diff options
Diffstat (limited to 'ext/mysqlnd/mysqlnd.c')
-rw-r--r-- | ext/mysqlnd/mysqlnd.c | 112 |
1 files changed, 40 insertions, 72 deletions
diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 5d5e77f9bb..41f34e366a 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 2006-2014 The PHP Group | +----------------------------------------------------------------------+ @@ -27,7 +27,7 @@ #include "mysqlnd_statistics.h" #include "mysqlnd_charset.h" #include "mysqlnd_debug.h" -#include "ext/standard/php_smart_str.h" +#include "zend_smart_str.h" /* TODO : @@ -113,7 +113,6 @@ MYSQLND_METHOD(mysqlnd_conn_data, free_contents)(MYSQLND_CONN_DATA * conn TSRMLS DBG_ENTER("mysqlnd_conn_data::free_contents"); - mysqlnd_local_infile_default(conn); if (conn->current_result) { conn->current_result->m.free_result(conn->current_result, TRUE TSRMLS_CC); conn->current_result = NULL; @@ -441,7 +440,7 @@ mysqlnd_switch_to_ssl_if_needed( MYSQLND_CONN_DATA * conn, const MYSQLND_PACKET_GREET * const greet_packet, const MYSQLND_OPTIONS * const options, - unsigned long mysql_flags + zend_ulong mysql_flags TSRMLS_DC ) { @@ -547,7 +546,7 @@ mysqlnd_run_authentication( const char * const auth_protocol, unsigned int charset_no, const MYSQLND_OPTIONS * const options, - unsigned long mysql_flags, + zend_ulong mysql_flags, zend_bool silent, zend_bool is_change_user TSRMLS_DC) @@ -679,7 +678,7 @@ mysqlnd_connect_run_authentication( size_t passwd_len, const MYSQLND_PACKET_GREET * const greet_packet, const MYSQLND_OPTIONS * const options, - unsigned long mysql_flags + zend_ulong mysql_flags TSRMLS_DC) { enum_func_status ret = FAIL; @@ -998,8 +997,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, */ net->data->compressed = mysql_flags & CLIENT_COMPRESS? TRUE:FALSE; - conn->user = mnd_pestrdup(user, conn->persistent); - conn->user_len = strlen(conn->user); + conn->user_len = strlen(user); + conn->user = mnd_pestrndup(user, conn->user_len, conn->persistent); conn->passwd = mnd_pestrndup(passwd, passwd_len, conn->persistent); conn->passwd_len = passwd_len; conn->port = port; @@ -1012,12 +1011,12 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, } if (!unix_socket && !named_pipe) { - conn->host = mnd_pestrdup(host, conn->persistent); + conn->host = mnd_pestrndup(host, host_len, conn->persistent); if (!conn->host) { SET_OOM_ERROR(*conn->error_info); goto err; /* OOM */ } - conn->host_len = strlen(conn->host); + conn->host_len = host_len; { char *p; mnd_sprintf(&p, 0, "%s via TCP/IP", conn->host); @@ -1025,7 +1024,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, connect)(MYSQLND_CONN_DATA * conn, SET_OOM_ERROR(*conn->error_info); goto err; /* OOM */ } - conn->host_info = mnd_pestrdup(p, conn->persistent); + conn->host_info = mnd_pestrdup(p, conn->persistent); mnd_sprintf_free(p); if (!conn->host_info) { SET_OOM_ERROR(*conn->error_info); @@ -1589,7 +1588,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, sqlstate)(const MYSQLND_CONN_DATA * const conn /* {{{ mysqlnd_old_escape_string */ -PHPAPI ulong +PHPAPI zend_ulong mysqlnd_old_escape_string(char * newstr, const char * escapestr, size_t escapestr_len TSRMLS_DC) { DBG_ENTER("mysqlnd_old_escape_string"); @@ -1623,11 +1622,11 @@ MYSQLND_METHOD(mysqlnd_conn_data, ssl_set)(MYSQLND_CONN_DATA * const conn, const /* {{{ mysqlnd_conn_data::escape_string */ -static ulong +static zend_ulong MYSQLND_METHOD(mysqlnd_conn_data, escape_string)(MYSQLND_CONN_DATA * const conn, char * newstr, const char * escapestr, size_t escapestr_len TSRMLS_DC) { size_t this_func = STRUCT_OFFSET(struct st_mysqlnd_conn_data_methods, escape_string); - ulong ret = FAIL; + zend_ulong ret = FAIL; DBG_ENTER("mysqlnd_conn_data::escape_string"); DBG_INF_FMT("conn=%llu", conn->thread_id); @@ -1728,7 +1727,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, ping)(MYSQLND_CONN_DATA * const conn TSRMLS_DC /* {{{ mysqlnd_conn_data::statistic */ static enum_func_status -MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, char **message, unsigned int * message_len TSRMLS_DC) +MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, zend_string **message TSRMLS_DC) { size_t this_func = STRUCT_OFFSET(struct st_mysqlnd_conn_data_methods, get_server_statistics); enum_func_status ret = FAIL; @@ -1751,9 +1750,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, char **me if (PASS == (ret = PACKET_READ(stats_header, conn))) { /* will be freed by Zend, thus don't use the mnd_ allocator */ - *message = estrndup(stats_header->message, stats_header->message_len); - *message_len = stats_header->message_len; - DBG_INF(*message); + *message = zend_string_init(stats_header->message, stats_header->message_len, 0); + DBG_INF((*message)->val); } PACKET_FREE(stats_header); } while (0); @@ -2116,23 +2114,23 @@ MYSQLND_METHOD(mysqlnd_conn_data, thread_id)(const MYSQLND_CONN_DATA * const con /* {{{ mysqlnd_conn_data::get_server_version */ -static unsigned long +static zend_ulong MYSQLND_METHOD(mysqlnd_conn_data, get_server_version)(const MYSQLND_CONN_DATA * const conn TSRMLS_DC) { - long major, minor, patch; + zend_long major, minor, patch; char *p; if (!(p = conn->server_version)) { return 0; } - major = strtol(p, &p, 10); + major = ZEND_STRTOL(p, &p, 10); p += 1; /* consume the dot */ - minor = strtol(p, &p, 10); + minor = ZEND_STRTOL(p, &p, 10); p += 1; /* consume the dot */ - patch = strtol(p, &p, 10); + patch = ZEND_STRTOL(p, &p, 10); - return (unsigned long)(major * 10000L + (unsigned long)(minor * 100L + patch)); + return (zend_ulong)(major * Z_L(10000) + (zend_ulong)(minor * Z_L(100) + patch)); } /* }}} */ @@ -2283,7 +2281,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, change_user)(MYSQLND_CONN_DATA * const conn, } /* XXX: passwords that have \0 inside work during auth, but in this case won't work with change user */ - ret = mysqlnd_run_authentication(conn, user, passwd, strlen(passwd), db, strlen(db), + ret = mysqlnd_run_authentication(conn, user, passwd, passwd_len, db, strlen(db), conn->auth_plugin_data, conn->auth_plugin_data_len, conn->options->auth_protocol, 0 /*charset not used*/, conn->options, conn->server_capabilities, silent, TRUE/*is_change*/ TSRMLS_CC); @@ -2445,7 +2443,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option)(MYSQLND_CONN_DATA * const c case MYSQL_OPT_CONNECT_ATTR_DELETE: if (conn->options->connect_attr && value) { DBG_INF_FMT("Before delete %d attribute(s)", zend_hash_num_elements(conn->options->connect_attr)); - zend_hash_del(conn->options->connect_attr, value, strlen(value)); + zend_hash_str_del(conn->options->connect_attr, value, strlen(value)); DBG_INF_FMT("%d left", zend_hash_num_elements(conn->options->connect_attr)); } break; @@ -2469,34 +2467,6 @@ end: /* }}} */ -/* {{{ connect_attr_item_edtor */ -static void -connect_attr_item_edtor(void * pDest) -{ -#ifdef ZTS - TSRMLS_FETCH(); -#endif - DBG_ENTER("connect_attr_item_edtor"); - mnd_efree(*(char **) pDest); - DBG_VOID_RETURN; -} -/* }}} */ - - -/* {{{ connect_attr_item_pdtor */ -static void -connect_attr_item_pdtor(void * pDest) -{ -#ifdef ZTS - TSRMLS_FETCH(); -#endif - DBG_ENTER("connect_attr_item_pdtor"); - mnd_pefree(*(char **) pDest, 1); - DBG_VOID_RETURN; -} -/* }}} */ - - /* {{{ mysqlnd_conn_data::set_client_option_2d */ static enum_func_status MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * const conn, @@ -2521,15 +2491,13 @@ MYSQLND_METHOD(mysqlnd_conn_data, set_client_option_2d)(MYSQLND_CONN_DATA * cons if (!conn->options->connect_attr) { goto oom; } - zend_hash_init(conn->options->connect_attr, 0, NULL, conn->persistent? connect_attr_item_pdtor:connect_attr_item_edtor, conn->persistent); + zend_hash_init(conn->options->connect_attr, 0, NULL, ZVAL_PTR_DTOR, conn->persistent); } DBG_INF_FMT("Adding [%s][%s]", key, value); { - const char * copyv = mnd_pestrdup(value, conn->persistent); - if (!copyv) { - goto oom; - } - zend_hash_update(conn->options->connect_attr, key, strlen(key), ©v, sizeof(char *), NULL); + zval attrz; + ZVAL_NEW_STR(&attrz, zend_string_init(value, strlen(value), 1)); + zend_hash_str_update(conn->options->connect_attr, key, strlen(key), &attrz); } break; default: @@ -2698,24 +2666,24 @@ static void MYSQLND_METHOD(mysqlnd_conn_data, tx_cor_options_to_string)(const MYSQLND_CONN_DATA * const conn, smart_str * str, const unsigned int mode TSRMLS_DC) { if (mode & TRANS_COR_AND_CHAIN && !(mode & TRANS_COR_AND_NO_CHAIN)) { - if (str->len) { + if (str->s && str->s->len) { smart_str_appendl(str, " ", sizeof(" ") - 1); } smart_str_appendl(str, "AND CHAIN", sizeof("AND CHAIN") - 1); } else if (mode & TRANS_COR_AND_NO_CHAIN && !(mode & TRANS_COR_AND_CHAIN)) { - if (str->len) { + if (str->s && str->s->len) { smart_str_appendl(str, " ", sizeof(" ") - 1); } smart_str_appendl(str, "AND NO CHAIN", sizeof("AND NO CHAIN") - 1); } if (mode & TRANS_COR_RELEASE && !(mode & TRANS_COR_NO_RELEASE)) { - if (str->len) { + if (str->s && str->s->len) { smart_str_appendl(str, " ", sizeof(" ") - 1); } smart_str_appendl(str, "RELEASE", sizeof("RELEASE") - 1); } else if (mode & TRANS_COR_NO_RELEASE && !(mode & TRANS_COR_RELEASE)) { - if (str->len) { + if (str->s && str->s->len) { smart_str_appendl(str, " ", sizeof(" ") - 1); } smart_str_appendl(str, "NO RELEASE", sizeof("NO RELEASE") - 1); @@ -2778,7 +2746,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * con if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) { do { - smart_str tmp_str = {0, 0, 0}; + smart_str tmp_str = {0, 0}; conn->m->tx_cor_options_to_string(conn, &tmp_str, flags TSRMLS_CC); smart_str_0(&tmp_str); @@ -2789,7 +2757,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_commit_or_rollback)(MYSQLND_CONN_DATA * con char * name_esc = mysqlnd_escape_string_for_tx_name_in_comment(name TSRMLS_CC); query_len = mnd_sprintf(&query, 0, (commit? "COMMIT%s %s":"ROLLBACK%s %s"), - name_esc? name_esc:"", tmp_str.c? tmp_str.c:""); + name_esc? name_esc:"", tmp_str.s? tmp_str.s->val:""); smart_str_free(&tmp_str); if (name_esc) { mnd_efree(name_esc); @@ -2822,26 +2790,26 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi if (PASS == conn->m->local_tx_start(conn, this_func TSRMLS_CC)) { do { - smart_str tmp_str = {0, 0, 0}; + smart_str tmp_str = {0, 0}; if (mode & TRANS_START_WITH_CONSISTENT_SNAPSHOT) { - if (tmp_str.len) { + if (tmp_str.s) { smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); } smart_str_appendl(&tmp_str, "WITH CONSISTENT SNAPSHOT", sizeof("WITH CONSISTENT SNAPSHOT") - 1); } if (mode & (TRANS_START_READ_WRITE | TRANS_START_READ_ONLY)) { - unsigned long server_version = conn->m->get_server_version(conn TSRMLS_CC); + zend_ulong server_version = conn->m->get_server_version(conn TSRMLS_CC); if (server_version < 50605L) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "This server version doesn't support 'READ WRITE' and 'READ ONLY'. Minimum 5.6.5 is required"); smart_str_free(&tmp_str); break; } else if (mode & TRANS_START_READ_WRITE) { - if (tmp_str.len) { + if (tmp_str.s && tmp_str.s->len) { smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); } smart_str_appendl(&tmp_str, "READ WRITE", sizeof("READ WRITE") - 1); } else if (mode & TRANS_START_READ_ONLY) { - if (tmp_str.len) { + if (tmp_str.s && tmp_str.s->len) { smart_str_appendl(&tmp_str, ", ", sizeof(", ") - 1); } smart_str_appendl(&tmp_str, "READ ONLY", sizeof("READ ONLY") - 1); @@ -2852,7 +2820,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, tx_begin)(MYSQLND_CONN_DATA * conn, const unsi { char * name_esc = mysqlnd_escape_string_for_tx_name_in_comment(name TSRMLS_CC); char * query; - unsigned int query_len = mnd_sprintf(&query, 0, "START TRANSACTION%s %s", name_esc? name_esc:"", tmp_str.c? tmp_str.c:""); + unsigned int query_len = mnd_sprintf(&query, 0, "START TRANSACTION%s %s", name_esc? name_esc:"", tmp_str.s? tmp_str.s->val:""); smart_str_free(&tmp_str); if (name_esc) { mnd_efree(name_esc); |