PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - mysql - php_mysql.c
Test: PHP Code Coverage
Date: 2009-11-23 Instrumented lines: 867
Code covered: 86.9 % Executed lines: 753
Legend: not executed executed

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

Generated by: LTP GCOV extension version 1.5

Generated at Mon, 23 Nov 2009 17:39:32 +0000 (35 hours ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.