~ubuntu-branches/ubuntu/hardy/php5/hardy-updates

« back to all changes in this revision

Viewing changes to ext/mysqli/mysqli_prop.c

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-10-09 03:14:32 UTC
  • Revision ID: james.westby@ubuntu.com-20051009031432-kspik3lobxstafv9
Tags: upstream-5.0.5
ImportĀ upstreamĀ versionĀ 5.0.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
  +----------------------------------------------------------------------+
 
3
  | PHP Version 5                                                        |
 
4
  +----------------------------------------------------------------------+
 
5
  | Copyright (c) 1997-2004 The PHP Group                                |
 
6
  +----------------------------------------------------------------------+
 
7
  | This source file is subject to version 3.0 of the PHP license,       |
 
8
  | that is bundled with this package in the file LICENSE, and is        |
 
9
  | available through the world-wide-web at the following url:           |
 
10
  | http://www.php.net/license/3_0.txt.                                  |
 
11
  | If you did not receive a copy of the PHP license and are unable to   |
 
12
  | obtain it through the world-wide-web, please send a note to          |
 
13
  | license@php.net so we can mail you a copy immediately.               |
 
14
  +----------------------------------------------------------------------+
 
15
  | Author: Georg Richter <georg@php.net>                                |
 
16
  +----------------------------------------------------------------------+
 
17
 
 
18
  $Id: mysqli_prop.c,v 1.14.2.6 2005/03/30 13:52:39 jorton Exp $ 
 
19
*/
 
20
 
 
21
#ifdef HAVE_CONFIG_H
 
22
#include "config.h"
 
23
#endif
 
24
 
 
25
#include <signal.h>
 
26
 
 
27
#include "php.h"
 
28
#include "php_ini.h"
 
29
#include "ext/standard/info.h"
 
30
#include "php_mysqli.h"
 
31
 
 
32
#define CHECK_OBJECT() \
 
33
        if (!obj->valid) { \
 
34
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Property access is not allowed yet. Call the default constructor of the object first"); \
 
35
                ZVAL_NULL(*retval); \
 
36
                return SUCCESS; \
 
37
        } \
 
38
 
 
39
 
 
40
 
 
41
#define MYSQLI_GET_MYSQL() \
 
42
MYSQL *p; \
 
43
ALLOC_ZVAL(*retval);\
 
44
CHECK_OBJECT(); \
 
45
p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;
 
46
 
 
47
#define MYSQLI_GET_RESULT() \
 
48
MYSQL_RES *p; \
 
49
ALLOC_ZVAL(*retval);\
 
50
CHECK_OBJECT(); \
 
51
p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr
 
52
 
 
53
#define MYSQLI_GET_STMT() \
 
54
MYSQL_STMT *p; \
 
55
ALLOC_ZVAL(*retval);\
 
56
CHECK_OBJECT(); \
 
57
p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt
 
58
 
 
59
#define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type)\
 
60
static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
 
61
{\
 
62
        __ret_type l;\
 
63
        __get_type;\
 
64
        if (!p) {\
 
65
                ZVAL_NULL(*retval);\
 
66
        } else {\
 
67
                l = (__ret_type)__int_func(p);\
 
68
                if (l < LONG_MAX) {\
 
69
                        ZVAL_LONG(*retval, l);\
 
70
                } else { \
 
71
                        char ret[40]; \
 
72
                        sprintf(ret, "%llu", (my_ulonglong)l); \
 
73
                        ZVAL_STRING(*retval, ret, 1); \
 
74
                } \
 
75
        }\
 
76
        return SUCCESS;\
 
77
}
 
78
 
 
79
#define MYSQLI_MAP_PROPERTY_FUNC_STRING(__func, __int_func, __get_type)\
 
80
static int __func(mysqli_object *obj, zval **retval TSRMLS_DC)\
 
81
{\
 
82
        char *c;\
 
83
        __get_type;\
 
84
        if (!p) {\
 
85
                ZVAL_NULL(*retval);\
 
86
        } else {\
 
87
                c = (char *)__int_func(p);\
 
88
                if (!c) {\
 
89
                        ZVAL_NULL(*retval);\
 
90
                } else {\
 
91
                        ZVAL_STRING(*retval, c, 1);\
 
92
                }\
 
93
        }\
 
94
        return SUCCESS;\
 
95
}
 
96
 
 
97
/* {{{ property link_client_version_read */
 
