]> granicus.if.org Git - php/commitdiff
clean up - avoid realloc
authorXinchen Hui <laruence@php.net>
Wed, 13 Aug 2014 07:51:43 +0000 (15:51 +0800)
committerXinchen Hui <laruence@php.net>
Wed, 13 Aug 2014 07:51:43 +0000 (15:51 +0800)
ext/mysql/php_mysql.c
ext/mysqli/mysqli_api.c
ext/mysqli/mysqli_prop.c
ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd.h
ext/mysqlnd/mysqlnd_structs.h
ext/pdo_mysql/mysql_driver.c

index 6518f8d36ad44658cbba52ac87815f8e947ab50b..30cac98b6560a05bea5fbfe87b515ef11ebb79e0 100644 (file)
@@ -1310,11 +1310,13 @@ PHP_FUNCTION(mysql_stat)
 {
        php_mysql_conn *mysql;
        zval *mysql_link = NULL;
+#ifndef MYSQL_USE_MYSQLND
        char *stat;
-#ifdef MYSQL_USE_MYSQLND
-       uint stat_len;
+#else
+       zend_string *stat;
 #endif
 
+
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &mysql_link) == FAILURE) {
                return;
        }
@@ -1332,10 +1334,8 @@ PHP_FUNCTION(mysql_stat)
        if ((stat = (char *)mysql_stat(mysql->conn))) {
                RETURN_STRING(stat);
 #else
-       if (mysqlnd_stat(mysql->conn, &stat, &stat_len) == PASS) {
-               // TODO: avoid reallocation ???
-               RETVAL_STRINGL(stat, stat_len);
-               efree(stat);
+       if (mysqlnd_stat(mysql->conn, &stat) == PASS) {
+               RETURN_STR(stat);
 #endif
        } else {
                RETURN_FALSE;
index 195eb41b5c826fd806a9d24074095ae067544f07..19f12417feb3393f0cc61cfcf55fa8e299d1dd97 100644 (file)
@@ -2262,9 +2262,10 @@ PHP_FUNCTION(mysqli_stat)
 {
        MY_MYSQL        *mysql;
        zval            *mysql_link;
-       char            *stat;
 #if defined(MYSQLI_USE_MYSQLND)
-       uint            stat_len;
+       zend_string *stat;
+#else
+       char            *stat;
 #endif
 
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) {
@@ -2277,10 +2278,9 @@ PHP_FUNCTION(mysqli_stat)
        {
                RETURN_STRING(stat);
 #else
-       if (mysqlnd_stat(mysql->mysql, &stat, &stat_len) == PASS)
+       if (mysqlnd_stat(mysql->mysql, &stat) == PASS)
        {
-               RETVAL_STRINGL(stat, stat_len);
-               efree(stat);
+               RETURN_STR(stat);
 #endif
        } else {
                RETURN_FALSE;
index b772511647af134c1389d4935beac59ea8e96674..cd0639d98fc34f05a3a4f4e1c1e967eecf6782d6 100644 (file)
@@ -250,14 +250,13 @@ static zval *link_stat_read(mysqli_object *obj, zval *retval TSRMLS_DC)
        mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
 
        if (mysql) {
-               char * stat_msg;
 #if defined(MYSQLI_USE_MYSQLND)
-               uint stat_msg_len;
-               if (mysqlnd_stat(mysql->mysql, &stat_msg, &stat_msg_len) == PASS) {
-                       ZVAL_STRINGL(retval, stat_msg, stat_msg_len);
-                       efree(stat_msg);
+               zend_string * stat_msg;
+               if (mysqlnd_stat(mysql->mysql, &stat_msg) == PASS) {
+                       ZVAL_STR(retval, stat_msg);
                }
 #else
+               char * stat_msg;
                if ((stat_msg = (char *)mysql_stat(mysql->mysql))) {
                        ZVAL_STRING(retval, stat_msg);
                }
index e3f52c1d0dc56f131ee1d20f6b0b6eeed939d117..e05d6844bc05befead1ecd69fd634d4b0fc5b3a5 100644 (file)
@@ -1727,7 +1727,7 @@ MYSQLND_METHOD(mysqlnd_conn_data, ping)(MYSQLND_CONN_DATA * const conn TSRMLS_DC
 
 /* {{{ mysqlnd_conn_data::statistic */
 static enum_func_status
-MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, char **message, unsigned int * message_len TSRMLS_DC)
+MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, zend_string **message TSRMLS_DC)
 {
        size_t this_func = STRUCT_OFFSET(struct st_mysqlnd_conn_data_methods, get_server_statistics);
        enum_func_status ret = FAIL;
@@ -1750,9 +1750,8 @@ MYSQLND_METHOD(mysqlnd_conn_data, statistic)(MYSQLND_CONN_DATA * conn, char **me
 
                        if (PASS == (ret = PACKET_READ(stats_header, conn))) {
                                /* will be freed by Zend, thus don't use the mnd_ allocator */
-                               *message = estrndup(stats_header->message, stats_header->message_len); 
-                               *message_len = stats_header->message_len;
-                               DBG_INF(*message);
+                               *message = STR_INIT(stats_header->message, stats_header->message_len, 0); 
+                               DBG_INF((*message)->val);
                        }
                        PACKET_FREE(stats_header);
                } while (0);
index a4e54f240818ec1bc16d3db2b49584cd07954ad3..94620d9369f4db4e2c2bce25184117a62c250793 100644 (file)
@@ -208,7 +208,7 @@ void mysqlnd_local_infile_default(MYSQLND_CONN_DATA * conn);
 #define mysqlnd_refresh(conn, options)         ((conn)->data)->m->refresh_server((conn)->data, (options) TSRMLS_CC)
 #define mysqlnd_shutdown(conn, level)          ((conn)->data)->m->shutdown_server((conn)->data, (level) TSRMLS_CC)
 #define mysqlnd_set_character_set(conn, cs)    ((conn)->data)->m->set_charset((conn)->data, (cs) TSRMLS_CC)
-#define mysqlnd_stat(conn, msg, msg_len)       ((conn)->data)->m->get_server_statistics(((conn)->data), (msg), (msg_len) TSRMLS_CC)
+#define mysqlnd_stat(conn, msg)                                ((conn)->data)->m->get_server_statistics(((conn)->data), (msg) TSRMLS_CC)
 #define mysqlnd_options(conn, opt, value)      ((conn)->data)->m->set_client_option((conn)->data, (opt), (value) TSRMLS_CC)
 #define mysqlnd_options4(conn, opt, k, v)      ((conn)->data)->m->set_client_option_2d((conn)->data, (opt), (k), (v) TSRMLS_CC)
 #define mysqlnd_set_server_option(conn, op)    ((conn)->data)->m->set_server_option((conn)->data, (op) TSRMLS_CC)
index 6b4fdf80d37587e93d8307d328e94621137eaa28..9ec924ead6bdac21e83663cae19a092c03692746 100644 (file)
@@ -443,7 +443,7 @@ typedef void                                (*func_mysqlnd_conn_data__get_statistics)(const MYSQLND_CONN_DAT
 
 typedef unsigned long          (*func_mysqlnd_conn_data__get_server_version)(const MYSQLND_CONN_DATA * const conn TSRMLS_DC);
 typedef const char *           (*func_mysqlnd_conn_data__get_server_information)(const MYSQLND_CONN_DATA * const conn TSRMLS_DC);
-typedef enum_func_status       (*func_mysqlnd_conn_data__get_server_statistics)(MYSQLND_CONN_DATA * conn, char **message, unsigned int * message_len TSRMLS_DC);
+typedef enum_func_status       (*func_mysqlnd_conn_data__get_server_statistics)(MYSQLND_CONN_DATA * conn, zend_string **message TSRMLS_DC);
 typedef const char *           (*func_mysqlnd_conn_data__get_host_information)(const MYSQLND_CONN_DATA * const conn TSRMLS_DC);
 typedef unsigned int           (*func_mysqlnd_conn_data__get_protocol_information)(const MYSQLND_CONN_DATA * const conn TSRMLS_DC);
 typedef const char *           (*func_mysqlnd_conn_data__get_last_message)(const MYSQLND_CONN_DATA * const conn TSRMLS_DC);
index d7c993509ff55d60fbca0d89a9878a1ab8b0ea74..b39fdfaaa2de9972c2d66b3ba3b1eefacb78053b 100644 (file)
@@ -439,14 +439,13 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value
                        ZVAL_STRING(return_value, (char *)mysql_get_host_info(H->server));
                        break;
                case PDO_ATTR_SERVER_INFO: {
-                       char *tmp;
 #if defined(PDO_USE_MYSQLND)
-                       unsigned int tmp_len;
+                       zend_string *tmp;
 
-                       if (mysqlnd_stat(H->server, &tmp, &tmp_len) == PASS) {
-                               ZVAL_STRINGL(return_value, tmp, tmp_len);
-                               efree(tmp);
+                       if (mysqlnd_stat(H->server, &tmp) == PASS) {
+                               ZVAL_STR(return_value, tmp);
 #else
+                       char *tmp;
                        if ((tmp = (char *)mysql_stat(H->server))) {
                                ZVAL_STRING(return_value, tmp);
 #endif