From c081ce628f0d76d44784d7bb8e06428b06142ac0 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 3 Jan 2014 11:08:10 +0800 Subject: Bump year --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 88bb9ab21e..3d092b2d6a 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2013 The PHP Group | + | Copyright (c) 1997-2014 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | -- cgit v1.2.1 From f4cfaf36e23ca47da3e352e1c60909104c059647 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 10 Feb 2014 10:04:30 +0400 Subject: Use better data structures (incomplete) --- ext/mysql/php_mysql.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 3d092b2d6a..a00e98fbbc 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2176,14 +2176,15 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) { if (Z_TYPE_P(ctor_params) == IS_ARRAY) { HashTable *htl = Z_ARRVAL_P(ctor_params); + uint idx; Bucket *p; fci.param_count = 0; fci.params = safe_emalloc(sizeof(zval*), htl->nNumOfElements, 0); - p = htl->pListHead; - while (p != NULL) { - fci.params[fci.param_count++] = (zval**)p->pData; - p = p->pListNext; + for (idx = 0; idx < htl->nNumUsed; idx++) { + p = htl->arData + idx; + if (!p->xData) continue; + fci.params[fci.param_count++] = (zval**)&p->xData; } } else { /* Two problems why we throw exceptions here: PHP is typeless -- cgit v1.2.1 From adcfee7b07ce96272349e6a17892151a150658bb Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sun, 23 Mar 2014 11:30:09 +0800 Subject: Refactor ext/mysql --- ext/mysql/php_mysql.c | 811 ++++++++++++++++++++++++-------------------------- 1 file changed, 397 insertions(+), 414 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index a00e98fbbc..eb34d442ac 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -121,7 +121,7 @@ static PHP_GINIT_FUNCTION(mysql); typedef struct _php_mysql_conn { MYSQL *conn; - int active_result_id; + zend_resource *active_result_res; int multi_query; } php_mysql_conn; @@ -363,46 +363,49 @@ ZEND_GET_MODULE(mysql) void timeout(int sig); -#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; } } +#define CHECK_LINK(link) { if (link == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } } #if defined(MYSQL_USE_MYSQLND) -#define PHPMY_UNBUFFERED_QUERY_CHECK() \ -{\ - if (mysql->active_result_id) { \ - do { \ - int type; \ - MYSQL_RES *_mysql_result; \ - \ - _mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \ - if (_mysql_result && type==le_result) { \ - if (mysql_result_is_unbuffered(_mysql_result) && !mysql_eof(_mysql_result)) { \ - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching all rows from a previous unbuffered query"); \ - } \ - zend_list_delete(mysql->active_result_id); \ - mysql->active_result_id = 0; \ - } \ - } while(0); \ - }\ +#define PHPMY_UNBUFFERED_QUERY_CHECK() \ +{ \ + if (mysql->active_result_res) { \ + do { \ + MYSQL_RES *_mysql_result; \ + _mysql_result = (MYSQL_RES *)mysql->active_result_res->ptr; \ + if (_mysql_result && \ + mysql->active_result_res->type == le_result) { \ + if (mysql_result_is_unbuffered(_mysql_result) && \ + !mysql_eof(_mysql_result)) { \ + php_error_docref(NULL TSRMLS_CC, E_NOTICE, \ + "Function called without first fetching all" \ + "rows from a previous unbuffered query"); \ + } \ + zend_list_close(mysql->active_result_res); \ + mysql->active_result_res = NULL; \ + } \ + } while(0); \ + } \ } #else -#define PHPMY_UNBUFFERED_QUERY_CHECK() \ -{ \ - if (mysql->active_result_id) { \ - do { \ - int type; \ - MYSQL_RES *mysql_result; \ - \ - mysql_result = (MYSQL_RES *) zend_list_find(mysql->active_result_id, &type); \ - if (mysql_result && type==le_result) { \ - if (!mysql_eof(mysql_result)) { \ - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Function called without first fetching all rows from a previous unbuffered query"); \ - while (mysql_fetch_row(mysql_result)); \ - } \ - zend_list_delete(mysql->active_result_id); \ - mysql->active_result_id = 0; \ - } \ - } while(0); \ - } \ +#define PHPMY_UNBUFFERED_QUERY_CHECK() \ +{ \ + if (mysql->active_result_res) { \ + do { \ + MYSQL_RES *mysql_result; \ + mysql_result = (MYSQL_RES *) mysql->active_result_res->ptr; \ + if (mysql_result && \ + mysql->active_result_res->type == le_result) { \ + if (!mysql_eof(mysql_result)) { \ + php_error_docref(NULL TSRMLS_CC, E_NOTICE, \ + "Function called without first fetching " \ + "all rows from a previous unbuffered query"); \ + while (mysql_fetch_row(mysql_result)); \ + } \ + zend_list_close(mysql->active_result_res); \ + mysql->active_result_res = NULL; \ + } \ + } while(0); \ + } \ } #endif @@ -410,7 +413,7 @@ void timeout(int sig); * This wrapper is required since mysql_free_result() returns an integer, and * thus, cannot be used directly */ -static void _free_mysql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void _free_mysql_result(zend_resource *rsrc TSRMLS_DC) { MYSQL_RES *mysql_result = (MYSQL_RES *)rsrc->ptr; @@ -421,13 +424,15 @@ static void _free_mysql_result(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ php_mysql_set_default_link */ -static void php_mysql_set_default_link(int id TSRMLS_DC) +static void php_mysql_set_default_link(zend_resource *link TSRMLS_DC) { - if (MySG(default_link) != -1) { - zend_list_delete(MySG(default_link)); + if (MySG(default_link) != NULL) { + if (--(MySG(default_link)->gc.refcount) == 0) { + zend_list_delete(MySG(default_link)); + } } - MySG(default_link) = id; - zend_list_addref(id); + ++link->gc.refcount; + MySG(default_link) = link; } /* }}} */ @@ -447,10 +452,10 @@ static int php_mysql_select_db(php_mysql_conn *mysql, char *db TSRMLS_DC) /* {{{ _close_mysql_link */ -static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void _close_mysql_link(zend_resource *rsrc TSRMLS_DC) { php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr; - void (*handler) (int); + void (*handler)(int); handler = signal(SIGPIPE, SIG_IGN); mysql_close(link->conn); @@ -462,7 +467,7 @@ static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ _close_mysql_plink */ -static void _close_mysql_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void _close_mysql_plink(zend_resource *rsrc TSRMLS_DC) { php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr; void (*handler) (int); @@ -531,7 +536,7 @@ static PHP_GINIT_FUNCTION(mysql) #ifdef MYSQL_USE_MYSQLND #include "ext/mysqlnd/mysqlnd_reverse_api.h" -static MYSQLND * mysql_convert_zv_to_mysqlnd(zval * zv TSRMLS_DC) +static MYSQLND *mysql_convert_zv_to_mysqlnd(zval *zv TSRMLS_DC) { php_mysql_conn *mysql; @@ -540,7 +545,7 @@ static MYSQLND * mysql_convert_zv_to_mysqlnd(zval * zv TSRMLS_DC) return NULL; } - mysql = (php_mysql_conn *)zend_fetch_resource(&zv TSRMLS_CC, -1, "MySQL-Link", NULL, 2, le_link, le_plink); + mysql = zend_fetch_resource(zv TSRMLS_CC, -1, "MySQL-Link", NULL, 2, le_link, le_plink); if (!mysql) { return NULL; @@ -626,7 +631,7 @@ PHP_RINIT_FUNCTION(mysql) return FAILURE; } #endif - MySG(default_link)=-1; + MySG(default_link) = NULL; MySG(num_links) = MySG(num_persistent); /* Reset connect error/errno on every request */ MySG(connect_error) = NULL; @@ -637,10 +642,11 @@ PHP_RINIT_FUNCTION(mysql) } /* }}} */ - #if defined(A0) && defined(MYSQL_USE_MYSQLND) -static int php_mysql_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC) +static int php_mysql_persistent_helper(zval *el;zend_rsrc_list_entry *le TSRMLS_DC) { + //??? + //zend_rsrc_list_entry *le = (zend_rsrc_list_entry*)Z_PTR_P(el); if (le->type == le_plink) { mysqlnd_end_psession(((php_mysql_conn *) le->ptr)->conn); } @@ -719,17 +725,19 @@ PHP_MINFO_FUNCTION(mysql) static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { - char *user=NULL, *passwd=NULL, *host_and_port=NULL, *socket=NULL, *tmp=NULL, *host=NULL; - int user_len = 0, passwd_len = 0, host_len = 0; - char *hashed_details=NULL; - int hashed_details_length, port = MYSQL_PORT; + char *user = NULL, *passwd = NULL; + char *host_and_port = NULL, *socket = NULL; + char *tmp = NULL, *host = NULL; + int user_len = 0, passwd_len = 0, host_len = 0; + int port = MYSQL_PORT; long client_flags = 0; - php_mysql_conn *mysql=NULL; + php_mysql_conn *mysql = NULL; #if MYSQL_VERSION_ID <= 32230 void (*handler) (int); #endif - zend_bool free_host=0, new_link=0; long connect_timeout; + zend_string *hashed_details = NULL; + zend_bool free_host = 0, new_link = 0; php_error_docref(NULL TSRMLS_CC, E_DEPRECATED, @@ -754,10 +762,10 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) MySG(default_port) = MYSQL_PORT; if ((serv_ptr = getservbyname("mysql", "tcp"))) { - MySG(default_port) = (uint) ntohs((ushort) serv_ptr->s_port); + MySG(default_port) = (uint)ntohs((ushort)serv_ptr->s_port); } if ((env = getenv("MYSQL_TCP_PORT"))) { - MySG(default_port) = (uint) atoi(env); + MySG(default_port) = (uint)atoi(env); } #else MySG(default_port) = MYSQL_PORT; @@ -768,9 +776,9 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (ZEND_NUM_ARGS()>0) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "SQL safe mode in effect - ignoring host/user/password information"); } - host_and_port=passwd=NULL; - user=php_get_current_user(TSRMLS_C); - hashed_details_length = spprintf(&hashed_details, 0, "mysql__%s_", user); + user = php_get_current_user(TSRMLS_C); + hashed_details = STR_ALLOC(sizeof("mysql___") + strlen(user) - 1, 0); + snprintf(hashed_details->val, hashed_details->len + 1, "mysql__%s_", user); client_flags = CLIENT_INTERACTIVE; } else { /* mysql_pconnect does not support new_link parameter */ @@ -814,13 +822,15 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifdef CLIENT_MULTI_STATEMENTS client_flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */ #endif - 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); + hashed_details = STR_ALLOC(sizeof("mysql____") + (host_and_port? strlen(host_and_port) : 0) + + (user? strlen(user) : 0) + (passwd? strlen(passwd) : 0) + MAX_LENGTH_OF_LONG - 1, 0); + hashed_details->len = snprintf(hashed_details->val, hashed_details->len + 1, "mysql_%s_%s_%s_%ld", SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags); } /* We cannot use mysql_port anymore in windows, need to use * mysql_real_connect() to set the port. */ - if (host_and_port && (tmp=strchr(host_and_port, ':'))) { + if (host_and_port && (tmp = strchr(host_and_port, ':'))) { host = estrndup(host_and_port, tmp-host_and_port); free_host = 1; tmp++; @@ -843,31 +853,35 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #endif if (!MySG(allow_persistent)) { - persistent=0; + persistent = 0; } + if (persistent) { - zend_rsrc_list_entry *le; + zend_resource *le; + zend_string *phashed; /* try to find if we already have this link in our persistent list */ - if (zend_hash_find(&EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) { /* we don't */ - zend_rsrc_list_entry new_le; + if ((le = zend_hash_find_ptr(&EG(persistent_list), hashed_details)) == NULL) { /* we don't */ + zend_resource new_le; if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links)); - efree(hashed_details); + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } + if (MySG(max_persistent) != -1 && MySG(num_persistent) >= MySG(max_persistent)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)", MySG(num_persistent)); - efree(hashed_details); + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } /* create the link */ - mysql = (php_mysql_conn *) malloc(sizeof(php_mysql_conn)); + mysql = (php_mysql_conn *)malloc(sizeof(php_mysql_conn)); if (!mysql) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Out of memory while allocating memory for a persistent link"); + php_error_docref(NULL TSRMLS_CC, E_ERROR, + "Out of memory while allocating memory for a persistent link"); } - mysql->active_result_id = 0; + mysql->active_result_res = NULL; #ifdef CLIENT_MULTI_STATEMENTS mysql->multi_query = client_flags & CLIENT_MULTI_STATEMENTS? 1:0; #else @@ -893,33 +907,37 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (MySG(connect_error) != NULL) { efree(MySG(connect_error)); } + MySG(connect_error) = estrdup(mysql_error(mysql->conn)); php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", MySG(connect_error)); #if defined(HAVE_MYSQL_ERRNO) MySG(connect_errno) = mysql_errno(mysql->conn); #endif free(mysql); - efree(hashed_details); + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile)); /* hash it up */ - Z_TYPE(new_le) = le_plink; + new_le.type = le_plink; new_le.ptr = mysql; - if (zend_hash_update(&EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) { + + /* avoid bogus memleak report */ + phashed = STR_INIT(hashed_details->val, hashed_details->len, 1); + if (zend_hash_update_mem(&EG(persistent_list), phashed, &new_le, sizeof(zend_resource)) == NULL) { free(mysql); - efree(hashed_details); + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } MySG(num_persistent)++; MySG(num_links)++; } else { /* The link is in our list of persistent connections */ - if (Z_TYPE_P(le) != le_plink) { + if (le->type != le_plink) { MYSQL_DO_CONNECT_RETURN_FALSE(); } - mysql = (php_mysql_conn *) le->ptr; - mysql->active_result_id = 0; + mysql = (php_mysql_conn *)le->ptr; + mysql->active_result_res = NULL; #ifdef CLIENT_MULTI_STATEMENTS mysql->multi_query = client_flags & CLIENT_MULTI_STATEMENTS? 1:0; #else @@ -938,8 +956,8 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #endif { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect"); - zend_hash_del(&EG(persistent_list), hashed_details, hashed_details_length+1); - efree(hashed_details); + zend_hash_del(&EG(persistent_list), hashed_details); + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile)); @@ -952,43 +970,41 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) } ZEND_REGISTER_RESOURCE(return_value, mysql, le_plink); } else { /* non persistent */ - zend_rsrc_list_entry *index_ptr, new_index_ptr; + zend_resource *index_ptr, new_index_ptr; /* first we check the hash for the hashed_details key. if it exists, * it should point us to the right offset where the actual mysql link sits. * if it doesn't, open a new mysql link, add it to the resource list, * and add a pointer to it with hashed_details as the key. */ - if (!new_link && zend_hash_find(&EG(regular_list), hashed_details, hashed_details_length+1,(void **) &index_ptr)==SUCCESS) { - int type; - long link; - void *ptr; + if (!new_link && (index_ptr = zend_hash_find_ptr(&EG(regular_list), hashed_details))) { + zend_resource *link; - if (Z_TYPE_P(index_ptr) != le_index_ptr) { + if (index_ptr->type != le_index_ptr) { MYSQL_DO_CONNECT_RETURN_FALSE(); } - link = (long) index_ptr->ptr; - ptr = zend_list_find(link,&type); /* check if the link is still there */ - if (ptr && (type==le_link || type==le_plink)) { - zend_list_addref(link); - Z_LVAL_P(return_value) = link; + + link = (zend_resource *)index_ptr->ptr; + if (link && (link->type == le_link || link->type == le_plink)) { + link->gc.refcount++; + ZVAL_RES(return_value, link); php_mysql_set_default_link(link TSRMLS_CC); - Z_TYPE_P(return_value) = IS_RESOURCE; - efree(hashed_details); + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_CLEANUP(); return; } else { - zend_hash_del(&EG(regular_list), hashed_details, hashed_details_length+1); + zend_hash_del(&EG(regular_list), hashed_details); } } + if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links)); - efree(hashed_details); + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } mysql = (php_mysql_conn *) emalloc(sizeof(php_mysql_conn)); - mysql->active_result_id = 0; + mysql->active_result_res = NULL; #ifdef CLIENT_MULTI_STATEMENTS mysql->multi_query = 1; #endif @@ -1001,7 +1017,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (!mysql->conn) { MySG(connect_error) = estrdup("OOM"); php_error_docref(NULL TSRMLS_CC, E_WARNING, "OOM"); - efree(hashed_details); + STR_RELEASE(hashed_details); efree(mysql); MYSQL_DO_CONNECT_RETURN_FALSE(); } @@ -1029,7 +1045,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifdef MYSQL_USE_MYSQLND mysqlnd_close(mysql->conn, MYSQLND_CLOSE_DISCONNECTED); #endif - efree(hashed_details); + STR_RELEASE(hashed_details); efree(mysql); MYSQL_DO_CONNECT_RETURN_FALSE(); } @@ -1039,27 +1055,28 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) ZEND_REGISTER_RESOURCE(return_value, mysql, le_link); /* add it to the hash */ - new_index_ptr.ptr = (void *) Z_LVAL_P(return_value); - Z_TYPE(new_index_ptr) = le_index_ptr; - if (zend_hash_update(&EG(regular_list), hashed_details, hashed_details_length+1,(void *) &new_index_ptr, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) { - efree(hashed_details); + new_index_ptr.ptr = Z_RES_P(return_value); + new_index_ptr.type = le_index_ptr; + + if (zend_hash_update_mem(&EG(regular_list), hashed_details, &new_index_ptr, sizeof(zend_resource)) == NULL) { + STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } MySG(num_links)++; } - efree(hashed_details); - php_mysql_set_default_link(Z_LVAL_P(return_value) TSRMLS_CC); + STR_RELEASE(hashed_details); + php_mysql_set_default_link(Z_RES_P(return_value) TSRMLS_CC); MYSQL_DO_CONNECT_CLEANUP(); } /* }}} */ /* {{{ php_mysql_get_default_link */ -static int php_mysql_get_default_link(INTERNAL_FUNCTION_PARAMETERS) +static zend_resource *php_mysql_get_default_link(INTERNAL_FUNCTION_PARAMETERS) { - if (MySG(default_link)==-1) { /* no link opened yet, implicitly open one */ - ht = 0; + if (MySG(default_link) == NULL) { /* no link opened yet, implicitly open one */ + ZEND_NUM_ARGS() = 0; php_mysql_do_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); } return MySG(default_link); @@ -1086,8 +1103,8 @@ PHP_FUNCTION(mysql_pconnect) Close a MySQL connection */ PHP_FUNCTION(mysql_close) { - int resource_id; - zval *mysql_link=NULL; + zend_resource *res; + zval *mysql_link = NULL; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { @@ -1095,29 +1112,28 @@ PHP_FUNCTION(mysql_close) } if (mysql_link) { - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, -1, "MySQL-Link", le_link, le_plink); + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } else { - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, NULL, MySG(default_link), "MySQL-Link", le_link, le_plink); + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, NULL, MySG(default_link)? MySG(default_link)->handle : -1, "MySQL-Link", le_link, le_plink); } - resource_id = mysql_link ? Z_RESVAL_P(mysql_link) : MySG(default_link); + res = mysql_link ? Z_RES_P(mysql_link) : MySG(default_link); PHPMY_UNBUFFERED_QUERY_CHECK(); + if (res) { #ifdef MYSQL_USE_MYSQLND - { - int tmp; - if ((mysql = zend_list_find(resource_id, &tmp)) && tmp == le_plink) { + if (res->type == le_plink) { mysqlnd_end_psession(mysql->conn); } - } #endif - zend_list_delete(resource_id); - - if (!mysql_link - || (mysql_link && Z_RESVAL_P(mysql_link)==MySG(default_link))) { - MySG(default_link) = -1; - if (mysql_link) { - /* on an explicit close of the default connection it had a refcount of 2 so we need one more call */ - zend_list_delete(resource_id); + if (!mysql_link) { + --res->gc.refcount; + MySG(default_link) = NULL; + } else if (mysql_link && Z_RES_P(mysql_link) == MySG(default_link)) { + --res->gc.refcount; + MySG(default_link) = NULL; + zend_list_close(res); + } else { + zend_list_close(res); } } @@ -1131,21 +1147,21 @@ PHP_FUNCTION(mysql_select_db) { char *db; int db_len; - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &db, &db_len, &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - if (php_mysql_select_db(mysql, db TSRMLS_CC)) { RETURN_TRUE; } else { @@ -1164,7 +1180,7 @@ PHP_FUNCTION(mysql_get_client_info) return; } - RETURN_STRING((char *)mysql_get_client_info(),1); + RETURN_STRING((char *)mysql_get_client_info()); } /* }}} */ @@ -1173,7 +1189,6 @@ PHP_FUNCTION(mysql_get_client_info) PHP_FUNCTION(mysql_get_host_info) { zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { @@ -1181,13 +1196,14 @@ PHP_FUNCTION(mysql_get_host_info) } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - - RETURN_STRING((char *)mysql_get_host_info(mysql->conn),1); + RETURN_STRING((char *)mysql_get_host_info(mysql->conn)); } /* }}} */ @@ -1196,7 +1212,6 @@ PHP_FUNCTION(mysql_get_host_info) PHP_FUNCTION(mysql_get_proto_info) { zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { @@ -1204,12 +1219,13 @@ PHP_FUNCTION(mysql_get_proto_info) } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - RETURN_LONG(mysql_get_proto_info(mysql->conn)); } /* }}} */ @@ -1219,7 +1235,6 @@ PHP_FUNCTION(mysql_get_proto_info) PHP_FUNCTION(mysql_get_server_info) { zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { @@ -1227,13 +1242,14 @@ PHP_FUNCTION(mysql_get_server_info) } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - - RETURN_STRING((char *)mysql_get_server_info(mysql->conn),1); + RETURN_STRING((char *)mysql_get_server_info(mysql->conn)); } /* }}} */ @@ -1241,24 +1257,24 @@ PHP_FUNCTION(mysql_get_server_info) Returns a string containing information about the most recent query */ PHP_FUNCTION(mysql_info) { - zval *mysql_link = NULL; - int id = -1; char *str; + zval *mysql_link = NULL; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } - - if (ZEND_NUM_ARGS() == 0) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - if ((str = (char *)mysql_info(mysql->conn))) { - RETURN_STRING(str,1); + RETURN_STRING(str); } else { RETURN_FALSE; } @@ -1270,18 +1286,19 @@ PHP_FUNCTION(mysql_info) PHP_FUNCTION(mysql_thread_id) { zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } - if (ZEND_NUM_ARGS() == 0) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); RETURN_LONG((long) mysql_thread_id(mysql->conn)); } @@ -1291,9 +1308,8 @@ PHP_FUNCTION(mysql_thread_id) Returns a string containing status information */ PHP_FUNCTION(mysql_stat) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; char *stat; #ifdef MYSQL_USE_MYSQLND uint stat_len; @@ -1303,19 +1319,22 @@ PHP_FUNCTION(mysql_stat) return; } - if (ZEND_NUM_ARGS() == 0) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); PHPMY_UNBUFFERED_QUERY_CHECK(); #ifndef MYSQL_USE_MYSQLND if ((stat = (char *)mysql_stat(mysql->conn))) { - RETURN_STRING(stat, 1); + RETURN_STRING(stat); #else if (mysqlnd_stat(mysql->conn, &stat, &stat_len) == PASS) { - RETURN_STRINGL(stat, stat_len, 0); + //???? memleak + RETURN_STRINGL(stat, stat_len); #endif } else { RETURN_FALSE; @@ -1327,21 +1346,22 @@ PHP_FUNCTION(mysql_stat) Returns the default character set for the current connection */ PHP_FUNCTION(mysql_client_encoding) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } - if (ZEND_NUM_ARGS() == 0) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - RETURN_STRING((char *)mysql_character_set_name(mysql->conn), 1); + RETURN_STRING((char *)mysql_character_set_name(mysql->conn)); } /* }}} */ #endif @@ -1351,22 +1371,23 @@ PHP_FUNCTION(mysql_client_encoding) sets client character set */ PHP_FUNCTION(mysql_set_charset) { - zval *mysql_link = NULL; char *csname; - int id = -1, csname_len; + int csname_len; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &csname, &csname_len, &mysql_link) == FAILURE) { return; } - if (ZEND_NUM_ARGS() == 1) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - if (!mysql_set_character_set(mysql->conn, csname)) { RETURN_TRUE; } else { @@ -1384,21 +1405,21 @@ PHP_FUNCTION(mysql_create_db) { char *db; int db_len; - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &db, &db_len, &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - PHPMY_UNBUFFERED_QUERY_CHECK(); if (mysql_create_db(mysql->conn, db)==0) { @@ -1415,21 +1436,21 @@ PHP_FUNCTION(mysql_drop_db) { char *db; int db_len; - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &db, &db_len, &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - if (mysql_drop_db(mysql->conn, db)==0) { RETURN_TRUE; } else { @@ -1442,13 +1463,10 @@ PHP_FUNCTION(mysql_drop_db) /* {{{ php_mysql_do_query_general */ -static void php_mysql_do_query_general(char *query, int query_len, zval *mysql_link, int link_id, char *db, int use_store, zval *return_value TSRMLS_DC) +static void php_mysql_do_query_general(php_mysql_conn *mysql, char *query, int query_len, char *db, int use_store, zval *return_value TSRMLS_DC) { - php_mysql_conn *mysql; MYSQL_RES *mysql_result; - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, link_id, "MySQL-Link", le_link, le_plink); - if (db) { if (!php_mysql_select_db(mysql, db TSRMLS_CC)) { RETURN_FALSE; @@ -1466,7 +1484,7 @@ static void php_mysql_do_query_general(char *query, int query_len, zval *mysql_l MYSQL_ROW row; char *newquery; - int newql = spprintf (&newquery, 0, "EXPLAIN %s", query); + int newql = spprintf(&newquery, 0, "EXPLAIN %s", query); mysql_real_query(mysql->conn, newquery, newql); efree (newquery); if (mysql_errno(mysql->conn)) { @@ -1511,9 +1529,9 @@ static void php_mysql_do_query_general(char *query, int query_len, zval *mysql_l } #endif if(use_store == MYSQL_USE_RESULT) { - mysql_result=mysql_use_result(mysql->conn); + mysql_result = mysql_use_result(mysql->conn); } else { - mysql_result=mysql_store_result(mysql->conn); + mysql_result = mysql_store_result(mysql->conn); } if (!mysql_result) { if (PHP_MYSQL_VALID_RESULT(mysql->conn)) { /* query should have returned rows */ @@ -1526,7 +1544,7 @@ static void php_mysql_do_query_general(char *query, int query_len, zval *mysql_l MySG(result_allocated)++; ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result); if (use_store == MYSQL_USE_RESULT) { - mysql->active_result_id = Z_LVAL_P(return_value); + mysql->active_result_res = Z_RES_P(return_value); } } /* }}} */ @@ -1538,18 +1556,21 @@ static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERS, int use_store) char *query; int query_len; zval *mysql_link = NULL; - int id = -1; + php_mysql_conn *mysql; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &query, &query_len, &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - php_mysql_do_query_general(query, query_len, mysql_link, id, NULL, use_store, return_value TSRMLS_CC); + php_mysql_do_query_general(mysql, query, query_len, NULL, use_store, return_value TSRMLS_CC); } /* }}} */ @@ -1561,7 +1582,6 @@ PHP_FUNCTION(mysql_query) } /* }}} */ - /* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier]) Sends an SQL query to MySQL, without fetching and buffering the result rows */ PHP_FUNCTION(mysql_unbuffered_query) @@ -1570,75 +1590,75 @@ PHP_FUNCTION(mysql_unbuffered_query) } /* }}} */ - /* {{{ proto resource mysql_db_query(string database_name, string query [, int link_identifier]) Sends an SQL query to MySQL */ PHP_FUNCTION(mysql_db_query) { char *db, *query; int db_len, query_len; + php_mysql_conn *mysql; zval *mysql_link = NULL; - int id = -1; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|r", &db, &db_len, &query, &query_len, &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } php_error_docref(NULL TSRMLS_CC, E_DEPRECATED, "This function is deprecated; use mysql_query() instead"); - php_mysql_do_query_general(query, query_len, mysql_link, id, db, MYSQL_STORE_RESULT, return_value TSRMLS_CC); + php_mysql_do_query_general(mysql, query, query_len, db, MYSQL_STORE_RESULT, return_value TSRMLS_CC); } /* }}} */ - /* {{{ proto resource mysql_list_dbs([int link_identifier]) List databases available on a MySQL server */ PHP_FUNCTION(mysql_list_dbs) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; MYSQL_RES *mysql_result; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - php_error_docref(NULL TSRMLS_CC, E_DEPRECATED, "This function is deprecated; use mysql_query() with SHOW DATABASES instead"); - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); + php_error_docref(NULL TSRMLS_CC, E_DEPRECATED, "This function is deprecated; use mysql_query() with SHOW DATABASES instead"); PHPMY_UNBUFFERED_QUERY_CHECK(); - - if ((mysql_result=mysql_list_dbs(mysql->conn, NULL))==NULL) { + if ((mysql_result = mysql_list_dbs(mysql->conn, NULL))==NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result"); RETURN_FALSE; } + MySG(result_allocated)++; ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result); } /* }}} */ - /* {{{ proto resource mysql_list_tables(string database_name [, int link_identifier]) List tables in a MySQL database */ PHP_FUNCTION(mysql_list_tables) { char *db; int db_len; - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; MYSQL_RES *mysql_result; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &db, &db_len, &mysql_link) == FAILURE) { @@ -1646,19 +1666,20 @@ PHP_FUNCTION(mysql_list_tables) } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - if (!php_mysql_select_db(mysql, db TSRMLS_CC)) { RETURN_FALSE; } PHPMY_UNBUFFERED_QUERY_CHECK(); - if ((mysql_result=mysql_list_tables(mysql->conn, NULL))==NULL) { + if ((mysql_result = mysql_list_tables(mysql->conn, NULL))==NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save MySQL query result"); RETURN_FALSE; } @@ -1667,7 +1688,6 @@ PHP_FUNCTION(mysql_list_tables) } /* }}} */ - /* {{{ proto resource mysql_list_fields(string database_name, string table_name [, int link_identifier]) List MySQL result fields */ PHP_FUNCTION(mysql_list_fields) @@ -1675,7 +1695,6 @@ PHP_FUNCTION(mysql_list_fields) char *db, *table; int db_len, table_len; zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; MYSQL_RES *mysql_result; @@ -1684,12 +1703,13 @@ PHP_FUNCTION(mysql_list_fields) } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - if (!php_mysql_select_db(mysql, db TSRMLS_CC)) { RETURN_FALSE; } @@ -1709,22 +1729,22 @@ PHP_FUNCTION(mysql_list_fields) Returns a result set describing the current server threads */ PHP_FUNCTION(mysql_list_processes) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; MYSQL_RES *mysql_result; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } - if (ZEND_NUM_ARGS() == 0) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - PHPMY_UNBUFFERED_QUERY_CHECK(); mysql_result = mysql_list_processes(mysql->conn); @@ -1738,101 +1758,95 @@ PHP_FUNCTION(mysql_list_processes) } /* }}} */ - /* {{{ proto string mysql_error([int link_identifier]) Returns the text of the error message from previous MySQL operation */ PHP_FUNCTION(mysql_error) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = MySG(default_link); - if (id==-1) { - if (MySG(connect_error)!=NULL){ - RETURN_STRING(MySG(connect_error),1); + if (MySG(default_link) == NULL) { + if (MySG(connect_error) != NULL){ + RETURN_STRING(MySG(connect_error)); } else { RETURN_FALSE; } } + mysql = (php_mysql_conn*)MySG(default_link)->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - - RETURN_STRING((char *)mysql_error(mysql->conn), 1); + RETURN_STRING((char *)mysql_error(mysql->conn)); } /* }}} */ - /* {{{ proto int mysql_errno([int link_identifier]) Returns the number of the error message from previous MySQL operation */ #ifdef HAVE_MYSQL_ERRNO PHP_FUNCTION(mysql_errno) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = MySG(default_link); - if (id==-1) { - if (MySG(connect_errno)!=0){ + if (MySG(default_link) == NULL) { + if (MySG(connect_error) != NULL){ RETURN_LONG(MySG(connect_errno)); } else { RETURN_FALSE; } } + mysql = (php_mysql_conn*)MySG(default_link)->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - RETURN_LONG(mysql_errno(mysql->conn)); } #endif /* }}} */ - /* {{{ proto int mysql_affected_rows([int link_identifier]) Gets number of affected rows in previous MySQL operation */ PHP_FUNCTION(mysql_affected_rows) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - /* conversion from int64 to long happing here */ - Z_LVAL_P(return_value) = (long) mysql_affected_rows(mysql->conn); - Z_TYPE_P(return_value) = IS_LONG; + RETURN_LONG((long)mysql_affected_rows(mysql->conn)); } /* }}} */ - /* {{{ proto string mysql_escape_string(string to_be_escaped) Escape string for mysql query */ PHP_FUNCTION(mysql_escape_string) { char *str; int str_len; + zend_string *escaped_str; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) { return; @@ -1842,12 +1856,11 @@ PHP_FUNCTION(mysql_escape_string) * we don't realloc() down to the real size since it'd most probably not * be worth it */ - - Z_STRVAL_P(return_value) = (char *) safe_emalloc(str_len, 2, 1); - Z_STRLEN_P(return_value) = mysql_escape_string(Z_STRVAL_P(return_value), str, str_len); - Z_TYPE_P(return_value) = IS_STRING; + escaped_str = STR_ALLOC(str_len * 2, 0); + escaped_str->len = mysql_escape_string(escaped_str->val, str, str_len); php_error_docref("function.mysql-real-escape-string" TSRMLS_CC, E_DEPRECATED, "This function is deprecated; use mysql_real_escape_string() instead."); + RETURN_STR(escaped_str); } /* }}} */ @@ -1855,29 +1868,32 @@ PHP_FUNCTION(mysql_escape_string) Escape special characters in a string for use in a SQL statement, taking into account the current charset of the connection */ PHP_FUNCTION(mysql_real_escape_string) { - zval *mysql_link = NULL; char *str; - char *new_str; - int id = -1, str_len, new_str_len; + int str_len; + zend_string *new_str; php_mysql_conn *mysql; - + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &str, &str_len, &mysql_link) == FAILURE) { return; } - if (ZEND_NUM_ARGS() == 1) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - - new_str = safe_emalloc(str_len, 2, 1); - new_str_len = mysql_real_escape_string(mysql->conn, new_str, str, str_len); - new_str = erealloc(new_str, new_str_len + 1); + /* assume worst case situation, which is 2x of the original string. + * we don't realloc() down to the real size since it'd most probably not + * be worth it + */ + new_str = STR_ALLOC(str_len * 2, 0); + new_str->len = mysql_real_escape_string(mysql->conn, new_str->val, str, str_len); - RETURN_STRINGL(new_str, new_str_len, 0); + RETURN_STR(new_str); } /* }}} */ @@ -1885,28 +1901,26 @@ PHP_FUNCTION(mysql_real_escape_string) Gets the ID generated from the previous INSERT operation */ PHP_FUNCTION(mysql_insert_id) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } if (!mysql_link) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); - /* conversion from int64 to long happing here */ - Z_LVAL_P(return_value) = (long) mysql_insert_id(mysql->conn); - Z_TYPE_P(return_value) = IS_LONG; + RETURN_LONG((long)mysql_insert_id(mysql->conn)); } /* }}} */ - /* {{{ proto mixed mysql_result(resource result, int row [, mixed field]) Gets result data */ PHP_FUNCTION(mysql_result) @@ -1929,30 +1943,30 @@ Q: String or long first? return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - if (row<0 || row>=(int)mysql_num_rows(mysql_result)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %ld on MySQL result index %ld", row, Z_LVAL_P(result)); + if (row < 0 || row >= (int)mysql_num_rows(mysql_result)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %ld on MySQL result index %ld", row, Z_RES_P(result)->handle); RETURN_FALSE; } mysql_data_seek(mysql_result, row); if (field) { - switch(Z_TYPE_P(field)) { + switch (Z_TYPE_P(field)) { case IS_STRING: { - int i=0; + int i = 0; const MYSQL_FIELD *tmp_field; char *table_name, *field_name, *tmp; - if ((tmp=strchr(Z_STRVAL_P(field), '.'))) { + if ((tmp = strchr(Z_STRVAL_P(field), '.'))) { table_name = estrndup(Z_STRVAL_P(field), tmp-Z_STRVAL_P(field)); - field_name = estrdup(tmp+1); + field_name = estrdup(tmp + 1); } else { table_name = NULL; field_name = estrndup(Z_STRVAL_P(field),Z_STRLEN_P(field)); } mysql_field_seek(mysql_result, 0); - while ((tmp_field=mysql_fetch_field(mysql_result))) { + while ((tmp_field = mysql_fetch_field(mysql_result))) { if ((!table_name || !strcasecmp(tmp_field->table, table_name)) && !strcasecmp(tmp_field->name, field_name)) { field_offset = i; break; @@ -1975,9 +1989,9 @@ Q: String or long first? } break; default: - convert_to_long_ex(&field); + convert_to_long_ex(field); field_offset = Z_LVAL_P(field); - if (field_offset<0 || field_offset>=(int)mysql_num_fields(mysql_result)) { + if (field_offset < 0 || field_offset >= (int)mysql_num_fields(mysql_result)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified"); RETURN_FALSE; } @@ -1986,25 +2000,22 @@ Q: String or long first? } #ifndef MYSQL_USE_MYSQLND - if ((sql_row=mysql_fetch_row(mysql_result))==NULL - || (sql_row_lengths=mysql_fetch_lengths(mysql_result))==NULL) { /* shouldn't happen? */ + if ((sql_row = mysql_fetch_row(mysql_result)) == NULL + || (sql_row_lengths=mysql_fetch_lengths(mysql_result)) == NULL) { /* shouldn't happen? */ RETURN_FALSE; } if (sql_row[field_offset]) { - Z_TYPE_P(return_value) = IS_STRING; - #if PHP_API_VERSION < 20100412 if (PG(magic_quotes_runtime)) { - Z_STRVAL_P(return_value) = php_addslashes(sql_row[field_offset], sql_row_lengths[field_offset],&Z_STRLEN_P(return_value), 0 TSRMLS_CC); + RETVAL_STR(php_addslashes(sql_row[field_offset], sql_row_lengths[field_offset], 0 TSRMLS_CC)); } else { #endif - Z_STRLEN_P(return_value) = sql_row_lengths[field_offset]; - Z_STRVAL_P(return_value) = (char *) safe_estrndup(sql_row[field_offset], Z_STRLEN_P(return_value)); + RETVAL_STRINGL(sql_row[field_offset], sql_row_lengths[field_offset]); #if PHP_API_VERSION < 20100412 } #endif } else { - Z_TYPE_P(return_value) = IS_NULL; + RETURN_NULL(); } #else mysqlnd_result_fetch_field_data(mysql_result, field_offset, return_value); @@ -2012,7 +2023,6 @@ Q: String or long first? } /* }}} */ - /* {{{ proto int mysql_num_rows(resource result) Gets number of rows in a result */ PHP_FUNCTION(mysql_num_rows) @@ -2024,11 +2034,10 @@ PHP_FUNCTION(mysql_num_rows) return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); /* conversion from int64 to long happing here */ - Z_LVAL_P(return_value) = (long) mysql_num_rows(mysql_result); - Z_TYPE_P(return_value) = IS_LONG; + RETURN_LONG((long) mysql_num_rows(mysql_result)); } /* }}} */ @@ -2043,10 +2052,9 @@ PHP_FUNCTION(mysql_num_fields) return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - Z_LVAL_P(return_value) = mysql_num_fields(mysql_result); - Z_TYPE_P(return_value) = IS_LONG; + RETURN_LONG(mysql_num_fields(mysql_result)); } /* }}} */ @@ -2055,7 +2063,7 @@ PHP_FUNCTION(mysql_num_fields) static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, int expected_args, int into_object) { MYSQL_RES *mysql_result; - zval *res, *ctor_params = NULL; + zval *res, *ctor_params = NULL; zend_class_entry *ce = NULL; #ifndef MYSQL_USE_MYSQLND int i; @@ -2066,20 +2074,19 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, #ifdef ZEND_ENGINE_2 if (into_object) { - char *class_name = NULL; - int class_name_len = 0; + zend_string *class_name = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|sz", &res, &class_name, &class_name_len, &ctor_params) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|Sz", &res, &class_name, &ctor_params) == FAILURE) { return; } if (ZEND_NUM_ARGS() < 2) { ce = zend_standard_class_def; } else { - ce = zend_fetch_class(class_name, class_name_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC); + ce = zend_fetch_class(class_name, ZEND_FETCH_CLASS_AUTO TSRMLS_CC); } if (!ce) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find class '%s'", class_name); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not find class '%s'", class_name->val); return; } result_type = MYSQL_ASSOC; @@ -2100,7 +2107,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, result_type = MYSQL_BOTH; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &res, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, res, -1, "MySQL result", le_result); #ifndef MYSQL_USE_MYSQLND if ((mysql_row = mysql_fetch_row(mysql_result)) == NULL || @@ -2116,29 +2123,26 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, mysql_field = mysql_fetch_field(mysql_result), i++) { if (mysql_row[i]) { - zval *data; - - MAKE_STD_ZVAL(data); + zval data; #if PHP_API_VERSION < 20100412 if (PG(magic_quotes_runtime)) { - Z_TYPE_P(data) = IS_STRING; - Z_STRVAL_P(data) = php_addslashes(mysql_row[i], mysql_row_lengths[i], &Z_STRLEN_P(data), 0 TSRMLS_CC); + ZVAL_STR(&data, php_addslashes(mysql_row[i], mysql_row_lengths[i], 0 TSRMLS_CC)); } else { #endif - ZVAL_STRINGL(data, mysql_row[i], mysql_row_lengths[i], 1); + ZVAL_STRINGL(&data, mysql_row[i], mysql_row_lengths[i]); #if PHP_API_VERSION < 20100412 } #endif if (result_type & MYSQL_NUM) { - add_index_zval(return_value, i, data); + add_index_zval(return_value, i, &data); } if (result_type & MYSQL_ASSOC) { if (result_type & MYSQL_NUM) { - Z_ADDREF_P(data); + Z_ADDREF_P(&data); } - add_assoc_zval(return_value, mysql_field->name, data); + add_assoc_zval(return_value, mysql_field->name, &data); } } else { /* NULL value. */ @@ -2158,21 +2162,23 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, #ifdef ZEND_ENGINE_2 /* mysqlnd might return FALSE if no more rows */ if (into_object && Z_TYPE_P(return_value) != IS_BOOL) { - zval dataset = *return_value; + zval dataset; zend_fcall_info fci; zend_fcall_info_cache fcc; - zval *retval_ptr; + zval retval; + ZVAL_COPY_VALUE(&dataset, return_value); object_and_properties_init(return_value, ce, NULL); - zend_merge_properties(return_value, Z_ARRVAL(dataset), 1 TSRMLS_CC); + zend_merge_properties(return_value, Z_ARRVAL(dataset), 0 TSRMLS_CC); + zval_dtor(&dataset); if (ce->constructor) { fci.size = sizeof(fci); fci.function_table = &ce->function_table; - fci.function_name = NULL; + ZVAL_UNDEF(&fci.function_name); fci.symbol_table = NULL; fci.object_ptr = return_value; - fci.retval_ptr_ptr = &retval_ptr; + fci.retval = &retval; if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) { if (Z_TYPE_P(ctor_params) == IS_ARRAY) { HashTable *htl = Z_ARRVAL_P(ctor_params); @@ -2180,11 +2186,11 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, Bucket *p; fci.param_count = 0; - fci.params = safe_emalloc(sizeof(zval*), htl->nNumOfElements, 0); + fci.params = safe_emalloc(sizeof(zval), htl->nNumOfElements, 0); for (idx = 0; idx < htl->nNumUsed; idx++) { p = htl->arData + idx; - if (!p->xData) continue; - fci.params[fci.param_count++] = (zval**)&p->xData; + if (ZVAL_IS_NULL(&p->val)) continue; + ZVAL_COPY_VALUE(&fci.params[fci.param_count++], &p->val); } } else { /* Two problems why we throw exceptions here: PHP is typeless @@ -2206,20 +2212,20 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, fcc.function_handler = ce->constructor; fcc.calling_scope = EG(scope); fcc.called_scope = Z_OBJCE_P(return_value); - fcc.object_ptr = return_value; + ZVAL_COPY_VALUE(&fcc.object, return_value); if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { - zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %s::%s()", ce->name, ce->constructor->common.function_name); + zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %s::%s()", ce->name->val, ce->constructor->common.function_name->val); } else { - if (retval_ptr) { - zval_ptr_dtor(&retval_ptr); + if (!ZVAL_IS_UNDEF(&retval)) { + zval_ptr_dtor(&retval); } } if (fci.params) { efree(fci.params); } } else if (ctor_params) { - zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Class %s does not have a constructor hence you cannot use ctor_params", ce->name); + zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Class %s does not have a constructor hence you cannot use ctor_params", ce->name->val); } } #endif @@ -2235,7 +2241,6 @@ PHP_FUNCTION(mysql_fetch_row) } /* }}} */ - /* {{{ proto object mysql_fetch_object(resource result [, string class_name [, NULL|array ctor_params]]) Fetch a result row as an object */ PHP_FUNCTION(mysql_fetch_object) @@ -2248,7 +2253,6 @@ PHP_FUNCTION(mysql_fetch_object) } /* }}} */ - /* {{{ proto array mysql_fetch_array(resource result [, int result_type]) Fetch a result row as an array (associative, numeric or both) */ PHP_FUNCTION(mysql_fetch_array) @@ -2257,7 +2261,6 @@ PHP_FUNCTION(mysql_fetch_array) } /* }}} */ - /* {{{ proto array mysql_fetch_assoc(resource result) Fetch a result row as an associative array */ PHP_FUNCTION(mysql_fetch_assoc) @@ -2278,10 +2281,10 @@ PHP_FUNCTION(mysql_data_seek) return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - if (offset<0 || offset>=(int)mysql_num_rows(mysql_result)) { - 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)); + if (offset < 0 || offset >= (int)mysql_num_rows(mysql_result)) { + 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_RES_P(result)->handle); RETURN_FALSE; } mysql_data_seek(mysql_result, offset); @@ -2289,7 +2292,6 @@ PHP_FUNCTION(mysql_data_seek) } /* }}} */ - /* {{{ proto array mysql_fetch_lengths(resource result) Gets max data size of each column in a result */ PHP_FUNCTION(mysql_fetch_lengths) @@ -2304,7 +2306,7 @@ PHP_FUNCTION(mysql_fetch_lengths) return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); if ((lengths=mysql_fetch_lengths(mysql_result))==NULL) { RETURN_FALSE; @@ -2407,37 +2409,36 @@ PHP_FUNCTION(mysql_fetch_field) return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); if (ZEND_NUM_ARGS() > 1) { - if (field<0 || field>=(int)mysql_num_fields(mysql_result)) { + if (field<0 || field >= (int)mysql_num_fields(mysql_result)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad field offset"); RETURN_FALSE; } mysql_field_seek(mysql_result, field); } - if ((mysql_field=mysql_fetch_field(mysql_result))==NULL) { + if ((mysql_field = mysql_fetch_field(mysql_result)) == NULL) { RETURN_FALSE; } object_init(return_value); - add_property_string(return_value, "name",(mysql_field->name?mysql_field->name:""), 1); - add_property_string(return_value, "table",(mysql_field->table?mysql_field->table:""), 1); - add_property_string(return_value, "def",(mysql_field->def?mysql_field->def:""), 1); + add_property_string(return_value, "name", (mysql_field->name?mysql_field->name:""), 1); + add_property_string(return_value, "table", (mysql_field->table?mysql_field->table:""), 1); + add_property_string(return_value, "def", (mysql_field->def?mysql_field->def:""), 1); add_property_long(return_value, "max_length", mysql_field->max_length); add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); - add_property_long(return_value, "multiple_key",(mysql_field->flags&MULTIPLE_KEY_FLAG?1:0)); - add_property_long(return_value, "unique_key",(mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); + add_property_long(return_value, "multiple_key", (mysql_field->flags&MULTIPLE_KEY_FLAG?1:0)); + add_property_long(return_value, "unique_key", (mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); add_property_long(return_value, "numeric", IS_NUM(Z_TYPE_P(mysql_field))?1:0); add_property_long(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0); add_property_string(return_value, "type", php_mysql_get_field_name(Z_TYPE_P(mysql_field)), 1); - add_property_long(return_value, "unsigned",(mysql_field->flags&UNSIGNED_FLAG?1:0)); - add_property_long(return_value, "zerofill",(mysql_field->flags&ZEROFILL_FLAG?1:0)); + add_property_long(return_value, "unsigned", (mysql_field->flags&UNSIGNED_FLAG?1:0)); + add_property_long(return_value, "zerofill", (mysql_field->flags&ZEROFILL_FLAG?1:0)); } /* }}} */ - /* {{{ proto bool mysql_field_seek(resource result, int field_offset) Sets result pointer to a specific field offset */ PHP_FUNCTION(mysql_field_seek) @@ -2449,10 +2450,10 @@ PHP_FUNCTION(mysql_field_seek) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &offset) == FAILURE) { return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - if (offset<0 || offset>=(int)mysql_num_fields(mysql_result)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", offset, Z_LVAL_P(result)); + if (offset < 0 || offset >= (int)mysql_num_fields(mysql_result)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", offset, Z_RES_P(result)->handle); RETURN_FALSE; } mysql_field_seek(mysql_result, offset); @@ -2460,7 +2461,6 @@ PHP_FUNCTION(mysql_field_seek) } /* }}} */ - #define PHP_MYSQL_FIELD_NAME 1 #define PHP_MYSQL_FIELD_TABLE 2 #define PHP_MYSQL_FIELD_LEN 3 @@ -2482,10 +2482,10 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) return; } - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - if (field<0 || field>=(int)mysql_num_fields(mysql_result)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", field, Z_LVAL_P(result)); + if (field < 0 || field >= (int)mysql_num_fields(mysql_result)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", field, Z_RES_P(result)->handle); RETURN_FALSE; } mysql_field_seek(mysql_result, field); @@ -2495,24 +2495,16 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) switch (entry_type) { case PHP_MYSQL_FIELD_NAME: - Z_STRLEN_P(return_value) = strlen(mysql_field->name); - Z_STRVAL_P(return_value) = estrndup(mysql_field->name, Z_STRLEN_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STRING(mysql_field->name); break; case PHP_MYSQL_FIELD_TABLE: - Z_STRLEN_P(return_value) = strlen(mysql_field->table); - Z_STRVAL_P(return_value) = estrndup(mysql_field->table, Z_STRLEN_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STRING(mysql_field->table); break; case PHP_MYSQL_FIELD_LEN: - Z_LVAL_P(return_value) = mysql_field->length; - Z_TYPE_P(return_value) = IS_LONG; + RETVAL_LONG(mysql_field->length); break; case PHP_MYSQL_FIELD_TYPE: - Z_STRVAL_P(return_value) = php_mysql_get_field_name(Z_TYPE_P(mysql_field)); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_STRVAL_P(return_value) = estrndup(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STRING(php_mysql_get_field_name(Z_TYPE_P(mysql_field))); break; case PHP_MYSQL_FIELD_FLAGS: memcpy(buf, "", sizeof("")); @@ -2583,9 +2575,7 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) len--; } - Z_STRLEN_P(return_value) = len; - Z_STRVAL_P(return_value) = estrndup(buf, len); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STRINGL(buf, len); break; default: @@ -2602,7 +2592,6 @@ PHP_FUNCTION(mysql_field_name) } /* }}} */ - /* {{{ proto string mysql_field_table(resource result, int field_offset) Gets name of the table the specified field is in */ PHP_FUNCTION(mysql_field_table) @@ -2611,7 +2600,6 @@ PHP_FUNCTION(mysql_field_table) } /* }}} */ - /* {{{ proto int mysql_field_len(resource result, int field_offset) Returns the length of the specified field */ PHP_FUNCTION(mysql_field_len) @@ -2620,7 +2608,6 @@ PHP_FUNCTION(mysql_field_len) } /* }}} */ - /* {{{ proto string mysql_field_type(resource result, int field_offset) Gets the type of the specified field in a result */ PHP_FUNCTION(mysql_field_type) @@ -2629,7 +2616,6 @@ PHP_FUNCTION(mysql_field_type) } /* }}} */ - /* {{{ proto string mysql_field_flags(resource result, int field_offset) Gets the flags associated with the specified field in a result */ PHP_FUNCTION(mysql_field_flags) @@ -2638,7 +2624,6 @@ PHP_FUNCTION(mysql_field_flags) } /* }}} */ - /* {{{ proto bool mysql_free_result(resource result) Free result memory */ PHP_FUNCTION(mysql_free_result) @@ -2650,13 +2635,9 @@ PHP_FUNCTION(mysql_free_result) return; } - if (Z_LVAL_P(result)==0) { - RETURN_FALSE; - } - - ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, &result, -1, "MySQL result", le_result); + ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - zend_list_delete(Z_LVAL_P(result)); + zend_list_close(Z_RES_P(result)); RETURN_TRUE; } /* }}} */ @@ -2665,22 +2646,24 @@ PHP_FUNCTION(mysql_free_result) Ping a server connection. If no connection then reconnect. */ PHP_FUNCTION(mysql_ping) { - zval *mysql_link = NULL; - int id = -1; php_mysql_conn *mysql; + zval *mysql_link = NULL; - if (0 == ZEND_NUM_ARGS()) { - id = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); - CHECK_LINK(id); - } else if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &mysql_link)==FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link)==FAILURE) { return; } - ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, &mysql_link, id, "MySQL-Link", le_link, le_plink); + if (!mysql_link) { + zend_resource *res = php_mysql_get_default_link(INTERNAL_FUNCTION_PARAM_PASSTHRU); + CHECK_LINK(res); + mysql = (php_mysql_conn*)res->ptr; + } else { + ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); + } PHPMY_UNBUFFERED_QUERY_CHECK(); - RETURN_BOOL(! mysql_ping(mysql->conn)); + RETURN_BOOL(!mysql_ping(mysql->conn)); } /* }}} */ -- cgit v1.2.1 From ea85451b65b904d0670c4011c819a15431720432 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 28 Mar 2014 02:11:22 +0400 Subject: Refactored data structures to keep zend_object* instead of a whole zval in some places --- ext/mysql/php_mysql.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index eb34d442ac..40672f3ef6 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2177,7 +2177,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, fci.function_table = &ce->function_table; ZVAL_UNDEF(&fci.function_name); fci.symbol_table = NULL; - fci.object_ptr = return_value; + fci.object = Z_OBJ_P(return_value); fci.retval = &retval; if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) { if (Z_TYPE_P(ctor_params) == IS_ARRAY) { @@ -2212,7 +2212,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, fcc.function_handler = ce->constructor; fcc.calling_scope = EG(scope); fcc.called_scope = Z_OBJCE_P(return_value); - ZVAL_COPY_VALUE(&fcc.object, return_value); + fcc.object = Z_OBJ_P(return_value); if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %s::%s()", ce->name->val, ce->constructor->common.function_name->val); -- cgit v1.2.1 From d8099d0468426dbee59f540048376653535270ce Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 2 Apr 2014 14:34:44 +0400 Subject: Changed data layout to allow more efficient operations --- ext/mysql/php_mysql.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 40672f3ef6..163cded77d 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -427,11 +427,11 @@ static void _free_mysql_result(zend_resource *rsrc TSRMLS_DC) static void php_mysql_set_default_link(zend_resource *link TSRMLS_DC) { if (MySG(default_link) != NULL) { - if (--(MySG(default_link)->gc.refcount) == 0) { + if (--GC_REFCOUNT((MySG(default_link))) == 0) { zend_list_delete(MySG(default_link)); } } - ++link->gc.refcount; + ++GC_REFCOUNT(link); MySG(default_link) = link; } /* }}} */ @@ -568,7 +568,7 @@ ZEND_MODULE_STARTUP_D(mysql) le_result = zend_register_list_destructors_ex(_free_mysql_result, NULL, "mysql result", module_number); le_link = zend_register_list_destructors_ex(_close_mysql_link, NULL, "mysql link", module_number); le_plink = zend_register_list_destructors_ex(NULL, _close_mysql_plink, "mysql link persistent", module_number); - Z_TYPE(mysql_module_entry) = type; + mysql_module_entry.type = type; REGISTER_LONG_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT); @@ -986,7 +986,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) link = (zend_resource *)index_ptr->ptr; if (link && (link->type == le_link || link->type == le_plink)) { - link->gc.refcount++; + GC_REFCOUNT(link)++; ZVAL_RES(return_value, link); php_mysql_set_default_link(link TSRMLS_CC); STR_RELEASE(hashed_details); @@ -1126,10 +1126,10 @@ PHP_FUNCTION(mysql_close) } #endif if (!mysql_link) { - --res->gc.refcount; + --GC_REFCOUNT(res); MySG(default_link) = NULL; } else if (mysql_link && Z_RES_P(mysql_link) == MySG(default_link)) { - --res->gc.refcount; + --GC_REFCOUNT(res); MySG(default_link) = NULL; zend_list_close(res); } else { @@ -2431,9 +2431,9 @@ PHP_FUNCTION(mysql_fetch_field) add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); add_property_long(return_value, "multiple_key", (mysql_field->flags&MULTIPLE_KEY_FLAG?1:0)); add_property_long(return_value, "unique_key", (mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); - add_property_long(return_value, "numeric", IS_NUM(Z_TYPE_P(mysql_field))?1:0); + add_property_long(return_value, "numeric", IS_NUM(mysql_field->type)?1:0); add_property_long(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0); - add_property_string(return_value, "type", php_mysql_get_field_name(Z_TYPE_P(mysql_field)), 1); + add_property_string(return_value, "type", php_mysql_get_field_name(mysql_field->type), 1); add_property_long(return_value, "unsigned", (mysql_field->flags&UNSIGNED_FLAG?1:0)); add_property_long(return_value, "zerofill", (mysql_field->flags&ZEROFILL_FLAG?1:0)); } @@ -2504,7 +2504,7 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) RETVAL_LONG(mysql_field->length); break; case PHP_MYSQL_FIELD_TYPE: - RETVAL_STRING(php_mysql_get_field_name(Z_TYPE_P(mysql_field))); + RETVAL_STRING(php_mysql_get_field_name(mysql_field->type)); break; case PHP_MYSQL_FIELD_FLAGS: memcpy(buf, "", sizeof("")); -- cgit v1.2.1 From 76cc99fe60d1e446a0250b4d778f02bcdbd7fc09 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 3 Apr 2014 15:26:23 +0400 Subject: Refactored ZVAL flags usage to simplify various checks (e.g. Z_REFCOUNTED(), candidate for GC, etc) --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 163cded77d..02e950a328 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1893,7 +1893,7 @@ PHP_FUNCTION(mysql_real_escape_string) new_str = STR_ALLOC(str_len * 2, 0); new_str->len = mysql_real_escape_string(mysql->conn, new_str->val, str, str_len); - RETURN_STR(new_str); + RETURN_NEW_STR(new_str); } /* }}} */ -- cgit v1.2.1 From eaf44ec397cc3286107166ce51bac03bf6bc8f83 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Apr 2014 20:46:45 +0200 Subject: Remove some usages of hashtable internals --- ext/mysql/php_mysql.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 3d092b2d6a..daf712cd0d 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2173,19 +2173,12 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, fci.symbol_table = NULL; fci.object_ptr = return_value; fci.retval_ptr_ptr = &retval_ptr; + fci.params = NULL; + fci.param_count = 0; + fci.no_separation = 1; + if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) { - if (Z_TYPE_P(ctor_params) == IS_ARRAY) { - HashTable *htl = Z_ARRVAL_P(ctor_params); - Bucket *p; - - fci.param_count = 0; - fci.params = safe_emalloc(sizeof(zval*), htl->nNumOfElements, 0); - p = htl->pListHead; - while (p != NULL) { - fci.params[fci.param_count++] = (zval**)p->pData; - p = p->pListNext; - } - } else { + if (zend_fcall_info_args(&fci, ctor_params TSRMLS_CC) == FAILURE) { /* Two problems why we throw exceptions here: PHP is typeless * and hence passing one argument that's not an array could be * by mistake and the other way round is possible, too. The @@ -2195,11 +2188,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, zend_throw_exception(zend_exception_get_default(TSRMLS_C), "Parameter ctor_params must be an array", 0 TSRMLS_CC); return; } - } else { - fci.param_count = 0; - fci.params = NULL; } - fci.no_separation = 1; fcc.initialized = 1; fcc.function_handler = ce->constructor; -- cgit v1.2.1 From 79b27dc096db199dc29f88c60b033165a52ec809 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 9 Apr 2014 16:48:03 +0400 Subject: Fixed reference counting --- ext/mysql/php_mysql.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 02e950a328..95d290e333 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1059,9 +1059,11 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) new_index_ptr.type = le_index_ptr; if (zend_hash_update_mem(&EG(regular_list), hashed_details, &new_index_ptr, sizeof(zend_resource)) == NULL) { + zval_ptr_dtor(return_value); STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } + Z_ADDREF_P(return_value); MySG(num_links)++; } -- cgit v1.2.1 From b7e6c8d0f8afb57e9f2012379c0d10c8aaf62804 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 9 Apr 2014 17:02:13 +0400 Subject: Fixed reference counting --- ext/mysql/php_mysql.c | 1 + 1 file changed, 1 insertion(+) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 95d290e333..2fdb517415 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1547,6 +1547,7 @@ static void php_mysql_do_query_general(php_mysql_conn *mysql, char *query, int q ZEND_REGISTER_RESOURCE(return_value, mysql_result, le_result); if (use_store == MYSQL_USE_RESULT) { mysql->active_result_res = Z_RES_P(return_value); + Z_ADDREF_P(return_value); } } /* }}} */ -- cgit v1.2.1 From 9b276c7a0c9f036484b56b87c6681e2b56f6b9f0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 9 Apr 2014 17:08:52 +0400 Subject: Fixed error reporting --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 2fdb517415..7b0c11c89a 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1978,7 +1978,7 @@ Q: String or long first? } if (!tmp_field) { /* no match found */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s%s%s not found in MySQL result index %ld", - (table_name?table_name:""), (table_name?".":""), field_name, Z_LVAL_P(result)); + (table_name?table_name:""), (table_name?".":""), field_name, Z_RES_P(result)->handle); efree(field_name); if (table_name) { efree(table_name); -- cgit v1.2.1 From 63791d055ad64762c3f63e08ca7ad8ba1f44e0ab Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Thu, 10 Apr 2014 16:44:54 +0300 Subject: New result fetching mode for mysqlnd, which should use less memory but implies more memory copy. The old method is still available and can be used. It stays as default. Choosing the method is through a flag to mysqli_query()/mysqli_real_query() New mode can be forced with an INI setting, for all extensions that support this mode (ext/mysql and mysqli, because PDO due to it's architecture can't support it) The setting is mysqlnd.fetch_data_copy=[0|1] --- ext/mysql/php_mysql.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 3d092b2d6a..ff4de0f5a8 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -877,7 +877,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND mysql->conn = mysql_init(NULL); #else - mysql->conn = mysql_init(persistent); + mysql->conn = mysqlnd_init(MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA, persistent); #endif if (connect_timeout != -1) { @@ -886,7 +886,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) #else - if (mysqlnd_connect(mysql->conn, host, user, passwd, passwd_len, NULL, 0, port, socket, client_flags TSRMLS_CC) == NULL) + if (mysqlnd_connect(mysql->conn, host, user, passwd, passwd_len, NULL, 0, port, socket, client_flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA TSRMLS_CC) == NULL) #endif { /* Populate connect error globals so that the error functions can read them */ @@ -934,7 +934,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) #else - if (mysqlnd_connect(mysql->conn, host, user, passwd, passwd_len, NULL, 0, port, socket, client_flags TSRMLS_CC) == NULL) + if (mysqlnd_connect(mysql->conn, host, user, passwd, passwd_len, NULL, 0, port, socket, client_flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA TSRMLS_CC) == NULL) #endif { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect"); @@ -996,7 +996,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND mysql->conn = mysql_init(NULL); #else - mysql->conn = mysql_init(persistent); + mysql->conn = mysqlnd_init(MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA, persistent); #endif if (!mysql->conn) { MySG(connect_error) = estrdup("OOM"); @@ -1013,7 +1013,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifndef MYSQL_USE_MYSQLND if (mysql_real_connect(mysql->conn, host, user, passwd, NULL, port, socket, client_flags)==NULL) #else - if (mysqlnd_connect(mysql->conn, host, user, passwd, passwd_len, NULL, 0, port, socket, client_flags TSRMLS_CC) == NULL) + if (mysqlnd_connect(mysql->conn, host, user, passwd, passwd_len, NULL, 0, port, socket, client_flags, MYSQLND_CLIENT_KNOWS_RSET_COPY_DATA TSRMLS_CC) == NULL) #endif { /* Populate connect error globals so that the error functions can read them */ -- cgit v1.2.1 From 68c34855afdccd4adbd142c3127ab822c0e877cc Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 11 Apr 2014 14:47:53 +0400 Subject: Fixed memory leaks --- ext/mysql/php_mysql.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 7b0c11c89a..573c1728ac 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -862,7 +862,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /* try to find if we already have this link in our persistent list */ if ((le = zend_hash_find_ptr(&EG(persistent_list), hashed_details)) == NULL) { /* we don't */ - zend_resource new_le; + zval new_le; if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links)); @@ -920,16 +920,17 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile)); /* hash it up */ - new_le.type = le_plink; - new_le.ptr = mysql; + ZVAL_NEW_PERSISTENT_RES(&new_le, -1, mysql, le_plink); /* avoid bogus memleak report */ phashed = STR_INIT(hashed_details->val, hashed_details->len, 1); - if (zend_hash_update_mem(&EG(persistent_list), phashed, &new_le, sizeof(zend_resource)) == NULL) { + if (zend_hash_update(&EG(persistent_list), phashed, &new_le) == NULL) { + STR_RELEASE(phashed); free(mysql); STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } + STR_RELEASE(phashed); MySG(num_persistent)++; MySG(num_links)++; } else { /* The link is in our list of persistent connections */ @@ -970,7 +971,8 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) } ZEND_REGISTER_RESOURCE(return_value, mysql, le_plink); } else { /* non persistent */ - zend_resource *index_ptr, new_index_ptr; + zend_resource *index_ptr; + zval new_index_ptr; /* first we check the hash for the hashed_details key. if it exists, * it should point us to the right offset where the actual mysql link sits. @@ -1055,10 +1057,8 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) ZEND_REGISTER_RESOURCE(return_value, mysql, le_link); /* add it to the hash */ - new_index_ptr.ptr = Z_RES_P(return_value); - new_index_ptr.type = le_index_ptr; - - if (zend_hash_update_mem(&EG(regular_list), hashed_details, &new_index_ptr, sizeof(zend_resource)) == NULL) { + ZVAL_NEW_RES(&new_index_ptr, -1, Z_RES_P(return_value), le_index_ptr); + if (zend_hash_update(&EG(regular_list), hashed_details, &new_index_ptr) == NULL) { zval_ptr_dtor(return_value); STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); -- cgit v1.2.1 From 050d7e38ad4163e7fa65e26724d3516ce7b33601 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 15 Apr 2014 15:40:40 +0400 Subject: Cleanup (1-st round) --- ext/mysql/php_mysql.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 573c1728ac..b6d43687e0 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2426,9 +2426,9 @@ PHP_FUNCTION(mysql_fetch_field) } object_init(return_value); - add_property_string(return_value, "name", (mysql_field->name?mysql_field->name:""), 1); - add_property_string(return_value, "table", (mysql_field->table?mysql_field->table:""), 1); - add_property_string(return_value, "def", (mysql_field->def?mysql_field->def:""), 1); + add_property_string(return_value, "name", (mysql_field->name?mysql_field->name:"")); + add_property_string(return_value, "table", (mysql_field->table?mysql_field->table:"")); + add_property_string(return_value, "def", (mysql_field->def?mysql_field->def:"")); add_property_long(return_value, "max_length", mysql_field->max_length); add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); @@ -2436,7 +2436,7 @@ PHP_FUNCTION(mysql_fetch_field) add_property_long(return_value, "unique_key", (mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); add_property_long(return_value, "numeric", IS_NUM(mysql_field->type)?1:0); add_property_long(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0); - add_property_string(return_value, "type", php_mysql_get_field_name(mysql_field->type), 1); + add_property_string(return_value, "type", php_mysql_get_field_name(mysql_field->type)); add_property_long(return_value, "unsigned", (mysql_field->flags&UNSIGNED_FLAG?1:0)); add_property_long(return_value, "zerofill", (mysql_field->flags&ZEROFILL_FLAG?1:0)); } -- cgit v1.2.1 From f9b26bc39a9ea9b1380628eeb0e6dad3c93cfcb0 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 15 Apr 2014 21:56:30 +0400 Subject: Cleanup (2-nd round) --- ext/mysql/php_mysql.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index b6d43687e0..1731c8a538 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1335,8 +1335,9 @@ PHP_FUNCTION(mysql_stat) RETURN_STRING(stat); #else if (mysqlnd_stat(mysql->conn, &stat, &stat_len) == PASS) { - //???? memleak - RETURN_STRINGL(stat, stat_len); + // TODO: avoid reallocation ??? + RETVAL_STRINGL(stat, stat_len); + efree(stat); #endif } else { RETURN_FALSE; -- cgit v1.2.1 From 17d027ed47c1f07b397a611431d28ad0e0107146 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 30 Apr 2014 18:32:42 +0400 Subject: Split IS_BOOL into IS_FALSE and IS_TRUE --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 56dcf7b373..9f7f07d038 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2165,7 +2165,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, #ifdef ZEND_ENGINE_2 /* mysqlnd might return FALSE if no more rows */ - if (into_object && Z_TYPE_P(return_value) != IS_BOOL) { + if (into_object && Z_TYPE_P(return_value) != IS_FALSE) { zval dataset; zend_fcall_info fci; zend_fcall_info_cache fcc; -- cgit v1.2.1 From d8651fbe1c4caaaedc42cef1dee0dd3b3f1e447e Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Sat, 3 May 2014 16:06:27 +0800 Subject: Make they are in the same style of Z_ISREF --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 9f7f07d038..0b27f1e44c 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2209,7 +2209,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { zend_throw_exception_ex(zend_exception_get_default(TSRMLS_C), 0 TSRMLS_CC, "Could not execute %s::%s()", ce->name->val, ce->constructor->common.function_name->val); } else { - if (!ZVAL_IS_UNDEF(&retval)) { + if (!Z_ISUNDEF(retval)) { zval_ptr_dtor(&retval); } } -- cgit v1.2.1 From fa7008bb247240556b6bd5950576d3f455621f82 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 8 May 2014 02:48:31 +0400 Subject: Fixed resource destruction --- ext/mysql/php_mysql.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 0b27f1e44c..94bfb6cfd2 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -427,9 +427,7 @@ static void _free_mysql_result(zend_resource *rsrc TSRMLS_DC) static void php_mysql_set_default_link(zend_resource *link TSRMLS_DC) { if (MySG(default_link) != NULL) { - if (--GC_REFCOUNT((MySG(default_link))) == 0) { - zend_list_delete(MySG(default_link)); - } + zend_list_delete(MySG(default_link)); } ++GC_REFCOUNT(link); MySG(default_link) = link; -- cgit v1.2.1 From b5af9e85992c74fa1e375767423ab43cdaf52fa2 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 20 May 2014 13:19:21 +0400 Subject: More accurate mysql_close() --- ext/mysql/php_mysql.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 94bfb6cfd2..580296a3cf 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1125,15 +1125,15 @@ PHP_FUNCTION(mysql_close) mysqlnd_end_psession(mysql->conn); } #endif - if (!mysql_link) { - --GC_REFCOUNT(res); + if (res == MySG(default_link)) { + zend_list_delete(res); MySG(default_link) = NULL; - } else if (mysql_link && Z_RES_P(mysql_link) == MySG(default_link)) { - --GC_REFCOUNT(res); - MySG(default_link) = NULL; - zend_list_close(res); - } else { - zend_list_close(res); + } + if (mysql_link) { + /* we have at least 3 additional references to this resource ??? */ + if (GC_REFCOUNT(res) <= 3) { + zend_list_close(res); + } } } -- cgit v1.2.1 From 6e7338700e8df8285c1d352b249e4970e35df472 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 4 Jun 2014 02:11:26 +0400 Subject: Avoid useless merge --- ext/mysql/php_mysql.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 580296a3cf..588eaf0539 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2171,8 +2171,14 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, ZVAL_COPY_VALUE(&dataset, return_value); object_and_properties_init(return_value, ce, NULL); - zend_merge_properties(return_value, Z_ARRVAL(dataset), 0 TSRMLS_CC); - zval_dtor(&dataset); + if (!ce->default_properties_count && !ce->__set) { + ALLOC_HASHTABLE(Z_OBJ_P(return_value)->properties); + *Z_OBJ_P(return_value)->properties = *Z_ARRVAL(dataset); + efree(Z_ARR(dataset)); + } else { + zend_merge_properties(return_value, Z_ARRVAL(dataset) TSRMLS_CC); + zval_dtor(&dataset); + } if (ce->constructor) { fci.size = sizeof(fci); -- cgit v1.2.1 From 7032e1b96dcf9acbe0fdbc30317a336a0c9acbc4 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 18 Jun 2014 16:59:56 +0800 Subject: Fixed warning message --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 588eaf0539..dfde6a4857 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -377,7 +377,7 @@ void timeout(int sig); if (mysql_result_is_unbuffered(_mysql_result) && \ !mysql_eof(_mysql_result)) { \ php_error_docref(NULL TSRMLS_CC, E_NOTICE, \ - "Function called without first fetching all" \ + "Function called without first fetching all " \ "rows from a previous unbuffered query"); \ } \ zend_list_close(mysql->active_result_res); \ -- cgit v1.2.1 From 92a708989380bfb5d5da00665895025398bdbc91 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 23 Jun 2014 19:12:15 +0800 Subject: Use zend_string in mysqlnd --- ext/mysql/php_mysql.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index dfde6a4857..db02c24f9a 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1969,7 +1969,11 @@ Q: String or long first? } mysql_field_seek(mysql_result, 0); while ((tmp_field = mysql_fetch_field(mysql_result))) { +#ifdef MYSQL_USE_MYSQLND + if ((!table_name || !strncasecmp(tmp_field->table->val, table_name, tmp_field->table->len)) && !strncasecmp(tmp_field->name->val, field_name, tmp_field->name->len)) { +#else if ((!table_name || !strcasecmp(tmp_field->table, table_name)) && !strcasecmp(tmp_field->name, field_name)) { +#endif field_offset = i; break; } @@ -2419,9 +2423,15 @@ PHP_FUNCTION(mysql_fetch_field) } object_init(return_value); +#if MYSQL_USE_MYSQLND + add_property_str(return_value, "name", STR_COPY(mysql_field->name)); + add_property_str(return_value, "table", STR_COPY(mysql_field->table)); + add_property_str(return_value, "def", STR_COPY(mysql_field->def)); +#else add_property_string(return_value, "name", (mysql_field->name?mysql_field->name:"")); add_property_string(return_value, "table", (mysql_field->table?mysql_field->table:"")); add_property_string(return_value, "def", (mysql_field->def?mysql_field->def:"")); +#endif add_property_long(return_value, "max_length", mysql_field->max_length); add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); @@ -2491,10 +2501,18 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) switch (entry_type) { case PHP_MYSQL_FIELD_NAME: +#ifdef MYSQL_USE_MYSQLND + RETVAL_STR(STR_COPY(mysql_field->name)); +#else RETVAL_STRING(mysql_field->name); +#endif break; case PHP_MYSQL_FIELD_TABLE: +#ifdef MYSQL_USE_MYSQLND + RETVAL_STR(STR_COPY(mysql_field->table)); +#else RETVAL_STRING(mysql_field->table); +#endif break; case PHP_MYSQL_FIELD_LEN: RETVAL_LONG(mysql_field->length); -- cgit v1.2.1 From 56a966e88a98bf04b2cd253b9b18136c0cc4028b Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Mon, 23 Jun 2014 19:34:23 +0800 Subject: Respect the origin behavior (fix one test: ext/pdo_mysql/tests/bug_33689.phpt) --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index db02c24f9a..cbef4e6960 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -2426,7 +2426,7 @@ PHP_FUNCTION(mysql_fetch_field) #if MYSQL_USE_MYSQLND add_property_str(return_value, "name", STR_COPY(mysql_field->name)); add_property_str(return_value, "table", STR_COPY(mysql_field->table)); - add_property_str(return_value, "def", STR_COPY(mysql_field->def)); + add_property_str(return_value, "def", mysql_field->def? STR_COPY(mysql_field->def) : STR_EMPTY_ALLOC()); #else add_property_string(return_value, "name", (mysql_field->name?mysql_field->name:"")); add_property_string(return_value, "table", (mysql_field->table?mysql_field->table:"")); -- cgit v1.2.1 From 8ce23d8f4fc5df0daec05642df8ead016f00fc32 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 25 Jun 2014 00:42:20 +0800 Subject: Don't use zend_string for other fields (only name here is enough) --- ext/mysql/php_mysql.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index cbef4e6960..6518f8d36a 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1969,11 +1969,9 @@ Q: String or long first? } mysql_field_seek(mysql_result, 0); while ((tmp_field = mysql_fetch_field(mysql_result))) { -#ifdef MYSQL_USE_MYSQLND - if ((!table_name || !strncasecmp(tmp_field->table->val, table_name, tmp_field->table->len)) && !strncasecmp(tmp_field->name->val, field_name, tmp_field->name->len)) { -#else - if ((!table_name || !strcasecmp(tmp_field->table, table_name)) && !strcasecmp(tmp_field->name, field_name)) { -#endif + if ((!table_name || + !strncasecmp(tmp_field->table, table_name, tmp_field->table_length)) && + !strncasecmp(tmp_field->name, field_name, tmp_field->name_length)) { field_offset = i; break; } @@ -2424,14 +2422,12 @@ PHP_FUNCTION(mysql_fetch_field) object_init(return_value); #if MYSQL_USE_MYSQLND - add_property_str(return_value, "name", STR_COPY(mysql_field->name)); - add_property_str(return_value, "table", STR_COPY(mysql_field->table)); - add_property_str(return_value, "def", mysql_field->def? STR_COPY(mysql_field->def) : STR_EMPTY_ALLOC()); + add_property_str(return_value, "name", STR_COPY(mysql_field->sname)); #else - add_property_string(return_value, "name", (mysql_field->name?mysql_field->name:"")); - add_property_string(return_value, "table", (mysql_field->table?mysql_field->table:"")); - add_property_string(return_value, "def", (mysql_field->def?mysql_field->def:"")); + add_property_stringl(return_value, "name", (mysql_field->name?mysql_field->name:""), mysql_field->name_length); #endif + add_property_stringl(return_value, "table", (mysql_field->table?mysql_field->table:""), mysql_field->table_length); + add_property_stringl(return_value, "def", (mysql_field->def?mysql_field->def:""), mysql_field->def_length); add_property_long(return_value, "max_length", mysql_field->max_length); add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); @@ -2502,17 +2498,13 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) switch (entry_type) { case PHP_MYSQL_FIELD_NAME: #ifdef MYSQL_USE_MYSQLND - RETVAL_STR(STR_COPY(mysql_field->name)); + RETVAL_STR(STR_COPY(mysql_field->sname)); #else RETVAL_STRING(mysql_field->name); #endif break; case PHP_MYSQL_FIELD_TABLE: -#ifdef MYSQL_USE_MYSQLND - RETVAL_STR(STR_COPY(mysql_field->table)); -#else RETVAL_STRING(mysql_field->table); -#endif break; case PHP_MYSQL_FIELD_LEN: RETVAL_LONG(mysql_field->length); -- cgit v1.2.1 From da3aeeed39f24e34e9318d7123ff84f0c5a98e61 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 13 Aug 2014 15:51:43 +0800 Subject: clean up - avoid realloc --- ext/mysql/php_mysql.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 6518f8d36a..30cac98b65 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1310,11 +1310,13 @@ PHP_FUNCTION(mysql_stat) { php_mysql_conn *mysql; zval *mysql_link = NULL; +#ifndef MYSQL_USE_MYSQLND char *stat; -#ifdef MYSQL_USE_MYSQLND - uint stat_len; +#else + zend_string *stat; #endif + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) { return; } @@ -1332,10 +1334,8 @@ PHP_FUNCTION(mysql_stat) if ((stat = (char *)mysql_stat(mysql->conn))) { RETURN_STRING(stat); #else - if (mysqlnd_stat(mysql->conn, &stat, &stat_len) == PASS) { - // TODO: avoid reallocation ??? - RETVAL_STRINGL(stat, stat_len); - efree(stat); + if (mysqlnd_stat(mysql->conn, &stat) == PASS) { + RETURN_STR(stat); #endif } else { RETURN_FALSE; -- cgit v1.2.1 From 35dd200430994b1b2807633e5d5dd3370b59633e Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Wed, 13 Aug 2014 16:44:22 +0800 Subject: clean up - remove checked questions --- ext/mysql/php_mysql.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 30cac98b65..f4124d306b 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -641,10 +641,9 @@ PHP_RINIT_FUNCTION(mysql) /* }}} */ #if defined(A0) && defined(MYSQL_USE_MYSQLND) -static int php_mysql_persistent_helper(zval *el;zend_rsrc_list_entry *le TSRMLS_DC) +static int php_mysql_persistent_helper(zval *el TSRMLS_DC) { - //??? - //zend_rsrc_list_entry *le = (zend_rsrc_list_entry*)Z_PTR_P(el); + zend_resource *le = (zend_resource *)Z_PTR_P(el); if (le->type == le_plink) { mysqlnd_end_psession(((php_mysql_conn *) le->ptr)->conn); } -- cgit v1.2.1 From 63d3f0b844b3a5f1c94be3c97bca29235dc2b3fc Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 19 Aug 2014 08:07:31 +0200 Subject: basic macro replacements, all at once --- ext/mysql/php_mysql.c | 60 +++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index f4124d306b..d492147c7f 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -568,15 +568,15 @@ ZEND_MODULE_STARTUP_D(mysql) le_plink = zend_register_list_destructors_ex(NULL, _close_mysql_plink, "mysql link persistent", module_number); mysql_module_entry.type = type; - REGISTER_LONG_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT); + REGISTER_INT_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT); + REGISTER_INT_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT); + REGISTER_INT_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT); + REGISTER_INT_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT); #if MYSQL_VERSION_ID >= 40000 - REGISTER_LONG_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT); + REGISTER_INT_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT); #endif - REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT); + REGISTER_INT_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT); + REGISTER_INT_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT); #ifndef MYSQL_USE_MYSQLND #if MYSQL_VERSION_ID >= 40000 @@ -820,7 +820,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) client_flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */ #endif hashed_details = STR_ALLOC(sizeof("mysql____") + (host_and_port? strlen(host_and_port) : 0) - + (user? strlen(user) : 0) + (passwd? strlen(passwd) : 0) + MAX_LENGTH_OF_LONG - 1, 0); + + (user? strlen(user) : 0) + (passwd? strlen(passwd) : 0) + MAX_LENGTH_OF_ZEND_INT - 1, 0); hashed_details->len = snprintf(hashed_details->val, hashed_details->len + 1, "mysql_%s_%s_%s_%ld", SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags); } @@ -1225,7 +1225,7 @@ PHP_FUNCTION(mysql_get_proto_info) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - RETURN_LONG(mysql_get_proto_info(mysql->conn)); + RETURN_INT(mysql_get_proto_info(mysql->conn)); } /* }}} */ @@ -1299,7 +1299,7 @@ PHP_FUNCTION(mysql_thread_id) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - RETURN_LONG((long) mysql_thread_id(mysql->conn)); + RETURN_INT((long) mysql_thread_id(mysql->conn)); } /* }}} */ @@ -1802,7 +1802,7 @@ PHP_FUNCTION(mysql_errno) if (!mysql_link) { if (MySG(default_link) == NULL) { if (MySG(connect_error) != NULL){ - RETURN_LONG(MySG(connect_errno)); + RETURN_INT(MySG(connect_errno)); } else { RETURN_FALSE; } @@ -1812,7 +1812,7 @@ PHP_FUNCTION(mysql_errno) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - RETURN_LONG(mysql_errno(mysql->conn)); + RETURN_INT(mysql_errno(mysql->conn)); } #endif /* }}} */ @@ -1837,7 +1837,7 @@ PHP_FUNCTION(mysql_affected_rows) } /* conversion from int64 to long happing here */ - RETURN_LONG((long)mysql_affected_rows(mysql->conn)); + RETURN_INT((long)mysql_affected_rows(mysql->conn)); } /* }}} */ @@ -1918,7 +1918,7 @@ PHP_FUNCTION(mysql_insert_id) } /* conversion from int64 to long happing here */ - RETURN_LONG((long)mysql_insert_id(mysql->conn)); + RETURN_INT((long)mysql_insert_id(mysql->conn)); } /* }}} */ @@ -1964,7 +1964,7 @@ Q: String or long first? field_name = estrdup(tmp + 1); } else { table_name = NULL; - field_name = estrndup(Z_STRVAL_P(field),Z_STRLEN_P(field)); + field_name = estrndup(Z_STRVAL_P(field),Z_STRSIZE_P(field)); } mysql_field_seek(mysql_result, 0); while ((tmp_field = mysql_fetch_field(mysql_result))) { @@ -1992,8 +1992,8 @@ Q: String or long first? } break; default: - convert_to_long_ex(field); - field_offset = Z_LVAL_P(field); + convert_to_int_ex(field); + field_offset = Z_IVAL_P(field); if (field_offset < 0 || field_offset >= (int)mysql_num_fields(mysql_result)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified"); RETURN_FALSE; @@ -2040,7 +2040,7 @@ PHP_FUNCTION(mysql_num_rows) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); /* conversion from int64 to long happing here */ - RETURN_LONG((long) mysql_num_rows(mysql_result)); + RETURN_INT((long) mysql_num_rows(mysql_result)); } /* }}} */ @@ -2057,7 +2057,7 @@ PHP_FUNCTION(mysql_num_fields) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - RETURN_LONG(mysql_num_fields(mysql_result)); + RETURN_INT(mysql_num_fields(mysql_result)); } /* }}} */ @@ -2312,7 +2312,7 @@ PHP_FUNCTION(mysql_fetch_lengths) num_fields = mysql_num_fields(mysql_result); for (i=0; itable?mysql_field->table:""), mysql_field->table_length); add_property_stringl(return_value, "def", (mysql_field->def?mysql_field->def:""), mysql_field->def_length); - add_property_long(return_value, "max_length", mysql_field->max_length); - add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); - add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); - add_property_long(return_value, "multiple_key", (mysql_field->flags&MULTIPLE_KEY_FLAG?1:0)); - add_property_long(return_value, "unique_key", (mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); - add_property_long(return_value, "numeric", IS_NUM(mysql_field->type)?1:0); - add_property_long(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0); + add_property_int(return_value, "max_length", mysql_field->max_length); + add_property_int(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); + add_property_int(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); + add_property_int(return_value, "multiple_key", (mysql_field->flags&MULTIPLE_KEY_FLAG?1:0)); + add_property_int(return_value, "unique_key", (mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); + add_property_int(return_value, "numeric", IS_NUM(mysql_field->type)?1:0); + add_property_int(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0); add_property_string(return_value, "type", php_mysql_get_field_name(mysql_field->type)); - add_property_long(return_value, "unsigned", (mysql_field->flags&UNSIGNED_FLAG?1:0)); - add_property_long(return_value, "zerofill", (mysql_field->flags&ZEROFILL_FLAG?1:0)); + add_property_int(return_value, "unsigned", (mysql_field->flags&UNSIGNED_FLAG?1:0)); + add_property_int(return_value, "zerofill", (mysql_field->flags&ZEROFILL_FLAG?1:0)); } /* }}} */ @@ -2506,7 +2506,7 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) RETVAL_STRING(mysql_field->table); break; case PHP_MYSQL_FIELD_LEN: - RETVAL_LONG(mysql_field->length); + RETVAL_INT(mysql_field->length); break; case PHP_MYSQL_FIELD_TYPE: RETVAL_STRING(php_mysql_get_field_name(mysql_field->type)); -- cgit v1.2.1 From bdbf47df181bdafc1b2bc2df1d23815f01510b88 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 19 Aug 2014 16:51:06 +0200 Subject: ported mysql and mysqlnd --- ext/mysql/php_mysql.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index d492147c7f..b0596c396a 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -80,7 +80,7 @@ static int le_result, le_link, le_plink; #define SAFE_STRING(s) ((s)?(s):"") #if MYSQL_VERSION_ID > 32199 || defined(MYSQL_USE_MYSQLND) -# define mysql_row_length_type unsigned long +# define mysql_row_length_type php_uint_t # define HAVE_MYSQL_ERRNO #else # define mysql_row_length_type unsigned int @@ -727,12 +727,12 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) char *tmp = NULL, *host = NULL; int user_len = 0, passwd_len = 0, host_len = 0; int port = MYSQL_PORT; - long client_flags = 0; + php_int_t client_flags = 0; php_mysql_conn *mysql = NULL; #if MYSQL_VERSION_ID <= 32230 void (*handler) (int); #endif - long connect_timeout; + php_int_t connect_timeout; zend_string *hashed_details = NULL; zend_bool free_host = 0, new_link = 0; @@ -780,13 +780,13 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) } else { /* mysql_pconnect does not support new_link parameter */ if (persistent) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!l", &host_and_port, &host_len, + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!i", &host_and_port, &host_len, &user, &user_len, &passwd, &passwd_len, &client_flags)==FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!bl", &host_and_port, &host_len, + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!bi", &host_and_port, &host_len, &user, &user_len, &passwd, &passwd_len, &new_link, &client_flags)==FAILURE) { return; @@ -1927,7 +1927,7 @@ PHP_FUNCTION(mysql_insert_id) PHP_FUNCTION(mysql_result) { zval *result, *field=NULL; - long row; + php_int_t row; MYSQL_RES *mysql_result; #ifndef MYSQL_USE_MYSQLND MYSQL_ROW sql_row; @@ -1940,7 +1940,7 @@ johannes TODO: Do 2 zend_parse_parameters calls instead of type "z" and switch below Q: String or long first? */ - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|z", &result, &row, &field) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri|z", &result, &row, &field) == FAILURE) { return; } @@ -2063,7 +2063,7 @@ PHP_FUNCTION(mysql_num_fields) /* {{{ php_mysql_fetch_hash */ -static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, int expected_args, int into_object) +static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, php_int_t result_type, int expected_args, int into_object) { MYSQL_RES *mysql_result; zval *res, *ctor_params = NULL; @@ -2096,7 +2096,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, long result_type, } else #endif { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &res, &result_type) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|i", &res, &result_type) == FAILURE) { return; } if (!result_type) { @@ -2271,10 +2271,10 @@ PHP_FUNCTION(mysql_fetch_assoc) PHP_FUNCTION(mysql_data_seek) { zval *result; - long offset; + php_int_t offset; MYSQL_RES *mysql_result; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &offset)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri", &result, &offset)) { return; } @@ -2398,11 +2398,11 @@ static char *php_mysql_get_field_name(int field_type) PHP_FUNCTION(mysql_fetch_field) { zval *result; - long field=0; + php_int_t field=0; MYSQL_RES *mysql_result; const MYSQL_FIELD *mysql_field; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &result, &field) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|i", &result, &field) == FAILURE) { return; } @@ -2445,10 +2445,10 @@ PHP_FUNCTION(mysql_fetch_field) PHP_FUNCTION(mysql_field_seek) { zval *result; - long offset; + php_int_t offset; MYSQL_RES *mysql_result; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &offset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri", &result, &offset) == FAILURE) { return; } ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); @@ -2473,13 +2473,13 @@ PHP_FUNCTION(mysql_field_seek) static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) { zval *result; - long field; + php_int_t field; MYSQL_RES *mysql_result; const MYSQL_FIELD *mysql_field = {0}; char buf[512]; int len; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &field) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri", &result, &field) == FAILURE) { return; } -- cgit v1.2.1 From 70de6180d5a022806212d2b6eebbba48af827940 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sun, 24 Aug 2014 02:35:34 +0200 Subject: fixes to %pd format usage --- ext/mysql/php_mysql.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index b0596c396a..1df53349a8 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -662,7 +662,7 @@ PHP_RSHUTDOWN_FUNCTION(mysql) if (MySG(trace_mode)) { if (MySG(result_allocated)){ - 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)); + php_error_docref("function.mysql-free-result" TSRMLS_CC, E_WARNING, "%pu result set(s) not freed. Use mysql_free_result to free result sets which were requested using mysql_query()", MySG(result_allocated)); } } @@ -686,9 +686,9 @@ PHP_MINFO_FUNCTION(mysql) php_info_print_table_start(); php_info_print_table_header(2, "MySQL Support", "enabled"); - snprintf(buf, sizeof(buf), "%ld", MySG(num_persistent)); + snprintf(buf, sizeof(buf), ZEND_INT_FMT, MySG(num_persistent)); php_info_print_table_row(2, "Active Persistent Links", buf); - snprintf(buf, sizeof(buf), "%ld", MySG(num_links)); + snprintf(buf, sizeof(buf), ZEND_INT_FMT, MySG(num_links)); php_info_print_table_row(2, "Active Links", buf); php_info_print_table_row(2, "Client API version", mysql_get_client_info()); #if !defined (PHP_WIN32) && !defined (NETWARE) && !defined(MYSQL_USE_MYSQLND) @@ -821,7 +821,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #endif hashed_details = STR_ALLOC(sizeof("mysql____") + (host_and_port? strlen(host_and_port) : 0) + (user? strlen(user) : 0) + (passwd? strlen(passwd) : 0) + MAX_LENGTH_OF_ZEND_INT - 1, 0); - hashed_details->len = snprintf(hashed_details->val, hashed_details->len + 1, "mysql_%s_%s_%s_%ld", SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags); + hashed_details->len = snprintf(hashed_details->val, hashed_details->len + 1, "mysql_%s_%s_%s_" ZEND_INT_FMT, SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags); } /* We cannot use mysql_port anymore in windows, need to use @@ -862,13 +862,13 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) zval new_le; if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links)); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%pd)", MySG(num_links)); STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } if (MySG(max_persistent) != -1 && MySG(num_persistent) >= MySG(max_persistent)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%ld)", MySG(num_persistent)); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%pd)", MySG(num_persistent)); STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } @@ -997,7 +997,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) } if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%ld)", MySG(num_links)); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%pd)", MySG(num_links)); STR_RELEASE(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } @@ -1947,7 +1947,7 @@ Q: String or long first? ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); if (row < 0 || row >= (int)mysql_num_rows(mysql_result)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %ld on MySQL result index %ld", row, Z_RES_P(result)->handle); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to jump to row %pd on MySQL result index %pd", row, Z_RES_P(result)->handle); RETURN_FALSE; } mysql_data_seek(mysql_result, row); @@ -1977,7 +1977,7 @@ Q: String or long first? i++; } if (!tmp_field) { /* no match found */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s%s%s not found in MySQL result index %ld", + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s%s%s not found in MySQL result index %pd", (table_name?table_name:""), (table_name?".":""), field_name, Z_RES_P(result)->handle); efree(field_name); if (table_name) { @@ -2281,7 +2281,7 @@ PHP_FUNCTION(mysql_data_seek) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); if (offset < 0 || offset >= (int)mysql_num_rows(mysql_result)) { - 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_RES_P(result)->handle); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset %pd is invalid for MySQL result index %pd (or the query data is unbuffered)", offset, Z_RES_P(result)->handle); RETURN_FALSE; } mysql_data_seek(mysql_result, offset); @@ -2454,7 +2454,7 @@ PHP_FUNCTION(mysql_field_seek) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); if (offset < 0 || offset >= (int)mysql_num_fields(mysql_result)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", offset, Z_RES_P(result)->handle); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %pd is invalid for MySQL result index %pd", offset, Z_RES_P(result)->handle); RETURN_FALSE; } mysql_field_seek(mysql_result, offset); @@ -2486,7 +2486,7 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); if (field < 0 || field >= (int)mysql_num_fields(mysql_result)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %ld is invalid for MySQL result index %ld", field, Z_RES_P(result)->handle); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Field %pd is invalid for MySQL result index %pd", field, Z_RES_P(result)->handle); RETURN_FALSE; } mysql_field_seek(mysql_result, field); -- cgit v1.2.1 From c3e3c98ec666812daaaca896cf5ef758a8a6df14 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 25 Aug 2014 19:24:55 +0200 Subject: master renames phase 1 --- ext/mysql/php_mysql.c | 132 +++++++++++++++++++++++++------------------------- 1 file changed, 66 insertions(+), 66 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 1df53349a8..4276537368 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -80,7 +80,7 @@ static int le_result, le_link, le_plink; #define SAFE_STRING(s) ((s)?(s):"") #if MYSQL_VERSION_ID > 32199 || defined(MYSQL_USE_MYSQLND) -# define mysql_row_length_type php_uint_t +# define mysql_row_length_type zend_ulong # define HAVE_MYSQL_ERRNO #else # define mysql_row_length_type unsigned int @@ -568,15 +568,15 @@ ZEND_MODULE_STARTUP_D(mysql) le_plink = zend_register_list_destructors_ex(NULL, _close_mysql_plink, "mysql link persistent", module_number); mysql_module_entry.type = type; - REGISTER_INT_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT); - REGISTER_INT_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT); - REGISTER_INT_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT); - REGISTER_INT_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("MYSQL_ASSOC", MYSQL_ASSOC, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("MYSQL_NUM", MYSQL_NUM, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("MYSQL_BOTH", MYSQL_BOTH, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("MYSQL_CLIENT_COMPRESS", CLIENT_COMPRESS, CONST_CS | CONST_PERSISTENT); #if MYSQL_VERSION_ID >= 40000 - REGISTER_INT_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("MYSQL_CLIENT_SSL", CLIENT_SSL, CONST_CS | CONST_PERSISTENT); #endif - REGISTER_INT_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT); - REGISTER_INT_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("MYSQL_CLIENT_INTERACTIVE", CLIENT_INTERACTIVE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("MYSQL_CLIENT_IGNORE_SPACE", CLIENT_IGNORE_SPACE, CONST_CS | CONST_PERSISTENT); #ifndef MYSQL_USE_MYSQLND #if MYSQL_VERSION_ID >= 40000 @@ -727,12 +727,12 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) char *tmp = NULL, *host = NULL; int user_len = 0, passwd_len = 0, host_len = 0; int port = MYSQL_PORT; - php_int_t client_flags = 0; + zend_long client_flags = 0; php_mysql_conn *mysql = NULL; #if MYSQL_VERSION_ID <= 32230 void (*handler) (int); #endif - php_int_t connect_timeout; + zend_long connect_timeout; zend_string *hashed_details = NULL; zend_bool free_host = 0, new_link = 0; @@ -774,19 +774,19 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) php_error_docref(NULL TSRMLS_CC, E_NOTICE, "SQL safe mode in effect - ignoring host/user/password information"); } user = php_get_current_user(TSRMLS_C); - hashed_details = STR_ALLOC(sizeof("mysql___") + strlen(user) - 1, 0); + hashed_details = zend_string_alloc(sizeof("mysql___") + strlen(user) - 1, 0); snprintf(hashed_details->val, hashed_details->len + 1, "mysql__%s_", user); client_flags = CLIENT_INTERACTIVE; } else { /* mysql_pconnect does not support new_link parameter */ if (persistent) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!i", &host_and_port, &host_len, + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!l", &host_and_port, &host_len, &user, &user_len, &passwd, &passwd_len, &client_flags)==FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!bi", &host_and_port, &host_len, + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!bl", &host_and_port, &host_len, &user, &user_len, &passwd, &passwd_len, &new_link, &client_flags)==FAILURE) { return; @@ -819,8 +819,8 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifdef CLIENT_MULTI_STATEMENTS client_flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries via connect parameter */ #endif - hashed_details = STR_ALLOC(sizeof("mysql____") + (host_and_port? strlen(host_and_port) : 0) - + (user? strlen(user) : 0) + (passwd? strlen(passwd) : 0) + MAX_LENGTH_OF_ZEND_INT - 1, 0); + hashed_details = zend_string_alloc(sizeof("mysql____") + (host_and_port? strlen(host_and_port) : 0) + + (user? strlen(user) : 0) + (passwd? strlen(passwd) : 0) + MAX_LENGTH_OF_LONG - 1, 0); hashed_details->len = snprintf(hashed_details->val, hashed_details->len + 1, "mysql_%s_%s_%s_" ZEND_INT_FMT, SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags); } @@ -863,13 +863,13 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%pd)", MySG(num_links)); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } if (MySG(max_persistent) != -1 && MySG(num_persistent) >= MySG(max_persistent)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open persistent links (%pd)", MySG(num_persistent)); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } /* create the link */ @@ -911,7 +911,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) MySG(connect_errno) = mysql_errno(mysql->conn); #endif free(mysql); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile)); @@ -920,14 +920,14 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) ZVAL_NEW_PERSISTENT_RES(&new_le, -1, mysql, le_plink); /* avoid bogus memleak report */ - phashed = STR_INIT(hashed_details->val, hashed_details->len, 1); + phashed = zend_string_init(hashed_details->val, hashed_details->len, 1); if (zend_hash_update(&EG(persistent_list), phashed, &new_le) == NULL) { - STR_RELEASE(phashed); + zend_string_release(phashed); free(mysql); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } - STR_RELEASE(phashed); + zend_string_release(phashed); MySG(num_persistent)++; MySG(num_links)++; } else { /* The link is in our list of persistent connections */ @@ -955,7 +955,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Link to server lost, unable to reconnect"); zend_hash_del(&EG(persistent_list), hashed_details); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } mysql_options(mysql->conn, MYSQL_OPT_LOCAL_INFILE, (char *)&MySG(allow_local_infile)); @@ -988,7 +988,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) GC_REFCOUNT(link)++; ZVAL_RES(return_value, link); php_mysql_set_default_link(link TSRMLS_CC); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_CLEANUP(); return; } else { @@ -998,7 +998,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (MySG(max_links) != -1 && MySG(num_links) >= MySG(max_links)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Too many open links (%pd)", MySG(num_links)); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } @@ -1016,7 +1016,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (!mysql->conn) { MySG(connect_error) = estrdup("OOM"); php_error_docref(NULL TSRMLS_CC, E_WARNING, "OOM"); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); efree(mysql); MYSQL_DO_CONNECT_RETURN_FALSE(); } @@ -1044,7 +1044,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #ifdef MYSQL_USE_MYSQLND mysqlnd_close(mysql->conn, MYSQLND_CLOSE_DISCONNECTED); #endif - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); efree(mysql); MYSQL_DO_CONNECT_RETURN_FALSE(); } @@ -1057,14 +1057,14 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) ZVAL_NEW_RES(&new_index_ptr, -1, Z_RES_P(return_value), le_index_ptr); if (zend_hash_update(&EG(regular_list), hashed_details, &new_index_ptr) == NULL) { zval_ptr_dtor(return_value); - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); MYSQL_DO_CONNECT_RETURN_FALSE(); } Z_ADDREF_P(return_value); MySG(num_links)++; } - STR_RELEASE(hashed_details); + zend_string_release(hashed_details); php_mysql_set_default_link(Z_RES_P(return_value) TSRMLS_CC); MYSQL_DO_CONNECT_CLEANUP(); } @@ -1225,7 +1225,7 @@ PHP_FUNCTION(mysql_get_proto_info) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - RETURN_INT(mysql_get_proto_info(mysql->conn)); + RETURN_LONG(mysql_get_proto_info(mysql->conn)); } /* }}} */ @@ -1299,7 +1299,7 @@ PHP_FUNCTION(mysql_thread_id) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - RETURN_INT((long) mysql_thread_id(mysql->conn)); + RETURN_LONG((long) mysql_thread_id(mysql->conn)); } /* }}} */ @@ -1802,7 +1802,7 @@ PHP_FUNCTION(mysql_errno) if (!mysql_link) { if (MySG(default_link) == NULL) { if (MySG(connect_error) != NULL){ - RETURN_INT(MySG(connect_errno)); + RETURN_LONG(MySG(connect_errno)); } else { RETURN_FALSE; } @@ -1812,7 +1812,7 @@ PHP_FUNCTION(mysql_errno) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - RETURN_INT(mysql_errno(mysql->conn)); + RETURN_LONG(mysql_errno(mysql->conn)); } #endif /* }}} */ @@ -1837,7 +1837,7 @@ PHP_FUNCTION(mysql_affected_rows) } /* conversion from int64 to long happing here */ - RETURN_INT((long)mysql_affected_rows(mysql->conn)); + RETURN_LONG((long)mysql_affected_rows(mysql->conn)); } /* }}} */ @@ -1857,7 +1857,7 @@ PHP_FUNCTION(mysql_escape_string) * we don't realloc() down to the real size since it'd most probably not * be worth it */ - escaped_str = STR_ALLOC(str_len * 2, 0); + escaped_str = zend_string_alloc(str_len * 2, 0); escaped_str->len = mysql_escape_string(escaped_str->val, str, str_len); php_error_docref("function.mysql-real-escape-string" TSRMLS_CC, E_DEPRECATED, "This function is deprecated; use mysql_real_escape_string() instead."); @@ -1891,7 +1891,7 @@ PHP_FUNCTION(mysql_real_escape_string) * we don't realloc() down to the real size since it'd most probably not * be worth it */ - new_str = STR_ALLOC(str_len * 2, 0); + new_str = zend_string_alloc(str_len * 2, 0); new_str->len = mysql_real_escape_string(mysql->conn, new_str->val, str, str_len); RETURN_NEW_STR(new_str); @@ -1918,7 +1918,7 @@ PHP_FUNCTION(mysql_insert_id) } /* conversion from int64 to long happing here */ - RETURN_INT((long)mysql_insert_id(mysql->conn)); + RETURN_LONG((long)mysql_insert_id(mysql->conn)); } /* }}} */ @@ -1927,7 +1927,7 @@ PHP_FUNCTION(mysql_insert_id) PHP_FUNCTION(mysql_result) { zval *result, *field=NULL; - php_int_t row; + zend_long row; MYSQL_RES *mysql_result; #ifndef MYSQL_USE_MYSQLND MYSQL_ROW sql_row; @@ -1940,7 +1940,7 @@ johannes TODO: Do 2 zend_parse_parameters calls instead of type "z" and switch below Q: String or long first? */ - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri|z", &result, &row, &field) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|z", &result, &row, &field) == FAILURE) { return; } @@ -1964,7 +1964,7 @@ Q: String or long first? field_name = estrdup(tmp + 1); } else { table_name = NULL; - field_name = estrndup(Z_STRVAL_P(field),Z_STRSIZE_P(field)); + field_name = estrndup(Z_STRVAL_P(field),Z_STRLEN_P(field)); } mysql_field_seek(mysql_result, 0); while ((tmp_field = mysql_fetch_field(mysql_result))) { @@ -1993,7 +1993,7 @@ Q: String or long first? break; default: convert_to_int_ex(field); - field_offset = Z_IVAL_P(field); + field_offset = Z_LVAL_P(field); if (field_offset < 0 || field_offset >= (int)mysql_num_fields(mysql_result)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified"); RETURN_FALSE; @@ -2040,7 +2040,7 @@ PHP_FUNCTION(mysql_num_rows) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); /* conversion from int64 to long happing here */ - RETURN_INT((long) mysql_num_rows(mysql_result)); + RETURN_LONG((long) mysql_num_rows(mysql_result)); } /* }}} */ @@ -2057,13 +2057,13 @@ PHP_FUNCTION(mysql_num_fields) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); - RETURN_INT(mysql_num_fields(mysql_result)); + RETURN_LONG(mysql_num_fields(mysql_result)); } /* }}} */ /* {{{ php_mysql_fetch_hash */ -static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, php_int_t result_type, int expected_args, int into_object) +static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_type, int expected_args, int into_object) { MYSQL_RES *mysql_result; zval *res, *ctor_params = NULL; @@ -2096,7 +2096,7 @@ static void php_mysql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, php_int_t result_ } else #endif { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|i", &res, &result_type) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &res, &result_type) == FAILURE) { return; } if (!result_type) { @@ -2271,10 +2271,10 @@ PHP_FUNCTION(mysql_fetch_assoc) PHP_FUNCTION(mysql_data_seek) { zval *result; - php_int_t offset; + zend_long offset; MYSQL_RES *mysql_result; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri", &result, &offset)) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &offset)) { return; } @@ -2312,7 +2312,7 @@ PHP_FUNCTION(mysql_fetch_lengths) num_fields = mysql_num_fields(mysql_result); for (i=0; isname)); + add_property_str(return_value, "name", zend_string_copy(mysql_field->sname)); #else add_property_stringl(return_value, "name", (mysql_field->name?mysql_field->name:""), mysql_field->name_length); #endif add_property_stringl(return_value, "table", (mysql_field->table?mysql_field->table:""), mysql_field->table_length); add_property_stringl(return_value, "def", (mysql_field->def?mysql_field->def:""), mysql_field->def_length); - add_property_int(return_value, "max_length", mysql_field->max_length); - add_property_int(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); - add_property_int(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); - add_property_int(return_value, "multiple_key", (mysql_field->flags&MULTIPLE_KEY_FLAG?1:0)); - add_property_int(return_value, "unique_key", (mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); - add_property_int(return_value, "numeric", IS_NUM(mysql_field->type)?1:0); - add_property_int(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0); + add_property_long(return_value, "max_length", mysql_field->max_length); + add_property_long(return_value, "not_null", IS_NOT_NULL(mysql_field->flags)?1:0); + add_property_long(return_value, "primary_key", IS_PRI_KEY(mysql_field->flags)?1:0); + add_property_long(return_value, "multiple_key", (mysql_field->flags&MULTIPLE_KEY_FLAG?1:0)); + add_property_long(return_value, "unique_key", (mysql_field->flags&UNIQUE_KEY_FLAG?1:0)); + add_property_long(return_value, "numeric", IS_NUM(mysql_field->type)?1:0); + add_property_long(return_value, "blob", IS_BLOB(mysql_field->flags)?1:0); add_property_string(return_value, "type", php_mysql_get_field_name(mysql_field->type)); - add_property_int(return_value, "unsigned", (mysql_field->flags&UNSIGNED_FLAG?1:0)); - add_property_int(return_value, "zerofill", (mysql_field->flags&ZEROFILL_FLAG?1:0)); + add_property_long(return_value, "unsigned", (mysql_field->flags&UNSIGNED_FLAG?1:0)); + add_property_long(return_value, "zerofill", (mysql_field->flags&ZEROFILL_FLAG?1:0)); } /* }}} */ @@ -2445,10 +2445,10 @@ PHP_FUNCTION(mysql_fetch_field) PHP_FUNCTION(mysql_field_seek) { zval *result; - php_int_t offset; + zend_long offset; MYSQL_RES *mysql_result; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri", &result, &offset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &offset) == FAILURE) { return; } ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); @@ -2473,13 +2473,13 @@ PHP_FUNCTION(mysql_field_seek) static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) { zval *result; - php_int_t field; + zend_long field; MYSQL_RES *mysql_result; const MYSQL_FIELD *mysql_field = {0}; char buf[512]; int len; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ri", &result, &field) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &result, &field) == FAILURE) { return; } @@ -2497,7 +2497,7 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) switch (entry_type) { case PHP_MYSQL_FIELD_NAME: #ifdef MYSQL_USE_MYSQLND - RETVAL_STR(STR_COPY(mysql_field->sname)); + RETVAL_STR(zend_string_copy(mysql_field->sname)); #else RETVAL_STRING(mysql_field->name); #endif @@ -2506,7 +2506,7 @@ static void php_mysql_field_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type) RETVAL_STRING(mysql_field->table); break; case PHP_MYSQL_FIELD_LEN: - RETVAL_INT(mysql_field->length); + RETVAL_LONG(mysql_field->length); break; case PHP_MYSQL_FIELD_TYPE: RETVAL_STRING(php_mysql_get_field_name(mysql_field->type)); -- cgit v1.2.1 From 4d997f63d98c663b2d9acccd3655572652f61c7d Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 25 Aug 2014 20:22:49 +0200 Subject: master renames phase 3 --- ext/mysql/php_mysql.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 4276537368..2bc488fe23 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -686,9 +686,9 @@ PHP_MINFO_FUNCTION(mysql) php_info_print_table_start(); php_info_print_table_header(2, "MySQL Support", "enabled"); - snprintf(buf, sizeof(buf), ZEND_INT_FMT, MySG(num_persistent)); + snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MySG(num_persistent)); php_info_print_table_row(2, "Active Persistent Links", buf); - snprintf(buf, sizeof(buf), ZEND_INT_FMT, MySG(num_links)); + snprintf(buf, sizeof(buf), ZEND_LONG_FMT, MySG(num_links)); php_info_print_table_row(2, "Active Links", buf); php_info_print_table_row(2, "Client API version", mysql_get_client_info()); #if !defined (PHP_WIN32) && !defined (NETWARE) && !defined(MYSQL_USE_MYSQLND) @@ -821,7 +821,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) #endif hashed_details = zend_string_alloc(sizeof("mysql____") + (host_and_port? strlen(host_and_port) : 0) + (user? strlen(user) : 0) + (passwd? strlen(passwd) : 0) + MAX_LENGTH_OF_LONG - 1, 0); - hashed_details->len = snprintf(hashed_details->val, hashed_details->len + 1, "mysql_%s_%s_%s_" ZEND_INT_FMT, SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags); + hashed_details->len = snprintf(hashed_details->val, hashed_details->len + 1, "mysql_%s_%s_%s_" ZEND_LONG_FMT, SAFE_STRING(host_and_port), SAFE_STRING(user), SAFE_STRING(passwd), client_flags); } /* We cannot use mysql_port anymore in windows, need to use -- cgit v1.2.1 From af59e92b24c8f624672720d47ef65bd8457728b9 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 25 Aug 2014 21:51:49 +0200 Subject: master renames phase 7 --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 2bc488fe23..dc5a2120ba 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1992,7 +1992,7 @@ Q: String or long first? } break; default: - convert_to_int_ex(field); + convert_to_long_ex(field); field_offset = Z_LVAL_P(field); if (field_offset < 0 || field_offset >= (int)mysql_num_fields(mysql_result)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad column offset specified"); -- cgit v1.2.1 From 202e8db1dc8e1203039327d81ce6fd82c1c2d909 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 26 Aug 2014 11:23:25 +0200 Subject: fixed several long vs zend_long casts --- ext/mysql/php_mysql.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index dc5a2120ba..8939e9934a 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1299,7 +1299,7 @@ PHP_FUNCTION(mysql_thread_id) ZEND_FETCH_RESOURCE2(mysql, php_mysql_conn *, mysql_link, -1, "MySQL-Link", le_link, le_plink); } - RETURN_LONG((long) mysql_thread_id(mysql->conn)); + RETURN_LONG((zend_long) mysql_thread_id(mysql->conn)); } /* }}} */ @@ -1837,7 +1837,7 @@ PHP_FUNCTION(mysql_affected_rows) } /* conversion from int64 to long happing here */ - RETURN_LONG((long)mysql_affected_rows(mysql->conn)); + RETURN_LONG((zend_long)mysql_affected_rows(mysql->conn)); } /* }}} */ @@ -1918,7 +1918,7 @@ PHP_FUNCTION(mysql_insert_id) } /* conversion from int64 to long happing here */ - RETURN_LONG((long)mysql_insert_id(mysql->conn)); + RETURN_LONG((zend_long)mysql_insert_id(mysql->conn)); } /* }}} */ @@ -2040,7 +2040,7 @@ PHP_FUNCTION(mysql_num_rows) ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL result", le_result); /* conversion from int64 to long happing here */ - RETURN_LONG((long) mysql_num_rows(mysql_result)); + RETURN_LONG((zend_long) mysql_num_rows(mysql_result)); } /* }}} */ -- cgit v1.2.1 From 3234480827b27ff5d3469a732167afd289632a96 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 27 Aug 2014 15:31:48 +0200 Subject: first show to make 's' work with size_t --- ext/mysql/php_mysql.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 8939e9934a..985f1888be 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -725,7 +725,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) char *user = NULL, *passwd = NULL; char *host_and_port = NULL, *socket = NULL; char *tmp = NULL, *host = NULL; - int user_len = 0, passwd_len = 0, host_len = 0; + size_t user_len = 0, passwd_len = 0, host_len = 0; int port = MYSQL_PORT; zend_long client_flags = 0; php_mysql_conn *mysql = NULL; @@ -1145,7 +1145,7 @@ PHP_FUNCTION(mysql_close) PHP_FUNCTION(mysql_select_db) { char *db; - int db_len; + size_t db_len; php_mysql_conn *mysql; zval *mysql_link = NULL; @@ -1404,7 +1404,7 @@ PHP_FUNCTION(mysql_set_charset) PHP_FUNCTION(mysql_create_db) { char *db; - int db_len; + size_t db_len; php_mysql_conn *mysql; zval *mysql_link = NULL; @@ -1435,7 +1435,7 @@ PHP_FUNCTION(mysql_create_db) PHP_FUNCTION(mysql_drop_db) { char *db; - int db_len; + size_t db_len; php_mysql_conn *mysql; zval *mysql_link = NULL; @@ -1657,7 +1657,7 @@ PHP_FUNCTION(mysql_list_dbs) PHP_FUNCTION(mysql_list_tables) { char *db; - int db_len; + size_t db_len; php_mysql_conn *mysql; zval *mysql_link = NULL; MYSQL_RES *mysql_result; @@ -1694,7 +1694,7 @@ PHP_FUNCTION(mysql_list_tables) PHP_FUNCTION(mysql_list_fields) { char *db, *table; - int db_len, table_len; + size_t db_len, table_len; zval *mysql_link = NULL; php_mysql_conn *mysql; MYSQL_RES *mysql_result; @@ -1846,7 +1846,7 @@ PHP_FUNCTION(mysql_affected_rows) PHP_FUNCTION(mysql_escape_string) { char *str; - int str_len; + size_t str_len; zend_string *escaped_str; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) { @@ -1870,7 +1870,7 @@ PHP_FUNCTION(mysql_escape_string) PHP_FUNCTION(mysql_real_escape_string) { char *str; - int str_len; + size_t str_len; zend_string *new_str; php_mysql_conn *mysql; zval *mysql_link = NULL; -- cgit v1.2.1 From 257ed4061ae88802538a6f22724c57fda052e36e Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Wed, 27 Aug 2014 17:31:24 +0200 Subject: 's' works with size_t round 2 --- ext/mysql/php_mysql.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 985f1888be..4b316b4526 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1555,7 +1555,7 @@ static void php_mysql_do_query_general(php_mysql_conn *mysql, char *query, int q static void php_mysql_do_query(INTERNAL_FUNCTION_PARAMETERS, int use_store) { char *query; - int query_len; + size_t query_len; zval *mysql_link = NULL; php_mysql_conn *mysql; @@ -1596,7 +1596,7 @@ PHP_FUNCTION(mysql_unbuffered_query) PHP_FUNCTION(mysql_db_query) { char *db, *query; - int db_len, query_len; + size_t db_len, query_len; php_mysql_conn *mysql; zval *mysql_link = NULL; -- cgit v1.2.1 From a038ab892ffd8ee1f808da8c5a84dfa3d06ac9f2 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 28 Aug 2014 10:31:13 +0400 Subject: Fixed type --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 4b316b4526..424f923d78 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1372,7 +1372,7 @@ PHP_FUNCTION(mysql_client_encoding) PHP_FUNCTION(mysql_set_charset) { char *csname; - int csname_len; + size_t csname_len; php_mysql_conn *mysql; zval *mysql_link = NULL; -- cgit v1.2.1 From 88d7ca44f645c6e1bbdb17affd7a34113911093d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 1 Sep 2014 20:57:33 +0400 Subject: Refactored INI subsystem to use zend_string* instead of char* --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index 424f923d78..e3535bc769 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -485,7 +485,7 @@ static void _close_mysql_plink(zend_resource *rsrc TSRMLS_DC) static PHP_INI_MH(OnMySQLPort) { if (new_value != NULL) { /* default port */ - MySG(default_port) = atoi(new_value); + MySG(default_port) = atoi(new_value->val); } else { MySG(default_port) = -1; } -- cgit v1.2.1 From d0cb715373c3fbe9dc095378ec5ed8c71f799f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Schl=C3=BCter?= Date: Fri, 19 Sep 2014 18:33:14 +0200 Subject: s/PHP 5/PHP 7/ --- ext/mysql/php_mysql.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'ext/mysql/php_mysql.c') diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c index e3535bc769..fc1dac5da7 100644 --- a/ext/mysql/php_mysql.c +++ b/ext/mysql/php_mysql.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2014 The PHP Group | +----------------------------------------------------------------------+ -- cgit v1.2.1