1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 6 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 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_01.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 : | Authors: Georg Richter <georg@php.net> |
16 : | Andrey Hristov <andrey@php.net> |
17 : | Ulf Wendel <uw@php.net> |
18 : +----------------------------------------------------------------------+
19 :
20 : $Id: mysqli_prop.c 281234 2009-05-27 15:04:55Z andrey $
21 : */
22 :
23 : #ifdef HAVE_CONFIG_H
24 : #include "config.h"
25 : #endif
26 :
27 : #include <signal.h>
28 :
29 : #include "php.h"
30 : #include "php_ini.h"
31 : #include "ext/standard/info.h"
32 : #include "php_mysqli_structs.h"
33 :
34 : #define CHECK_STATUS(value) \
35 : if (!obj->ptr || ((MYSQLI_RESOURCE *)obj->ptr)->status < value ) { \
36 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Property access is not allowed yet"); \
37 : ZVAL_NULL(*retval); \
38 : return SUCCESS; \
39 : } \
40 :
41 : #define MYSQLI_GET_MYSQL(statusval) \
42 : MYSQL *p; \
43 : MAKE_STD_ZVAL(*retval);\
44 : if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
45 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %v", obj->zo.ce->name);\
46 : ZVAL_NULL(*retval);\
47 : return SUCCESS; \
48 : } else { \
49 : CHECK_STATUS(statusval);\
50 : p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;\
51 : }
52 :
53 : #define MYSQLI_GET_RESULT(statusval) \
54 : MYSQL_RES *p; \
55 : MAKE_STD_ZVAL(*retval);\
56 : if (!obj->ptr) { \
57 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %v", obj->zo.ce->name);\
58 : ZVAL_NULL(*retval);\
59 : return SUCCESS; \
60 : } else { \
61 : CHECK_STATUS(statusval);\
62 : p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; \
63 : }
64 :
65 :
66 : #define MYSQLI_GET_STMT(statusval) \
67 : MYSQL_STMT *p; \
68 : MAKE_STD_ZVAL(*retval);\
69 : if (!obj->ptr) { \
70 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %v", obj->zo.ce->name);\
71 : ZVAL_NULL(*retval);\
72 : return SUCCESS; \
73 : } else { \
74 : CHECK_STATUS(statusval);\
75 : p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt;\
76 : }
77 :
78 : #define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
79 : static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
80 : {\
81 : __ret_type l;\
82 : __get_type;\
83 : if (!p) {\
84 : ZVAL_NULL(*retval);\
85 : } else {\
86 : l = (__ret_type)__int_func(p);\
87 : if (l < LONG_MAX) {\
88 : ZVAL_LONG(*retval, l);\
89 : } else { \
90 : char *ret; \
91 : int ret_len = spprintf(&ret, 0, __ret_type_sprint_mod, l); \
92 : ZVAL_STRINGL(*retval, ret, ret_len, 0); \
93 : } \
94 : }\
95 : return SUCCESS;\
96 : }
97 :
98 : #define MYSQLI_MAP_PROPERTY_FUNC_STRING(__func, __int_func, __get_type)\
99 : static int __func(mysqli_object *obj, zval **retval TSRMLS_DC)\
100 : {\
101 : char *c;\
102 : __get_type;\
103 : if (!p) {\
104 : ZVAL_NULL(*retval);\
105 : } else {\
106 : c = (char *)__int_func(p);\
107 : if (!c) {\
108 : ZVAL_NULL(*retval);\
109 : } else {\
110 : ZVAL_UTF8_STRING(*retval, c, ZSTR_DUPLICATE);\
111 : }\
112 : }\
113 : return SUCCESS;\
114 : }
115 :
116 : /* {{{ property link_client_version_read */
117 : static int link_client_version_read(mysqli_object *obj, zval **retval TSRMLS_DC)
118 8 : {
119 8 : MAKE_STD_ZVAL(*retval);
120 8 : ZVAL_LONG(*retval, MYSQL_VERSION_ID);
121 8 : return SUCCESS;
122 : }
123 : /* }}} */
124 :
125 : /* {{{ property link_client_info_read */
126 : static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
127 7 : {
128 7 : MAKE_STD_ZVAL(*retval);
129 7 : CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
130 6 : ZVAL_UTF8_STRING(*retval, MYSQL_SERVER_VERSION, ZSTR_DUPLICATE)
131 6 : return SUCCESS;
132 : }
133 : /* }}} */
134 :
135 : /* {{{ property link_connect_errno_read */
136 : static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
137 7 : {
138 7 : MAKE_STD_ZVAL(*retval);
139 7 : ZVAL_LONG(*retval, (long)MyG(error_no));
140 7 : return SUCCESS;
141 : }
142 : /* }}} */
143 :
144 : /* {{{ property link_connect_error_read */
145 : static int link_connect_error_read(mysqli_object *obj, zval **retval TSRMLS_DC)
146 7 : {
147 7 : MAKE_STD_ZVAL(*retval);
148 7 : if (MyG(error_msg)) {
149 1 : ZVAL_UTF8_STRING(*retval, MyG(error_msg), ZSTR_DUPLICATE);
150 : } else {
151 6 : ZVAL_NULL(*retval);
152 : }
153 7 : return SUCCESS;
154 : }
155 : /* }}} */
156 :
157 : /* {{{ property link_affected_rows_read */
158 : static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
159 21 : {
160 : MY_MYSQL *mysql;
161 : my_ulonglong rc;
162 :
163 21 : MAKE_STD_ZVAL(*retval);
164 :
165 21 : CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
166 :
167 18 : mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
168 :
169 18 : if (!mysql) {
170 0 : ZVAL_NULL(*retval);
171 : } else {
172 18 : CHECK_STATUS(MYSQLI_STATUS_VALID);
173 :
174 17 : rc = mysql_affected_rows(mysql->mysql);
175 :
176 17 : if (rc == (my_ulonglong) -1) {
177 2 : ZVAL_LONG(*retval, -1);
178 2 : return SUCCESS;
179 : }
180 :
181 15 : if (rc < LONG_MAX) {
182 15 : ZVAL_LONG(*retval, rc);
183 : } else {
184 : char *ret;
185 0 : int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, rc);
186 0 : ZVAL_STRINGL(*retval, ret, l, 0);
187 : }
188 : }
189 15 : return SUCCESS;
190 : }
191 : /* }}} */
192 :
193 : /* link properties */
194 28 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), ulong, "%lu");
195 19 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED));
196 8 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
197 7 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
198 8 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
199 13 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
200 7 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
201 7 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
202 8 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
203 8 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
204 17 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
205 8 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
206 : /* result properties */
207 :
208 : /* {{{ property result_type_read */
209 : static int result_type_read(mysqli_object *obj, zval **retval TSRMLS_DC)
210 6 : {
211 : MYSQL_RES *p;
212 :
213 6 : MAKE_STD_ZVAL(*retval);
214 6 : CHECK_STATUS(MYSQLI_STATUS_VALID);
215 5 : p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
216 :
217 5 : if (!p) {
218 0 : ZVAL_NULL(*retval);
219 : } else {
220 5 : ZVAL_LONG(*retval, mysqli_result_is_unbuffered(p) ? MYSQLI_USE_RESULT:MYSQLI_STORE_RESULT);
221 : }
222 5 : return SUCCESS;
223 : }
224 : /* }}} */
225 :
226 : /* {{{ property result_lengths_read */
227 : static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
228 9 : {
229 : MYSQL_RES *p;
230 : ulong *ret;
231 :
232 9 : MAKE_STD_ZVAL(*retval);
233 :
234 9 : CHECK_STATUS(MYSQLI_STATUS_VALID);
235 7 : p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
236 9 : if (!p || !p->field_count || !(ret = mysql_fetch_lengths(p))) {
237 2 : ZVAL_NULL(*retval);
238 : } else {
239 : ulong i;
240 :
241 5 : array_init(*retval);
242 :
243 15 : for (i = 0; i < p->field_count; i++) {
244 10 : add_index_long(*retval, i, ret[i]);
245 : }
246 : }
247 7 : return SUCCESS;
248 : }
249 : /* }}} */
250 :
251 :
252 6 : MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong, "%lu");
253 9 : MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong, "%lu");
254 9 : MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
255 :
256 : /* statement properties */
257 :
258 : /* {{{ property stmt_id_read */
259 : static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
260 3 : {
261 : MY_STMT *p;
262 :
263 3 : MAKE_STD_ZVAL(*retval);
264 3 : CHECK_STATUS(MYSQLI_STATUS_VALID);
265 :
266 3 : p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
267 :
268 3 : if (!p) {
269 0 : ZVAL_NULL(*retval);
270 : } else {
271 3 : ZVAL_LONG(*retval, p->stmt->stmt_id);
272 : }
273 3 : return SUCCESS;
274 : }
275 : /* }}} */
276 :
277 : /* {{{ property stmt_affected_rows_read */
278 : static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
279 6 : {
280 : MY_STMT *p;
281 : my_ulonglong rc;
282 :
283 6 : MAKE_STD_ZVAL(*retval);
284 6 : CHECK_STATUS(MYSQLI_STATUS_VALID);
285 :
286 4 : p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
287 :
288 4 : if (!p) {
289 0 : ZVAL_NULL(*retval);
290 : } else {
291 4 : rc = mysql_stmt_affected_rows(p->stmt);
292 :
293 4 : if (rc == (my_ulonglong) -1) {
294 2 : ZVAL_LONG(*retval, -1);
295 2 : return SUCCESS;
296 : }
297 :
298 2 : if (rc < LONG_MAX) {
299 2 : ZVAL_LONG(*retval, rc);
300 : } else {
301 : char *ret;
302 0 : int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, rc);
303 0 : ZVAL_STRINGL(*retval, ret, l, 0);
304 : }
305 : }
306 2 : return SUCCESS;
307 : }
308 : /* }}} */
309 :
310 4 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
311 3 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
312 3 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong, "%lu");
313 4 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong, "%lu");
314 4 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED), ulong, "%lu");
315 3 : MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));
316 3 : MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));
317 :
318 : /* }}} */
319 : const mysqli_property_entry mysqli_link_property_entries[] = {
320 : {"affected_rows", sizeof("affected_rows") - 1, link_affected_rows_read, NULL},
321 : {"client_info", sizeof("client_info") - 1, link_client_info_read, NULL},
322 : {"client_version", sizeof("client_version") - 1, link_client_version_read, NULL},
323 : {"connect_errno", sizeof("connect_errno") - 1, link_connect_errno_read, NULL},
324 : {"connect_error", sizeof("connect_error") - 1, link_connect_error_read, NULL},
325 : {"errno", sizeof("errno") - 1, link_errno_read, NULL},
326 : {"error", sizeof("error") - 1, link_error_read, NULL},
327 : {"field_count", sizeof("field_count") - 1, link_field_count_read, NULL},
328 : {"host_info", sizeof("host_info") - 1, link_host_info_read, NULL},
329 : {"info", sizeof("info") - 1, link_info_read, NULL},
330 : {"insert_id", sizeof("insert_id") - 1, link_insert_id_read, NULL},
331 : {"server_info", sizeof("server_info") - 1, link_server_info_read, NULL},
332 : {"server_version", sizeof("server_version") - 1, link_server_version_read, NULL},
333 : {"sqlstate", sizeof("sqlstate") - 1, link_sqlstate_read, NULL},
334 : {"protocol_version",sizeof("protocol_version") - 1, link_protocol_version_read, NULL},
335 : {"thread_id", sizeof("thread_id") - 1, link_thread_id_read, NULL},
336 : {"warning_count", sizeof("warning_count") - 1, link_warning_count_read, NULL},
337 : {NULL, 0, NULL, NULL}
338 : };
339 :
340 : /* should not be const, as it is patched during runtime */
341 : zend_property_info mysqli_link_property_info_entries[] = {
342 : {ZEND_ACC_PUBLIC, {"affected_rows"},sizeof("affected_rows") - 1, 0, {NULL}, 0, NULL},
343 : {ZEND_ACC_PUBLIC, {"client_info"}, sizeof("client_info") - 1, 0, {NULL}, 0, NULL},
344 : {ZEND_ACC_PUBLIC, {"client_version"},sizeof("client_version") - 1, 0, {NULL}, 0, NULL},
345 : {ZEND_ACC_PUBLIC, {"connect_errno"},sizeof("connect_errno") - 1, 0, {NULL}, 0, NULL},
346 : {ZEND_ACC_PUBLIC, {"connect_error"},sizeof("connect_error") - 1, 0, {NULL}, 0, NULL},
347 : {ZEND_ACC_PUBLIC, {"errno"}, sizeof("errno") - 1, 0, {NULL}, 0, NULL},
348 : {ZEND_ACC_PUBLIC, {"error"}, sizeof("error") - 1, 0, {NULL}, 0, NULL},
349 : {ZEND_ACC_PUBLIC, {"field_count"}, sizeof("field_count") - 1, 0, {NULL}, 0, NULL},
350 : {ZEND_ACC_PUBLIC, {"host_info"}, sizeof("host_info") - 1, 0, {NULL}, 0, NULL},
351 : {ZEND_ACC_PUBLIC, {"info"}, sizeof("info") - 1, 0, {NULL}, 0, NULL},
352 : {ZEND_ACC_PUBLIC, {"insert_id"}, sizeof("insert_id") - 1, 0, {NULL}, 0, NULL},
353 : {ZEND_ACC_PUBLIC, {"server_info"}, sizeof("server_info") - 1, 0, {NULL}, 0, NULL},
354 : {ZEND_ACC_PUBLIC, {"server_version"},sizeof("server_version") - 1, 0, {NULL}, 0, NULL},
355 : {ZEND_ACC_PUBLIC, {"sqlstate"}, sizeof("sqlstate") - 1, 0, {NULL}, 0, NULL},
356 : {ZEND_ACC_PUBLIC, {"protocol_version"}, sizeof("protocol_version")-1, 0, {NULL}, 0, NULL},
357 : {ZEND_ACC_PUBLIC, {"thread_id"}, sizeof("thread_id") - 1, 0, {NULL}, 0, NULL},
358 : {ZEND_ACC_PUBLIC, {"warning_count"},sizeof("warning_count") - 1, 0, {NULL}, 0, NULL},
359 : {0, {NULL}, 0, 0, {NULL}, 0, NULL}
360 : };
361 :
362 :
363 : const mysqli_property_entry mysqli_result_property_entries[] = {
364 : {"current_field",sizeof("current_field")-1, result_current_field_read, NULL},
365 : {"field_count", sizeof("field_count") - 1, result_field_count_read, NULL},
366 : {"lengths", sizeof("lengths") - 1, result_lengths_read, NULL},
367 : {"num_rows", sizeof("num_rows") - 1, result_num_rows_read, NULL},
368 : {"type", sizeof("type") - 1, result_type_read, NULL},
369 : {NULL, 0, NULL, NULL}
370 : };
371 :
372 : zend_property_info mysqli_result_property_info_entries[] = {
373 : {ZEND_ACC_PUBLIC, {"current_field"},sizeof("current_field")-1, 0, {NULL}, 0, NULL},
374 : {ZEND_ACC_PUBLIC, {"field_count"}, sizeof("field_count") - 1, 0, {NULL}, 0, NULL},
375 : {ZEND_ACC_PUBLIC, {"lengths"}, sizeof("lengths") - 1, 0, {NULL}, 0, NULL},
376 : {ZEND_ACC_PUBLIC, {"num_rows"}, sizeof("num_rows") - 1, 0, {NULL}, 0, NULL},
377 : {ZEND_ACC_PUBLIC, {"type"}, sizeof("type") - 1, 0, {NULL}, 0, NULL},
378 : {0, {NULL}, 0, 0, {NULL}, 0, NULL}
379 : };
380 :
381 : const mysqli_property_entry mysqli_stmt_property_entries[] = {
382 : {"affected_rows", sizeof("affected_rows")-1,stmt_affected_rows_read, NULL},
383 : {"insert_id", sizeof("insert_id") - 1, stmt_insert_id_read, NULL},
384 : {"num_rows", sizeof("num_rows") - 1, stmt_num_rows_read, NULL},
385 : {"param_count", sizeof("param_count") - 1, stmt_param_count_read, NULL},
386 : {"field_count", sizeof("field_count") - 1, stmt_field_count_read, NULL},
387 : {"errno", sizeof("errno") - 1, stmt_errno_read, NULL},
388 : {"error", sizeof("error") - 1, stmt_error_read, NULL},
389 : {"sqlstate", sizeof("sqlstate") - 1, stmt_sqlstate_read, NULL},
390 : {"id", sizeof("id") - 1, stmt_id_read, NULL},
391 : {NULL, 0, NULL, NULL}
392 : };
393 :
394 :
395 : zend_property_info mysqli_stmt_property_info_entries[] = {
396 : {ZEND_ACC_PUBLIC, {"affected_rows"},sizeof("affected_rows") - 1, 0, {NULL}, 0, NULL},
397 : {ZEND_ACC_PUBLIC, {"insert_id"}, sizeof("insert_id") - 1, 0, {NULL}, 0, NULL},
398 : {ZEND_ACC_PUBLIC, {"num_rows"}, sizeof("num_rows") - 1, 0, {NULL}, 0, NULL},
399 : {ZEND_ACC_PUBLIC, {"param_count"}, sizeof("param_count") - 1, 0, {NULL}, 0, NULL},
400 : {ZEND_ACC_PUBLIC, {"field_count"}, sizeof("field_count") - 1, 0, {NULL}, 0, NULL},
401 : {ZEND_ACC_PUBLIC, {"errno"}, sizeof("errno") - 1, 0, {NULL}, 0, NULL},
402 : {ZEND_ACC_PUBLIC, {"error"}, sizeof("error") - 1, 0, {NULL}, 0, NULL},
403 : {ZEND_ACC_PUBLIC, {"sqlstate"}, sizeof("sqlstate") - 1, 0, {NULL}, 0, NULL},
404 : {ZEND_ACC_PUBLIC, {"id"}, sizeof("id") - 1, 0, {NULL}, 0, NULL},
405 : {0, {NULL}, 0, 0, {NULL}, 0, NULL}
406 : };
407 :
408 : /*
409 : * Local variables:
410 : * tab-width: 4
411 : * c-basic-offset: 4
412 : * End:
413 : * vim600: noet sw=4 ts=4 fdm=marker
414 : * vim<600: noet sw=4 ts=4
415 : */
|