--- embedaddon/php/ext/pdo_mysql/mysql_statement.c 2012/02/21 23:47:59 1.1.1.1 +++ embedaddon/php/ext/pdo_mysql/mysql_statement.c 2012/05/29 12:34:41 1.1.1.2 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mysql_statement.c,v 1.1.1.1 2012/02/21 23:47:59 misho Exp $ */ +/* $Id: mysql_statement.c,v 1.1.1.2 2012/05/29 12:34:41 misho Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -59,12 +59,10 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS pefree(S->einfo.errmsg, stmt->dbh->is_persistent); S->einfo.errmsg = NULL; } -#if HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND if (S->stmt) { pdo_mysql_stmt_close(S->stmt); S->stmt = NULL; } -#endif /* HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND */ #ifndef PDO_USE_MYSQLND if (S->params) { @@ -77,9 +75,6 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS efree(S->in_length); } -#endif /* PDO_USE_MYSQLND */ - -#ifdef HAVE_MYSQL_STMT_PREPARE if (S->bound_result) { int i; @@ -91,10 +86,9 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS efree(S->out_null); efree(S->out_length); } -#endif /* HAVE_MYSQL_STMT_PREPARE */ +#endif -#if HAVE_MYSQL_NEXT_RESULT || PDO_USE_MYSQLND if (S->H->server) { while (mysql_more_results(S->H->server)) { MYSQL_RES *res; @@ -107,8 +101,8 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt TSRMLS mysql_free_result(res); } } - } -#endif /* HAVE_MYSQL_NEXT_RESULT || PDO_USE_MYSQLND */ + } + #if PDO_USE_MYSQLND if (!S->stmt && S->current_data) { mnd_free(S->current_data); @@ -131,7 +125,40 @@ static void pdo_mysql_stmt_set_row_count(pdo_stmt_t *s } /* }}} */ -#ifdef HAVE_MYSQL_STMT_PREPARE +static int pdo_mysql_fill_stmt_from_result(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ +{ + pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; + pdo_mysql_db_handle *H = S->H; + my_ulonglong row_count; + PDO_DBG_ENTER("pdo_mysql_fill_stmt_from_result"); + + 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 + lets see if we have access to a result set */ + if (!H->buffered) { + S->result = mysql_use_result(H->server); + } else { + S->result = mysql_store_result(H->server); + } + if (NULL == S->result) { + pdo_mysql_error_stmt(stmt); + PDO_DBG_RETURN(0); + } + + stmt->row_count = (long) mysql_num_rows(S->result); + stmt->column_count = (int) mysql_num_fields(S->result); + S->fields = mysql_fetch_fields(S->result); + } else { + /* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */ + stmt->row_count = (long) row_count; + } + + PDO_DBG_RETURN(1); +} +/* }}} */ + +#ifndef PDO_USE_MYSQLND static int pdo_mysql_stmt_execute_prepared_libmysql(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ { pdo_mysql_stmt *S = stmt->driver_data; @@ -289,15 +316,12 @@ static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt TSR { pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; pdo_mysql_db_handle *H = S->H; - my_ulonglong row_count; PDO_DBG_ENTER("pdo_mysql_stmt_execute"); PDO_DBG_INF_FMT("stmt=%p", S->stmt); -#if HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND if (S->stmt) { PDO_DBG_RETURN(pdo_mysql_stmt_execute_prepared(stmt)); } -#endif /* ensure that we free any previous unfetched results */ if (S->result) { @@ -310,36 +334,12 @@ static int pdo_mysql_stmt_execute(pdo_stmt_t *stmt TSR PDO_DBG_RETURN(0); } - 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 - lets see if we have access to a result set */ - if (!H->buffered) { - S->result = mysql_use_result(H->server); - } else { - S->result = mysql_store_result(H->server); - } - if (NULL == S->result) { - pdo_mysql_error_stmt(stmt); - PDO_DBG_RETURN(0); - } - - stmt->row_count = (long) mysql_num_rows(S->result); - stmt->column_count = (int) mysql_num_fields(S->result); - S->fields = mysql_fetch_fields(S->result); - - } else { - /* this was a DML or DDL query (INSERT, UPDATE, DELETE, ... */ - stmt->row_count = (long) row_count; - } - - PDO_DBG_RETURN(1); + PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); } /* }}} */ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt TSRMLS_DC) /* {{{ */ { -#if HAVE_MYSQL_NEXT_RESULT || PDO_USE_MYSQLND pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; pdo_mysql_db_handle *H = S->H; long row_count; @@ -401,7 +401,7 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt #endif /* ensure that we free any previous unfetched results */ -#if HAVE_MYSQL_STMT_PREPARE +#ifndef PDO_USE_MYSQLND if (S->stmt) { stmt->column_count = (int)mysql_num_fields(S->result); mysql_stmt_free_result(S->stmt); @@ -421,30 +421,8 @@ static int pdo_mysql_stmt_next_rowset(pdo_stmt_t *stmt /* No more results */ PDO_DBG_RETURN(0); } else { - if (!H->buffered) { - S->result = mysql_use_result(H->server); - row_count = 0; - } else { - S->result = mysql_store_result(H->server); - if ((long)-1 == (row_count = (long) mysql_affected_rows(H->server))) { - pdo_mysql_error_stmt(stmt); - PDO_DBG_RETURN(0); - } - } - - if (NULL == S->result) { - PDO_DBG_RETURN(0); - } - - stmt->row_count = row_count; - stmt->column_count = (int) mysql_num_fields(S->result); - S->fields = mysql_fetch_fields(S->result); - PDO_DBG_RETURN(1); + PDO_DBG_RETURN(pdo_mysql_fill_stmt_from_result(stmt TSRMLS_CC)); } -#else - strcpy(stmt->error_code, "HYC00"); - PDO_DBG_RETURN(0); -#endif /* HAVE_MYSQL_STMT_PREPARE */ } /* }}} */ @@ -466,7 +444,6 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, #ifndef PDO_USE_MYSQLND PDO_MYSQL_PARAM_BIND *b; #endif -#if HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND pdo_mysql_stmt *S = (pdo_mysql_stmt*)stmt->driver_data; PDO_DBG_ENTER("pdo_mysql_stmt_param_hook"); @@ -598,7 +575,7 @@ static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, break; } } -#endif /* HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND */ + PDO_DBG_RETURN(1); } /* }}} */ @@ -619,7 +596,6 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum PDO_DBG_RETURN(1); } #else -# if HAVE_MYSQL_STMT_PREPARE int ret; if (S->stmt) { @@ -640,7 +616,6 @@ static int pdo_mysql_stmt_fetch(pdo_stmt_t *stmt, enum PDO_DBG_RETURN(1); } -# endif /* HAVE_MYSQL_STMT_PREPARE */ #endif /* PDO_USE_MYSQLND */ if (!S->result) { @@ -731,15 +706,12 @@ static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, in } /* With mysqlnd data is stored inside mysqlnd, not S->current_data */ -#if HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND if (!S->stmt) { -#endif if (S->current_data == NULL || !S->result) { PDO_DBG_RETURN(0); } -#if HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND } -#endif + if (colno >= stmt->column_count) { /* error invalid column */ PDO_DBG_RETURN(0); @@ -751,7 +723,7 @@ static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, in *len = sizeof(zval); PDO_DBG_RETURN(1); } -#elif HAVE_MYSQL_STMT_PREPARE +#else if (S->stmt) { if (S->out_null[colno]) { *ptr = NULL; @@ -769,7 +741,7 @@ static int pdo_mysql_stmt_get_col(pdo_stmt_t *stmt, in *len = S->out_length[colno]; PDO_DBG_RETURN(1); } -#endif /* PDO_USE_MYSQLND else HAVE_MYSQL_STMT_PREPARE */ +#endif *ptr = S->current_data[colno]; *len = S->current_lengths[colno]; PDO_DBG_RETURN(1); @@ -887,7 +859,7 @@ static int pdo_mysql_stmt_col_meta(pdo_stmt_t *stmt, l #endif 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); } /* }}} */ @@ -901,15 +873,12 @@ static int pdo_mysql_stmt_cursor_closer(pdo_stmt_t *st mysql_free_result(S->result); S->result = NULL; } -#if HAVE_MYSQL_STMT_PREPARE || PDO_USE_MYSQLND if (S->stmt) { int retval; retval = mysql_stmt_free_result(S->stmt); PDO_DBG_RETURN(retval ? 0 : 1); } -#endif -#if HAVE_MYSQL_NEXT_RESULT || PDO_USE_MYSQLND while (mysql_more_results(S->H->server)) { MYSQL_RES *res; if (mysql_next_result(S->H->server) != 0) { @@ -920,7 +889,6 @@ static int pdo_mysql_stmt_cursor_closer(pdo_stmt_t *st mysql_free_result(res); } } -#endif PDO_DBG_RETURN(1); } /* }}} */