]> granicus.if.org Git - php/commitdiff
First set of phpng changes for mysqlnd
authorAndrey Hristov <andrey@php.net>
Tue, 20 May 2014 16:57:11 +0000 (19:57 +0300)
committerAndrey Hristov <andrey@php.net>
Tue, 20 May 2014 16:57:11 +0000 (19:57 +0300)
ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd.h
ext/mysqlnd/mysqlnd_loaddata.c
ext/mysqlnd/mysqlnd_reverse_api.c
ext/mysqlnd/mysqlnd_structs.h
ext/mysqlnd/mysqlnd_wireprotocol.c

index 0289cd326c3c875dfe45fa4fa78ead0df7413f0f..c5db05b91dda07196e300ce7d957a904d03d0497 100644 (file)
@@ -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*)&copyv);
+                               zval attrz;
+                               ZVAL_STRING(&attrz, value);
+                               zend_hash_str_update(conn->options->connect_attr, key, strlen(key), &attrz);
                        }
                        break;
                default:
index f373ea5dd5538761406a8022a4b8a374418b240e..a4e54f240818ec1bc16d3db2b49584cd07954ad3 100644 (file)
@@ -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)
index 94d69a4008ba4df1a1e9fc9806a4ff15ed4d9d35..ab7a1ae9ebe67184a54810cd214f84bad1348b7c 100644 (file)
@@ -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;
index d8b1a41511d547d28e90a8e8d3c02a4eee3f5e53..332669d6c61e05eae499bb81d9fceea775bb3f84 100644 (file)
@@ -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;
 }
 /* }}} */
index 66920e47be0625c3e0db1e69cdf351ca12a94af4..a72fccf88f996c94c0dc712d676bfdef9a71278c 100644 (file)
@@ -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
index ecce71d9c2b87d2a690cc983335a5307d1601e87..6a22b18829de36cb4a1e854f4f2e3cf67f5988a5 100644 (file)
@@ -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;