}
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;
}
}
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);
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);
/* {{{ php_add_field_properties */
static void php_add_field_properties(zval *value, const MYSQL_FIELD *field TSRMLS_DC)
{
+#ifdef MYSQLI_USE_MYSQLND
+ add_property_str(value, "name", STR_COPY(field->name));
+ add_property_str(value, "orgname", STR_COPY(field->org_name));
+ add_property_str(value, "table", STR_COPY(field->table));
+ add_property_str(value, "orgtable", STR_COPY(field->org_table));
+ add_property_str(value, "def", STR_COPY(field->def));
+ add_property_str(value, "db", STR_COPY(field->db));
+#else
add_property_string(value, "name",(field->name ? field->name : ""));
add_property_string(value, "orgname",(field->org_name ? field->org_name : ""));
add_property_string(value, "table",(field->table ? field->table : ""));
add_property_string(value, "orgtable",(field->org_table ? field->org_table : ""));
add_property_string(value, "def",(field->def ? field->def : ""));
add_property_string(value, "db",(field->db ? field->db : ""));
+#endif
/* FIXME: manually set the catalog to "def" due to bug in
* libmysqlclient which does not initialize field->catalog
*/
Z_TRY_ADDREF_P(data);
if (meta->zend_hash_keys[i].is_numeric == FALSE) {
- zend_hash_str_update(Z_ARRVAL_P(row), meta->fields[i].name, meta->fields[i].name_length, data);
+ zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].name, data);
} else {
zend_hash_index_update(Z_ARRVAL_P(row), meta->zend_hash_keys[i].key, data);
}
*/
Z_TRY_ADDREF_P(data);
if (meta->zend_hash_keys[i].is_numeric == FALSE) {
- zend_hash_str_update(Z_ARRVAL_P(row), meta->fields[i].name, meta->fields[i].name_length, data);
+ zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].name, data);
} else {
zend_hash_index_update(Z_ARRVAL_P(row), meta->zend_hash_keys[i].key, data);
}
*/
Z_TRY_ADDREF_P(data);
if (meta->zend_hash_keys[i].is_numeric == FALSE) {
- zend_hash_str_update(Z_ARRVAL_P(row), meta->fields[i].name, meta->fields[i].name_length, data);
+ zend_hash_update(Z_ARRVAL_P(row), meta->fields[i].name, data);
} else {
zend_hash_index_update(Z_ARRVAL_P(row), meta->zend_hash_keys[i].key, data);
}
php_mysqlnd_free_field_metadata(MYSQLND_FIELD *meta, zend_bool persistent TSRMLS_DC)
{
if (meta) {
- if (meta->root) {
- mnd_pefree(meta->root, persistent);
- meta->root = NULL;
- }
- if (meta->def) {
- mnd_pefree(meta->def, persistent);
- meta->def = NULL;
- }
+ STR_RELEASE(meta->def);
+ STR_RELEASE(meta->name);
+ STR_RELEASE(meta->org_name);
+ STR_RELEASE(meta->table);
+ STR_RELEASE(meta->org_table);
+ STR_RELEASE(meta->db);
+ STR_RELEASE(meta->catalog);
}
}
/* }}} */
for (;i < meta->field_count; i++) {
long idx;
- if (meta->fields[i].root) {
- /* We re-read metadata for PS */
- mnd_pefree(meta->fields[i].root, meta->persistent);
- meta->fields[i].root = NULL;
- }
-
field_packet->metadata = &(meta->fields[i]);
if (FAIL == PACKET_READ(field_packet, conn)) {
PACKET_FREE(field_packet);
/* For BC we have to check whether the key is numeric and use it like this */
if ((meta->zend_hash_keys[i].is_numeric =
- mysqlnd_is_key_numeric(field_packet->metadata->name,
- field_packet->metadata->name_length + 1,
+ mysqlnd_is_key_numeric(field_packet->metadata->name->val,
+ field_packet->metadata->name->len + 1,
&idx))) {
meta->zend_hash_keys[i].key = idx;
}
*/
memcpy(new_fields, orig_fields, (meta->field_count) * sizeof(MYSQLND_FIELD));
for (i = 0; i < meta->field_count; i++) {
- /* First copy the root, then field by field adjust the pointers */
- new_fields[i].root = mnd_pemalloc(orig_fields[i].root_len, persistent);
- if (!new_fields[i].root) {
- goto oom;
- }
- memcpy(new_fields[i].root, orig_fields[i].root, new_fields[i].root_len);
-
- if (orig_fields[i].name && orig_fields[i].name != mysqlnd_empty_string) {
- new_fields[i].name = new_fields[i].root +
- (orig_fields[i].name - orig_fields[i].root);
- }
- 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);
- }
- if (orig_fields[i].table && orig_fields[i].table != mysqlnd_empty_string) {
- new_fields[i].table = new_fields[i].root +
- (orig_fields[i].table - orig_fields[i].root);
- }
- if (orig_fields[i].org_table && orig_fields[i].org_table != mysqlnd_empty_string) {
- new_fields[i].org_table = new_fields[i].root +
- (orig_fields[i].org_table - orig_fields[i].root);
- }
- if (orig_fields[i].db && orig_fields[i].db != mysqlnd_empty_string) {
- new_fields[i].db = new_fields[i].root + (orig_fields[i].db - orig_fields[i].root);
- }
- if (orig_fields[i].catalog && orig_fields[i].catalog != mysqlnd_empty_string) {
- new_fields[i].catalog = new_fields[i].root + (orig_fields[i].catalog - orig_fields[i].root);
- }
- /* def is not on the root, if allocated at all */
- if (orig_fields[i].def) {
- new_fields[i].def = mnd_pemalloc(orig_fields[i].def_length + 1, persistent);
- if (!new_fields[i].def) {
- goto oom;
- }
- /* copy the trailing \0 too */
- memcpy(new_fields[i].def, orig_fields[i].def, orig_fields[i].def_length + 1);
- }
+ new_fields[i].name = STR_DUP(orig_fields[i].name, persistent);
+ new_fields[i].org_name = STR_DUP(orig_fields[i].org_name, persistent);
+ new_fields[i].table = STR_DUP(orig_fields[i].table, persistent);
+ new_fields[i].org_table = STR_DUP(orig_fields[i].org_table, persistent);
+ new_fields[i].db = STR_DUP(orig_fields[i].db, persistent);
+ new_fields[i].catalog = STR_DUP(orig_fields[i].catalog, persistent);
+ new_fields[i].def = STR_DUP(orig_fields[i].def, persistent);
}
new_meta->current_field = 0;
new_meta->field_count = meta->field_count;
}
/* }}} */
+
/* {{{ mysqlnd_res_meta::fetch_field */
static const MYSQLND_FIELD *
MYSQLND_METHOD(mysqlnd_res_meta, fetch_field)(MYSQLND_RES_METADATA * const meta TSRMLS_DC)
DBG_RETURN(NULL);
}
DBG_INF_FMT("name=%s max_length=%u",
- meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"",
+ meta->fields[meta->current_field].name? meta->fields[meta->current_field].name->val:"",
meta->fields[meta->current_field].max_length);
DBG_RETURN(&meta->fields[meta->current_field++]);
}
DBG_ENTER("mysqlnd_res_meta::fetch_field_direct");
DBG_INF_FMT("fieldnr=%u", fieldnr);
DBG_INF_FMT("name=%s max_length=%u",
- meta->fields[meta->current_field].name? meta->fields[meta->current_field].name:"",
+ meta->fields[meta->current_field].name? meta->fields[meta->current_field].name->val:"",
meta->fields[meta->current_field].max_length);
DBG_RETURN(&meta->fields[fieldnr]);
}
}
/* }}} */
+
/* {{{ mysqlnd_res_meta::field_seek */
static MYSQLND_FIELD_OFFSET
MYSQLND_METHOD(mysqlnd_res_meta, field_seek)(MYSQLND_RES_METADATA * const meta, const MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC)
typedef struct st_mysqlnd_field
{
- const char *name; /* Name of column */
- const char *org_name; /* Original column name, if an alias */
- const char *table; /* Table of column if column was a field */
- const char *org_table; /* Org table name, if table was an alias */
- const char *db; /* Database for table */
- const char *catalog; /* Catalog for table */
- char *def; /* Default value (set by mysql_list_fields) */
+ zend_string *name; /* Name of column */
+ zend_string *org_name; /* Original column name, if an alias */
+ zend_string *table; /* Table of column if column was a field */
+ zend_string *org_table; /* Org table name, if table was an alias */
+ zend_string *db; /* Database for table */
+ zend_string *catalog; /* Catalog for table */
+ zend_string *def; /* Default value (set by mysql_list_fields) */
unsigned long length; /* Width of column (create length) */
unsigned long max_length; /* Max width for selected set */
- unsigned int name_length;
- unsigned int org_name_length;
- unsigned int table_length;
- unsigned int org_table_length;
- unsigned int db_length;
- unsigned int catalog_length;
- unsigned int def_length;
unsigned int flags; /* Diverse flags */
unsigned int decimals; /* Number of decimals in field */
unsigned int charsetnr; /* Character set */
enum mysqlnd_field_types type; /* Type of field. See mysql_com.h for types */
- char *root;
- size_t root_len;
} MYSQLND_FIELD;
static const char *unknown_sqlstate= "HY000";
-const char * const mysqlnd_empty_string = "";
-
/* Used in mysqlnd_debug.c */
const char mysqlnd_read_header_name[] = "mysqlnd_read_header";
const char mysqlnd_read_body_name[] = "mysqlnd_read_body";
static size_t rset_field_offsets[] =
{
STRUCT_OFFSET(MYSQLND_FIELD, catalog),
- STRUCT_OFFSET(MYSQLND_FIELD, catalog_length),
STRUCT_OFFSET(MYSQLND_FIELD, db),
- STRUCT_OFFSET(MYSQLND_FIELD, db_length),
STRUCT_OFFSET(MYSQLND_FIELD, table),
- STRUCT_OFFSET(MYSQLND_FIELD, table_length),
STRUCT_OFFSET(MYSQLND_FIELD, org_table),
- STRUCT_OFFSET(MYSQLND_FIELD, org_table_length),
STRUCT_OFFSET(MYSQLND_FIELD, name),
- STRUCT_OFFSET(MYSQLND_FIELD, name_length),
STRUCT_OFFSET(MYSQLND_FIELD, org_name),
- STRUCT_OFFSET(MYSQLND_FIELD, org_name_length)
};
zend_uchar *buf = (zend_uchar *) conn->net->cmd_buffer.buffer;
zend_uchar *p = buf;
zend_uchar *begin = buf;
- char *root_ptr;
unsigned long len;
MYSQLND_FIELD *meta;
unsigned int i, field_count = sizeof(rset_field_offsets)/sizeof(size_t);
meta = packet->metadata;
- for (i = 0; i < field_count; i += 2) {
+ for (i = 0; i < field_count; i++) {
len = php_mysqlnd_net_field_length(&p);
BAIL_IF_NO_MORE_DATA;
switch ((len)) {
case 0:
- *(const char **)(((char*)meta) + rset_field_offsets[i]) = mysqlnd_empty_string;
- *(unsigned int *)(((char*)meta) + rset_field_offsets[i+1]) = 0;
+ *(zend_string **)(((char*)meta) + rset_field_offsets[i]) = STR_EMPTY_ALLOC();
break;
case MYSQLND_NULL_LENGTH:
goto faulty_or_fake;
default:
- *(const char **)(((char *)meta) + rset_field_offsets[i]) = (const char *)p;
- *(unsigned int *)(((char*)meta) + rset_field_offsets[i+1]) = len;
+ *(zend_string **)(((char *)meta) + rset_field_offsets[i]) = STR_INIT((char *)p, len, packet->persistent_alloc);
p += len;
total_len += len + 1;
break;
{
BAIL_IF_NO_MORE_DATA;
DBG_INF_FMT("Def found, length %lu, persistent=%u", len, packet->persistent_alloc);
- meta->def = mnd_pemalloc(len + 1, packet->persistent_alloc);
- if (!meta->def) {
- SET_OOM_ERROR(*conn->error_info);
- DBG_RETURN(FAIL);
- }
- memcpy(meta->def, p, len);
- meta->def[len] = '\0';
- meta->def_length = len;
+ meta->def = STR_INIT((char *)p, len, packet->persistent_alloc);
p += len;
+ } else {
+ meta->def = STR_EMPTY_ALLOC();
}
DBG_INF_FMT("allocing root. persistent=%u", packet->persistent_alloc);
- root_ptr = meta->root = mnd_pemalloc(total_len, packet->persistent_alloc);
- if (!root_ptr) {
- SET_OOM_ERROR(*conn->error_info);
- DBG_RETURN(FAIL);
- }
-
- meta->root_len = total_len;
- /* Now do allocs */
- if (meta->catalog && meta->catalog != mysqlnd_empty_string) {
- len = meta->catalog_length;
- meta->catalog = memcpy(root_ptr, meta->catalog, len);
- *(root_ptr +=len) = '\0';
- root_ptr++;
- }
-
- if (meta->db && meta->db != mysqlnd_empty_string) {
- len = meta->db_length;
- meta->db = memcpy(root_ptr, meta->db, len);
- *(root_ptr +=len) = '\0';
- root_ptr++;
- }
-
- if (meta->table && meta->table != mysqlnd_empty_string) {
- len = meta->table_length;
- meta->table = memcpy(root_ptr, meta->table, len);
- *(root_ptr +=len) = '\0';
- root_ptr++;
- }
-
- if (meta->org_table && meta->org_table != mysqlnd_empty_string) {
- len = meta->org_table_length;
- meta->org_table = memcpy(root_ptr, meta->org_table, len);
- *(root_ptr +=len) = '\0';
- root_ptr++;
- }
-
- if (meta->name && meta->name != mysqlnd_empty_string) {
- len = meta->name_length;
- meta->name = memcpy(root_ptr, meta->name, len);
- *(root_ptr +=len) = '\0';
- root_ptr++;
- }
-
- if (meta->org_name && meta->org_name != mysqlnd_empty_string) {
- len = meta->org_name_length;
- meta->org_name = memcpy(root_ptr, meta->org_name, len);
- *(root_ptr +=len) = '\0';
- root_ptr++;
- }
- DBG_INF_FMT("FIELD=[%s.%s.%s]", meta->db? meta->db:"*NA*", meta->table? meta->table:"*NA*",
- meta->name? meta->name:"*NA*");
+ DBG_INF_FMT("FIELD=[%s.%s.%s]", meta->db? meta->db->val:"*NA*", meta->table? meta->table->val:"*NA*",
+ meta->name? meta->name->val:"*NA*");
DBG_RETURN(PASS);
zend_uchar * php_mysqlnd_net_store_length(zend_uchar *packet, uint64_t length);
size_t php_mysqlnd_net_store_length_size(uint64_t length);
-PHPAPI const extern char * const mysqlnd_empty_string;
-
enum_func_status php_mysqlnd_rowp_read_binary_protocol(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval * fields,
unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
int namelen;
if (S->H->fetch_table_names) {
+#ifdef PDO_USE_MYSQLND
+ namelen = spprintf(&cols[i].name, 0, "%s.%s", S->fields[i].table->val, S->fields[i].name->val);
+#else
namelen = spprintf(&cols[i].name, 0, "%s.%s", S->fields[i].table, S->fields[i].name);
+#endif
cols[i].namelen = namelen;
} else {
+#ifdef PDO_USE_MYSQLND
+ cols[i].namelen = S->fields[i].name->len;
+ cols[i].name = estrndup(S->fields[i].name->val, S->fields[i].name->len);
+#else
namelen = strlen(S->fields[i].name);
cols[i].namelen = namelen;
cols[i].name = estrndup(S->fields[i].name, namelen);
+#endif
}
cols[i].precision = S->fields[i].decimals;
F = S->fields + colno;
if (F->def) {
+#ifdef PDO_USE_MYSQLND
+ add_assoc_str(return_value, "mysql:def", STR_COPY(F->def));
+#else
add_assoc_string(return_value, "mysql:def", F->def);
+#endif
}
if (IS_NOT_NULL(F->flags)) {
add_next_index_string(&flags, "not_null");
#endif
add_assoc_zval(return_value, "flags", &flags);
+#ifdef PDO_USE_MYSQLND
+ add_assoc_str(return_value, "table", STR_COPY(F->table));
+#else
add_assoc_string(return_value, "table", (char *) (F->table?F->table : ""));
+#endif
PDO_DBG_RETURN(SUCCESS);
} /* }}} */