clean up - avoid realloc

This commit is contained in:
Xinchen Hui 2014-08-13 15:51:43 +08:00
parent 05eaed4345
commit da3aeeed39
7 changed files with 24 additions and 27 deletions

View 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;

View 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;

View 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);
}

View 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);

View 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)

View 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);

View 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