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