From: Andrey Hristov Date: Tue, 20 May 2014 16:57:11 +0000 (+0300) Subject: First set of phpng changes for mysqlnd X-Git-Tag: POST_PHPNG_MERGE~315 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5d57e17a15cf89bf8b20d718ce5070b42ee446e0;p=php First set of phpng changes for mysqlnd --- diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index 0289cd326c..c5db05b91d 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -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; @@ -2440,34 +2439,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, @@ -2492,15 +2463,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_str_update_ptr(conn->options->connect_attr, key, strlen(key), (void*)©v); + zval attrz; + ZVAL_STRING(&attrz, value); + zend_hash_str_update(conn->options->connect_attr, key, strlen(key), &attrz); } break; default: diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index f373ea5dd5..a4e54f2408 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -188,8 +188,7 @@ PHPAPI void mysqlnd_free_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind TSRM PHPAPI const char * mysqlnd_field_type_name(enum mysqlnd_field_types field_type); /* LOAD DATA LOCAL */ -PHPAPI void mysqlnd_local_infile_default(MYSQLND_CONN_DATA * conn); -PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND_CONN_DATA * const conn, const char * const funcname); +void mysqlnd_local_infile_default(MYSQLND_CONN_DATA * conn); /* Simple commands */ #define mysqlnd_autocommit(conn, mode) ((conn)->data)->m->set_autocommit((conn)->data, (mode) TSRMLS_CC) diff --git a/ext/mysqlnd/mysqlnd_loaddata.c b/ext/mysqlnd/mysqlnd_loaddata.c index 94d69a4008..ab7a1ae9eb 100644 --- a/ext/mysqlnd/mysqlnd_loaddata.c +++ b/ext/mysqlnd/mysqlnd_loaddata.c @@ -27,7 +27,7 @@ /* {{{ mysqlnd_local_infile_init */ static -int mysqlnd_local_infile_init(void ** ptr, char * filename, void ** userdata TSRMLS_DC) +int mysqlnd_local_infile_init(void ** ptr, const char * const filename TSRMLS_DC) { MYSQLND_INFILE_INFO *info; php_stream_context *context = NULL; @@ -73,7 +73,7 @@ int mysqlnd_local_infile_read(void * ptr, zend_uchar * buf, unsigned int buf_len DBG_ENTER("mysqlnd_local_infile_read"); - count = (int)php_stream_read(info->fd, (char *) buf, buf_len); + count = (int) php_stream_read(info->fd, (char *) buf, buf_len); if (count < 0) { strcpy(info->error_msg, "Error reading file"); @@ -125,7 +125,7 @@ void mysqlnd_local_infile_end(void * ptr TSRMLS_DC) /* {{{ mysqlnd_local_infile_default */ -PHPAPI void +void mysqlnd_local_infile_default(MYSQLND_CONN_DATA * conn) { conn->infile.local_infile_init = mysqlnd_local_infile_init; @@ -136,20 +136,6 @@ mysqlnd_local_infile_default(MYSQLND_CONN_DATA * conn) /* }}} */ -/* {{{ mysqlnd_set_local_infile_handler */ -PHPAPI void -mysqlnd_set_local_infile_handler(MYSQLND_CONN_DATA * const conn, const char * const funcname) -{ - if (!conn->infile.callback) { - MAKE_STD_ZVAL(conn->infile.callback); - } else { - zval_dtor(conn->infile.callback); - } - ZVAL_STRING(conn->infile.callback, (char*) funcname, 1); -} -/* }}} */ - - static const char *lost_conn = "Lost connection to MySQL server during LOAD DATA of local file"; @@ -184,7 +170,7 @@ mysqlnd_handle_local_infile(MYSQLND_CONN_DATA * conn, const char * filename, zen *is_warning = FALSE; /* init handler: allocate read buffer and open file */ - if (infile.local_infile_init(&info, (char *)filename, conn->infile.userdata TSRMLS_CC)) { + if (infile.local_infile_init(&info, (char *)filename TSRMLS_CC)) { char tmp_buf[sizeof(conn->error_info->error)]; int tmp_error_no; *is_warning = TRUE; diff --git a/ext/mysqlnd/mysqlnd_reverse_api.c b/ext/mysqlnd/mysqlnd_reverse_api.c index d8b1a41511..332669d6c6 100644 --- a/ext/mysqlnd/mysqlnd_reverse_api.c +++ b/ext/mysqlnd/mysqlnd_reverse_api.c @@ -60,8 +60,7 @@ mysqlnd_reverse_api_get_api_list(TSRMLS_D) PHPAPI void mysqlnd_reverse_api_register_api(MYSQLND_REVERSE_API * apiext TSRMLS_DC) { - zend_hash_add(&mysqlnd_api_ext_ht, apiext->module->name, strlen(apiext->module->name) + 1, &apiext, - sizeof(MYSQLND_REVERSE_API *), NULL); + zend_hash_str_add_ptr(&mysqlnd_api_ext_ht, apiext->module->name, strlen(apiext->module->name), &apiext); } /* }}} */ @@ -71,8 +70,8 @@ PHPAPI MYSQLND * zval_to_mysqlnd(zval * zv, const unsigned int client_api_capabilities, unsigned int * save_client_api_capabilities TSRMLS_DC) { MYSQLND * retval; - MYSQLND_REVERSE_API ** elem; - +#ifdef OLD_CODE + MYSQLND_REVERSE_API * elem; for (zend_hash_internal_pointer_reset(&mysqlnd_api_ext_ht); zend_hash_get_current_data(&mysqlnd_api_ext_ht, (void **)&elem) == SUCCESS; zend_hash_move_forward(&mysqlnd_api_ext_ht)) @@ -87,7 +86,22 @@ zval_to_mysqlnd(zval * zv, const unsigned int client_api_capabilities, unsigned } } } - +#else + zval * elem; + ZEND_HASH_FOREACH_VAL(&mysqlnd_api_ext_ht, elem) { + MYSQLND_REVERSE_API * api = (MYSQLND_REVERSE_API *) Z_PTR_P(elem); + if (api && api->conversion_cb) { + retval = api->conversion_cb(zv TSRMLS_CC); + if (retval) { + if (retval->data) { + *save_client_api_capabilities = retval->data->m->negotiate_client_api_capabilities(retval->data, client_api_capabilities TSRMLS_CC); + } + return retval; + } + } + + } ZEND_HASH_FOREACH_END(); +#endif return NULL; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 66920e47be..a72fccf88f 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -149,12 +149,10 @@ typedef struct st_mysqlnd_charset /* local infile handler */ typedef struct st_mysqlnd_infile { - int (*local_infile_init)(void **ptr, char *filename, void **userdata TSRMLS_DC); + int (*local_infile_init)(void **ptr, const char * const filename TSRMLS_DC); int (*local_infile_read)(void *ptr, zend_uchar * buf, unsigned int buf_len TSRMLS_DC); - int (*local_infile_error)(void *ptr, char *error_msg, unsigned int error_msg_len TSRMLS_DC); + int (*local_infile_error)(void *ptr, char * error_msg, unsigned int error_msg_len TSRMLS_DC); void (*local_infile_end)(void *ptr TSRMLS_DC); - zval *callback; - void *userdata; } MYSQLND_INFILE; typedef struct st_mysqlnd_options diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index ecce71d9c2..6a22b18829 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -561,9 +561,10 @@ size_t php_mysqlnd_auth_write(void * _packet, MYSQLND_CONN_DATA * conn TSRMLS_DC } if (packet->connect_attr && zend_hash_num_elements(packet->connect_attr)) { + size_t ca_payload_len = 0; +#ifdef OLD_CODE HashPosition pos_value; const char ** entry_value; - size_t ca_payload_len = 0; zend_hash_internal_pointer_reset_ex(packet->connect_attr, &pos_value); while (SUCCESS == zend_hash_get_current_data_ex(packet->connect_attr, (void **)&entry_value, &pos_value)) { char *s_key; @@ -579,10 +580,28 @@ size_t php_mysqlnd_auth_write(void * _packet, MYSQLND_CONN_DATA * conn TSRMLS_DC } zend_hash_move_forward_ex(conn->options->connect_attr, &pos_value); } +#else + { + zend_string * key; + unsigned long unused_num_key; + zval * entry_value; + ZEND_HASH_FOREACH_KEY_VAL(packet->connect_attr, unused_num_key, key, entry_value) { + if (key) { /* HASH_KEY_IS_STRING */ + size_t value_len = Z_STRLEN_P(entry_value); + + ca_payload_len += php_mysqlnd_net_store_length_size(key->len); + ca_payload_len += key->len; + ca_payload_len += php_mysqlnd_net_store_length_size(value_len); + ca_payload_len += value_len; + } + } ZEND_HASH_FOREACH_END(); + } +#endif if ((sizeof(buffer) - (p - buffer)) >= (ca_payload_len + php_mysqlnd_net_store_length_size(ca_payload_len))) { p = php_mysqlnd_net_store_length(p, ca_payload_len); +#ifdef OLD_CODE zend_hash_internal_pointer_reset_ex(packet->connect_attr, &pos_value); while (SUCCESS == zend_hash_get_current_data_ex(packet->connect_attr, (void **)&entry_value, &pos_value)) { char *s_key; @@ -601,6 +620,27 @@ size_t php_mysqlnd_auth_write(void * _packet, MYSQLND_CONN_DATA * conn TSRMLS_DC } zend_hash_move_forward_ex(conn->options->connect_attr, &pos_value); } +#else + { + zend_string * key; + unsigned long unused_num_key; + zval * entry_value; + ZEND_HASH_FOREACH_KEY_VAL(packet->connect_attr, unused_num_key, key, entry_value) { + if (key) { /* HASH_KEY_IS_STRING */ + size_t value_len = Z_STRLEN_P(entry_value); + + /* copy key */ + p = php_mysqlnd_net_store_length(p, key->len); + memcpy(p, key->val, key->len); + p+= key->len; + /* copy value */ + p = php_mysqlnd_net_store_length(p, value_len); + memcpy(p, Z_STRVAL_P(entry_value), value_len); + p+= value_len; + } + } ZEND_HASH_FOREACH_END(); + } +#endif } else { /* cannot put the data - skip */ } @@ -1578,7 +1618,6 @@ php_mysqlnd_rowp_read_text_protocol_aux(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, unsigned int field_count, const MYSQLND_FIELD * fields_metadata, zend_bool as_int_or_float, zend_bool copy_data, MYSQLND_STATS * stats TSRMLS_DC) { - unsigned int i; zend_bool last_field_was_string = FALSE; zval **current_field, **end_field, **start_field;