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: Zeev Suraski <zeev@zend.com> |
16 : | Zak Greant <zak@mysql.com> |
17 : | Georg Richter <georg@php.net> |
18 : +----------------------------------------------------------------------+
19 : */
20 :
21 : /* $Id: php_mysql.c 289004 2009-09-30 14:39:33Z uw $ */
22 :
23 : /* TODO:
24 : *
25 : * ? Safe mode implementation
26 : */
27 :
28 : #ifdef HAVE_CONFIG_H
29 : # include "config.h"
30 : #endif
31 :
32 : #include "php.h"
33 : #include "php_globals.h"
34 : #include "ext/standard/info.h"
35 : #include "ext/standard/php_string.h"
36 : #include "ext/standard/basic_functions.h"
37 : #include "zend_exceptions.h"
38 :
39 : #if HAVE_MYSQL
40 :
41 : #ifdef PHP_WIN32
42 : # include <winsock2.h>
43 : # define signal(a, b) NULL
44 : #elif defined(NETWARE)
45 : # include <sys/socket.h>
46 : # define signal(a, b) NULL
47 : #else
48 : # if HAVE_SIGNAL_H
49 : # include <signal.h>
50 : # endif
51 : # if HAVE_SYS_TYPES_H
52 : # include <sys/types.h>
53 : # endif
54 : # include <netdb.h>
55 : # include <netinet/in.h>
56 : # if HAVE_ARPA_INET_H
57 : # include <arpa/inet.h>
58 : # endif
59 : #endif
60 :
61 : #include "php_ini.h"
62 : #include "php_mysql_structs.h"
63 :
64 : /* True globals, no need for thread safety */
65 : static int le_result, le_link, le_plink;
66 :
67 : #ifdef HAVE_MYSQL_REAL_CONNECT
68 : # ifdef HAVE_ERRMSG_H
69 : # include <errmsg.h>
70 : # endif
71 : #endif
72 :
73 : #define SAFE_STRING(s) ((s)?(s):"")
74 :
75 : #if MYSQL_VERSION_ID > 32199 || defined(MYSQL_USE_MYSQLND)
76 : # define mysql_row_length_type unsigned long
77 : # define HAVE_MYSQL_ERRNO
78 : #else
79 : # define mysql_row_length_type unsigned int
80 : # ifdef mysql_errno
81 : # define HAVE_MYSQL_ERRNO
82 : # endif
83 : #endif
84 :
85 : #if MYSQL_VERSION_ID >= 32032 || defined(MYSQL_USE_MYSQLND)
86 : #define HAVE_GETINFO_FUNCS
87 : #endif
88 :
89 : #if MYSQL_VERSION_ID > 32133 || defined(FIELD_TYPE_TINY)
90 : #define MYSQL_HAS_TINY
91 : #endif
92 :
93 : #if MYSQL_VERSION_ID >= 32200
94 : #define MYSQL_HAS_YEAR
95 : #endif
96 :
97 : #define MYSQL_ASSOC 1<<0
98 : #define MYSQL_NUM 1<<1
99 : #define MYSQL_BOTH (MYSQL_ASSOC|MYSQL_NUM)
100 :
101 : #define MYSQL_USE_RESULT 0
102 : #define MYSQL_STORE_RESULT 1
103 :
104 : #if MYSQL_VERSION_ID < 32224
105 : #define PHP_MYSQL_VALID_RESULT(mysql) \
106 : (mysql_num_fields(mysql)>0)
107 : #else
108 : #define PHP_MYSQL_VALID_RESULT(mysql) \
109 : (mysql_field_count(mysql)>0)
110 : #endif
111 :
112 : ZEND_DECLARE_MODULE_GLOBALS(mysql)
113 : static PHP_GINIT_FUNCTION(mysql);
114 :
115 : typedef struct _php_mysql_conn {
116 : MYSQL *conn;
117 : int active_result_id;
118 : int multi_query;
119 : } php_mysql_conn;
120 :
121 : #ifdef MYSQL_USE_MYSQLND
122 : static MYSQLND_ZVAL_PCACHE *mysql_mysqlnd_zval_cache;
123 : static MYSQLND_QCACHE *mysql_mysqlnd_qcache;
124 : #endif
125 :
126 :
127 : #ifdef CLIENT_MULTI_STATEMENTS
128 : #define MYSQL_DISABLE_MQ if (mysql->multi_query) { \
129 : mysql_set_server_option(mysql->conn, MYSQL_OPTION_MULTI_STATEMENTS_OFF); \
130 : mysql->multi_query = 0; \
131 : }
132 : #else
133 : #define MYSQL_DISABLE_MQ
134 : #endif
135 :
136 :
137 : /* {{{ mysql_functions[]
138 : */
139 : static const zend_function_entry mysql_functions[] = {
140 : PHP_FE(mysql_connect, NULL)
141 : PHP_FE(mysql_pconnect, NULL)
142 : PHP_FE(mysql_close, NULL)
143 : PHP_FE(mysql_select_db, NULL)
144 : #ifndef NETWARE /* The below two functions not supported on NetWare */
145 : #if MYSQL_VERSION_ID < 40000
146 : PHP_DEP_FE(mysql_create_db, NULL)
147 : PHP_DEP_FE(mysql_drop_db, NULL)
148 : #endif
149 : #endif /* NETWARE */
150 : PHP_FE(mysql_query, NULL)
151 : PHP_FE(mysql_unbuffered_query, NULL)
152 : PHP_FE(mysql_db_query, NULL)
153 : PHP_FE(mysql_list_dbs, NULL)
154 : PHP_DEP_FE(mysql_list_tables, NULL)
155 : PHP_FE(mysql_list_fields, NULL)
156 : PHP_FE(mysql_list_processes, NULL)
157 : PHP_FE(mysql_error, NULL)
158 : #ifdef HAVE_MYSQL_ERRNO
159 : PHP_FE(mysql_errno, NULL)
160 : #endif
161 : PHP_FE(mysql_affected_rows, NULL)
162 : PHP_FE(mysql_insert_id, NULL)
163 : PHP_FE(mysql_result, NULL)
164 : PHP_FE(mysql_num_rows, NULL)
165 : PHP_FE(mysql_num_fields, NULL)
166 : PHP_FE(mysql_fetch_row, NULL)
167 : PHP_FE(mysql_fetch_array, NULL)
168 : PHP_FE(mysql_fetch_assoc, NULL)
169 : PHP_FE(mysql_fetch_object, NULL)
170 : PHP_FE(mysql_data_seek, NULL)
171 : PHP_FE(mysql_fetch_lengths, NULL)
172 : PHP_FE(mysql_fetch_field, NULL)
173 : PHP_FE(mysql_field_seek, NULL)
174 : PHP_FE(mysql_free_result, NULL)
175 : PHP_FE(mysql_field_name, NULL)
176 : PHP_FE(mysql_field_table, NULL)
177 : PHP_FE(mysql_field_len, NULL)
178 : PHP_FE(mysql_field_type, NULL)
179 : PHP_FE(mysql_field_flags, NULL)
180 : PHP_FE(mysql_escape_string, NULL)
181 : PHP_FE(mysql_real_escape_string, NULL)
182 : PHP_FE(mysql_stat, NULL)
183 : PHP_FE(mysql_thread_id, NULL)
184 : PHP_FE(mysql_client_encoding, NULL)
185 : PHP_FE(mysql_ping, NULL)
186 : #ifdef HAVE_GETINFO_FUNCS
187 : PHP_FE(mysql_get_client_info, NULL)
188 : PHP_FE(mysql_get_host_info, NULL)
189 : PHP_FE(mysql_get_proto_info, NULL)
190 : PHP_FE(mysql_get_server_info, NULL)
191 : #endif
192 :
193 : PHP_FE(mysql_info, NULL)
194 : #ifdef MYSQL_HAS_SET_CHARSET
195 : PHP_FE(mysql_set_charset, NULL)
196 : #endif
197 : /* for downwards compatability */
198 : PHP_FALIAS(mysql, mysql_db_query, NULL)
199 : PHP_FALIAS(mysql_fieldname, mysql_field_name, NULL)
200 : PHP_FALIAS(mysql_fieldtable, mysql_field_table, NULL)
201 : PHP_FALIAS(mysql_fieldlen, mysql_field_len, NULL)
202 : PHP_FALIAS(mysql_fieldtype, mysql_field_type, NULL)
203 : PHP_FALIAS(mysql_fieldflags, mysql_field_flags, NULL)
204 : PHP_FALIAS(mysql_selectdb, mysql_select_db, NULL)
205 : #ifndef NETWARE /* The below two functions not supported on NetWare */
206 : #if MYSQL_VERSION_ID < 40000
207 : PHP_DEP_FALIAS(mysql_createdb, mysql_create_db, NULL)
208 : PHP_DEP_FALIAS(mysql_dropdb, mysql_drop_db, NULL)
209 : #endif
210 : #endif /* NETWARE */
211 : PHP_FALIAS(mysql_freeresult, mysql_free_result, NULL)
212 : PHP_FALIAS(mysql_numfields, mysql_num_fields, NULL)
213 : PHP_FALIAS(mysql_numrows, mysql_num_rows, NULL)
214 : PHP_FALIAS(mysql_listdbs, mysql_list_dbs, NULL)
215 : PHP_DEP_FALIAS(mysql_listtables,mysql_list_tables, NULL)
216 : PHP_FALIAS(mysql_listfields, mysql_list_fields, NULL)
217 : PHP_FALIAS(mysql_db_name, mysql_result, NULL)
218 : PHP_FALIAS(mysql_dbname, mysql_result, NULL)
219 : PHP_FALIAS(mysql_tablename, mysql_result, NULL)
220 : PHP_FALIAS(mysql_table_name, mysql_result, NULL)
221 : {NULL, NULL, NULL}
222 : };
223 : /* }}} */
224 :
225 : /* Dependancies */
226 : static const zend_module_dep mysql_deps[] = {
227 : #if defined(MYSQL_USE_MYSQLND)
228 : ZEND_MOD_REQUIRED("mysqlnd")
229 : #endif
230 : {NULL, NULL, NULL}
231 : };
232 :
233 : /* {{{ mysql_module_entry
234 : */
235 : zend_module_entry mysql_module_entry = {
236 : #if ZEND_MODULE_API_NO >= 20050922
237 : STANDARD_MODULE_HEADER_EX, NULL,
238 : mysql_deps,
239 : #elif ZEND_MODULE_API_NO >= 20010901
240 : STANDARD_MODULE_HEADER,
241 : #endif
242 : "mysql",
243 : mysql_functions,
244 : ZEND_MODULE_STARTUP_N(mysql),
245 : PHP_MSHUTDOWN(mysql),
246 : PHP_RINIT(mysql),
247 : PHP_RSHUTDOWN(mysql),
248 : PHP_MINFO(mysql),
249 : "1.0",
250 : PHP_MODULE_GLOBALS(mysql),
251 : PHP_GINIT(mysql),
252 : NULL,
253 : NULL,
254 : STANDARD_MODULE_PROPERTIES_EX
255 : };
256 : /* }}} */
257 :
258 : #ifdef COMPILE_DL_MYSQL
259 : ZEND_GET_MODULE(mysql)
260 : #endif
261 :
262 : void timeout(int sig);
263 :
264 : #define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } }
265 :
266 : #if defined(MYSQL_USE_MYSQLND)
267 : #define PHPMY_UNBUFFERED_QUERY_CHECK() \
268 : {\
269 : if (mysql->active_result_id) { \
270 : do { \
271 : int type; \
272 : MYSQL_RES *mysql_result; \
273 : \
274 : mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
275 : if (mysql_result && type==le_result) { \
276 : if (mysql_result_is_unbuffered(mysql_result) && !mysql_eof(mysql_result)) { \
277 : php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching all rows from a previous unbuffered query"); \
278 : } \
279 : zend_list_delete(mysql->active_result_id); \
280 : mysql->active_result_id = 0; \
281 : } \
282 : } while(0); \
283 : }\
284 : }
285 : #else
286 : #define PHPMY_UNBUFFERED_QUERY_CHECK() \
287 : { \
288 : if (mysql->active_result_id) { \
289 : do { \
290 : int type; \
291 : MYSQL_RES *mysql_result; \
292 : \
293 : mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \
294 : if (mysql_result && type==le_result) { \
295 : if (!mysql_eof(mysql_result)) { \
296 : php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching all rows from a previous unbuffered query"); \
297 : while (mysql_fetch_row(mysql_result)); \
298 : } \
299 : zend_list_delete(mysql->active_result_id); \
300 : mysql->active_result_id = 0; \
301 : } \
302 : } while(0); \
303 : } \
304 : }
305 : #endif
306 :
307 : /* {{{ _free_mysql_result
308 : * This wrapper is required since mysql_free_result() returns an integer, and
309 : * thus, cannot be used directly
310 : */
311 : static void _free_mysql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
312 197 : {
313 197 : MYSQL_RES *mysql_result = (MYSQL_RES *)rsrc->ptr;
314 :
315 197 : mysql_free_result(mysql_result);
316 197 : MySG(result_allocated)--;
317 197 : }
318 : /* }}} */
319 :
320 : /* {{{ php_mysql_set_default_link
321 : */
322 : static void php_mysql_set_default_link(int id TSRMLS_DC)
323 182 : {
324 182 : if (MySG(default_link) != -1) {
325 8 : zend_list_delete(MySG(default_link));
326 : }
327 182 : MySG(default_link) = id;
328 182 : zend_list_addref(id);
329 182 : }
330 : /* }}} */
331 :
332 : /* {{{ php_mysql_select_db
333 : */
334 : static int php_mysql_select_db(php_mysql_conn *mysql, char *db TSRMLS_DC)
335 173 : {
336 173 : PHPMY_UNBUFFERED_QUERY_CHECK();
337 :
338 173 : if (mysql_select_db(mysql->conn, db) != 0) {
339 1 : return 0;
340 : } else {
341 172 : return 1;
342 : }
343 : }
344 : /* }}} */
345 :
346 : /* {{{ _close_mysql_link
347 : */
348 : static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)
349 165 : {
350 165 : php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr;
351 : void (*handler) (int);
352 :
353 165 : handler = signal(SIGPIPE, SIG_IGN);
354 165 : mysql_close(link->conn);
355 165 : signal(SIGPIPE, handler);
356 165 : efree(link);
357 165 : MySG(num_links)--;
358 165 : }
359 : /* }}} */
360 :
361 : /* {{{ _close_mysql_plink
362 : */
363 : static void _close_mysql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC)
364 7 : {
365 7 : php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr;
366 : void (*handler) (int);
367 :
368 7 : handler = signal(SIGPIPE, SIG_IGN);
369 7 : mysql_close(link->conn);
370 7 : signal(SIGPIPE, handler);
371 :
372 7 : free(link);
373 7 : MySG(num_persistent)--;
374 7 : MySG(num_links)--;
375 7 : }
376 : /* }}} */
377 :
378 : /* {{{ PHP_INI_MH
379 : */
380 : static PHP_INI_MH(OnMySQLPort)
381 17012 : {
382 17012 : if (new_value != NULL) { /* default port */
383 3 : MySG(default_port) = atoi(new_value);
384 : } else {
385 17009 : MySG(default_port) = -1;
386 : }
387 :
388 17012 : return SUCCESS;
389 : }
390 : /* }}} */
391 :
392 : /* {{{ PHP_INI */
393 : PHP_INI_BEGIN()
394 : STD_PHP_INI_BOOLEAN("mysql.allow_persistent", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_persistent, zend_mysql_globals, mysql_globals)
395 : STD_PHP_INI_ENTRY_EX("mysql.max_persistent", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_persistent, zend_mysql_globals, mysql_globals, display_link_numbers)
396 : STD_PHP_INI_ENTRY_EX("mysql.max_links", "-1", PHP_INI_SYSTEM, OnUpdateLong, max_links, zend_mysql_globals, mysql_globals, display_link_numbers)
397 : STD_PHP_INI_ENTRY("mysql.default_host", NULL, PHP_INI_ALL, OnUpdateString, default_host, zend_mysql_globals, mysql_globals)
398 : STD_PHP_INI_ENTRY("mysql.default_user", NULL, PHP_INI_ALL, OnUpdateString, default_user, zend_mysql_globals, mysql_globals)
399 : STD_PHP_INI_ENTRY("mysql.default_password", NULL, PHP_INI_ALL, OnUpdateString, default_password, zend_mysql_globals, mysql_globals)
400 : PHP_INI_ENTRY("mysql.default_port", NULL, PHP_INI_ALL, OnMySQLPort)
401 : #ifdef MYSQL_UNIX_ADDR
402 : STD_PHP_INI_ENTRY("mysql.default_socket", MYSQL_UNIX_ADDR,PHP_INI_ALL,OnUpdateStringUnempty, default_socket, zend_mysql_globals, mysql_globals)
403 : #else
404 : STD_PHP_INI_ENTRY("mysql.default_socket", NULL, PHP_INI_ALL, OnUpdateStringUnempty, default_socket, zend_mysql_globals, mysql_globals)
405 : #endif
406 : STD_PHP_INI_ENTRY("mysql.connect_timeout", "60", PHP_INI_ALL, OnUpdateLong, connect_timeout, zend_mysql_globals, mysql_globals)
407 : STD_PHP_INI_BOOLEAN("mysql.trace_mode", "0", PHP_INI_ALL, OnUpdateLong, trace_mode, zend_mysql_globals, mysql_globals)
408 : STD_PHP_INI_BOOLEAN("mysql.allow_local_infile", "1", PHP_INI_SYSTEM, OnUpdateLong, allow_local_infile, zend_mysql_globals, mysql_globals)
409 : #ifdef MYSQL_USE_MYSQLND
410 : STD_PHP_INI_ENTRY("mysql.cache_size", "2000", PHP_INI_SYSTEM, OnUpdateLong, cache_size, zend_mysql_globals, mysql_globals)
411 : #endif
412 : PHP_INI_END()
413 : /* }}} */
414 :
415 : /* {{{ PHP_GINIT_FUNCTION
416 : */
417 : static PHP_GINIT_FUNCTION(mysql)
418 17007 : {
419 17007 : mysql_globals->num_persistent = 0;
420 17007 : mysql_globals->default_socket = NULL;
421 17007 : mysql_globals->default_host = NULL;
422 17007 : mysql_globals->default_user = NULL;
423 17007 : mysql_globals->default_password = NULL;
424 17007 : mysql_globals->connect_errno = 0;
425 17007 : mysql_globals->connect_error = NULL;
426 17007 : mysql_globals->connect_timeout = 0;
427 17007 : mysql_globals->trace_mode = 0;
428 17007 : mysql_globals->allow_local_infile = 1;
429 17007 : mysql_globals->result_allocated = 0;
430 : #ifdef MYSQL_USE_MYSQLND
431 17007 : mysql_globals->cache_size = 0;
432 17007 : mysql_globals->mysqlnd_thd_zval_cache = NULL;
433 : #endif
434 17007 : }
435 : /* }}} */
436 :
437 : /* {{{ PHP_MINIT_FUNCTION
438 : */
439 : ZEND_MODULE_STARTUP_D(mysql)
440 17007 : {
441 17007 : REGISTER_INI_ENTRIES();
442 17007 : le_result = zend_register_list_destructors_ex(_free_mysql_result, NULL, "mysql result", module_number);
443 17007 : le_link = zend_register_list_destructors_ex(_close_mysql_link, NULL, "mysql link", module_number);
444 17007 : le_plink = zend_register_list_destructors_ex(NULL, _close_mysql_plink, "mysql link persistent", module_number);
445 17007 : Z_TYPE(mysql_module_entry) = type;
446 :
447 17007 : REGISTER_LONG_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT);
448 17007 : REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT);
449 17007 : REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT);
450 17007 : REGISTER_LONG_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT);
451 : #if MYSQL_VERSION_ID >= 40000
452 17007 : REGISTER_LONG_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT);
453 : #endif
454 17007 : REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT);
455 17007 : REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT);
456 :
457 : #ifndef MYSQL_USE_MYSQLND
458 : #if MYSQL_VERSION_ID >= 40000
459 : if (mysql_server_init(0, NULL, NULL)) {
460 : return FAILURE;
461 : }
462 : #endif
463 : #else
464 17007 : mysql_mysqlnd_zval_cache = mysqlnd_palloc_init_cache(MySG(cache_size));
465 17007 : mysql_mysqlnd_qcache = mysqlnd_qcache_init_cache();
466 : #endif
467 :
468 17007 : return SUCCESS;
469 : }
470 : /* }}} */
471 :
472 : /* {{{ PHP_MSHUTDOWN_FUNCTION
473 : */
474 : PHP_MSHUTDOWN_FUNCTION(mysql)
475 17039 : {
476 : #ifndef MYSQL_USE_MYSQLND
477 : #if MYSQL_VERSION_ID >= 40000
478 : #ifdef PHP_WIN32
479 : unsigned long client_ver = mysql_get_client_version();
480 : /*
481 : Can't call mysql_server_end() multiple times prior to 5.0.46 on Windows.
482 : PHP bug#41350 MySQL bug#25621
483 : */
484 : if ((client_ver >= 50046 && client_ver < 50100) || client_ver > 50122) {
485 : mysql_server_end();
486 : }
487 : #else
488 : mysql_server_end();
489 : #endif
490 : #endif
491 : #else
492 17039 : mysqlnd_palloc_free_cache(mysql_mysqlnd_zval_cache);
493 17039 : mysqlnd_qcache_free_cache_reference(&mysql_mysqlnd_qcache);
494 : #endif
495 :
496 17039 : UNREGISTER_INI_ENTRIES();
497 17039 : return SUCCESS;
498 : }
499 : /* }}} */
500 :
501 : /* {{{ PHP_RINIT_FUNCTION
502 : */
503 : PHP_RINIT_FUNCTION(mysql)
504 16993 : {
505 : #if !defined(MYSQL_USE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
506 : if (mysql_thread_init()) {
507 : return FAILURE;
508 : }
509 : #endif
510 16993 : MySG(default_link)=-1;
511 16993 : MySG(num_links) = MySG(num_persistent);
512 : /* Reset connect error/errno on every request */
513 16993 : MySG(connect_error) = NULL;
514 16993 : MySG(connect_errno) =0;
515 16993 : MySG(result_allocated) = 0;
516 :
517 : #ifdef MYSQL_USE_MYSQLND
518 16993 : MySG(mysqlnd_thd_zval_cache) = mysqlnd_palloc_rinit(mysql_mysqlnd_zval_cache);
519 : #endif
520 :
521 16993 : return SUCCESS;
522 : }
523 : /* }}} */
524 :
525 :
526 : #ifdef MYSQL_USE_MYSQLND
527 : static int php_mysql_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC)
528 323 : {
529 323 : if (le->type == le_plink) {
530 7 : mysqlnd_end_psession(((php_mysql_conn *) le->ptr)->conn);
531 : }
532 323 : return ZEND_HASH_APPLY_KEEP;
533 : } /* }}} */
534 : #endif
535 :
536 :
537 : /* {{{ PHP_RSHUTDOWN_FUNCTION
538 : */
539 : PHP_RSHUTDOWN_FUNCTION(mysql)
540 17025 : {
541 : #if !defined(MYSQL_USE_MYSQLND) && defined(ZTS) && MYSQL_VERSION_ID >= 40000
542 : mysql_thread_end();
543 : #endif
544 :
545 17025 : if (MySG(trace_mode)) {
546 2 : if (MySG(result_allocated)){
547 1 : php_error_docref("function.mysql-free-result" TSRMLS_CC, E_WARNING, "%lu result set(s) not freed. Use mysql_free_result to free result sets which were requested using mysql_query()", MySG(result_allocated));
548 : }
549 : }
550 :
551 17025 : if (MySG(connect_error)!=NULL) {
552 13 : efree(MySG(connect_error));
553 : }
554 :
555 : #ifdef MYSQL_USE_MYSQLND
556 17025 : zend_hash_apply(&EG(persistent_list), (apply_func_t) php_mysql_persistent_helper TSRMLS_CC);
557 17025 : mysqlnd_palloc_rshutdown(MySG(mysqlnd_thd_zval_cache));
558 : #endif
559 :
560 17025 : return SUCCESS;
561 : }
562 : /* }}} */
563 :
564 : /* {{{ PHP_MINFO_FUNCTION
565 : */
566 : PHP_MINFO_FUNCTION(mysql)
567 43 : {
568 : char buf[32];
569 :
570 43 : php_info_print_table_start();
571 43 : php_info_print_table_header(2, "MySQL Support", "enabled");
572 43 : snprintf(buf, sizeof(buf), "%ld", MySG(num_persistent));
573 43 : php_info_print_table_row(2, "Active Persistent Links", buf);
574 43 : snprintf(buf, sizeof(buf), "%ld", MySG(num_links));
575 43 : php_info_print_table_row(2, "Active Links", buf);
576 43 : php_info_print_table_row(2, "Client API version", mysql_get_client_info());
577 : #if !defined (PHP_WIN32) && !defined (NETWARE) && !defined(MYSQL_USE_MYSQLND)
578 : php_info_print_table_row(2, "MYSQL_MODULE_TYPE", PHP_MYSQL_TYPE);
579 : php_info_print_table_row(2, "MYSQL_SOCKET", MYSQL_UNIX_ADDR);
580 : php_info_print_table_row(2, "MYSQL_INCLUDE", PHP_MYSQL_INCLUDE);
581 : php_info_print_table_row(2, "MYSQL_LIBS", PHP_MYSQL_LIBS);
582 : #endif
583 : #if defined(MYSQL_USE_MYSQLND)
584 : {
585 : zval values;
586 :
587 43 : php_info_print_table_header(2, "Persistent cache", mysql_mysqlnd_zval_cache? "enabled":"disabled");
588 :
589 43 : if (mysql_mysqlnd_zval_cache) {
590 : /* Now report cache status */
591 43 : mysqlnd_palloc_stats(mysql_mysqlnd_zval_cache, &values);
592 43 : mysqlnd_minfo_print_hash(&values);
593 43 : zval_dtor(&values);
594 : }
595 : }
596 : #endif
597 :
598 43 : php_info_print_table_end();
599 :
600 43 : DISPLAY_INI_ENTRIES();
601 :
602 43 : }
603 : /* }}} */
604 :
605 : /* {{{ php_mysql_do_connect
606 : */
607 : #define MYSQL_DO_CONNECT_CLEANUP() \
608 : if (free_host) { \
609 : efree(host); \
610 : }
611 :
612 : #define MYSQL_DO_CONNECT_RETURN_FALSE() \
613 : MYSQL_DO_CONNECT_CLEANUP(); \
614 : RETURN_FALSE;
615 :
616 : #ifdef MYSQL_USE_MYSQLND
617 : #define MYSQL_PORT 0
618 : #endif
619 :
620 : static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
621 202 : {
622 202 : char *user=NULL, *passwd=NULL, *host_and_port=NULL, *socket=NULL, *tmp=NULL, *host=NULL;
623 : int user_len, passwd_len, host_len;
624 202 : char *hashed_details=NULL;
625 202 : int hashed_details_length, port = MYSQL_PORT;
626 202 : long client_flags = 0;
627 202 : php_mysql_conn *mysql=NULL;
628 : #if !defined(MYSQL_USE_MYSQLND) && !defined(MYSQL_HAS_SET_CHARSET)
629 : char *encoding;
630 : #endif
631 : #if MYSQL_VERSION_ID <= 32230
632 : void (*handler) (int);
633 : #endif
634 202 : zend_bool free_host=0, new_link=0;
635 : long connect_timeout;
636 :
637 : #if !defined(MYSQL_USE_MYSQLND)
638 : if ((MYSQL_VERSION_ID / 100) != (mysql_get_client_version() / 100)) {
639 : php_error_docref(NULL TSRMLS_CC, E_WARNING,
640 : "Headers and client library minor version mismatch. Headers:%d Library:%ld",
641 : MYSQL_VERSION_ID, mysql_get_client_version());
642 : }
643 : #endif
644 :
645 202 : connect_timeout = MySG(connect_timeout);
646 :
647 202 : socket = MySG(default_socket);
648 :
649 202 : if (MySG(default_port) < 0) {
650 : #if !defined(PHP_WIN32) && !defined(NETWARE)
651 : struct servent *serv_ptr;
652 : char *env;
653 :
654 151 : MySG(default_port) = MYSQL_PORT;
655 151 : if ((serv_ptr = getservbyname("mysql", "tcp"))) {
656 151 : MySG(default_port) = (uint) ntohs((ushort) serv_ptr->s_port);
657 : }
658 151 : if ((env = getenv("MYSQL_TCP_PORT"))) {
659 1 : MySG(default_port) = (uint) atoi(env);
660 : }
661 : #else
662 : MySG(default_port) = MYSQL_PORT;
663 : #endif
664 : }
665 :
666 202 : if (PG(sql_safe_mode)) {
667 3 : if (ZEND_NUM_ARGS()>0) {
668 3 : php_error_docref(NULL TSRMLS_CC, E_NOTICE, "SQL safe mode in effect - ignoring host/user/password information");
669 : }
670 3 : host_and_port=passwd=NULL;
671 3 : user=php_get_current_user();
672 3 : hashed_details_length = spprintf(&hashed_details, 0, "mysql__%s_", user);
673 3 : client_flags = CLIENT_INTERACTIVE;
674 : } else {
675 199 : host_and_port = MySG(default_host);
676 199 : user = MySG(default_user);
677 199 : passwd = MySG(default_password);
678 :
679 : /* mysql_pconnect does not support new_link parameter */
680 199 : if (persistent) {
681 18 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&s&s&l", &host_and_port, &host_len, UG(utf8_conv),
682 : &user, &user_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv),
683 : &client_flags)==FAILURE) {
684 1 : return;
685 : }
686 : } else {
687 181 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s&s&s&bl", &host_and_port, &host_len, UG(utf8_conv),
688 : &user, &user_len, UG(utf8_conv), &passwd, &passwd_len, UG(utf8_conv),
689 : &new_link, &client_flags)==FAILURE) {
690 1 : return;
691 : }
692 : }
693 :
694 : /* disable local infile option for open_basedir */
695 197 : if (((PG(open_basedir) && PG(open_basedir)[0] != '\0')) && (client_flags & CLIENT_LOCAL_FILES)) {
696 1 : client_flags ^= CLIENT_LOCAL_FILES;
697 : }
698 :
699 : #ifdef CLIENT_MULTI_STATEMENTS
700 197 : client_flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */
701 : #endif
702 197 : hashed_details_length = spprintf(&hashed_details, 0, "mysql_%s_%s_%s_%ld", SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags);
703 : }
704 :
705 : /* We cannot use mysql_port anymore in windows, need to use
706 : * mysql_real_connect() to set the port.
707 : */
708 386 : if (host_and_port && (tmp=strchr(host_and_port, ':'))) {
709 186 : host = estrndup(host_and_port, tmp-host_and_port);
710 186 : free_host = 1;
711 186 : tmp++;
712 186 : if (tmp[0] != '/') {
713 186 : port = atoi(tmp);
714 186 : if ((tmp=strchr(tmp, ':'))) {
715 0 : tmp++;
716 0 : socket=tmp;
717 : }
718 : } else {
719 0 : socket = tmp;
720 : }
721 : } else {
722 14 : host = host_and_port;
723 14 : port = MySG(default_port);
724 : }
725 :
726 : #if MYSQL_VERSION_ID < 32200
727 : mysql_port = port;
728 : #endif
729 :
730 200 : if (!MySG(allow_persistent)) {
731 5 : persistent=0;
732 : }
733 200 : if (persistent) {
734 : zend_rsrc_list_entry *le;
735 :
736 : /* try to find if we already have this link in our persistent list */
737 16 : if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { /* we don't */
738 : zend_rsrc_list_entry new_le;
739 :
740 10 : if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) {
741 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links));
742 0 : efree(hashed_details);
743 0 : MYSQL_DO_CONNECT_RETURN_FALSE();
744 : }
745 10 : if (MySG(max_persistent) != -1 && MySG(num_persistent) >= MySG(max_persistent)) {
746 1 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)", MySG(num_persistent));
747 1 : efree(hashed_details);
748 1 : MYSQL_DO_CONNECT_RETURN_FALSE();
749 : }
750 : /* create the link */
751 9 : mysql = (php_mysql_conn *) malloc(sizeof(php_mysql_conn));
752 9 : mysql->active_result_id = 0;
753 : #ifdef CLIENT_MULTI_STATEMENTS
754 9 : mysql->multi_query = client_flags & CLIENT_MULTI_STATEMENTS? 1:0;
755 : #else
756 : mysql->multi_query = 0;
757 : #endif
758 : #ifndef MYSQL_USE_MYSQLND
759 : mysql->conn = mysql_init(NULL);
760 : #else
761 9 : mysql->conn = mysql_init(persistent);
762 : #endif
763 9 : mysql_options(mysql->conn, MYSQL_SET_CHARSET_NAME, "utf8");
764 :
765 9 : if (connect_timeout != -1) {
766 9 : mysql_options(mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
767 : }
768 : #ifndef MYSQL_USE_MYSQLND
769 : if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL)
770 : #else
771 9 : if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0,
772 : port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL)
773 : #endif
774 : {
775 : /* Populate connect error globals so that the error functions can read them */
776 2 : if (MySG(connect_error) != NULL) {
777 1 : efree(MySG(connect_error));
778 : }
779 2 : MySG(connect_error) = estrdup(mysql_error(mysql->conn));
780 2 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", MySG(connect_error));
781 : #if defined(HAVE_MYSQL_ERRNO)
782 2 : MySG(connect_errno) = mysql_errno(mysql->conn);
783 : #endif
784 2 : free(mysql);
785 2 : efree(hashed_details);
786 2 : MYSQL_DO_CONNECT_RETURN_FALSE();
787 : }
788 7 : mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile));
789 :
790 : #if !defined(MYSQL_USE_MYSQLND)
791 : #ifdef MYSQL_HAS_SET_CHARSET
792 : mysql_set_character_set(mysql->conn, "utf8");
793 : #else
794 : encoding = mysql_character_set_name(mysql->conn);
795 : if (strcasecmp((char*)encoding, "utf8")) {
796 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't connect in Unicode mode. Client library was compiled with default charset %s", encoding);
797 : MYSQL_DO_CONNECT_RETURN_FALSE();
798 : }
799 : #endif
800 : #endif
801 :
802 : /* hash it up */
803 7 : Z_TYPE(new_le) = le_plink;
804 7 : new_le.ptr = mysql;
805 7 : if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) {
806 0 : free(mysql);
807 0 : efree(hashed_details);
808 0 : MYSQL_DO_CONNECT_RETURN_FALSE();
809 : }
810 7 : MySG(num_persistent)++;
811 7 : MySG(num_links)++;
812 : } else { /* The link is in our list of persistent connections */
813 6 : if (Z_TYPE_P(le) != le_plink) {
814 0 : MYSQL_DO_CONNECT_RETURN_FALSE();
815 : }
816 6 : mysql = (php_mysql_conn *) le->ptr;
817 6 : mysql->active_result_id = 0;
818 : #ifdef CLIENT_MULTI_STATEMENTS
819 6 : mysql->multi_query = client_flags & CLIENT_MULTI_STATEMENTS? 1:0;
820 : #else
821 : mysql->multi_query = 0;
822 : #endif
823 : /* ensure that the link did not die */
824 : #if defined(MYSQL_USE_MYSQLND)
825 6 : mysqlnd_end_psession(mysql->conn);
826 : #endif
827 6 : if (mysql_ping(mysql->conn)) {
828 1 : if (mysql_errno(mysql->conn) == 2006) {
829 1 : mysql_options(mysql->conn, MYSQL_SET_CHARSET_NAME, "utf8");
830 : #ifndef MYSQL_USE_MYSQLND
831 : if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL)
832 : #else
833 1 : if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0,
834 : port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL)
835 : #endif
836 : {
837 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect");
838 0 : zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1);
839 0 : efree(hashed_details);
840 0 : MYSQL_DO_CONNECT_RETURN_FALSE();
841 : }
842 : #if !defined(MYSQL_USE_MYSQLND)
843 : #ifdef MYSQL_HAS_SET_CHARSET
844 : mysql_set_character_set(mysql->conn, "utf8");
845 : #else
846 : if (strcasecmp((char*)encoding, "utf8")) {
847 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't connect in Unicode mode. Client library was compiled with default charset %s", encoding);
848 : MYSQL_DO_CONNECT_RETURN_FALSE();
849 : }
850 : #endif
851 : #endif
852 1 : mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile));
853 : }
854 : } else {
855 : #ifdef MYSQL_USE_MYSQLND
856 5 : mysqlnd_restart_psession(mysql->conn, MySG(mysqlnd_thd_zval_cache));
857 : #endif
858 : }
859 : }
860 13 : ZEND_REGISTER_RESOURCE(return_value, mysql, le_plink);
861 : } else { /* non persistent */
862 : zend_rsrc_list_entry *index_ptr, new_index_ptr;
863 :
864 : /* first we check the hash for the hashed_details key. if it exists,
865 : * it should point us to the right offset where the actual mysql link sits.
866 : * if it doesn't, open a new mysql link, add it to the resource list,
867 : * and add a pointer to it with hashed_details as the key.
868 : */
869 184 : if (!new_link && zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length+1,(void **) &index_ptr)==SUCCESS) {
870 : int type;
871 : long link;
872 : void *ptr;
873 :
874 8 : if (Z_TYPE_P(index_ptr) != le_index_ptr) {
875 0 : MYSQL_DO_CONNECT_RETURN_FALSE();
876 : }
877 8 : link = (long) index_ptr->ptr;
878 8 : ptr = zend_list_find(link,&type); /* check if the link is still there */
879 8 : if (ptr && (type==le_link || type==le_plink)) {
880 4 : zend_list_addref(link);
881 4 : Z_LVAL_P(return_value) = link;
882 4 : php_mysql_set_default_link(link TSRMLS_CC);
883 4 : Z_TYPE_P(return_value) = IS_RESOURCE;
884 4 : efree(hashed_details);
885 4 : MYSQL_DO_CONNECT_CLEANUP();
886 4 : return;
887 : } else {
888 4 : zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1);
889 : }
890 : }
891 180 : if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) {
892 3 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links));
893 3 : efree(hashed_details);
894 3 : MYSQL_DO_CONNECT_RETURN_FALSE();
895 : }
896 :
897 177 : mysql = (php_mysql_conn *) emalloc(sizeof(php_mysql_conn));
898 177 : mysql->active_result_id = 0;
899 : #ifdef CLIENT_MULTI_STATEMENTS
900 177 : mysql->multi_query = 1;
901 : #else
902 : mysql->multi_query = 0;
903 : #endif
904 : #ifndef MYSQL_USE_MYSQLND
905 : mysql->conn = mysql_init(NULL);
906 : #else
907 177 : mysql->conn = mysql_init(persistent);
908 : #endif
909 :
910 177 : mysql_options(mysql->conn, MYSQL_SET_CHARSET_NAME, "utf8");
911 :
912 177 : if (connect_timeout != -1) {
913 177 : mysql_options(mysql->conn, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&connect_timeout);
914 : }
915 :
916 : #ifndef MYSQL_USE_MYSQLND
917 : if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL)
918 : #else
919 177 : if (mysqlnd_connect(mysql->conn, host, user, passwd, 0, NULL, 0,
920 : port, socket, client_flags, MySG(mysqlnd_thd_zval_cache) TSRMLS_CC) == NULL)
921 : #endif
922 : {
923 : /* Populate connect error globals so that the error functions can read them */
924 12 : if (MySG(connect_error) != NULL) {
925 0 : efree(MySG(connect_error));
926 : }
927 12 : MySG(connect_error) = estrdup(mysql_error(mysql->conn));
928 12 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", MySG(connect_error));
929 : #if defined(HAVE_MYSQL_ERRNO)
930 12 : MySG(connect_errno) = mysql_errno(mysql->conn);
931 : #endif
932 12 : efree(hashed_details);
933 : /* free mysql structure */
934 : #ifdef MYSQL_USE_MYSQLND
935 12 : mysqlnd_close(mysql->conn, MYSQLND_CLOSE_DISCONNECTED);
936 : #endif
937 12 : efree(mysql);
938 12 : MYSQL_DO_CONNECT_RETURN_FALSE();
939 : }
940 :
941 : #if !defined(MYSQL_USE_MYSQLND)
942 : #ifdef MYSQL_HAS_SET_CHARSET
943 : mysql_set_character_set(mysql->conn, "utf8");
944 : #else
945 : if (strcasecmp((char*)encoding, "utf8")) {
946 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't connect in Unicode mode. Client library was compiled with default charset %s", encoding);
947 : MYSQL_DO_CONNECT_RETURN_FALSE();
948 : }
949 : #endif
950 : #endif
951 165 : mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile));
952 :
953 : /* add it to the list */
954 165 : ZEND_REGISTER_RESOURCE(return_value, mysql, le_link);
955 :
956 : /* add it to the hash */
957 165 : new_index_ptr.ptr = (void *) Z_LVAL_P(return_value);
958 165 : Z_TYPE(new_index_ptr) = le_index_ptr;
959 165 : if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length+1,(void *) &new_index_ptr, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) {
960 0 : efree(hashed_details);
961 0 : MYSQL_DO_CONNECT_RETURN_FALSE();
962 : }
963 165 : MySG(num_links)++;
964 : }
965 :
966 178 : efree(hashed_details);
967 178 : php_mysql_set_default_link(Z_LVAL_P(return_value) TSRMLS_CC);
968 178 : MYSQL_DO_CONNECT_CLEANUP();
969 : }
970 : /* }}} */
971 :
972 : /* {{{ php_mysql_get_default_link
973 : */
974 : static int php_mysql_get_default_link(INTERNAL_FUNCTION_PARAMETERS)
975 27 : {
976 27 : if (MySG(default_link)==-1) { /* no link opened yet, implicitly open one */
977 5 : ht = 0;
978 5 : php_mysql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
979 : }
980 27 : return MySG(default_link);
981 : }
982 : /* }}} */
983 :
984 : /* {{{ proto resource mysql_connect([string hostname[:port][:/path/to/socket] [, string username [, string password [, bool new [, int flags]]]]]) U
985 : Opens a connection to a MySQL Server */
986 : PHP_FUNCTION(mysql_connect)
987 178 : {
988 178 : php_mysql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
989 178 : }
990 : /* }}} */
991 :
992 : /* {{{ proto resource mysql_pconnect([string hostname[:port][:/path/to/socket] [, string username [, string password [, int flags]]]]) U
993 : Opens a persistent connection to a MySQL Server */
994 : PHP_FUNCTION(mysql_pconnect)
995 19 : {
996 19 : php_mysql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
997 19 : }
998 : /* }}} */
999 :
1000 : /* {{{ proto bool mysql_close([int link_identifier]) U
1001 : Close a MySQL connection */
1002 : PHP_FUNCTION(mysql_close)
1003 175 : {
1004 : int resource_id;
1005 175 : zval *mysql_link=NULL;
1006 : php_mysql_conn *mysql;
1007 :
1008 175 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1009 2 : return;
1010 : }
1011 :
1012 173 : if (mysql_link) {
1013 166 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, -1, "MySQL-Link", le_link, le_plink);
1014 : } else {
1015 7 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, NULL, MySG(default_link), "MySQL-Link", le_link, le_plink);
1016 : }
1017 :
1018 170 : resource_id = mysql_link ? Z_RESVAL_P(mysql_link) : MySG(default_link);
1019 170 : PHPMY_UNBUFFERED_QUERY_CHECK();
1020 : #ifdef MYSQL_USE_MYSQLND
1021 : {
1022 : int tmp;
1023 170 : if ((mysql = zend_list_find(resource_id, &tmp)) && tmp == le_plink) {
1024 14 : mysqlnd_end_psession(mysql->conn);
1025 : }
1026 : }
1027 : #endif
1028 170 : zend_list_delete(resource_id);
1029 :
1030 170 : if (!mysql_link
1031 : || (mysql_link && Z_RESVAL_P(mysql_link)==MySG(default_link))) {
1032 163 : MySG(default_link) = -1;
1033 163 : if (mysql_link) {
1034 : /* on an explicit close of the default connection it had a refcount of 2 so we need one more call */
1035 159 : zend_list_delete(resource_id);
1036 : }
1037 : }
1038 :
1039 170 : RETURN_TRUE;
1040 : }
1041 : /* }}} */
1042 :
1043 : /* {{{ proto bool mysql_select_db(string database_name [, int link_identifier]) U
1044 : Selects a MySQL database */
1045 : PHP_FUNCTION(mysql_select_db)
1046 167 : {
1047 : zval *mysql_link;
1048 : char *db;
1049 167 : int id=-1, db_len;
1050 : php_mysql_conn *mysql;
1051 :
1052 167 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|r", &db, &db_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1053 1 : return;
1054 : }
1055 :
1056 166 : if (ZEND_NUM_ARGS() == 1) {
1057 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1058 1 : CHECK_LINK(id);
1059 : }
1060 :
1061 165 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1062 :
1063 164 : if (php_mysql_select_db(mysql, db TSRMLS_CC)) {
1064 163 : RETURN_TRUE;
1065 : } else {
1066 1 : RETURN_FALSE;
1067 : }
1068 : }
1069 : /* }}} */
1070 :
1071 : #ifdef HAVE_GETINFO_FUNCS
1072 :
1073 : /* {{{ proto string mysql_get_client_info(void) U
1074 : Returns a string that represents the client library version */
1075 : PHP_FUNCTION(mysql_get_client_info)
1076 162 : {
1077 162 : if (zend_parse_parameters_none() == FAILURE) {
1078 1 : return;
1079 : }
1080 :
1081 161 : RETURN_UTF8_STRING((char *)mysql_get_client_info(), ZSTR_DUPLICATE);
1082 : }
1083 : /* }}} */
1084 :
1085 : /* {{{ proto string mysql_get_host_info([int link_identifier]) U
1086 : Returns a string describing the type of connection in use, including the server host name */
1087 : PHP_FUNCTION(mysql_get_host_info)
1088 4 : {
1089 4 : zval *mysql_link = NULL;
1090 4 : int id = -1;
1091 : php_mysql_conn *mysql;
1092 :
1093 4 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1094 2 : return;
1095 : }
1096 :
1097 2 : if (!mysql_link) {
1098 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1099 1 : CHECK_LINK(id);
1100 : }
1101 :
1102 2 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1103 :
1104 2 : RETURN_UTF8_STRING((char *)mysql_get_host_info(mysql->conn), ZSTR_DUPLICATE);
1105 : }
1106 : /* }}} */
1107 :
1108 : /* {{{ proto int mysql_get_proto_info([int link_identifier]) U
1109 : Returns the protocol version used by current connection */
1110 : PHP_FUNCTION(mysql_get_proto_info)
1111 4 : {
1112 4 : zval *mysql_link = NULL;
1113 4 : int id = -1;
1114 : php_mysql_conn *mysql;
1115 :
1116 4 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1117 2 : return;
1118 : }
1119 :
1120 2 : if (!mysql_link) {
1121 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1122 1 : CHECK_LINK(id);
1123 : }
1124 :
1125 2 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1126 :
1127 2 : RETURN_LONG(mysql_get_proto_info(mysql->conn));
1128 : }
1129 : /* }}} */
1130 :
1131 : /* {{{ proto string mysql_get_server_info([int link_identifier]) U
1132 : Returns a string that represents the server version number */
1133 : PHP_FUNCTION(mysql_get_server_info)
1134 7 : {
1135 7 : zval *mysql_link = NULL;
1136 7 : int id = -1;
1137 : php_mysql_conn *mysql;
1138 :
1139 7 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1140 2 : return;
1141 : }
1142 :
1143 5 : if (!mysql_link) {
1144 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1145 1 : CHECK_LINK(id);
1146 : }
1147 :
1148 5 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1149 :
1150 5 : RETURN_UTF8_STRING((char *)mysql_get_server_info(mysql->conn), ZSTR_DUPLICATE);
1151 : }
1152 : /* }}} */
1153 :
1154 : /* {{{ proto string mysql_info([int link_identifier]) U
1155 : Returns a string containing information about the most recent query */
1156 : PHP_FUNCTION(mysql_info)
1157 8 : {
1158 8 : zval *mysql_link = NULL;
1159 8 : int id = -1;
1160 : char *str;
1161 : php_mysql_conn *mysql;
1162 :
1163 8 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1164 1 : return;
1165 : }
1166 :
1167 7 : if (ZEND_NUM_ARGS() == 0) {
1168 2 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1169 2 : CHECK_LINK(id);
1170 : }
1171 :
1172 6 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1173 :
1174 6 : if ((str = (char *)mysql_info(mysql->conn))) {
1175 5 : RETURN_UTF8_STRING(str,ZSTR_DUPLICATE);
1176 : } else {
1177 1 : RETURN_FALSE;
1178 : }
1179 : }
1180 : /* }}} */
1181 :
1182 : /* {{{ proto int mysql_thread_id([int link_identifier]) U
1183 : Returns the thread id of current connection */
1184 : PHP_FUNCTION(mysql_thread_id)
1185 18 : {
1186 18 : zval *mysql_link = NULL;
1187 18 : int id = -1;
1188 : php_mysql_conn *mysql;
1189 :
1190 18 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1191 1 : return;
1192 : }
1193 :
1194 17 : if (ZEND_NUM_ARGS() == 0) {
1195 3 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1196 3 : CHECK_LINK(id);
1197 : }
1198 17 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1199 :
1200 16 : RETURN_LONG((long) mysql_thread_id(mysql->conn));
1201 : }
1202 : /* }}} */
1203 :
1204 : /* {{{ proto string mysql_stat([int link_identifier]) U
1205 : Returns a string containing status information */
1206 : PHP_FUNCTION(mysql_stat)
1207 5 : {
1208 5 : zval *mysql_link = NULL;
1209 5 : int id = -1;
1210 : php_mysql_conn *mysql;
1211 : char *stat;
1212 : #ifdef MYSQL_USE_MYSQLND
1213 : uint stat_len;
1214 : #endif
1215 :
1216 5 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1217 2 : return;
1218 : }
1219 :
1220 3 : if (ZEND_NUM_ARGS() == 0) {
1221 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1222 1 : CHECK_LINK(id);
1223 : }
1224 3 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1225 :
1226 2 : PHPMY_UNBUFFERED_QUERY_CHECK();
1227 : #ifndef MYSQL_USE_MYSQLND
1228 : if ((stat = (char *)mysql_stat(mysql->conn))) {
1229 : RETURN_UTF8_STRING(stat, ZSTR_DUPLICATE);
1230 : #else
1231 2 : if (mysqlnd_stat(mysql->conn, &stat, &stat_len) == PASS) {
1232 2 : RETURN_UTF8_STRINGL(stat, stat_len, ZSTR_AUTOFREE);
1233 : #endif
1234 : } else {
1235 0 : RETURN_FALSE;
1236 : }
1237 :
1238 : }
1239 : /* }}} */
1240 :
1241 : /* {{{ proto string mysql_client_encoding([int link_identifier]) U
1242 : Returns the default character set for the current connection */
1243 : PHP_FUNCTION(mysql_client_encoding)
1244 3 : {
1245 3 : zval *mysql_link = NULL;
1246 3 : int id = -1;
1247 : php_mysql_conn *mysql;
1248 :
1249 3 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1250 0 : return;
1251 : }
1252 :
1253 3 : if (ZEND_NUM_ARGS() == 0) {
1254 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1255 1 : CHECK_LINK(id);
1256 : }
1257 :
1258 3 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1259 :
1260 2 : RETURN_UTF8_STRING((char *)mysql_character_set_name(mysql->conn), ZSTR_DUPLICATE);
1261 : }
1262 : /* }}} */
1263 : #endif
1264 :
1265 : #ifdef MYSQL_HAS_SET_CHARSET
1266 : /* {{{ proto bool mysql_set_charset(string csname [, int link_identifier]) U
1267 : sets client character set */
1268 : PHP_FUNCTION(mysql_set_charset)
1269 0 : {
1270 0 : zval *mysql_link = NULL;
1271 : char *csname;
1272 0 : int id = -1, csname_len;
1273 : php_mysql_conn *mysql;
1274 :
1275 0 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|r", &csname, &csname_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1276 0 : return;
1277 : }
1278 :
1279 0 : if (ZEND_NUM_ARGS() == 1) {
1280 0 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1281 0 : CHECK_LINK(id);
1282 : }
1283 :
1284 0 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1285 :
1286 : /* Only allow the use of this function with unicode.semantics=On */
1287 0 : if (csname_len != 4 || strncasecmp(csname, "utf8", 4)) {
1288 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Character set %s is not supported when running PHP with unicode.semantics=On.", csname);
1289 0 : RETURN_FALSE;
1290 : }
1291 :
1292 0 : if (!mysql_set_character_set(mysql->conn, csname)) {
1293 0 : RETURN_TRUE;
1294 : } else {
1295 0 : RETURN_FALSE;
1296 : }
1297 : }
1298 : /* }}} */
1299 : #endif
1300 :
1301 : #ifndef NETWARE /* The below two functions not supported on NetWare */
1302 : #if MYSQL_VERSION_ID < 40000
1303 : /* {{{ proto bool mysql_create_db(string database_name [, int link_identifier]) U
1304 : Create a MySQL database */
1305 : PHP_FUNCTION(mysql_create_db)
1306 : {
1307 : zval *mysql_link;
1308 : int id = -1, db_len;
1309 : char *db;
1310 : php_mysql_conn *mysql;
1311 :
1312 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|r", &db, &db_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1313 : RETURN_FALSE;
1314 : }
1315 :
1316 : if (ZEND_NUM_ARGS() == 1) {
1317 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1318 : CHECK_LINK(id);
1319 : }
1320 :
1321 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1322 :
1323 : PHPMY_UNBUFFERED_QUERY_CHECK();
1324 :
1325 : if (mysql_create_db(mysql->conn, db)==0) {
1326 : RETURN_TRUE;
1327 : } else {
1328 : RETURN_FALSE;
1329 : }
1330 : }
1331 : /* }}} */
1332 :
1333 : /* {{{ proto bool mysql_drop_db(string database_name [, int link_identifier]) U
1334 : Drops (delete) a MySQL database */
1335 : PHP_FUNCTION(mysql_drop_db)
1336 : {
1337 : zval *mysql_link;
1338 : char *db;
1339 : int id = -1, db_len;
1340 : php_mysql_conn *mysql;
1341 :
1342 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|r", &db, &db_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1343 : RETURN_FALSE;
1344 : }
1345 :
1346 : if (ZEND_NUM_ARGS() == 1) {
1347 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1348 : CHECK_LINK(id);
1349 : }
1350 :
1351 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1352 :
1353 : if (mysql_drop_db(mysql->conn, db)==0) {
1354 : RETURN_TRUE;
1355 : } else {
1356 : RETURN_FALSE;
1357 : }
1358 : }
1359 : /* }}} */
1360 : #endif
1361 : #endif /* NETWARE */
1362 :
1363 : /* {{{ php_mysql_do_query_general
1364 : */
1365 : static void php_mysql_do_query_general(char *query, zval **mysql_link, int link_id, char *db, int use_store, zval *return_value TSRMLS_DC)
1366 781 : {
1367 : php_mysql_conn *mysql;
1368 : MYSQL_RES *mysql_result;
1369 :
1370 781 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, link_id, "MySQL-Link", le_link, le_plink);
1371 :
1372 778 : if (db) {
1373 3 : if (!php_mysql_select_db(mysql, db TSRMLS_CC)) {
1374 0 : RETURN_FALSE;
1375 : }
1376 : }
1377 :
1378 778 : PHPMY_UNBUFFERED_QUERY_CHECK();
1379 :
1380 778 : MYSQL_DISABLE_MQ;
1381 : #ifndef MYSQL_USE_MYSQLND
1382 : /* check explain */
1383 : if (MySG(trace_mode)) {
1384 : if (!strncasecmp("select", query, 6)){
1385 : MYSQL_ROW row;
1386 :
1387 : char *newquery;
1388 : spprintf(&newquery, 0, "EXPLAIN %s", query);
1389 : mysql_real_query(mysql->conn, newquery, strlen(newquery));
1390 : efree (newquery);
1391 : if (mysql_errno(mysql->conn)) {
1392 : php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
1393 : RETURN_FALSE;
1394 : }
1395 : else {
1396 : mysql_result = mysql_use_result(mysql->conn);
1397 : while ((row = mysql_fetch_row(mysql_result))) {
1398 : if (!strcmp("ALL", row[1])) {
1399 : php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "Your query requires a full tablescan (table %s, %s rows affected). Use EXPLAIN to optimize your query", row[0], row[6]);
1400 : } else if (!strcmp("INDEX", row[1])) {
1401 : php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "Your query requires a full indexscan (table %s, %s rows affected). Use EXPLAIN to optimize your query", row[0], row[6]);
1402 : }
1403 : }
1404 : mysql_free_result(mysql_result);
1405 : }
1406 : }
1407 : } /* end explain */
1408 : #endif
1409 :
1410 : /* mysql_query is binary unsafe, use mysql_real_query */
1411 : #if MYSQL_VERSION_ID > 32199
1412 778 : if (mysql_real_query(mysql->conn, query, strlen(query))!=0) {
1413 : /* check possible error */
1414 16 : if (MySG(trace_mode)){
1415 1 : if (mysql_errno(mysql->conn)){
1416 1 : php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
1417 : }
1418 : }
1419 16 : RETURN_FALSE;
1420 : }
1421 : #else
1422 : if (mysql_query(mysql->conn, query)!=0) {
1423 : /* check possible error */
1424 : if (MySG(trace_mode)){
1425 : if (mysql_errno(mysql->conn)){
1426 : php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
1427 : }
1428 : }
1429 : RETURN_FALSE;
1430 : }
1431 : #endif
1432 762 : if(use_store == MYSQL_USE_RESULT) {
1433 11 : mysql_result=mysql_use_result(mysql->conn);
1434 : } else {
1435 751 : mysql_result=mysql_store_result(mysql->conn);
1436 : }
1437 762 : if (!mysql_result) {
1438 575 : if (PHP_MYSQL_VALID_RESULT(mysql->conn)) { /* query should have returned rows */
1439 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save result set");
1440 0 : RETURN_FALSE;
1441 : } else {
1442 575 : RETURN_TRUE;
1443 : }
1444 : }
1445 187 : MySG(result_allocated)++;
1446 187 : ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
1447 187 : if (use_store == MYSQL_USE_RESULT) {
1448 5 : mysql->active_result_id = Z_LVAL_P(return_value);
1449 : }
1450 : }
1451 : /* }}} */
1452 :
1453 : /* {{{ php_mysql_do_query
1454 : */
1455 : static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERS, int use_store)
1456 783 : {
1457 : zval *mysql_link;
1458 : char *query;
1459 783 : int id=-1, query_len;
1460 :
1461 783 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|r", &query, &query_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1462 3 : return;
1463 : }
1464 :
1465 780 : if (ZEND_NUM_ARGS() == 1) {
1466 8 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1467 8 : CHECK_LINK(id);
1468 : }
1469 778 : php_mysql_do_query_general(query, &mysql_link, id, NULL, use_store, return_value TSRMLS_CC);
1470 : }
1471 : /* }}} */
1472 :
1473 : /* {{{ proto resource mysql_query(string query [, int link_identifier]) U
1474 : Sends an SQL query to MySQL */
1475 : PHP_FUNCTION(mysql_query)
1476 766 : {
1477 766 : php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
1478 766 : }
1479 : /* }}} */
1480 :
1481 :
1482 : /* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier]) U
1483 : Sends an SQL query to MySQL, without fetching and buffering the result rows */
1484 : PHP_FUNCTION(mysql_unbuffered_query)
1485 17 : {
1486 17 : php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);
1487 17 : }
1488 : /* }}} */
1489 :
1490 :
1491 : /* {{{ proto resource mysql_db_query(string database_name, string query [, int link_identifier]) U
1492 : Sends an SQL query to MySQL */
1493 : PHP_FUNCTION(mysql_db_query)
1494 6 : {
1495 : zval *mysql_link;
1496 : char *db, *query;
1497 6 : int id = -1, db_len, query_len;
1498 :
1499 6 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&s&|r", &db, &db_len, UG(utf8_conv), &query, &query_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1500 3 : return;
1501 : }
1502 :
1503 3 : if (ZEND_NUM_ARGS() == 2) {
1504 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1505 1 : CHECK_LINK(id);
1506 : }
1507 :
1508 3 : php_error_docref(NULL TSRMLS_CC, E_DEPRECATED, "use mysql_query() instead");
1509 :
1510 3 : php_mysql_do_query_general(query, &mysql_link, id, db, MYSQL_STORE_RESULT, return_value TSRMLS_CC);
1511 : }
1512 : /* }}} */
1513 :
1514 :
1515 : /* {{{ proto resource mysql_list_dbs([int link_identifier]) U
1516 : List databases available on a MySQL server */
1517 : PHP_FUNCTION(mysql_list_dbs)
1518 5 : {
1519 5 : zval *mysql_link = NULL;
1520 5 : int id = -1;
1521 : php_mysql_conn *mysql;
1522 : MYSQL_RES *mysql_result;
1523 :
1524 5 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1525 2 : return;
1526 : }
1527 :
1528 3 : if (!mysql_link) {
1529 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1530 1 : CHECK_LINK(id);
1531 : }
1532 :
1533 3 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1534 :
1535 3 : PHPMY_UNBUFFERED_QUERY_CHECK();
1536 :
1537 3 : if ((mysql_result=mysql_list_dbs(mysql->conn, NULL))==NULL) {
1538 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
1539 0 : RETURN_FALSE;
1540 : }
1541 3 : ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
1542 : }
1543 : /* }}} */
1544 :
1545 :
1546 : /* {{{ proto resource mysql_list_tables(string database_name [, int link_identifier]) U
1547 : List tables in a MySQL database */
1548 : PHP_FUNCTION(mysql_list_tables)
1549 6 : {
1550 6 : zval *mysql_link = NULL;
1551 : char *db;
1552 6 : int id = -1, db_len;
1553 : php_mysql_conn *mysql;
1554 : MYSQL_RES *mysql_result;
1555 :
1556 :
1557 6 : switch(ZEND_NUM_ARGS()) {
1558 : case 1:
1559 2 : if (zend_parse_parameters(1 TSRMLS_CC, "s&", &db, &db_len, UG(utf8_conv)) == FAILURE) {
1560 0 : RETURN_FALSE;
1561 : }
1562 2 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1563 2 : CHECK_LINK(id);
1564 1 : break;
1565 : case 2:
1566 2 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&r", &db, &db_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1567 1 : RETURN_FALSE;
1568 : }
1569 1 : break;
1570 : default:
1571 2 : WRONG_PARAM_COUNT;
1572 : break;
1573 : }
1574 2 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1575 :
1576 2 : if (!php_mysql_select_db(mysql, db TSRMLS_CC)) {
1577 0 : RETURN_FALSE;
1578 : }
1579 :
1580 2 : PHPMY_UNBUFFERED_QUERY_CHECK();
1581 :
1582 2 : if ((mysql_result=mysql_list_tables(mysql->conn, NULL))==NULL) {
1583 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
1584 0 : RETURN_FALSE;
1585 : }
1586 2 : ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
1587 : }
1588 : /* }}} */
1589 :
1590 :
1591 : /* {{{ proto resource mysql_list_fields(string database_name, string table_name [, int link_identifier]) U
1592 : List MySQL result fields */
1593 : PHP_FUNCTION(mysql_list_fields)
1594 4 : {
1595 : zval *mysql_link;
1596 : char *db, *table;
1597 4 : int id = -1, db_len, table_len;
1598 : php_mysql_conn *mysql;
1599 : MYSQL_RES *mysql_result;
1600 :
1601 4 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&s&|r", &db, &db_len, UG(utf8_conv), &table, &table_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1602 0 : RETURN_FALSE;
1603 : }
1604 :
1605 4 : if (ZEND_NUM_ARGS() < 3) {
1606 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1607 1 : CHECK_LINK(id);
1608 : }
1609 :
1610 4 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1611 :
1612 4 : if (!php_mysql_select_db(mysql, db TSRMLS_CC)) {
1613 0 : RETURN_FALSE;
1614 : }
1615 :
1616 4 : PHPMY_UNBUFFERED_QUERY_CHECK();
1617 :
1618 4 : if ((mysql_result=mysql_list_fields(mysql->conn, table, NULL))==NULL) {
1619 1 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
1620 1 : RETURN_FALSE;
1621 : }
1622 3 : ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
1623 : }
1624 : /* }}} */
1625 :
1626 : /* {{{ proto resource mysql_list_processes([int link_identifier]) U
1627 : Returns a result set describing the current server threads */
1628 : PHP_FUNCTION(mysql_list_processes)
1629 3 : {
1630 3 : zval *mysql_link = NULL;
1631 3 : int id = -1;
1632 : php_mysql_conn *mysql;
1633 : MYSQL_RES *mysql_result;
1634 :
1635 3 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1636 1 : return;
1637 : }
1638 :
1639 2 : if (ZEND_NUM_ARGS() == 0) {
1640 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1641 1 : CHECK_LINK(id);
1642 : }
1643 :
1644 2 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1645 :
1646 2 : PHPMY_UNBUFFERED_QUERY_CHECK();
1647 :
1648 2 : mysql_result = mysql_list_processes(mysql->conn);
1649 2 : if (mysql_result == NULL) {
1650 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result");
1651 0 : RETURN_FALSE;
1652 : }
1653 :
1654 2 : ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result);
1655 : }
1656 : /* }}} */
1657 :
1658 :
1659 : /* {{{ proto string mysql_error([int link_identifier]) U
1660 : Returns the text of the error message from previous MySQL operation */
1661 : PHP_FUNCTION(mysql_error)
1662 18 : {
1663 18 : zval *mysql_link = NULL;
1664 18 : int id = -1;
1665 : php_mysql_conn *mysql;
1666 :
1667 18 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1668 2 : return;
1669 : }
1670 :
1671 16 : if (!mysql_link) {
1672 7 : id = MySG(default_link);
1673 7 : if (id==-1) {
1674 4 : if (MySG(connect_error)!=NULL){
1675 3 : RETURN_STRING(MySG(connect_error),1);
1676 : } else {
1677 1 : RETURN_FALSE;
1678 : }
1679 : }
1680 : }
1681 :
1682 12 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1683 :
1684 11 : RETURN_UTF8_STRING((char *)mysql_error(mysql->conn), ZSTR_DUPLICATE);
1685 : }
1686 : /* }}} */
1687 :
1688 :
1689 : /* {{{ proto int mysql_errno([int link_identifier])
1690 : Returns the number of the error message from previous MySQL operation */
1691 : #ifdef HAVE_MYSQL_ERRNO
1692 : PHP_FUNCTION(mysql_errno)
1693 20 : {
1694 20 : zval *mysql_link = NULL;
1695 20 : int id = -1;
1696 : php_mysql_conn *mysql;
1697 :
1698 20 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1699 2 : return;
1700 : }
1701 :
1702 18 : if (!mysql_link) {
1703 7 : id = MySG(default_link);
1704 7 : if (id==-1) {
1705 4 : if (MySG(connect_errno)!=0){
1706 3 : RETURN_LONG(MySG(connect_errno));
1707 : } else {
1708 1 : RETURN_FALSE;
1709 : }
1710 : }
1711 : }
1712 :
1713 14 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1714 :
1715 13 : RETURN_LONG(mysql_errno(mysql->conn));
1716 : }
1717 : #endif
1718 : /* }}} */
1719 :
1720 :
1721 : /* {{{ proto int mysql_affected_rows([int link_identifier])
1722 : Gets number of affected rows in previous MySQL operation */
1723 : PHP_FUNCTION(mysql_affected_rows)
1724 0 : {
1725 0 : zval *mysql_link = NULL;
1726 0 : int id = -1;
1727 : php_mysql_conn *mysql;
1728 :
1729 0 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1730 0 : return;
1731 : }
1732 :
1733 0 : if (!mysql_link) {
1734 0 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1735 0 : CHECK_LINK(id);
1736 : }
1737 :
1738 0 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1739 :
1740 : /* conversion from int64 to long happing here */
1741 0 : Z_LVAL_P(return_value) = (long) mysql_affected_rows(mysql->conn);
1742 0 : Z_TYPE_P(return_value) = IS_LONG;
1743 : }
1744 : /* }}} */
1745 :
1746 :
1747 : /* {{{ proto string mysql_escape_string(string to_be_escaped) U
1748 : Escape string for mysql query */
1749 : PHP_FUNCTION(mysql_escape_string)
1750 9 : {
1751 : char *str, *new_str;
1752 : int str_len, new_str_len;
1753 :
1754 :
1755 9 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&", &str, &str_len, UG(utf8_conv)) == FAILURE) {
1756 1 : return;
1757 : }
1758 :
1759 8 : new_str = (char *) safe_emalloc(str_len, 2, 1);
1760 8 : new_str_len = mysql_escape_string(new_str, str, str_len);
1761 : /* Now we kind of realloc() by returning a zval pointing to a buffer with enough size */
1762 8 : RETVAL_UTF8_STRINGL(new_str, new_str_len, ZSTR_DUPLICATE);
1763 8 : efree(new_str);
1764 8 : if (MySG(trace_mode)){
1765 1 : php_error_docref("function.mysql-real-escape-string" TSRMLS_CC, E_DEPRECATED, "use mysql_real_escape_string() instead.");
1766 : }
1767 : }
1768 : /* }}} */
1769 :
1770 : /* {{{ proto string mysql_real_escape_string(string to_be_escaped [, int link_identifier]) U
1771 : Escape special characters in a string for use in a SQL statement, taking into account the current charset of the connection */
1772 : PHP_FUNCTION(mysql_real_escape_string)
1773 11 : {
1774 11 : zval *mysql_link = NULL;
1775 : char *str;
1776 : char *new_str;
1777 11 : int id = -1, str_len, new_str_len;
1778 : php_mysql_conn *mysql;
1779 :
1780 :
1781 11 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|r", &str, &str_len, UG(utf8_conv), &mysql_link) == FAILURE) {
1782 2 : return;
1783 : }
1784 :
1785 9 : if (ZEND_NUM_ARGS() == 1) {
1786 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1787 1 : CHECK_LINK(id);
1788 : }
1789 :
1790 9 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1791 :
1792 9 : new_str = safe_emalloc(str_len, 2, 1);
1793 9 : new_str_len = mysql_real_escape_string(mysql->conn, new_str, str, str_len);
1794 : /* Now we kind of realloc() by returning a zval pointing to a buffer with enough size */
1795 9 : RETVAL_UTF8_STRINGL(new_str, new_str_len, ZSTR_DUPLICATE);
1796 9 : efree(new_str);
1797 : }
1798 : /* }}} */
1799 :
1800 : /* {{{ proto int mysql_insert_id([int link_identifier]) U
1801 : Gets the ID generated from the previous INSERT operation */
1802 : PHP_FUNCTION(mysql_insert_id)
1803 0 : {
1804 0 : zval *mysql_link = NULL;
1805 0 : int id = -1;
1806 : php_mysql_conn *mysql;
1807 :
1808 0 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
1809 0 : return;
1810 : }
1811 :
1812 0 : if (!mysql_link) {
1813 0 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
1814 0 : CHECK_LINK(id);
1815 : }
1816 :
1817 0 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
1818 :
1819 : /* conversion from int64 to long happing here */
1820 0 : Z_LVAL_P(return_value) = (long) mysql_insert_id(mysql->conn);
1821 0 : Z_TYPE_P(return_value) = IS_LONG;
1822 : }
1823 : /* }}} */
1824 :
1825 :
1826 : /* {{{ proto mixed mysql_result(resource result, int row [, mixed field]) U
1827 : Gets result data */
1828 : PHP_FUNCTION(mysql_result)
1829 38 : {
1830 38 : zval *result, *field=NULL;
1831 : long row;
1832 : MYSQL_RES *mysql_result;
1833 : #ifndef MYSQL_USE_MYSQLND
1834 : MYSQL_ROW sql_row;
1835 : mysql_row_length_type *sql_row_lengths;
1836 : #endif
1837 38 : int field_offset=0;
1838 :
1839 :
1840 38 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|z", &result, &row, &field) == FAILURE) {
1841 7 : return;
1842 : }
1843 :
1844 31 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
1845 :
1846 28 : if (row<0 || row>=(long)mysql_num_rows(mysql_result)) {
1847 6 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %ld on MySQL result index %ld", row, Z_LVAL_P(result));
1848 6 : RETURN_FALSE;
1849 : }
1850 22 : mysql_data_seek(mysql_result, row);
1851 :
1852 22 : if (field) {
1853 : /* XXX: What about unicode type ??? Please test :) */
1854 16 : switch(Z_TYPE_P(field)) {
1855 : case IS_STRING: {
1856 0 : int i=0;
1857 : const MYSQL_FIELD *tmp_field;
1858 : char *table_name, *field_name, *tmp;
1859 :
1860 0 : if ((tmp=strchr(Z_STRVAL_P(field), '.'))) {
1861 0 : table_name = estrndup(Z_STRVAL_P(field), tmp-Z_STRVAL_P(field));
1862 0 : field_name = estrdup(tmp+1);
1863 : } else {
1864 0 : table_name = NULL;
1865 0 : field_name = estrndup(Z_STRVAL_P(field),Z_STRLEN_P(field));
1866 : }
1867 0 : mysql_field_seek(mysql_result, 0);
1868 0 : while ((tmp_field=mysql_fetch_field(mysql_result))) {
1869 0 : if ((!table_name || !strcasecmp(tmp_field->table, table_name)) && !strcasecmp(tmp_field->name, field_name)) {
1870 0 : field_offset = i;
1871 0 : break;
1872 : }
1873 0 : i++;
1874 : }
1875 0 : if (!tmp_field) { /* no match found */
1876 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s%s%s not found in MySQL result index %ld",
1877 : (table_name?table_name:""), (table_name?".":""), field_name, Z_LVAL_P(result));
1878 0 : efree(field_name);
1879 0 : if (table_name) {
1880 0 : efree(table_name);
1881 : }
1882 0 : RETURN_FALSE;
1883 : }
1884 0 : efree(field_name);
1885 0 : if (table_name) {
1886 0 : efree(table_name);
1887 : }
1888 : }
1889 0 : break;
1890 : default:
1891 16 : convert_to_long_ex(&field);
1892 16 : field_offset = Z_LVAL_P(field);
1893 16 : if (field_offset<0 || field_offset>=(int)mysql_num_fields(mysql_result)) {
1894 2 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified");
1895 2 : RETURN_FALSE;
1896 : }
1897 : break;
1898 : }
1899 : }
1900 :
1901 : #ifndef MYSQL_USE_MYSQLND
1902 : if ((sql_row=mysql_fetch_row(mysql_result))==NULL
1903 : || (sql_row_lengths=mysql_fetch_lengths(mysql_result))==NULL) { /* shouldn't happen? */
1904 : RETURN_FALSE;
1905 : }
1906 :
1907 : if (sql_row[field_offset]) {
1908 : RETURN_UTF8_STRINGL(sql_row[field_offset], sql_row_lengths[field_offset], ZSTR_DUPLICATE);
1909 : } else {
1910 : Z_TYPE_P(return_value) = IS_NULL;
1911 : }
1912 : #else
1913 20 : mysqlnd_result_fetch_field_data(mysql_result, field_offset, return_value);
1914 : #endif
1915 : }
1916 : /* }}} */
1917 :
1918 :
1919 : /* {{{ proto int mysql_num_rows(resource result) U
1920 : Gets number of rows in a result */
1921 : PHP_FUNCTION(mysql_num_rows)
1922 14 : {
1923 : zval *result;
1924 : MYSQL_RES *mysql_result;
1925 :
1926 14 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
1927 3 : return;
1928 : }
1929 :
1930 11 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
1931 :
1932 : /* conversion from int64 to long happing here */
1933 10 : Z_LVAL_P(return_value) = (long) mysql_num_rows(mysql_result);
1934 10 : Z_TYPE_P(return_value) = IS_LONG;
1935 : }
1936 : /* }}} */
1937 :
1938 : /* {{{ proto int mysql_num_fields(resource result) U
1939 : Gets number of fields in a result */
1940 : PHP_FUNCTION(mysql_num_fields)
1941 16 : {
1942 : zval *result;
1943 : MYSQL_RES *mysql_result;
1944 :
1945 16 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
1946 2 : return;
1947 : }
1948 :
1949 14 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
1950 :
1951 13 : Z_LVAL_P(return_value) = mysql_num_fields(mysql_result);
1952 13 : Z_TYPE_P(return_value) = IS_LONG;
1953 : }
1954 : /* }}} */
1955 :
1956 : #define MYSQL_BINARY_CHARSET_NR 63
1957 :
1958 : #if MYSQL_VERSION_ID > 50002 || defined(MYSQL_USE_MYSQLND)
1959 : /* we have BIT */
1960 : #define IS_BINARY_DATA(f) (((f)->type == MYSQL_TYPE_TINY_BLOB || (f)->type == MYSQL_TYPE_BLOB || \
1961 : (f)->type == MYSQL_TYPE_MEDIUM_BLOB || (f)->type == MYSQL_TYPE_LONG_BLOB || \
1962 : (f)->type == MYSQL_TYPE_BIT || \
1963 : (f)->type == MYSQL_TYPE_VAR_STRING || (f)->type == MYSQL_TYPE_VARCHAR || \
1964 : (f)->type == MYSQL_TYPE_STRING)&& (f)->charsetnr == MYSQL_BINARY_CHARSET_NR)
1965 : #else
1966 : #define IS_BINARY_DATA(f) (((f)->type == MYSQL_TYPE_TINY_BLOB || (f)->type == MYSQL_TYPE_BLOB || \
1967 : (f)->type == MYSQL_TYPE_MEDIUM_BLOB || (f)->type == MYSQL_TYPE_LONG_BLOB || \
1968 : (f)->type == MYSQL_TYPE_VAR_STRING || (f)->type == MYSQL_TYPE_VARCHAR || \
1969 : (f)->type == MYSQL_TYPE_STRING)&& (f)->charsetnr == MYSQL_BINARY_CHARSET_NR)
1970 :
1971 : #endif
1972 :
1973 : /* {{{ php_mysql_fetch_hash
1974 : */
1975 : static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type, int expected_args, int into_object)
1976 22 : {
1977 : MYSQL_RES *mysql_result;
1978 22 : zval *res, *ctor_params = NULL;
1979 22 : zend_class_entry *ce = NULL;
1980 : #ifndef MYSQL_USE_MYSQLND
1981 : int i;
1982 : MYSQL_FIELD *mysql_field;
1983 : MYSQL_ROW mysql_row;
1984 : mysql_row_length_type *mysql_row_lengths;
1985 : #endif
1986 :
1987 22 : if (into_object) {
1988 22 : char *class_name = NULL;
1989 22 : int class_name_len = 0;
1990 :
1991 22 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s&z", &res, &class_name, &class_name_len, UG(utf8_conv), &ctor_params) == FAILURE) {
1992 1 : return;
1993 : }
1994 :
1995 21 : if (ZEND_NUM_ARGS() < 2) {
1996 8 : ce = zend_standard_class_def;
1997 : } else {
1998 13 : ce = zend_fetch_class(class_name, class_name_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
1999 : }
2000 20 : if (!ce) {
2001 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find class '%s'", class_name);
2002 0 : return;
2003 : }
2004 20 : result_type = MYSQL_ASSOC;
2005 : } else {
2006 0 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &res, &result_type) == FAILURE) {
2007 0 : return;
2008 : }
2009 0 : if (!result_type) {
2010 : /* result_type might have been set outside, so only overwrite when not set */
2011 0 : result_type = MYSQL_BOTH;
2012 : }
2013 : }
2014 :
2015 20 : if (result_type & ~MYSQL_BOTH) {
2016 0 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH");
2017 0 : result_type = MYSQL_BOTH;
2018 : }
2019 :
2020 20 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &res, -1, "MySQL result", le_result);
2021 :
2022 : #ifndef MYSQL_USE_MYSQLND
2023 : if ((mysql_row = mysql_fetch_row(mysql_result)) == NULL ||
2024 : (mysql_row_lengths = mysql_fetch_lengths(mysql_result)) == NULL) {
2025 : RETURN_FALSE;
2026 : }
2027 :
2028 : array_init(return_value);
2029 :
2030 : mysql_field_seek(mysql_result, 0);
2031 : for (mysql_field = mysql_fetch_field(mysql_result), i = 0;
2032 : mysql_field;
2033 : mysql_field = mysql_fetch_field(mysql_result), i++)
2034 : {
2035 : if (mysql_row[i]) {
2036 : zval *data;
2037 :
2038 : MAKE_STD_ZVAL(data);
2039 :
2040 : if (!IS_BINARY_DATA(mysql_field)) {
2041 : UChar *ustr;
2042 : int ulen;
2043 :
2044 : zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, mysql_row[i], mysql_row_lengths[i] TSRMLS_CC);
2045 : ZVAL_UNICODEL(data, ustr, ulen, 0);
2046 : } else {
2047 : ZVAL_STRINGL(data, mysql_row[i], mysql_row_lengths[i], 1);
2048 : }
2049 :
2050 : if (result_type & MYSQL_NUM) {
2051 : add_index_zval(return_value, i, data);
2052 : }
2053 : if (result_type & MYSQL_ASSOC) {
2054 : UChar *ustr;
2055 : int ulen;
2056 :
2057 : if (result_type & MYSQL_NUM) {
2058 : Z_ADDREF_P(data);
2059 : }
2060 :
2061 : zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, mysql_field->name, strlen(mysql_field->name) TSRMLS_CC);
2062 : add_u_assoc_zval_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1, data);
2063 : efree(ustr);
2064 : }
2065 : } else {
2066 : /* NULL value. */
2067 : if (result_type & MYSQL_NUM) {
2068 : add_index_null(return_value, i);
2069 : }
2070 :
2071 : if (result_type & MYSQL_ASSOC) {
2072 : UChar *ustr;
2073 : int ulen;
2074 :
2075 : zend_string_to_unicode(UG(utf8_conv), &ustr, &ulen, mysql_field->name, strlen(mysql_field->name) TSRMLS_CC);
2076 : add_u_assoc_null_ex(return_value, IS_UNICODE, ZSTR(ustr), ulen + 1);
2077 : efree(ustr);
2078 : }
2079 : }
2080 : }
2081 : #else
2082 18 : mysqlnd_fetch_into(mysql_result, MYSQLND_FETCH_ASSOC, return_value, MYSQLND_MYSQL);
2083 : #endif
2084 :
2085 : /* mysqlnd might return FALSE if no more rows */
2086 18 : if (into_object && Z_TYPE_P(return_value) != IS_BOOL) {
2087 11 : zval dataset = *return_value;
2088 : zend_fcall_info fci;
2089 : zend_fcall_info_cache fcc;
2090 : zval *retval_ptr;
2091 :
2092 11 : object_and_properties_init(return_value, ce, NULL);
2093 11 : zend_merge_properties(return_value, Z_ARRVAL(dataset), 1 TSRMLS_CC);
2094 :
2095 11 : if (ce->constructor) {
2096 6 : fci.size = sizeof(fci);
2097 6 : fci.function_table = &ce->function_table;
2098 6 : fci.function_name = NULL;
2099 6 : fci.symbol_table = NULL;
2100 6 : fci.object_ptr = return_value;
2101 6 : fci.retval_ptr_ptr = &retval_ptr;
2102 8 : if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) {
2103 2 : if (Z_TYPE_P(ctor_params) == IS_ARRAY) {
2104 2 : HashTable *ht = Z_ARRVAL_P(ctor_params);
2105 : Bucket *p;
2106 :
2107 2 : fci.param_count = 0;
2108 2 : fci.params = safe_emalloc(sizeof(zval*), ht->nNumOfElements, 0);
2109 2 : p = ht->pListHead;
2110 7 : while (p != NULL) {
2111 3 : fci.params[fci.param_count++] = (zval**)p->pData;
2112 3 : p = p->pListNext;
2113 : }
2114 : } else {
2115 : /* Two problems why we throw exceptions here: PHP is typeless
2116 : * and hence passing one argument that's not an array could be
2117 : * by mistake and the other way round is possible, too. The
2118 : * single value is an array. Also we'd have to make that one
2119 : * argument passed by reference.
2120 : */
2121 0 : zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Parameter ctor_params must be an array", 0 TSRMLS_CC);
2122 0 : return;
2123 : }
2124 : } else {
2125 4 : fci.param_count = 0;
2126 4 : fci.params = NULL;
2127 : }
2128 6 : fci.no_separation = 1;
2129 :
2130 6 : fcc.initialized = 1;
2131 6 : fcc.function_handler = ce->constructor;
2132 6 : fcc.calling_scope = EG(scope);
2133 6 : fcc.called_scope = Z_OBJCE_P(return_value);
2134 6 : fcc.object_ptr = return_value;
2135 :
2136 6 : if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) {
2137 0 : zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %v::%v()", ce->name, ce->constructor->common.function_name);
2138 : } else {
2139 6 : if (retval_ptr) {
2140 6 : zval_ptr_dtor(&retval_ptr);
2141 : }
2142 : }
2143 6 : if (fci.params) {
2144 2 : efree(fci.params);
2145 : }
2146 5 : } else if (ctor_params) {
2147 0 : zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Class %v does not have a constructor hence you cannot use ctor_params", ce->name);
2148 : }
2149 : }
2150 : }
2151 : /* }}} */
2152 :
2153 : /* {{{ proto array mysql_fetch_row(resource result) U
2154 : Gets a result row as an enumerated array */
2155 : PHP_FUNCTION(mysql_fetch_row)
2156 5 : {
2157 : #ifdef MYSQL_USE_MYSQLND
2158 : MYSQL_RES *result;
2159 : zval *mysql_result;
2160 :
2161 5 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mysql_result) == FAILURE) {
2162 2 : return;
2163 : }
2164 3 : ZEND_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, -1, "MySQL result", le_result);
2165 :
2166 2 : mysqlnd_fetch_into(result, MYSQLND_FETCH_NUM, return_value, MYSQLND_MYSQL);
2167 : #else
2168 : php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_NUM, 1, 0);
2169 : #endif
2170 : }
2171 : /* }}} */
2172 :
2173 :
2174 : /* {{{ proto object mysql_fetch_object(resource result [, string class_name [, NULL|array ctor_params]])
2175 : Fetch a result row as an object */
2176 : PHP_FUNCTION(mysql_fetch_object)
2177 22 : {
2178 22 : php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_ASSOC, 2, 1);
2179 :
2180 21 : if (Z_TYPE_P(return_value) == IS_ARRAY) {
2181 0 : object_and_properties_init(return_value, ZEND_STANDARD_CLASS_DEF_PTR, Z_ARRVAL_P(return_value));
2182 : }
2183 21 : }
2184 : /* }}} */
2185 :
2186 :
2187 : /* {{{ proto array mysql_fetch_array(resource result [, int result_type]) U
2188 : Fetch a result row as an array (associative, numeric or both) */
2189 : PHP_FUNCTION(mysql_fetch_array)
2190 103 : {
2191 : #ifndef MYSQL_USE_MYSQLND
2192 : php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 2, 0);
2193 : #else
2194 : MYSQL_RES *result;
2195 : zval *mysql_result;
2196 103 : long mode = MYSQLND_FETCH_BOTH;
2197 :
2198 103 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &mysql_result, &mode) == FAILURE) {
2199 2 : return;
2200 : }
2201 101 : ZEND_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, -1, "MySQL result", le_result);
2202 :
2203 100 : if (mode & ~MYSQL_BOTH) {
2204 2 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH");
2205 2 : mode = MYSQL_BOTH;
2206 : }
2207 :
2208 100 : mysqlnd_fetch_into(result, mode, return_value, MYSQLND_MYSQL);
2209 : #endif
2210 : }
2211 : /* }}} */
2212 :
2213 :
2214 : /* {{{ proto array mysql_fetch_assoc(resource result) U
2215 : Fetch a result row as an associative array */
2216 : PHP_FUNCTION(mysql_fetch_assoc)
2217 54 : {
2218 : #ifndef MYSQL_USE_MYSQLND
2219 : php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_ASSOC, 1, 0);
2220 : #else
2221 : MYSQL_RES *result;
2222 : zval *mysql_result;
2223 :
2224 54 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mysql_result) == FAILURE) {
2225 2 : return;
2226 : }
2227 52 : ZEND_FETCH_RESOURCE(result, MYSQL_RES *, &mysql_result, -1, "MySQL result", le_result);
2228 :
2229 51 : mysqlnd_fetch_into(result, MYSQLND_FETCH_ASSOC, return_value, MYSQLND_MYSQL);
2230 : #endif
2231 : }
2232 : /* }}} */
2233 :
2234 : /* {{{ proto bool mysql_data_seek(resource result, int row_number) U
2235 : Move internal result pointer */
2236 : PHP_FUNCTION(mysql_data_seek)
2237 9 : {
2238 : zval *result;
2239 : long offset;
2240 : MYSQL_RES *mysql_result;
2241 :
2242 9 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &offset)) {
2243 3 : return;
2244 : }
2245 :
2246 6 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
2247 :
2248 5 : if (offset<0 || offset>=(long)mysql_num_rows(mysql_result)) {
2249 3 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset %ld is invalid for MySQL result index %ld (or the query data is unbuffered)", offset, Z_LVAL_P(result));
2250 3 : RETURN_FALSE;
2251 : }
2252 2 : mysql_data_seek(mysql_result, offset);
2253 2 : RETURN_TRUE;
2254 : }
2255 : /* }}} */
2256 :
2257 :
2258 : /* {{{ proto array mysql_fetch_lengths(resource result) U
2259 : Gets max data size of each column in a result */
2260 : PHP_FUNCTION(mysql_fetch_lengths)
2261 5 : {
2262 : zval *result;
2263 : MYSQL_RES *mysql_result;
2264 : mysql_row_length_type *lengths;
2265 : int num_fields;
2266 : unsigned int i;
2267 :
2268 5 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
2269 2 : return;
2270 : }
2271 :
2272 3 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
2273 :
2274 2 : if ((lengths=mysql_fetch_lengths(mysql_result))==NULL) {
2275 1 : RETURN_FALSE;
2276 : }
2277 1 : array_init(return_value);
2278 1 : num_fields = mysql_num_fields(mysql_result);
2279 :
2280 3 : for (i=0; i<num_fields; i++) {
2281 2 : add_index_long(return_value, i, lengths[i]);
2282 : }
2283 : }
2284 : /* }}} */
2285 :
2286 : /* {{{ php_mysql_get_field_name
2287 : */
2288 : static char *php_mysql_get_field_name(int field_type)
2289 42 : {
2290 42 : switch(field_type) {
2291 : case FIELD_TYPE_STRING:
2292 : case FIELD_TYPE_VAR_STRING:
2293 9 : return "string";
2294 : break;
2295 : #if MYSQL_VERSION_ID > 50002 || defined(MYSQL_USE_MYSQLND)
2296 : case MYSQL_TYPE_BIT:
2297 : #endif
2298 : #ifdef MYSQL_HAS_TINY
2299 : case FIELD_TYPE_TINY:
2300 : #endif
2301 : case FIELD_TYPE_SHORT:
2302 : case FIELD_TYPE_LONG:
2303 : case FIELD_TYPE_LONGLONG:
2304 : case FIELD_TYPE_INT24:
2305 17 : return "int";
2306 : break;
2307 : case FIELD_TYPE_FLOAT:
2308 : case FIELD_TYPE_DOUBLE:
2309 : case FIELD_TYPE_DECIMAL:
2310 : #ifdef FIELD_TYPE_NEWDECIMAL
2311 : case FIELD_TYPE_NEWDECIMAL:
2312 : #endif
2313 3 : return "real";
2314 : break;
2315 : case FIELD_TYPE_TIMESTAMP:
2316 1 : return "timestamp";
2317 : break;
2318 : #ifdef MYSQL_HAS_YEAR
2319 : case FIELD_TYPE_YEAR:
2320 1 : return "year";
2321 : break;
2322 : #endif
2323 : case FIELD_TYPE_DATE:
2324 : #ifdef FIELD_TYPE_NEWDATE
2325 : case FIELD_TYPE_NEWDATE:
2326 : #endif
2327 1 : return "date";
2328 : break;
2329 : case FIELD_TYPE_TIME:
2330 1 : return "time";
2331 : break;
2332 : case FIELD_TYPE_SET:
2333 0 : return "set";
2334 : break;
2335 : case FIELD_TYPE_ENUM:
2336 0 : return "enum";
2337 : break;
2338 : #ifdef FIELD_TYPE_GEOMETRY
2339 : case FIELD_TYPE_GEOMETRY:
2340 0 : return "geometry";
2341 : break;
2342 : #endif
2343 : case FIELD_TYPE_DATETIME:
2344 1 : return "datetime";
2345 : break;
2346 : case FIELD_TYPE_TINY_BLOB:
2347 : case FIELD_TYPE_MEDIUM_BLOB:
2348 : case FIELD_TYPE_LONG_BLOB:
2349 : case FIELD_TYPE_BLOB:
2350 8 : return "blob";
2351 : break;
2352 : case FIELD_TYPE_NULL:
2353 0 : return "null";
2354 : break;
2355 : default:
2356 0 : return "unknown";
2357 : break;
2358 : }
2359 : }
2360 : /* }}} */
2361 :
2362 : /* {{{ proto object mysql_fetch_field(resource result [, int field_offset]) U
2363 : Gets column information from a result and return as an object */
2364 : PHP_FUNCTION(mysql_fetch_field)
2365 46 : {
2366 : zval *result;
2367 46 : long field=0;
2368 : MYSQL_RES *mysql_result;
2369 : const MYSQL_FIELD *mysql_field;
2370 :
2371 46 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &result, &field) == FAILURE) {
2372 2 : return;
2373 : }
2374 :
2375 44 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
2376 :
2377 43 : if (ZEND_NUM_ARGS() > 1) {
2378 33 : if (field<0 || field>=(int)mysql_num_fields(mysql_result)) {
2379 1 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad field offset");
2380 1 : RETURN_FALSE;
2381 : }
2382 32 : mysql_field_seek(mysql_result, field);
2383 : }
2384 42 : if ((mysql_field=mysql_fetch_field(mysql_result))==NULL) {
2385 3 : RETURN_FALSE;
2386 : }
2387 39 : object_init(return_value);
2388 :
2389 39 : add_property_utf8_string(return_value, "name",(mysql_field->name?mysql_field->name:""), ZSTR_DUPLICATE);
2390 39 : add_property_utf8_string(return_value, "table",(mysql_field->table?mysql_field->table:""), ZSTR_DUPLICATE);
2391 39 : add_property_utf8_string(return_value, "def",(mysql_field->def?mysql_field->def:""), ZSTR_DUPLICATE);
2392 39 : add_property_long(return_value, "max_length", mysql_field->max_length);
2393 39 : add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0);
2394 39 : add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0);
2395 39 : add_property_long(return_value, "multiple_key",(mysql_field->flags&MULTIPLE_KEY_FLAG?1:0));
2396 39 : add_property_long(return_value, "unique_key",(mysql_field->flags&UNIQUE_KEY_FLAG?1:0));
2397 39 : add_property_long(return_value, "numeric", IS_NUM(Z_TYPE_P(mysql_field))?1:0);
2398 39 : add_property_long(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0);
2399 39 : add_property_utf8_string(return_value, "type", php_mysql_get_field_name(Z_TYPE_P(mysql_field)), ZSTR_DUPLICATE);
2400 39 : add_property_long(return_value, "unsigned",(mysql_field->flags&UNSIGNED_FLAG?1:0));
2401 39 : add_property_long(return_value, "zerofill",(mysql_field->flags&ZEROFILL_FLAG?1:0));
2402 : }
2403 : /* }}} */
2404 :
2405 :
2406 : /* {{{ proto bool mysql_field_seek(resource result, int field_offset) U
2407 : Sets result pointer to a specific field offset */
2408 : PHP_FUNCTION(mysql_field_seek)
2409 8 : {
2410 : zval *result;
2411 : long offset;
2412 : MYSQL_RES *mysql_result;
2413 :
2414 8 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &offset) == FAILURE) {
2415 2 : return;
2416 : }
2417 6 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
2418 :
2419 5 : if (offset<0 || offset>=(int)mysql_num_fields(mysql_result)) {
2420 2 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", offset, Z_LVAL_P(result));
2421 2 : RETURN_FALSE;
2422 : }
2423 3 : mysql_field_seek(mysql_result, offset);
2424 3 : RETURN_TRUE;
2425 : }
2426 : /* }}} */
2427 :
2428 :
2429 : #define PHP_MYSQL_FIELD_NAME 1
2430 : #define PHP_MYSQL_FIELD_TABLE 2
2431 : #define PHP_MYSQL_FIELD_LEN 3
2432 : #define PHP_MYSQL_FIELD_TYPE 4
2433 : #define PHP_MYSQL_FIELD_FLAGS 5
2434 :
2435 : /* {{{ php_mysql_field_info
2436 : */
2437 : static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
2438 50 : {
2439 : zval *result;
2440 : long field;
2441 : MYSQL_RES *mysql_result;
2442 50 : const MYSQL_FIELD *mysql_field = {0};
2443 : char buf[512];
2444 : int len;
2445 :
2446 50 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &field) == FAILURE) {
2447 15 : return;
2448 : }
2449 :
2450 35 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
2451 :
2452 30 : if (field<0 || field>=(int)mysql_num_fields(mysql_result)) {
2453 10 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", field, Z_LVAL_P(result));
2454 10 : RETURN_FALSE;
2455 : }
2456 20 : mysql_field_seek(mysql_result, field);
2457 20 : if ((mysql_field=mysql_fetch_field(mysql_result))==NULL) {
2458 0 : RETURN_FALSE;
2459 : }
2460 :
2461 20 : switch (entry_type) {
2462 : case PHP_MYSQL_FIELD_NAME:
2463 3 : RETVAL_UTF8_STRING(mysql_field->name, ZSTR_DUPLICATE);
2464 3 : break;
2465 : case PHP_MYSQL_FIELD_TABLE:
2466 1 : RETVAL_UTF8_STRING(mysql_field->table, ZSTR_DUPLICATE);
2467 1 : break;
2468 : case PHP_MYSQL_FIELD_LEN:
2469 3 : Z_LVAL_P(return_value) = mysql_field->length;
2470 3 : Z_TYPE_P(return_value) = IS_LONG;
2471 3 : break;
2472 : case PHP_MYSQL_FIELD_TYPE:
2473 3 : RETVAL_UTF8_STRING(php_mysql_get_field_name(Z_TYPE_P(mysql_field)), ZSTR_DUPLICATE);
2474 3 : break;
2475 : case PHP_MYSQL_FIELD_FLAGS:
2476 10 : memcpy(buf, "", sizeof(""));
2477 : #ifdef IS_NOT_NULL
2478 10 : if (IS_NOT_NULL(mysql_field->flags)) {
2479 3 : strcat(buf, "not_null ");
2480 : }
2481 : #endif
2482 : #ifdef IS_PRI_KEY
2483 10 : if (IS_PRI_KEY(mysql_field->flags)) {
2484 2 : strcat(buf, "primary_key ");
2485 : }
2486 : #endif
2487 : #ifdef UNIQUE_KEY_FLAG
2488 10 : if (mysql_field->flags&UNIQUE_KEY_FLAG) {
2489 1 : strcat(buf, "unique_key ");
2490 : }
2491 : #endif
2492 : #ifdef MULTIPLE_KEY_FLAG
2493 10 : if (mysql_field->flags&MULTIPLE_KEY_FLAG) {
2494 1 : strcat(buf, "multiple_key ");
2495 : }
2496 : #endif
2497 : #ifdef IS_BLOB
2498 10 : if (IS_BLOB(mysql_field->flags)) {
2499 1 : strcat(buf, "blob ");
2500 : }
2501 : #endif
2502 : #ifdef UNSIGNED_FLAG
2503 10 : if (mysql_field->flags&UNSIGNED_FLAG) {
2504 2 : strcat(buf, "unsigned ");
2505 : }
2506 : #endif
2507 : #ifdef ZEROFILL_FLAG
2508 10 : if (mysql_field->flags&ZEROFILL_FLAG) {
2509 1 : strcat(buf, "zerofill ");
2510 : }
2511 : #endif
2512 : #ifdef BINARY_FLAG
2513 10 : if (mysql_field->flags&BINARY_FLAG) {
2514 2 : strcat(buf, "binary ");
2515 : }
2516 : #endif
2517 : #ifdef ENUM_FLAG
2518 10 : if (mysql_field->flags&ENUM_FLAG) {
2519 1 : strcat(buf, "enum ");
2520 : }
2521 : #endif
2522 : #ifdef SET_FLAG
2523 10 : if (mysql_field->flags&SET_FLAG) {
2524 1 : strcat(buf, "set ");
2525 : }
2526 : #endif
2527 : #ifdef AUTO_INCREMENT_FLAG
2528 10 : if (mysql_field->flags&AUTO_INCREMENT_FLAG) {
2529 0 : strcat(buf, "auto_increment ");
2530 : }
2531 : #endif
2532 : #ifdef TIMESTAMP_FLAG
2533 10 : if (mysql_field->flags&TIMESTAMP_FLAG) {
2534 1 : strcat(buf, "timestamp ");
2535 : }
2536 : #endif
2537 10 : len = strlen(buf);
2538 : /* remove trailing space, if present */
2539 10 : if (len && buf[len-1] == ' ') {
2540 9 : buf[len-1] = 0;
2541 9 : len--;
2542 : }
2543 :
2544 10 : RETVAL_UTF8_STRING(buf, ZSTR_DUPLICATE);
2545 10 : break;
2546 :
2547 : default:
2548 0 : RETURN_FALSE;
2549 : }
2550 : }
2551 : /* }}} */
2552 :
2553 : /* {{{ proto string mysql_field_name(resource result, int field_index)
2554 : Gets the name of the specified field in a result */
2555 : PHP_FUNCTION(mysql_field_name)
2556 9 : {
2557 9 : php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_NAME);
2558 9 : }
2559 : /* }}} */
2560 :
2561 :
2562 : /* {{{ proto string mysql_field_table(resource result, int field_offset) U
2563 : Gets name of the table the specified field is in */
2564 : PHP_FUNCTION(mysql_field_table)
2565 7 : {
2566 7 : php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_TABLE);
2567 7 : }
2568 : /* }}} */
2569 :
2570 :
2571 : /* {{{ proto int mysql_field_len(resource result, int field_offset) U
2572 : Returns the length of the specified field */
2573 : PHP_FUNCTION(mysql_field_len)
2574 9 : {
2575 9 : php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_LEN);
2576 9 : }
2577 : /* }}} */
2578 :
2579 :
2580 : /* {{{ proto string mysql_field_type(resource result, int field_offset) U
2581 : Gets the type of the specified field in a result */
2582 : PHP_FUNCTION(mysql_field_type)
2583 9 : {
2584 9 : php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_TYPE);
2585 9 : }
2586 : /* }}} */
2587 :
2588 :
2589 : /* {{{ proto string mysql_field_flags(resource result, int field_offset) U
2590 : Gets the flags associated with the specified field in a result */
2591 : PHP_FUNCTION(mysql_field_flags)
2592 16 : {
2593 16 : php_mysql_field_info(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_MYSQL_FIELD_FLAGS);
2594 16 : }
2595 : /* }}} */
2596 :
2597 :
2598 : /* {{{ proto bool mysql_free_result(resource result) U
2599 : Free result memory */
2600 : PHP_FUNCTION(mysql_free_result)
2601 111 : {
2602 : zval *result;
2603 : MYSQL_RES *mysql_result;
2604 :
2605 111 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &result) == FAILURE) {
2606 3 : return;
2607 : }
2608 :
2609 108 : if (Z_LVAL_P(result)==0) {
2610 0 : RETURN_FALSE;
2611 : }
2612 :
2613 108 : ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result);
2614 :
2615 106 : zend_list_delete(Z_LVAL_P(result));
2616 106 : RETURN_TRUE;
2617 : }
2618 : /* }}} */
2619 :
2620 : /* {{{ proto bool mysql_ping([int link_identifier]) U
2621 : Ping a server connection. If no connection then reconnect. */
2622 : PHP_FUNCTION(mysql_ping)
2623 6 : {
2624 6 : zval *mysql_link = NULL;
2625 6 : int id = -1;
2626 : php_mysql_conn *mysql;
2627 :
2628 6 : if (0 == ZEND_NUM_ARGS()) {
2629 1 : id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU);
2630 1 : CHECK_LINK(id);
2631 5 : } else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mysql_link)==FAILURE) {
2632 1 : return;
2633 : }
2634 :
2635 5 : ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink);
2636 :
2637 4 : PHPMY_UNBUFFERED_QUERY_CHECK();
2638 :
2639 4 : RETURN_BOOL(! mysql_ping(mysql->conn));
2640 : }
2641 : /* }}} */
2642 :
2643 : #endif
2644 :
2645 : /*
2646 : * Local variables:
2647 : * tab-width: 4
2648 : * c-basic-offset: 4
2649 : * End:
2650 : * vim600: sw=4 ts=4 fdm=marker
2651 : * vim<600: sw=4 ts=4
2652 : */
|