summaryrefslogtreecommitdiff
path: root/ext/mysqlnd
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mysqlnd')
-rw-r--r--ext/mysqlnd/mysqlnd_result.c12
-rw-r--r--ext/mysqlnd/mysqlnd_result_meta.c22
-rw-r--r--ext/mysqlnd/mysqlnd_structs.h11
3 files changed, 14 insertions, 31 deletions
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;