From: Dmitry Stogov Date: Tue, 14 Nov 2017 13:14:13 +0000 (+0300) Subject: Merge mysqlnd_field_hash_key structure into st_mysqlnd_field. X-Git-Tag: php-7.3.0alpha1~1038 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=148641980cefa66ef7ad63ad5c2e187cae274a88;p=php Merge mysqlnd_field_hash_key structure into st_mysqlnd_field. --- diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 1035d0379f..ddefc9efd5 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -869,10 +869,10 @@ MYSQLND_METHOD(mysqlnd_result_unbuffered, fetch_row)(MYSQLND_RES * result, void hashing of the column name, which is not needed as it can be precomputed. */ Z_TRY_ADDREF_P(data); - if (meta->zend_hash_keys[i].is_numeric == FALSE) { + if (meta->fields[i].is_numeric == FALSE) { zend_hash_update(row_ht, meta->fields[i].sname, data); } else { - zend_hash_index_update(row_ht, meta->zend_hash_keys[i].key, data); + zend_hash_index_update(row_ht, meta->fields[i].num_key, data); } } @@ -1123,10 +1123,10 @@ MYSQLND_METHOD(mysqlnd_result_buffered_zval, fetch_row)(MYSQLND_RES * result, vo hashing of the column name, which is not needed as it can be precomputed. */ Z_TRY_ADDREF_P(data); - if (meta->zend_hash_keys[i].is_numeric == FALSE) { + if (meta->fields[i].is_numeric == FALSE) { zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].sname, data); } else { - zend_hash_index_update(Z_ARRVAL_P(row), meta->zend_hash_keys[i].key, data); + zend_hash_index_update(Z_ARRVAL_P(row), meta->fields[i].num_key, data); } } } @@ -1219,10 +1219,10 @@ MYSQLND_METHOD(mysqlnd_result_buffered_c, fetch_row)(MYSQLND_RES * result, void hashing of the column name, which is not needed as it can be precomputed. */ Z_TRY_ADDREF_P(data); - if (meta->zend_hash_keys[i].is_numeric == FALSE) { + if (meta->fields[i].is_numeric == FALSE) { zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].sname, data); } else { - zend_hash_index_update(Z_ARRVAL_P(row), meta->zend_hash_keys[i].key, data); + zend_hash_index_update(Z_ARRVAL_P(row), meta->fields[i].num_key, data); } } /* diff --git a/ext/mysqlnd/mysqlnd_result_meta.c b/ext/mysqlnd/mysqlnd_result_meta.c index 1db22f507d..1b2f4ddc33 100644 --- a/ext/mysqlnd/mysqlnd_result_meta.c +++ b/ext/mysqlnd/mysqlnd_result_meta.c @@ -87,8 +87,8 @@ MYSQLND_METHOD(mysqlnd_res_meta, read_metadata)(MYSQLND_RES_METADATA * const met } /* For BC we have to check whether the key is numeric and use it like this */ - if ((meta->zend_hash_keys[i].is_numeric = ZEND_HANDLE_NUMERIC(field_packet.metadata->sname, idx))) { - meta->zend_hash_keys[i].key = idx; + if ((meta->fields[i].is_numeric = ZEND_HANDLE_NUMERIC(field_packet.metadata->sname, idx))) { + meta->fields[i].num_key = idx; } } PACKET_FREE(&field_packet); @@ -116,11 +116,6 @@ MYSQLND_METHOD(mysqlnd_res_meta, free)(MYSQLND_RES_METADATA * meta) meta->fields = NULL; } - if (meta->zend_hash_keys) { - DBG_INF("Freeing zend_hash_keys"); - mnd_efree(meta->zend_hash_keys); - meta->zend_hash_keys = NULL; - } DBG_INF("Freeing metadata structure"); mnd_efree(meta); @@ -138,7 +133,6 @@ MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * co MYSQLND_RES_METADATA * new_meta = NULL; MYSQLND_FIELD * new_fields; MYSQLND_FIELD * orig_fields = meta->fields; - size_t len = meta->field_count * sizeof(struct mysqlnd_field_hash_key); DBG_ENTER("mysqlnd_res_meta::clone_metadata"); @@ -153,12 +147,6 @@ MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * co goto oom; } - new_meta->zend_hash_keys = mnd_emalloc(len); - if (!new_meta->zend_hash_keys) { - goto oom; - } - memcpy(new_meta->zend_hash_keys, meta->zend_hash_keys, len); - /* This will copy also the strings and the root, which we will have to adjust in the loop @@ -180,6 +168,9 @@ MYSQLND_METHOD(mysqlnd_res_meta, clone_metadata)(const MYSQLND_RES_METADATA * co new_fields[i].name_length = ZSTR_LEN(new_fields[i].sname); } + new_fields[i].is_numeric = orig_fields[i].is_numeric; + new_fields[i].num_key = orig_fields[i].num_key; + if (orig_fields[i].org_name && orig_fields[i].org_name != mysqlnd_empty_string) { new_fields[i].org_name = new_fields[i].root + (orig_fields[i].org_name - orig_fields[i].root); @@ -316,8 +307,7 @@ mysqlnd_result_meta_init(unsigned int field_count) ret->field_count = field_count; /* +1 is to have empty marker at the end */ ret->fields = mnd_ecalloc(field_count + 1, sizeof(MYSQLND_FIELD)); - ret->zend_hash_keys = mnd_ecalloc(field_count, sizeof(struct mysqlnd_field_hash_key)); - if (!ret->fields || !ret->zend_hash_keys) { + if (!ret->fields) { break; } DBG_INF_FMT("meta=%p", ret); diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 3d76bc22bf..15b8f9a09a 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -85,6 +85,8 @@ typedef struct st_mysqlnd_cmd_buffer typedef struct st_mysqlnd_field { zend_string *sname; /* Name of column */ + zend_bool is_numeric; + zend_ulong num_key; const char *name; /* Name of column in C string */ const char *org_name; /* Original column name, if an alias */ const char *table; /* Table of column if column was a field */ @@ -1134,18 +1136,9 @@ struct st_mysqlnd_protocol_frame_codec }; - -struct mysqlnd_field_hash_key -{ - zend_bool is_numeric; - zend_ulong key; -}; - - struct st_mysqlnd_result_metadata { MYSQLND_FIELD *fields; - struct mysqlnd_field_hash_key *zend_hash_keys; MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res_meta) * m;