98
static int link_client_version_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
99
{
 
100
        ALLOC_ZVAL(*retval);
 
101
        ZVAL_LONG(*retval, MYSQL_VERSION_ID);
 
102
        return SUCCESS;
 
103
}
 
104
/* }}} */
 
105
 
 
106
/* {{{ property link_client_info_read */
 
107
static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
108
{
 
109
        ALLOC_ZVAL(*retval);
 
110
        ZVAL_STRING(*retval, MYSQL_SERVER_VERSION, 1);
 
111
        return SUCCESS;
 
112
}
 
113
/* }}} */
 
114
 
 
115
/* {{{ property link_connect_errno_read */
 
116
static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
117
{
 
118
        ALLOC_ZVAL(*retval);
 
119
        ZVAL_LONG(*retval, (long)MyG(error_no));
 
120
        return SUCCESS;
 
121
}
 
122
/* }}} */
 
123
 
 
124
/* {{{ property link_connect_error_read */
 
125
static int link_connect_error_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
126
{
 
127
        ALLOC_ZVAL(*retval);
 
128
        ZVAL_STRING(*retval, MyG(error_msg), 1);
 
129
        return SUCCESS;
 
130
}
 
131
/* }}} */
 
132
 
 
133
/* {{{ property link_affected_rows_read */
 
134
static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
135
{
 
136
        MY_MYSQL *mysql;
 
137
        my_ulonglong rc;
 
138
 
 
139
        ALLOC_ZVAL(*retval); 
 
140
        CHECK_OBJECT();
 
141
 
 
142
        mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
143
        rc = mysql_affected_rows(mysql->mysql);
 
144
 
 
145
        if (rc == (my_ulonglong)-1) {
 
146
                ZVAL_LONG(*retval, -1);
 
147
                return SUCCESS;
 
148
        } 
 
149
 
 
150
        if (rc < LONG_MAX) {
 
151
                ZVAL_LONG(*retval, rc);
 
152
        } else {
 
153
                char ret[40];
 
154
                sprintf(ret, "%llu", (my_ulonglong) rc);
 
155
                ZVAL_STRING(*retval, ret, 1);
 
156
        }
 
157
 
 
158
        return SUCCESS;
 
159
}
 
160
/* }}} */
 
161
 
 
162
/* link properties */
 
163
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(), ulong);
 
164
MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL());
 
165
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(), ulong);
 
166
MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL());
 
167
MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL());
 
168
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(), my_ulonglong);
 
169
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(), ulong);
 
170
MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL());
 
171
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(), ulong);
 
172
MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL());
 
173
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(), ulong);
 
174
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(), ulong);
 
175
/* result properties */
 
176
 
 
177
/* {{{ property result_type_read */
 
178
static int result_type_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
179
{
 
180
        MYSQL_RES *p;
 
181
 
 
182
        ALLOC_ZVAL(*retval); 
 
183
        CHECK_OBJECT();
 
184
 
 
185
        p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
186
 
 
187
        if (!p) {
 
188
                ZVAL_NULL(*retval);
 
189
        } else {
 
190
                ZVAL_LONG(*retval, (p->data) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT);
 
191
        }
 
192
        return SUCCESS;
 
193
}
 
194
/* }}} */
 
195
 
 
196
/* {{{ property result_lengths_read */
 
197
static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
198
{
 
199
        MYSQL_RES *p;
 
200
 
 
201
        ALLOC_ZVAL(*retval); 
 
202
        CHECK_OBJECT();
 
203
 
 
204
        p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
205
 
 
206
        if (!p || !p->field_count) {
 
207
                ZVAL_NULL(*retval);
 
208
        } else {
 
209
                ulong i;
 
210
                zval *l;
 
211
        
 
212
                array_init(*retval);
 
213
 
 
214
                for (i=0; i < p->field_count; i++) {
 
215
                        MAKE_STD_ZVAL(l);
 
216
                        ZVAL_LONG(l, p->lengths[i]);
 
217
                        add_index_zval(*retval, i, l);
 
218
                }       
 
219
        }
 
220
        return SUCCESS;
 
221
}
 
222
/* }}} */
 
223
 
 
224
 
 
225
MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(), ulong);
 
226
MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(), ulong);
 
227
MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(), my_ulonglong);
 
228
 
 
229
/* statement properties */
 
230
 
 
231
/* {{{ property stmt_id_read */
 
