--- embedaddon/php/ext/pdo_mysql/mysql_statement.c 2012/05/29 12:34:41 1.1.1.2 +++ embedaddon/php/ext/pdo_mysql/mysql_statement.c 2013/07/22 01:31:58 1.1.1.3 @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ - | Copyright (c) 1997-2012 The PHP Group | + | Copyright (c) 1997-2013 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysql_statement.c,v 1.1.1.2 2012/05/29 12:34:41 misho Exp $ */ +/* $Id: mysql_statement.c,v 1.1.1.3 2013/07/22 01:31:58 misho Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -75,13 +75,13 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS efree(S->in_length); } - if (S->bound_result) + if (S->bound_result) { int i; for (i = 0; i < stmt->column_count; i++) { pdo_free_bound_result(S->bound_result[i]); } - + efree(S->bound_result); efree(S->out_null); efree(S->out_length); @@ -95,7 +95,7 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS if (mysql_next_result(S->H->server) != 0) { break; } - + res = mysql_store_result(S->H->server); if (res) { mysql_free_result(res); @@ -134,7 +134,7 @@ static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t row_count = mysql_affected_rows(H->server); if (row_count == (my_ulonglong)-1) { - /* we either have a query that returned a result set or an error occured + /* we either have a query that returned a result set or an error occurred lets see if we have access to a result set */ if (!H->buffered) { S->result = mysql_use_result(H->server); @@ -180,23 +180,23 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pd } if (!S->result) { - int i; + int i; - /* figure out the result set format, if any */ - S->result = mysql_stmt_result_metadata(S->stmt); - if (S->result) { - int calc_max_length = H->buffered && S->max_length == 1; - S->fields = mysql_fetch_fields(S->result); - if (S->bound_result) { - int i; - for (i = 0; i < stmt->column_count; i++) { - efree(S->bound_result[i].buffer); - } - efree(S->bound_result); - efree(S->out_null); - efree(S->out_length); + /* figure out the result set format, if any */ + S->result = mysql_stmt_result_metadata(S->stmt); + if (S->result) { + int calc_max_length = H->buffered && S->max_length == 1; + S->fields = mysql_fetch_fields(S->result); + if (S->bound_result) { + int i; + for (i = 0; i < stmt->column_count; i++) { + efree(S->bound_result[i].buffer); + } + efree(S->bound_result); + efree(S->out_null); + efree(S->out_length); } - + stmt->column_count = (int)mysql_num_fields(S->result); S->bound_result = ecalloc(stmt->column_count, sizeof(MYSQL_BIND)); S->out_null = ecalloc(stmt->column_count, sizeof(my_bool)); @@ -262,7 +262,7 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pd } } } - + pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); PDO_DBG_RETURN(1); } @@ -275,9 +275,9 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo pdo_mysql_stmt *S = stmt->driver_data; pdo_mysql_db_handle *H = S->H; int i; - + PDO_DBG_ENTER("pdo_mysql_stmt_execute_prepared_mysqlnd"); - + if (mysql_stmt_execute(S->stmt)) { pdo_mysql_error_stmt(stmt); PDO_DBG_RETURN(0); @@ -305,7 +305,7 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo } } } - + pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); PDO_DBG_RETURN(1); } @@ -322,7 +322,7 @@ static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt TSR if (S->stmt) { PDO_DBG_RETURN(pdo_mysql_stmt_execute_prepared(stmt)); } - + /* ensure that we free any previous unfetched results */ if (S->result) { mysql_free_result(S->result); @@ -343,7 +343,6 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; pdo_mysql_db_handle *H = S->H; long row_count; - int ret; PDO_DBG_ENTER("pdo_mysql_stmt_next_rowset"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); @@ -357,8 +356,8 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt } if (!mysqlnd_stmt_more_results(S->stmt)) { - /* - MySQL gives us n + 1 result sets for + /* + MySQL gives us n + 1 result sets for CALL proc() and n result sets returned by the proc itself. Result set n + 1 is about the procedure call itself. As the PDO emulation does not return it, we skip it as well @@ -412,17 +411,25 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt S->result = NULL; } - ret = mysql_next_result(H->server); - - if (ret > 0) { + if (!mysql_more_results(H->server)) { + /* No more results */ + PDO_DBG_RETURN(0); + } +#if PDO_USE_MYSQLND + if (mysql_next_result(H->server) == FAIL) { pdo_mysql_error_stmt(stmt); PDO_DBG_RETURN(0); - } else if (ret < 0) { - /* No more results */ + } else { + PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); + } +#else + if (mysql_next_result(H->server) > 0) { + pdo_mysql_error_stmt(stmt); PDO_DBG_RETURN(0); } else { PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); } +#endif } /* }}} */ @@ -444,7 +451,7 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, #ifndef PDO_USE_MYSQLND PDO_MYSQL_PARAM_BIND *b; #endif - pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; + pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; PDO_DBG_ENTER("pdo_mysql_stmt_param_hook"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); @@ -484,18 +491,18 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, } #else b = (PDO_MYSQL_PARAM_BIND*)param->driver_data; - *b->is_null = 0; - if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || - Z_TYPE_P(param->parameter) == IS_NULL) { - *b->is_null = 1; - b->buffer_type = MYSQL_TYPE_STRING; - b->buffer = NULL; - b->buffer_length = 0; - *b->length = 0; + *b->is_null = 0; + if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || + Z_TYPE_P(param->parameter) == IS_NULL) { + *b->is_null = 1; + b->buffer_type = MYSQL_TYPE_STRING; + b->buffer = NULL; + b->buffer_length = 0; + *b->length = 0; PDO_DBG_RETURN(1); - } + } #endif /* PDO_USE_MYSQLND */ - + switch (PDO_PARAM_TYPE(param->param_type)) { case PDO_PARAM_STMT: PDO_DBG_RETURN(0); @@ -519,7 +526,7 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, default: ; } - + #if PDO_USE_MYSQLND /* Is it really correct to check the zval's type? - But well, that's what the old code below does, too */ PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE_P(param->parameter)); @@ -540,9 +547,9 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, default: PDO_DBG_RETURN(0); } - + PDO_DBG_RETURN(1); -#else +#else PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE_P(param->parameter)); switch (Z_TYPE_P(param->parameter)) { case IS_STRING: @@ -597,7 +604,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum } #else int ret; - + if (S->stmt) { ret = mysql_stmt_fetch(S->stmt); @@ -617,7 +624,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum PDO_DBG_RETURN(1); } #endif /* PDO_USE_MYSQLND */ - + if (!S->result) { strcpy(stmt->error_code, "HY000"); PDO_DBG_RETURN(0); @@ -637,7 +644,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_mysql_error_stmt(stmt); } PDO_DBG_RETURN(0); - } + } S->current_lengths = mysql_fetch_lengths(S->result); PDO_DBG_RETURN(1); @@ -661,8 +668,8 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, i PDO_DBG_RETURN(0); } - /* fetch all on demand, this seems easiest - ** if we've been here before bail out + /* fetch all on demand, this seems easiest + ** if we've been here before bail out */ if (cols[0].name) { PDO_DBG_RETURN(1); @@ -678,10 +685,10 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, i cols[i].namelen = namelen; cols[i].name = estrndup(S->fields[i].name, namelen); } - + cols[i].precision = S->fields[i].decimals; cols[i].maxlen = S->fields[i].length; - + #ifdef PDO_USE_MYSQLND if (S->stmt) { cols[i].param_type = PDO_PARAM_ZVAL; @@ -754,9 +761,12 @@ static char *type_to_name_native(int type) /* {{{ */ switch (type) { PDO_MYSQL_NATIVE_TYPE_NAME(STRING) PDO_MYSQL_NATIVE_TYPE_NAME(VAR_STRING) -#ifdef MYSQL_HAS_TINY +#ifdef FIELD_TYPE_TINY PDO_MYSQL_NATIVE_TYPE_NAME(TINY) #endif +#ifdef FIELD_TYPE_BIT + PDO_MYSQL_NATIVE_TYPE_NAME(BIT) +#endif PDO_MYSQL_NATIVE_TYPE_NAME(SHORT) PDO_MYSQL_NATIVE_TYPE_NAME(LONG) PDO_MYSQL_NATIVE_TYPE_NAME(LONGLONG) @@ -771,7 +781,7 @@ static char *type_to_name_native(int type) /* {{{ */ PDO_MYSQL_NATIVE_TYPE_NAME(GEOMETRY) #endif PDO_MYSQL_NATIVE_TYPE_NAME(TIMESTAMP) -#ifdef MYSQL_HAS_YEAR +#ifdef FIELD_TYPE_YEAR PDO_MYSQL_NATIVE_TYPE_NAME(YEAR) #endif PDO_MYSQL_NATIVE_TYPE_NAME(SET) @@ -799,7 +809,7 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, l const MYSQL_FIELD *F; zval *flags; char *str; - + PDO_DBG_ENTER("pdo_mysql_stmt_col_meta"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); if (!S->result) { @@ -857,7 +867,7 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, l break; } #endif - + add_assoc_zval(return_value, "flags", flags); add_assoc_string(return_value, "table", (char *) (F->table?F->table:""), 1); PDO_DBG_RETURN(SUCCESS);