1 /*
2   +----------------------------------------------------------------------+
3   | PHP Version 7                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 1997-2018 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   | Author: Georg Richter <georg@php.net>                                |
16   |         Andrey Hristov <andrey@php.net>                              |
17   +----------------------------------------------------------------------+
18 */
19 
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23 
24 #include <signal.h>
25 
26 #include "php.h"
27 #include "php_ini.h"
28 #include "ext/standard/info.h"
29 #if defined(MYSQLI_USE_MYSQLND)
30 #include "php_mysqli_structs.h"
31 #endif
32 #include "mysqli_priv.h"
33 
34 #define CHECK_STATUS(value) \
35 	if (!obj->ptr || ((MYSQLI_RESOURCE *)obj->ptr)->status < value ) { \
36 		php_error_docref(NULL, E_WARNING, "Property access is not allowed yet"); \
37 		ZVAL_FALSE(retval); \
38 		return retval; \
39 	} \
40 
41 #define MYSQLI_GET_MYSQL(statusval) \
42 MYSQL *p; \
43 if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
44 	php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));\
45 	ZVAL_FALSE(retval);\
46 	return retval; \
47 } else { \
48 	CHECK_STATUS(statusval);\
49     p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;\
50 }
51 
52 #define MYSQLI_GET_RESULT(statusval) \
53 MYSQL_RES *p; \
54 if (!obj->ptr) { \
55 	php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));\
56 	ZVAL_NULL(retval);\
57 	return retval; \
58 } else { \
59 	CHECK_STATUS(statusval);\
60 	p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; \
61 }
62 
63 
64 #define MYSQLI_GET_STMT(statusval) \
65 MYSQL_STMT *p; \
66 if (!obj->ptr) { \
67 	php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", ZSTR_VAL(obj->zo.ce->name));\
68 	ZVAL_NULL(retval);\
69 	return retval; \
70 } else { \
71 	CHECK_STATUS(statusval);\
72 	p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt;\
73 }
74 
75 #define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
76 static zval *__func(mysqli_object *obj, zval *retval) \
77 {\
78 	__ret_type l;\
79 	__get_type;\
80 	if (!p) {\
81 		ZVAL_NULL(retval);\
82 	} else {\
83 		l = (__ret_type)__int_func(p);\
84 		if (l < ZEND_LONG_MAX) {\
85 			ZVAL_LONG(retval, (zend_long) l);\
86 		} else { \
87 			ZVAL_NEW_STR(retval, strpprintf(0, __ret_type_sprint_mod, l)); \
88 		} \
89 	}\
90 	return retval;\
91 }
92 
93 #define MYSQLI_MAP_PROPERTY_FUNC_STRING(__func, __int_func, __get_type)\
94 static zval *__func(mysqli_object *obj, zval *retval)\
95 {\
96 	char *c;\
97 	__get_type;\
98 	if (!p) {\
99 		ZVAL_NULL(retval);\
100 	} else {\
101 		c = (char *)__int_func(p);\
102 		if (!c) {\
103 			ZVAL_NULL(retval);\
104 		} else {\
105 			ZVAL_STRING(retval, c);\
106 		}\
107 	}\
108 	return retval; \
109 }
110 
111 /* {{{ property link_client_version_read */
link_client_version_read(mysqli_object * obj,zval * retval)112 static zval *link_client_version_read(mysqli_object *obj, zval *retval)
113 {
114 	ZVAL_LONG(retval, MYSQL_VERSION_ID);
115 	return retval;
116 }
117 /* }}} */
118 
119 /* {{{ property link_client_info_read */
link_client_info_read(mysqli_object * obj,zval * retval)120 static zval *link_client_info_read(mysqli_object *obj, zval *retval)
121 {
122 	CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
123 	ZVAL_STRING(retval, MYSQL_SERVER_VERSION);
124 	return retval;
125 }
126 /* }}} */
127 
128 /* {{{ property link_connect_errno_read */
link_connect_errno_read(mysqli_object * obj,zval * retval)129 static zval *link_connect_errno_read(mysqli_object *obj, zval *retval)
130 {
131 	ZVAL_LONG(retval, (zend_long)MyG(error_no));
132 	return retval;
133 }
134 /* }}} */
135 
136 /* {{{ property link_connect_error_read */
link_connect_error_read(mysqli_object * obj,zval * retval)137 static zval *link_connect_error_read(mysqli_object *obj, zval *retval)
138 {
139 	if (MyG(error_msg)) {
140 		ZVAL_STRING(retval, MyG(error_msg));
141 	} else {
142 		ZVAL_NULL(retval);
143 	}
144 	return retval;
145 }
146 /* }}} */
147 
148 /* {{{ property link_affected_rows_read */
link_affected_rows_read(mysqli_object * obj,zval * retval)149 static zval *link_affected_rows_read(mysqli_object *obj, zval *retval)
150 {
151 	MY_MYSQL *mysql;
152 	my_ulonglong rc;
153 
154 	CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
155 
156  	mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
157 
158 	if (!mysql) {
159 		ZVAL_NULL(retval);
160 	} else {
161 		CHECK_STATUS(MYSQLI_STATUS_VALID);
162 
163 		rc = mysql_affected_rows(mysql->mysql);
164 
165 		if (rc == (my_ulonglong) -1) {
166 			ZVAL_LONG(retval, -1);
167 			return retval;
168 		}
169 
170 		if (rc < ZEND_LONG_MAX) {
171 			ZVAL_LONG(retval, (zend_long) rc);
172 		} else {
173 			ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
174 		}
175 	}
176 	return retval;
177 }
178 /* }}} */
179 
180 /* {{{ property link_error_list_read */
link_error_list_read(mysqli_object * obj,zval * retval)181 static zval *link_error_list_read(mysqli_object *obj, zval *retval)
182 {
183 	MY_MYSQL *mysql;
184 
185 	CHECK_STATUS(MYSQLI_STATUS_VALID);
186 
187  	mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
188 
189 	if (mysql) {
190 		array_init(retval);
191 #if defined(MYSQLI_USE_MYSQLND)
192 		if (1) {
193 			MYSQLND_ERROR_LIST_ELEMENT * message;
194 			zend_llist_position pos;
195 			for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(&mysql->mysql->data->error_info->error_list, &pos);
196 				 message;
197 				 message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&mysql->mysql->data->error_info->error_list, &pos))
198 			{
199 				zval single_error;
200 				array_init(&single_error);
201 				add_assoc_long_ex(&single_error, "errno", sizeof("errno") - 1, message->error_no);
202 				add_assoc_string_ex(&single_error, "sqlstate", sizeof("sqlstate") - 1, message->sqlstate);
203 				add_assoc_string_ex(&single_error, "error", sizeof("error") - 1, message->error);
204 				add_next_index_zval(retval, &single_error);
205 			}
206 		}
207 #else
208 		if (mysql_errno(mysql->mysql)) {
209 			zval single_error;
210 			array_init(&single_error);
211 			add_assoc_long_ex(&single_error, "errno", sizeof("errno") - 1, mysql_errno(mysql->mysql));
212 			add_assoc_string_ex(&single_error, "sqlstate", sizeof("sqlstate") - 1, mysql_sqlstate(mysql->mysql));
213 			add_assoc_string_ex(&single_error, "error", sizeof("error") - 1, mysql_error(mysql->mysql));
214 			add_next_index_zval(retval, &single_error);
215 		}
216 #endif
217 	} else {
218 		ZVAL_EMPTY_ARRAY(retval);
219 	}
220 
221 	return retval;
222 }
223 /* }}} */
224 
225 /* link properties */
MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read,mysql_errno,MYSQLI_GET_MYSQL (MYSQLI_STATUS_INITIALIZED),zend_ulong,ZEND_ULONG_FMT)226 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), zend_ulong, ZEND_ULONG_FMT)
227 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED))
228 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
229 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
230 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
231 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
232 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
233 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
234 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
235 MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID))
236 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
237 MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
238 
239 /* {{{ property link_stat_read */
240 static zval *link_stat_read(mysqli_object *obj, zval *retval)
241 {
242 	MY_MYSQL *mysql;
243 
244 	ZVAL_NULL(retval);
245 
246 #if defined(MYSQLI_USE_MYSQLND)
247 	CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
248 #else
249 	CHECK_STATUS(MYSQLI_STATUS_VALID);
250 #endif
251 
252  	mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
253 
254 	if (mysql) {
255 #if defined(MYSQLI_USE_MYSQLND)
256 		zend_string * stat_msg;
257 		if (mysqlnd_stat(mysql->mysql, &stat_msg) == PASS) {
258 			ZVAL_STR(retval, stat_msg);
259 		}
260 #else
261 		char * stat_msg;
262 		if ((stat_msg = (char *)mysql_stat(mysql->mysql))) {
263 			ZVAL_STRING(retval, stat_msg);
264 		}
265 #endif
266 	}
267 	return retval;
268 }
269 /* }}} */
270 
271 /* result properties */
272 
273 /* {{{ property result_type_read */
result_type_read(mysqli_object * obj,zval * retval)274 static zval *result_type_read(mysqli_object *obj, zval *retval)
275 {
276 	MYSQL_RES *p;
277 
278 	CHECK_STATUS(MYSQLI_STATUS_VALID);
279  	p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
280 
281 	if (!p) {
282 		ZVAL_NULL(retval);
283 	} else {
284 		ZVAL_LONG(retval, mysqli_result_is_unbuffered(p) ? MYSQLI_USE_RESULT:MYSQLI_STORE_RESULT);
285 	}
286 	return retval;
287 }
288 /* }}} */
289 
290 /* {{{ property result_lengths_read */
result_lengths_read(mysqli_object * obj,zval * retval)291 static zval *result_lengths_read(mysqli_object *obj, zval *retval)
292 {
293 	MYSQL_RES *p;
294 #if defined(MYSQLI_USE_MYSQLND)
295 	const size_t *ret;
296 #else
297 	const zend_ulong *ret;
298 #endif
299 	uint32_t field_count;
300 
301 	CHECK_STATUS(MYSQLI_STATUS_VALID);
302 	p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
303 	field_count = mysql_num_fields(p);
304 	if (!p || !field_count || !(ret = mysql_fetch_lengths(p))) {
305 		ZVAL_NULL(retval);
306 	} else {
307 		zend_ulong i;
308 
309 		array_init(retval);
310 
311 		for (i = 0; i < field_count; i++) {
312 			add_index_long(retval, i, ret[i]);
313 		}
314 	}
315 	return retval;
316 }
317 /* }}} */
318 
MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read,mysql_field_tell,MYSQLI_GET_RESULT (MYSQLI_STATUS_VALID),zend_ulong,ZEND_ULONG_FMT)319 MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
320 MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
321 MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
322 
323 /* statement properties */
324 
325 /* {{{ property stmt_id_read */
326 static zval *stmt_id_read(mysqli_object *obj, zval *retval)
327 {
328 	MY_STMT *p;
329 
330 	CHECK_STATUS(MYSQLI_STATUS_VALID);
331 
332  	p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
333 
334 	if (!p) {
335 		ZVAL_NULL(retval);
336 	} else {
337 		ZVAL_LONG(retval, mysqli_stmt_get_id(p->stmt));
338 	}
339 	return retval;
340 }
341 /* }}} */
342 
343 /* {{{ property stmt_affected_rows_read */
stmt_affected_rows_read(mysqli_object * obj,zval * retval)344 static zval *stmt_affected_rows_read(mysqli_object *obj, zval *retval)
345 {
346 	MY_STMT *p;
347 	my_ulonglong rc;
348 
349 	CHECK_STATUS(MYSQLI_STATUS_VALID);
350 
351  	p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
352 
353 	if (!p) {
354 		ZVAL_NULL(retval);
355 	} else {
356 		rc = mysql_stmt_affected_rows(p->stmt);
357 
358 		if (rc == (my_ulonglong) -1) {
359 			ZVAL_LONG(retval, -1);
360 			return retval;
361 		}
362 
363 		if (rc < ZEND_LONG_MAX) {
364 			ZVAL_LONG(retval, (zend_long) rc);
365 		} else {
366 			ZVAL_NEW_STR(retval, strpprintf(0, MYSQLI_LLU_SPEC, rc));
367 		}
368 	}
369 	return retval;
370 }
371 /* }}} */
372 
373 /* {{{ property stmt_error_list_read */
stmt_error_list_read(mysqli_object * obj,zval * retval)374 static zval *stmt_error_list_read(mysqli_object *obj, zval *retval)
375 {
376 	MY_STMT * stmt;
377 
378 	CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
379 
380  	stmt = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
381 	if (stmt && stmt->stmt) {
382 		array_init(retval);
383 #if defined(MYSQLI_USE_MYSQLND)
384 		if (stmt->stmt->data && stmt->stmt->data->error_info) {
385 			MYSQLND_ERROR_LIST_ELEMENT * message;
386 			zend_llist_position pos;
387 			for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(&stmt->stmt->data->error_info->error_list, &pos);
388 				 message;
389 				 message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&stmt->stmt->data->error_info->error_list, &pos))
390 			{
391 				zval single_error;
392 				array_init(&single_error);
393 				add_assoc_long_ex(&single_error, "errno", sizeof("errno") - 1, message->error_no);
394 				add_assoc_string_ex(&single_error, "sqlstate", sizeof("sqlstate") - 1, message->sqlstate);
395 				add_assoc_string_ex(&single_error, "error", sizeof("error") - 1, message->error);
396 				add_next_index_zval(retval, &single_error);
397 			}
398 		}
399 #else
400 		if (mysql_stmt_errno(stmt->stmt)) {
401 			zval single_error;
402 			array_init(&single_error);
403 			add_assoc_long_ex(&single_error, "errno", sizeof("errno") - 1, mysql_stmt_errno(stmt->stmt));
404 			add_assoc_string_ex(&single_error, "sqlstate", sizeof("sqlstate") - 1, mysql_stmt_sqlstate(stmt->stmt));
405 			add_assoc_string_ex(&single_error, "error", sizeof("error") - 1, mysql_stmt_error(stmt->stmt));
406 			add_next_index_zval(retval, &single_error);
407 		}
408 #endif
409 	} else {
410 		ZVAL_EMPTY_ARRAY(retval);
411 	}
412 	return retval;
413 }
414 /* }}} */
415 
416 MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
417 MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC)
418 MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
419 MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), zend_ulong, ZEND_ULONG_FMT)
420 MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED), zend_ulong, ZEND_ULONG_FMT)
421 MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED))
422 MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED))
423 
424 /* }}} */
425 const mysqli_property_entry mysqli_link_property_entries[] = {
426 	{"affected_rows", 	sizeof("affected_rows") - 1,	link_affected_rows_read, NULL},
427 	{"client_info", 	sizeof("client_info") - 1,		link_client_info_read, NULL},
428 	{"client_version",	sizeof("client_version") - 1,	link_client_version_read, NULL},
429 	{"connect_errno",	sizeof("connect_errno") - 1,	link_connect_errno_read, NULL},
430 	{"connect_error",	sizeof("connect_error") - 1,	link_connect_error_read, NULL},
431 	{"errno",			sizeof("errno") - 1,			link_errno_read, NULL},
432 	{"error",			sizeof("error") - 1,			link_error_read, NULL},
433 	{"error_list",		sizeof("error_list") - 1,		link_error_list_read, NULL},
434 	{"field_count",		sizeof("field_count") - 1,		link_field_count_read, NULL},
435 	{"host_info",		sizeof("host_info") - 1,		link_host_info_read, NULL},
436 	{"info",			sizeof("info") - 1,				link_info_read, NULL},
437 	{"insert_id",		sizeof("insert_id") - 1,		link_insert_id_read, NULL},
438 	{"server_info",		sizeof("server_info") - 1,		link_server_info_read, NULL},
439 	{"server_version",	sizeof("server_version") - 1,	link_server_version_read, NULL},
440 	{"stat",			sizeof("stat") - 1,				link_stat_read, NULL},
441 	{"sqlstate",		sizeof("sqlstate") - 1,			link_sqlstate_read, NULL},
442 	{"protocol_version",sizeof("protocol_version") - 1,	link_protocol_version_read, NULL},
443 	{"thread_id",		sizeof("thread_id") - 1, 		link_thread_id_read, NULL},
444 	{"warning_count",	sizeof("warning_count") - 1, 	link_warning_count_read, NULL},
445 	{NULL, 0, NULL, NULL}
446 };
447 
448 
449 const mysqli_property_entry mysqli_result_property_entries[] = {
450 	{"current_field",sizeof("current_field")-1,	result_current_field_read, NULL},
451 	{"field_count", sizeof("field_count") - 1,	result_field_count_read, NULL},
452 	{"lengths", 	sizeof("lengths") - 1,		result_lengths_read, NULL},
453 	{"num_rows", 	sizeof("num_rows") - 1,		result_num_rows_read, NULL},
454 	{"type", 		sizeof("type") - 1,			result_type_read, NULL},
455 	{NULL, 0, NULL, NULL}
456 };
457 
458 const mysqli_property_entry mysqli_stmt_property_entries[] = {
459 	{"affected_rows", sizeof("affected_rows")-1,stmt_affected_rows_read, NULL},
460 	{"insert_id",	sizeof("insert_id") - 1, 	stmt_insert_id_read, NULL},
461 	{"num_rows",	sizeof("num_rows") - 1, 	stmt_num_rows_read, NULL},
462 	{"param_count", sizeof("param_count") - 1,	stmt_param_count_read, NULL},
463 	{"field_count", sizeof("field_count") - 1,	stmt_field_count_read, NULL},
464 	{"errno",		sizeof("errno") - 1,		stmt_errno_read, NULL},
465 	{"error",		sizeof("error") - 1, 		stmt_error_read, NULL},
466 	{"error_list",	sizeof("error_list") - 1, 	stmt_error_list_read, NULL},
467 	{"sqlstate",	sizeof("sqlstate") - 1,		stmt_sqlstate_read, NULL},
468 	{"id",			sizeof("id") - 1,			stmt_id_read, NULL},
469 	{NULL, 0, NULL, NULL}
470 };
471 
472 /*
473  * Local variables:
474  * tab-width: 4
475  * c-basic-offset: 4
476  * End:
477  * vim600: noet sw=4 ts=4 fdm=marker
478  * vim<600: noet sw=4 ts=4
479  */
480