This commit is contained in:
ULF WENDEL 2012-10-23 15:13:57 +02:00
parent 38b632dd7c
commit 0737be7e7b

View file

@ -75,13 +75,13 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
efree(S->in_length); efree(S->in_length);
} }
if (S->bound_result) if (S->bound_result)
{ {
int i; int i;
for (i = 0; i < stmt->column_count; i++) { for (i = 0; i < stmt->column_count; i++) {
pdo_free_bound_result(S->bound_result[i]); pdo_free_bound_result(S->bound_result[i]);
} }
efree(S->bound_result); efree(S->bound_result);
efree(S->out_null); efree(S->out_null);
efree(S->out_length); efree(S->out_length);
@ -95,7 +95,7 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
if (mysql_next_result(S->H->server) != 0) { if (mysql_next_result(S->H->server) != 0) {
break; break;
} }
res = mysql_store_result(S->H->server); res = mysql_store_result(S->H->server);
if (res) { if (res) {
mysql_free_result(res); mysql_free_result(res);
@ -180,23 +180,23 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC)
} }
if (!S->result) { if (!S->result) {
int i; int i;
/* figure out the result set format, if any */ /* figure out the result set format, if any */
S->result = mysql_stmt_result_metadata(S->stmt); S->result = mysql_stmt_result_metadata(S->stmt);
if (S->result) { if (S->result) {
int calc_max_length = H->buffered && S->max_length == 1; int calc_max_length = H->buffered && S->max_length == 1;
S->fields = mysql_fetch_fields(S->result); S->fields = mysql_fetch_fields(S->result);
if (S->bound_result) { if (S->bound_result) {
int i; int i;
for (i = 0; i < stmt->column_count; i++) { for (i = 0; i < stmt->column_count; i++) {
efree(S->bound_result[i].buffer); efree(S->bound_result[i].buffer);
} }
efree(S->bound_result); efree(S->bound_result);
efree(S->out_null); efree(S->out_null);
efree(S->out_length); efree(S->out_length);
} }
stmt->column_count = (int)mysql_num_fields(S->result); stmt->column_count = (int)mysql_num_fields(S->result);
S->bound_result = ecalloc(stmt->column_count, sizeof(MYSQL_BIND)); S->bound_result = ecalloc(stmt->column_count, sizeof(MYSQL_BIND));
S->out_null = ecalloc(stmt->column_count, sizeof(my_bool)); S->out_null = ecalloc(stmt->column_count, sizeof(my_bool));
@ -262,7 +262,7 @@ static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC)
} }
} }
} }
pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC);
PDO_DBG_RETURN(1); PDO_DBG_RETURN(1);
} }
@ -275,9 +275,9 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt TSRMLS_DC) /
pdo_mysql_stmt *S = stmt->driver_data; pdo_mysql_stmt *S = stmt->driver_data;
pdo_mysql_db_handle *H = S->H; pdo_mysql_db_handle *H = S->H;
int i; int i;
PDO_DBG_ENTER("pdo_mysql_stmt_execute_prepared_mysqlnd"); PDO_DBG_ENTER("pdo_mysql_stmt_execute_prepared_mysqlnd");
if (mysql_stmt_execute(S->stmt)) { if (mysql_stmt_execute(S->stmt)) {
pdo_mysql_error_stmt(stmt); pdo_mysql_error_stmt(stmt);
PDO_DBG_RETURN(0); PDO_DBG_RETURN(0);
@ -305,7 +305,7 @@ static int pdo_mysql_stmt_execute_prepared_mysqlnd(pdo_stmt_t *stmt TSRMLS_DC) /
} }
} }
} }
pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC); pdo_mysql_stmt_set_row_count(stmt TSRMLS_CC);
PDO_DBG_RETURN(1); PDO_DBG_RETURN(1);
} }
@ -322,7 +322,7 @@ static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
if (S->stmt) { if (S->stmt) {
PDO_DBG_RETURN(pdo_mysql_stmt_execute_prepared(stmt)); PDO_DBG_RETURN(pdo_mysql_stmt_execute_prepared(stmt));
} }
/* ensure that we free any previous unfetched results */ /* ensure that we free any previous unfetched results */
if (S->result) { if (S->result) {
mysql_free_result(S->result); mysql_free_result(S->result);
@ -357,8 +357,8 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
} }
if (!mysqlnd_stmt_more_results(S->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. CALL proc() and n result sets returned by the proc itself.
Result set n + 1 is about the procedure call itself. Result set n + 1 is about the procedure call itself.
As the PDO emulation does not return it, we skip it as well As the PDO emulation does not return it, we skip it as well
@ -413,7 +413,19 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
} }
ret = mysql_next_result(H->server); ret = mysql_next_result(H->server);
#if PDO_USE_MYSQLND
/* for whatever reason mysqlnd breaks with libmysql compatibility at the C level, no -1 */
if (PASS != ret) {
pdo_mysql_error_stmt(stmt);
PDO_DBG_RETURN(0);
}
if (mysql_more_results(H->server)) {
PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
} else {
/* No more results */
PDO_DBG_RETURN(0);
}
#else
if (ret > 0) { if (ret > 0) {
pdo_mysql_error_stmt(stmt); pdo_mysql_error_stmt(stmt);
PDO_DBG_RETURN(0); PDO_DBG_RETURN(0);
@ -423,6 +435,7 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */
} else { } else {
PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC));
} }
#endif
} }
/* }}} */ /* }}} */
@ -444,7 +457,7 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da
#ifndef PDO_USE_MYSQLND #ifndef PDO_USE_MYSQLND
PDO_MYSQL_PARAM_BIND *b; PDO_MYSQL_PARAM_BIND *b;
#endif #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_ENTER("pdo_mysql_stmt_param_hook");
PDO_DBG_INF_FMT("stmt=%p", S->stmt); PDO_DBG_INF_FMT("stmt=%p", S->stmt);
@ -484,18 +497,18 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da
} }
#else #else
b = (PDO_MYSQL_PARAM_BIND*)param->driver_data; b = (PDO_MYSQL_PARAM_BIND*)param->driver_data;
*b->is_null = 0; *b->is_null = 0;
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL || if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_NULL ||
Z_TYPE_P(param->parameter) == IS_NULL) { Z_TYPE_P(param->parameter) == IS_NULL) {
*b->is_null = 1; *b->is_null = 1;
b->buffer_type = MYSQL_TYPE_STRING; b->buffer_type = MYSQL_TYPE_STRING;
b->buffer = NULL; b->buffer = NULL;
b->buffer_length = 0; b->buffer_length = 0;
*b->length = 0; *b->length = 0;
PDO_DBG_RETURN(1); PDO_DBG_RETURN(1);
} }
#endif /* PDO_USE_MYSQLND */ #endif /* PDO_USE_MYSQLND */
switch (PDO_PARAM_TYPE(param->param_type)) { switch (PDO_PARAM_TYPE(param->param_type)) {
case PDO_PARAM_STMT: case PDO_PARAM_STMT:
PDO_DBG_RETURN(0); PDO_DBG_RETURN(0);
@ -519,7 +532,7 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da
default: default:
; ;
} }
#if PDO_USE_MYSQLND #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 */ /* 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)); PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE_P(param->parameter));
@ -540,9 +553,9 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_da
default: default:
PDO_DBG_RETURN(0); PDO_DBG_RETURN(0);
} }
PDO_DBG_RETURN(1); PDO_DBG_RETURN(1);
#else #else
PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE_P(param->parameter)); PDO_DBG_INF_FMT("param->parameter->type=%d", Z_TYPE_P(param->parameter));
switch (Z_TYPE_P(param->parameter)) { switch (Z_TYPE_P(param->parameter)) {
case IS_STRING: case IS_STRING:
@ -597,7 +610,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori
} }
#else #else
int ret; int ret;
if (S->stmt) { if (S->stmt) {
ret = mysql_stmt_fetch(S->stmt); ret = mysql_stmt_fetch(S->stmt);
@ -617,7 +630,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori
PDO_DBG_RETURN(1); PDO_DBG_RETURN(1);
} }
#endif /* PDO_USE_MYSQLND */ #endif /* PDO_USE_MYSQLND */
if (!S->result) { if (!S->result) {
strcpy(stmt->error_code, "HY000"); strcpy(stmt->error_code, "HY000");
PDO_DBG_RETURN(0); PDO_DBG_RETURN(0);
@ -637,7 +650,7 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum pdo_fetch_orientation ori
pdo_mysql_error_stmt(stmt); pdo_mysql_error_stmt(stmt);
} }
PDO_DBG_RETURN(0); PDO_DBG_RETURN(0);
} }
S->current_lengths = mysql_fetch_lengths(S->result); S->current_lengths = mysql_fetch_lengths(S->result);
PDO_DBG_RETURN(1); PDO_DBG_RETURN(1);
@ -661,8 +674,8 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC) /* {{{
PDO_DBG_RETURN(0); PDO_DBG_RETURN(0);
} }
/* fetch all on demand, this seems easiest /* fetch all on demand, this seems easiest
** if we've been here before bail out ** if we've been here before bail out
*/ */
if (cols[0].name) { if (cols[0].name) {
PDO_DBG_RETURN(1); PDO_DBG_RETURN(1);
@ -678,10 +691,10 @@ static int pdo_mysql_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC) /* {{{
cols[i].namelen = namelen; cols[i].namelen = namelen;
cols[i].name = estrndup(S->fields[i].name, namelen); cols[i].name = estrndup(S->fields[i].name, namelen);
} }
cols[i].precision = S->fields[i].decimals; cols[i].precision = S->fields[i].decimals;
cols[i].maxlen = S->fields[i].length; cols[i].maxlen = S->fields[i].length;
#ifdef PDO_USE_MYSQLND #ifdef PDO_USE_MYSQLND
if (S->stmt) { if (S->stmt) {
cols[i].param_type = PDO_PARAM_ZVAL; cols[i].param_type = PDO_PARAM_ZVAL;
@ -799,7 +812,7 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, long colno, zval *return_va
const MYSQL_FIELD *F; const MYSQL_FIELD *F;
zval *flags; zval *flags;
char *str; char *str;
PDO_DBG_ENTER("pdo_mysql_stmt_col_meta"); PDO_DBG_ENTER("pdo_mysql_stmt_col_meta");
PDO_DBG_INF_FMT("stmt=%p", S->stmt); PDO_DBG_INF_FMT("stmt=%p", S->stmt);
if (!S->result) { if (!S->result) {
@ -857,7 +870,7 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, long colno, zval *return_va
break; break;
} }
#endif #endif
add_assoc_zval(return_value, "flags", flags); add_assoc_zval(return_value, "flags", flags);
add_assoc_string(return_value, "table", (char *) (F->table?F->table:""), 1); add_assoc_string(return_value, "table", (char *) (F->table?F->table:""), 1);
PDO_DBG_RETURN(SUCCESS); PDO_DBG_RETURN(SUCCESS);