memcpy(sqlstate, mysql->mysql->net.sqlstate, SQLSTATE_LENGTH+1);
#else
MYSQLND_ERROR_INFO error_info = *mysql->mysql->data->error_info;
+ mysql->mysql->data->error_info->error_list.head = NULL;
+ mysql->mysql->data->error_info->error_list.tail = NULL;
+ mysql->mysql->data->error_info->error_list.count = 0;
#endif
mysqli_stmt_close(stmt->stmt, FALSE);
stmt->stmt = NULL;
memcpy(mysql->mysql->net.last_error, last_error, MYSQL_ERRMSG_SIZE);
memcpy(mysql->mysql->net.sqlstate, sqlstate, SQLSTATE_LENGTH+1);
#else
+ zend_llist_clean(&mysql->mysql->data->error_info->error_list);
*mysql->mysql->data->error_info = error_info;
#endif
}
}
MYSQLI_FETCH_RESOURCE_CONN(mysql, mysql_link, MYSQLI_STATUS_VALID);
#if defined(MYSQLI_USE_MYSQLND)
- if (mysql->mysql->data->error_info->error_list) {
+ if (1) {
MYSQLND_ERROR_LIST_ELEMENT * message;
zend_llist_position pos;
array_init(return_value);
- for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(mysql->mysql->data->error_info->error_list, &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))
+ message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&mysql->mysql->data->error_info->error_list, &pos))
{
zval single_error;
array_init(&single_error);
}
MYSQLI_FETCH_RESOURCE_STMT(stmt, mysql_stmt, MYSQLI_STATUS_INITIALIZED);
#if defined(MYSQLI_USE_MYSQLND)
- if (stmt->stmt && stmt->stmt->data && stmt->stmt->data->error_info->error_list) {
+ if (stmt->stmt && stmt->stmt->data && stmt->stmt->data->error_info) {
MYSQLND_ERROR_LIST_ELEMENT * message;
zend_llist_position pos;
array_init(return_value);
- for (message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_first_ex(stmt->stmt->data->error_info->error_list, &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))
+ message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&stmt->stmt->data->error_info->error_list, &pos))
{
zval single_error;
array_init(&single_error);
s_errno = mysql_errno(mysql->mysql);
#else
MYSQLND_ERROR_INFO error_info = *mysql->mysql->data->error_info;
+ mysql->mysql->data->error_info->error_list.head = NULL;
+ mysql->mysql->data->error_info->error_list.tail = NULL;
+ mysql->mysql->data->error_info->error_list.count = 0;
#endif
MYSQLI_REPORT_MYSQL_ERROR(mysql->mysql);
MYSQLI_DISABLE_MQ;
strcpy(mysql->mysql->net.sqlstate, s_sqlstate);
mysql->mysql->net.last_errno = s_errno;
#else
+ zend_llist_clean(&mysql->mysql->data->error_info->error_list);
*mysql->mysql->data->error_info = error_info;
#endif
RETURN_FALSE;
if (mysql) {
array_init(retval);
#if defined(MYSQLI_USE_MYSQLND)
- if (mysql->mysql->data->error_info->error_list) {
+ if (1) {
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);
+ 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))
+ message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&mysql->mysql->data->error_info->error_list, &pos))
{
zval single_error;
array_init(&single_error);
if (stmt && stmt->stmt) {
array_init(retval);
#if defined(MYSQLI_USE_MYSQLND)
- if (stmt->stmt->data && stmt->stmt->data->error_info->error_list) {
+ if (stmt->stmt->data && stmt->stmt->data->error_info) {
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);
+ 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))
+ message = (MYSQLND_ERROR_LIST_ELEMENT *) zend_llist_get_next_ex(&stmt->stmt->data->error_info->error_list, &pos))
{
zval single_error;
array_init(&single_error);
// mysqlnd only option
// m - trace memory allocations
$trace = try_control_string($link, 't:O,' . $trace_file . ':m', $trace_file, 120);
- if (!preg_match("@^[|\s]*>\_mysqlnd_pefree@ismU", $trace, $matches) &&
- !preg_match("@^[|\s]*>\_mysqlnd_pemalloc@ismU", $trace, $matches)) {
+ if (!preg_match("@^[|\s]*>\_mysqlnd_p?efree@ismU", $trace, $matches) &&
+ !preg_match("@^[|\s]*>\_mysqlnd_p?emalloc@ismU", $trace, $matches)) {
printf("[125] Memory dump does neither contain _mysqlnd_pefree nor _mysqlnd_pemalloc calls - check manually.\n");
var_dump($trace);
}
if (isset($functions_trace[$name]))
$found++;
- if ($found < (count($memory_funcs) - 3))
+ if ($found < 2) {
printf("[016] Only %d memory functions have been found, expecting at least %d.\n",
- $found, count($memory_funcs) - 3);
+ $found, 2);
+ var_dump($trace);
+ }
$trace = try_control_string($link, 't:O,' . $trace_file, $trace_file, 20);
if (!strstr($trace, 'SELECT * FROM test') && !strstr($trace, 'mysql_real_query'))
if (isset($functions_trace[$name]))
$found++;
- if ($found > 2)
+ if ($found > 2) {
printf("[026] More than %d memory functions have been recorded, that's strange.\n",
$found);
+ var_dump($trace);
+ }
mysqli_close($link);
@unlink($trace_file);
info->error_no = 0;
info->error[0] = '\0';
memset(&info->sqlstate, 0, sizeof(info->sqlstate));
- if (info->error_list) {
- zend_llist_clean(info->error_list);
- }
+ zend_llist_clean(&info->error_list);
DBG_VOID_RETURN;
}
{
DBG_ENTER("mysqlnd_error_info::set_client_error");
if (err_no) {
+ MYSQLND_ERROR_LIST_ELEMENT error_for_the_list = {0};
+
info->error_no = err_no;
strlcpy(info->sqlstate, sqlstate, sizeof(info->sqlstate));
strlcpy(info->error, error, sizeof(info->error));
- if (info->error_list) {
- MYSQLND_ERROR_LIST_ELEMENT error_for_the_list = {0};
-
- error_for_the_list.error_no = err_no;
- strlcpy(error_for_the_list.sqlstate, sqlstate, sizeof(error_for_the_list.sqlstate));
- error_for_the_list.error = mnd_pestrdup(error, TRUE);
- if (error_for_the_list.error) {
- DBG_INF_FMT("adding error [%s] to the list", error_for_the_list.error);
- zend_llist_add_element(info->error_list, &error_for_the_list);
- }
+
+ error_for_the_list.error_no = err_no;
+ strlcpy(error_for_the_list.sqlstate, sqlstate, sizeof(error_for_the_list.sqlstate));
+ error_for_the_list.error = mnd_pestrdup(error, TRUE);
+ if (error_for_the_list.error) {
+ DBG_INF_FMT("adding error [%s] to the list", error_for_the_list.error);
+ zend_llist_add_element(&info->error_list, &error_for_the_list);
}
} else {
info->m->reset(info);
info->m = mysqlnd_error_info_get_methods();
info->m->reset(info);
- info->error_list = mnd_pecalloc(1, sizeof(zend_llist), persistent);
- if (info->error_list) {
- zend_llist_init(info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t) mysqlnd_error_list_pdtor, persistent);
- }
+ zend_llist_init(&info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t) mysqlnd_error_list_pdtor, persistent);
info->persistent = persistent;
- DBG_RETURN(info->error_list? PASS:FAIL);
+ DBG_RETURN(PASS);
}
/* }}} */
{
DBG_ENTER("mysqlnd_error_info_free_contents");
info->m->reset(info);
- if (info->error_list) {
- mnd_pefree(info->error_list, info->persistent);
- info->error_list = NULL;
- }
-
DBG_VOID_RETURN;
}
/* }}} */
stmt->result->m.free_result_internal(stmt->result);
stmt->result = NULL;
}
- if (stmt->error_info->error_list) {
- zend_llist_clean(stmt->error_info->error_list);
- mnd_efree(stmt->error_info->error_list);
- stmt->error_info->error_list = NULL;
- }
+ zend_llist_clean(&stmt->error_info->error_list);
DBG_VOID_RETURN;
}
char error[MYSQLND_ERRMSG_SIZE+1];
char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
unsigned int error_no;
- zend_llist * error_list;
+ zend_llist error_list;
zend_bool persistent;
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *m;