--- embedaddon/php/ext/mysqli/mysqli_nonapi.c 2012/02/21 23:47:58 1.1.1.1 +++ embedaddon/php/ext/mysqli/mysqli_nonapi.c 2013/10/14 08:02:25 1.1.1.4 @@ -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 | @@ -17,7 +17,7 @@ | Ulf Wendel | +----------------------------------------------------------------------+ - $Id: mysqli_nonapi.c,v 1.1.1.1 2012/02/21 23:47:58 misho Exp $ + $Id: mysqli_nonapi.c,v 1.1.1.4 2013/10/14 08:02:25 misho Exp $ */ #ifdef HAVE_CONFIG_H @@ -174,7 +174,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETER /* reset variables */ #ifndef MYSQLI_NO_CHANGE_USER_ON_PCONNECT - if (!mysqli_change_user_silent(mysql->mysql, username, passwd, dbname)) { + if (!mysqli_change_user_silent(mysql->mysql, username, passwd, dbname, passwd_len)) { #else if (!mysql_ping(mysql->mysql)) { #endif @@ -387,18 +387,7 @@ PHP_FUNCTION(mysqli_fetch_all) /* }}} */ -/* {{{ proto array mysqli_cache_stats(void) U - Returns statistics about the zval cache */ -PHP_FUNCTION(mysqli_get_cache_stats) -{ - if (zend_parse_parameters_none() == FAILURE) { - return; - } - array_init(return_value); -} -/* }}} */ - /* {{{ proto array mysqli_get_client_stats(void) Returns statistics about the zval cache */ PHP_FUNCTION(mysqli_get_client_stats) @@ -429,7 +418,94 @@ PHP_FUNCTION(mysqli_get_connection_stats) #endif /* }}} */ +/* {{{ proto mixed mysqli_error_list (object connection) + Fetches all client errors */ +PHP_FUNCTION(mysqli_error_list) +{ + MY_MYSQL *mysql; + zval *mysql_link; + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { + return; + } + MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID); + array_init(return_value); +#if defined(MYSQLI_USE_MYSQLND) + if (mysql->mysql->data->error_info->error_list) { + MYSQLND_ERROR_LIST_ELEMENT * message; + zend_llist_position pos; + for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(mysql->mysql->data->error_info->error_list, &pos); + message; + message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(mysql->mysql->data->error_info->error_list, &pos)) + { + zval * single_error; + MAKE_STD_ZVAL(single_error); + array_init(single_error); + add_assoc_long_ex(single_error, "errno", sizeof("errno"), message->error_no); + add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), message->sqlstate, 1); + add_assoc_string_ex(single_error, "error", sizeof("error"), message->error, 1); + add_next_index_zval(return_value, single_error); + } + } +#else + if (mysql_errno(mysql->mysql)) { + zval * single_error; + MAKE_STD_ZVAL(single_error); + array_init(single_error); + add_assoc_long_ex(single_error, "errno", sizeof("errno"), mysql_errno(mysql->mysql)); + add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), mysql_sqlstate(mysql->mysql), 1); + add_assoc_string_ex(single_error, "error", sizeof("error"), mysql_error(mysql->mysql), 1); + add_next_index_zval(return_value, single_error); + } +#endif +} +/* }}} */ + + +/* {{{ proto string mysqli_stmt_error_list(object stmt) +*/ +PHP_FUNCTION(mysqli_stmt_error_list) +{ + MY_STMT *stmt; + zval *mysql_stmt; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_stmt, mysqli_stmt_class_entry) == FAILURE) { + return; + } + MYSQLI_FETCH_RESOURCE_STMT(stmt, &mysql_stmt, MYSQLI_STATUS_INITIALIZED); + array_init(return_value); +#if defined(MYSQLI_USE_MYSQLND) + if (stmt->stmt && stmt->stmt->data && stmt->stmt->data->error_info->error_list) { + MYSQLND_ERROR_LIST_ELEMENT * message; + zend_llist_position pos; + for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(stmt->stmt->data->error_info->error_list, &pos); + message; + message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(stmt->stmt->data->error_info->error_list, &pos)) + { + zval * single_error; + MAKE_STD_ZVAL(single_error); + array_init(single_error); + add_assoc_long_ex(single_error, "errno", sizeof("errno"), message->error_no); + add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), message->sqlstate, 1); + add_assoc_string_ex(single_error, "error", sizeof("error"), message->error, 1); + add_next_index_zval(return_value, single_error); + } + } +#else + if (mysql_stmt_errno(stmt->stmt)) { + zval * single_error; + MAKE_STD_ZVAL(single_error); + array_init(single_error); + add_assoc_long_ex(single_error, "errno", sizeof("errno"), mysql_stmt_errno(stmt->stmt)); + add_assoc_string_ex(single_error, "sqlstate", sizeof("sqlstate"), mysql_stmt_sqlstate(stmt->stmt), 1); + add_assoc_string_ex(single_error, "error", sizeof("error"), mysql_stmt_error(stmt->stmt), 1); + add_next_index_zval(return_value, single_error); + } +#endif +} +/* }}} */ + + /* {{{ proto mixed mysqli_fetch_object (object result [, string class_name [, NULL|array ctor_params]]) Fetch a result row as an object */ PHP_FUNCTION(mysqli_fetch_object) @@ -463,7 +539,7 @@ PHP_FUNCTION(mysqli_multi_query) strcpy(s_sqlstate, mysql_sqlstate(mysql->mysql)); s_errno = mysql_errno(mysql->mysql); #else - MYSQLND_ERROR_INFO error_info = mysql->mysql->error_info; + MYSQLND_ERROR_INFO error_info = *mysql->mysql->data->error_info; #endif MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql); MYSQLI_DISABLE_MQ; @@ -474,7 +550,7 @@ PHP_FUNCTION(mysqli_multi_query) strcpy(mysql->mysql->net.sqlstate, s_sqlstate); mysql->mysql->net.last_errno = s_errno; #else - mysql->mysql->error_info = error_info; + *mysql->mysql->data->error_info = error_info; #endif RETURN_FALSE; } @@ -488,7 +564,7 @@ PHP_FUNCTION(mysqli_query) MY_MYSQL *mysql; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; - MYSQL_RES *result; + MYSQL_RES *result = NULL; char *query = NULL; int query_len; long resultmode = MYSQLI_STORE_RESULT; @@ -607,7 +683,7 @@ static int mysqlnd_zval_array_from_mysqlnd_array(MYSQL MYSQLND **p = in_array; HashTable *new_hash; zval **elem, **dest_elem; - int ret = 0; + int ret = 0, i = 0; ALLOC_HASHTABLE(new_hash); zend_hash_init(new_hash, zend_hash_num_elements(Z_ARRVAL_P(out_array)), NULL, ZVAL_PTR_DTOR, 0); @@ -616,13 +692,19 @@ static int mysqlnd_zval_array_from_mysqlnd_array(MYSQL zend_hash_get_current_data(Z_ARRVAL_P(out_array), (void **) &elem) == SUCCESS; zend_hash_move_forward(Z_ARRVAL_P(out_array))) { + i++; if (Z_TYPE_PP(elem) != IS_OBJECT || !instanceof_function(Z_OBJCE_PP(elem), mysqli_link_class_entry TSRMLS_CC)) { continue; } { MY_MYSQL *mysql; + MYSQLI_RESOURCE *my_res; mysqli_object *intern = (mysqli_object *)zend_object_store_get_object(*elem TSRMLS_CC); - mysql = (MY_MYSQL *) ((MYSQLI_RESOURCE *)intern->ptr)->ptr; + if (!(my_res = (MYSQLI_RESOURCE *)intern->ptr)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] Couldn't fetch %s", i, intern->zo.ce->name); + continue; + } + mysql = (MY_MYSQL *) my_res->ptr; if (mysql->mysql == *p) { zend_hash_next_index_insert(new_hash, (void *)elem, sizeof(zval *), (void **)&dest_elem); if (dest_elem) { @@ -705,6 +787,11 @@ PHP_FUNCTION(mysqli_poll) RETURN_FALSE; } + if (!r_array && !e_array) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No stream arrays were passed"); + RETURN_FALSE; + } + if (r_array != NULL) { mysqlnd_zval_array_to_mysqlnd_array(r_array, &new_r_array TSRMLS_CC); } @@ -748,7 +835,7 @@ PHP_FUNCTION(mysqli_reap_async_query) MY_MYSQL *mysql; zval *mysql_link; MYSQLI_RESOURCE *mysqli_resource; - MYSQL_RES *result; + MYSQL_RES *result = NULL; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &mysql_link, mysqli_link_class_entry) == FAILURE) { return; @@ -837,7 +924,11 @@ PHP_FUNCTION(mysqli_get_warnings) MYSQLI_FETCH_RESOURCE_CONN(mysql, &mysql_link, MYSQLI_STATUS_VALID); if (mysql_warning_count(mysql->mysql)) { +#ifdef MYSQLI_USE_MYSQLND + w = php_get_warnings(mysql->mysql->data TSRMLS_CC); +#else w = php_get_warnings(mysql->mysql TSRMLS_CC); +#endif } else { RETURN_FALSE; } @@ -848,6 +939,7 @@ PHP_FUNCTION(mysqli_get_warnings) } /* }}} */ + /* {{{ proto object mysqli_stmt_get_warnings(object link) */ PHP_FUNCTION(mysqli_stmt_get_warnings) { @@ -873,6 +965,7 @@ PHP_FUNCTION(mysqli_stmt_get_warnings) } /* }}} */ + #ifdef HAVE_MYSQLI_SET_CHARSET /* {{{ proto bool mysqli_set_charset(object link, string csname) sets client character set */ @@ -928,7 +1021,7 @@ PHP_FUNCTION(mysqli_get_charset) state = cs.state; comment = cs.comment; #else - cs = mysql->mysql->charset; + cs = mysql->mysql->data->charset; if (!cs) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The connection has no charset associated"); RETURN_NULL();