232
static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
233
{
 
234
        MY_STMT *p;
 
235
 
 
236
        ALLOC_ZVAL(*retval); 
 
237
        CHECK_OBJECT();
 
238
 
 
239
        p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
240
 
 
241
        if (!p) {
 
242
                ZVAL_NULL(*retval);
 
243
        } else {
 
244
                ZVAL_LONG(*retval, p->stmt->stmt_id);
 
245
        }
 
246
        return SUCCESS;
 
247
}
 
248
/* }}} */
 
249
 
 
250
/* {{{ property stmt_affected_rows_read */
 
251
static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
 
252
{
 
253
        MY_STMT *stmt;
 
254
        my_ulonglong rc;
 
255
 
 
256
        ALLOC_ZVAL(*retval); 
 
257
        CHECK_OBJECT();
 
258
 
 
259
        stmt = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
260
        rc = mysql_stmt_affected_rows(stmt->stmt);
 
261
 
 
262
        if (rc == (my_ulonglong)-1) {
 
263
                ZVAL_LONG(*retval, -1);
 
264
                return SUCCESS;
 
265
        } 
 
266
 
 
267
        if (rc < LONG_MAX) {
 
268
                ZVAL_LONG(*retval, rc);
 
269
        } else {
 
270
                char ret[40];
 
271
                sprintf(ret, "%llu", (my_ulonglong) rc);
 
272
                ZVAL_STRING(*retval, ret, 1);
 
273
        }
 
274
 
 
275
        return SUCCESS;
 
276
}
 
277
/* }}} */
 
278
 
 
279
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(), my_ulonglong);
 
280
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(), my_ulonglong);
 
281
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(), ulong);
 
282
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(), ulong);
 
283
MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(), ulong);
 
284
MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT());
 
285
MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT());
 
286
 
 
287
mysqli_property_entry mysqli_link_property_entries[] = {
 
288
        {"affected_rows", link_affected_rows_read, NULL},
 
289
        {"client_info", link_client_info_read, NULL},
 
290
        {"client_version", link_client_version_read, NULL},
 
291
        {"connect_errno", link_connect_errno_read, NULL},
 
292
        {"connect_error", link_connect_error_read, NULL},
 
293
        {"errno", link_errno_read, NULL},
 
294
        {"error", link_error_read, NULL},
 
295
        {"field_count", link_field_count_read, NULL},
 
296
        {"host_info", link_host_info_read, NULL},
 
297
        {"info", link_info_read, NULL},
 
298
        {"insert_id", link_insert_id_read, NULL},
 
299
        {"server_info", link_server_info_read, NULL},
 
300
        {"server_version", link_server_version_read, NULL},
 
301
        {"sqlstate", link_sqlstate_read, NULL},
 
302
        {"protocol_version", link_protocol_version_read, NULL},
 
303
        {"thread_id", link_thread_id_read, NULL},
 
304
        {"warning_count", link_warning_count_read, NULL},
 
305
        {NULL, NULL, NULL}      
 
306
};
 
307
 
 
308
mysqli_property_entry mysqli_result_property_entries[] = {
 
309
        {"current_field", result_current_field_read, NULL},
 
310
        {"field_count", result_field_count_read, NULL},
 
311
        {"lengths", result_lengths_read, NULL},
 
312
        {"num_rows", result_num_rows_read, NULL},
 
313
        {"type", result_type_read, NULL},
 
314
        {NULL, NULL, NULL}
 
315
};
 
316
 
 
317
mysqli_property_entry mysqli_stmt_property_entries[] = {
 
318
        {"affected_rows", stmt_affected_rows_read, NULL},
 
319
        {"insert_id", stmt_insert_id_read, NULL},
 
320
        {"num_rows", stmt_num_rows_read, NULL},
 
321
        {"param_count", stmt_param_count_read, NULL},
 
322
        {"field_count", stmt_field_count_read, NULL},
 
323
        {"errno", stmt_errno_read, NULL},
 
324
        {"error", stmt_error_read, NULL},
 
325
        {"sqlstate", stmt_sqlstate_read, NULL},
 
326
        {"id", stmt_id_read, NULL},
 
327
        {NULL, NULL, NULL}
 
328
};
 
329
 
 
330
/*
 
331
 * Local variables:
 
332
 * tab-width: 4
 
333
 * c-basic-offset: 4
 
334
 * End:
 
335
 * vim600: noet sw=4 ts=4 fdm=marker
 
336
 * vim<600: noet sw=4 ts=4
 
337
 */