mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Move from directly referencing an aggregated structure to using a
pointer to a structure. The structure is still aggregated but we add a level of indirection for possible plugins to overwrite the storage
This commit is contained in:
parent
5e8bcbb08a
commit
845d8fa10c
26 changed files with 430 additions and 406 deletions
|
@ -55,8 +55,8 @@ MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest)(MYSQLND_RES * const resu
|
|||
data_cursor,
|
||||
result->meta->field_count,
|
||||
result->meta->fields,
|
||||
result->conn->options.numeric_and_datetime_as_unicode,
|
||||
result->conn->options.int_and_float_native,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (rc != PASS) {
|
||||
ret = FAIL;
|
||||
|
@ -332,7 +332,7 @@ MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND
|
|||
|
||||
result->meta = result->m.result_meta_init(result->field_count, result->persistent TSRMLS_CC);
|
||||
if (!result->meta) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
DBG_RETURN(FAIL);
|
||||
}
|
||||
|
||||
|
@ -374,7 +374,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
do {
|
||||
rset_header = conn->protocol->m.get_rset_header_packet(conn->protocol, FALSE TSRMLS_CC);
|
||||
if (!rset_header) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
break;
|
||||
}
|
||||
|
@ -396,19 +396,19 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
a multi-statement or a stored procedure, so it should be
|
||||
safe to unconditionally turn off the flag here.
|
||||
*/
|
||||
conn->upsert_status.server_status &= ~SERVER_MORE_RESULTS_EXISTS;
|
||||
conn->upsert_status->server_status &= ~SERVER_MORE_RESULTS_EXISTS;
|
||||
/*
|
||||
This will copy the error code and the messages, as they
|
||||
are buffers in the struct
|
||||
*/
|
||||
COPY_CLIENT_ERROR(conn->error_info, rset_header->error_info);
|
||||
COPY_CLIENT_ERROR(*conn->error_info, rset_header->error_info);
|
||||
ret = FAIL;
|
||||
DBG_ERR_FMT("error=%s", rset_header->error_info.error);
|
||||
/* Return back from CONN_QUERY_SENT */
|
||||
CONN_SET_STATE(conn, CONN_READY);
|
||||
break;
|
||||
}
|
||||
conn->error_info.error_no = 0;
|
||||
conn->error_info->error_no = 0;
|
||||
|
||||
switch (rset_header->field_count) {
|
||||
case MYSQLND_NULL_LENGTH: { /* LOAD DATA LOCAL INFILE */
|
||||
|
@ -426,15 +426,15 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
DBG_INF("UPSERT");
|
||||
conn->last_query_type = QUERY_UPSERT;
|
||||
conn->field_count = rset_header->field_count;
|
||||
conn->upsert_status.warning_count = rset_header->warning_count;
|
||||
conn->upsert_status.server_status = rset_header->server_status;
|
||||
conn->upsert_status.affected_rows = rset_header->affected_rows;
|
||||
conn->upsert_status.last_insert_id = rset_header->last_insert_id;
|
||||
conn->upsert_status->warning_count = rset_header->warning_count;
|
||||
conn->upsert_status->server_status = rset_header->server_status;
|
||||
conn->upsert_status->affected_rows = rset_header->affected_rows;
|
||||
conn->upsert_status->last_insert_id = rset_header->last_insert_id;
|
||||
SET_NEW_MESSAGE(conn->last_message, conn->last_message_len,
|
||||
rset_header->info_or_local_file, rset_header->info_or_local_file_len,
|
||||
conn->persistent);
|
||||
/* Result set can follow UPSERT statement, check server_status */
|
||||
if (conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
if (conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
CONN_SET_STATE(conn, CONN_NEXT_RESULT_PENDING);
|
||||
} else {
|
||||
CONN_SET_STATE(conn, CONN_READY);
|
||||
|
@ -450,7 +450,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
SET_EMPTY_MESSAGE(conn->last_message, conn->last_message_len, conn->persistent);
|
||||
|
||||
MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_RSET_QUERY);
|
||||
memset(&conn->upsert_status, 0, sizeof(conn->upsert_status));
|
||||
memset(conn->upsert_status, 0, sizeof(*conn->upsert_status));
|
||||
/* restore after zeroing */
|
||||
SET_ERROR_AFF_ROWS(conn);
|
||||
|
||||
|
@ -486,7 +486,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
result = stmt->result;
|
||||
}
|
||||
if (!result) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
break;
|
||||
}
|
||||
|
@ -504,7 +504,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
/* Check for SERVER_STATUS_MORE_RESULTS if needed */
|
||||
fields_eof = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC);
|
||||
if (!fields_eof) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
break;
|
||||
}
|
||||
|
@ -523,7 +523,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
unsigned int to_log = MYSQLND_G(log_mask);
|
||||
to_log &= fields_eof->server_status;
|
||||
DBG_INF_FMT("warnings=%u server_status=%u", fields_eof->warning_count, fields_eof->server_status);
|
||||
conn->upsert_status.warning_count = fields_eof->warning_count;
|
||||
conn->upsert_status->warning_count = fields_eof->warning_count;
|
||||
/*
|
||||
If SERVER_MORE_RESULTS_EXISTS is set then this is either MULTI_QUERY or a CALL()
|
||||
The first packet after sending the query/com_execute has the bit set only
|
||||
|
@ -531,7 +531,7 @@ mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC)
|
|||
will include many result sets. What actually matters are the bits set at the end
|
||||
of every result set (the EOF packet).
|
||||
*/
|
||||
conn->upsert_status.server_status = fields_eof->server_status;
|
||||
conn->upsert_status->server_status = fields_eof->server_status;
|
||||
if (fields_eof->server_status & SERVER_QUERY_NO_GOOD_INDEX_USED) {
|
||||
statistic = STAT_BAD_INDEX_USED;
|
||||
} else if (fields_eof->server_status & SERVER_QUERY_NO_INDEX_USED) {
|
||||
|
@ -634,7 +634,7 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)
|
|||
DBG_RETURN(retrow);
|
||||
}
|
||||
if (CONN_GET_STATE(result->conn) != CONN_FETCHING_DATA) {
|
||||
SET_CLIENT_ERROR(result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC,
|
||||
SET_CLIENT_ERROR(*result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC,
|
||||
UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);
|
||||
DBG_RETURN(retrow);
|
||||
}
|
||||
|
@ -669,8 +669,8 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)
|
|||
result->unbuf->last_row_data,
|
||||
row_packet->field_count,
|
||||
row_packet->fields_metadata,
|
||||
result->conn->options.numeric_and_datetime_as_unicode,
|
||||
result->conn->options.int_and_float_native,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (PASS != rc) {
|
||||
DBG_RETURN(retrow);
|
||||
|
@ -700,12 +700,12 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)
|
|||
}
|
||||
}
|
||||
} else {
|
||||
SET_OOM_ERROR(result->conn->error_info);
|
||||
SET_OOM_ERROR(*result->conn->error_info);
|
||||
}
|
||||
}
|
||||
} else if (ret == FAIL) {
|
||||
if (row_packet->error_info.error_no) {
|
||||
COPY_CLIENT_ERROR(result->conn->error_info, row_packet->error_info);
|
||||
COPY_CLIENT_ERROR(*result->conn->error_info, row_packet->error_info);
|
||||
DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
|
||||
}
|
||||
CONN_SET_STATE(result->conn, CONN_READY);
|
||||
|
@ -714,13 +714,13 @@ mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TSRMLS_DC)
|
|||
/* Mark the connection as usable again */
|
||||
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
|
||||
result->unbuf->eof_reached = TRUE;
|
||||
result->conn->upsert_status.warning_count = row_packet->warning_count;
|
||||
result->conn->upsert_status.server_status = row_packet->server_status;
|
||||
result->conn->upsert_status->warning_count = row_packet->warning_count;
|
||||
result->conn->upsert_status->server_status = row_packet->server_status;
|
||||
/*
|
||||
result->row_packet will be cleaned when
|
||||
destroying the result object
|
||||
*/
|
||||
if (result->conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
if (result->conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
CONN_SET_STATE(result->conn, CONN_NEXT_RESULT_PENDING);
|
||||
} else {
|
||||
CONN_SET_STATE(result->conn, CONN_READY);
|
||||
|
@ -749,7 +749,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla
|
|||
DBG_RETURN(PASS);
|
||||
}
|
||||
if (CONN_GET_STATE(result->conn) != CONN_FETCHING_DATA) {
|
||||
SET_CLIENT_ERROR(result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);
|
||||
SET_CLIENT_ERROR(*result->conn->error_info, CR_COMMANDS_OUT_OF_SYNC, UNKNOWN_SQLSTATE, mysqlnd_out_of_sync);
|
||||
DBG_RETURN(FAIL);
|
||||
}
|
||||
if (!row_packet) {
|
||||
|
@ -784,8 +784,8 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla
|
|||
result->unbuf->last_row_data,
|
||||
field_count,
|
||||
row_packet->fields_metadata,
|
||||
result->conn->options.numeric_and_datetime_as_unicode,
|
||||
result->conn->options.int_and_float_native,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (PASS != rc) {
|
||||
DBG_RETURN(FAIL);
|
||||
|
@ -840,7 +840,7 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla
|
|||
result->unbuf->row_count++;
|
||||
} else if (ret == FAIL) {
|
||||
if (row_packet->error_info.error_no) {
|
||||
COPY_CLIENT_ERROR(result->conn->error_info, row_packet->error_info);
|
||||
COPY_CLIENT_ERROR(*result->conn->error_info, row_packet->error_info);
|
||||
DBG_ERR_FMT("errorno=%u error=%s", row_packet->error_info.error_no, row_packet->error_info.error);
|
||||
}
|
||||
CONN_SET_STATE(result->conn, CONN_READY);
|
||||
|
@ -849,13 +849,13 @@ mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, void *param, unsigned int fla
|
|||
/* Mark the connection as usable again */
|
||||
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status);
|
||||
result->unbuf->eof_reached = TRUE;
|
||||
result->conn->upsert_status.warning_count = row_packet->warning_count;
|
||||
result->conn->upsert_status.server_status = row_packet->server_status;
|
||||
result->conn->upsert_status->warning_count = row_packet->warning_count;
|
||||
result->conn->upsert_status->server_status = row_packet->server_status;
|
||||
/*
|
||||
result->row_packet will be cleaned when
|
||||
destroying the result object
|
||||
*/
|
||||
if (result->conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
if (result->conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
CONN_SET_STATE(result->conn, CONN_NEXT_RESULT_PENDING);
|
||||
} else {
|
||||
CONN_SET_STATE(result->conn, CONN_READY);
|
||||
|
@ -875,8 +875,7 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps
|
|||
{
|
||||
DBG_ENTER("mysqlnd_res::use_result");
|
||||
|
||||
SET_EMPTY_ERROR(result->conn->error_info);
|
||||
|
||||
SET_EMPTY_ERROR(*result->conn->error_info);
|
||||
|
||||
if (ps == FALSE) {
|
||||
result->type = MYSQLND_RES_NORMAL;
|
||||
|
@ -921,7 +920,7 @@ MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps
|
|||
|
||||
DBG_RETURN(result);
|
||||
oom:
|
||||
SET_OOM_ERROR(result->conn->error_info);
|
||||
SET_OOM_ERROR(*result->conn->error_info);
|
||||
DBG_RETURN(NULL);
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -951,8 +950,8 @@ mysqlnd_fetch_row_buffered_c(MYSQLND_RES * result TSRMLS_DC)
|
|||
current_row,
|
||||
result->meta->field_count,
|
||||
result->meta->fields,
|
||||
result->conn->options.numeric_and_datetime_as_unicode,
|
||||
result->conn->options.int_and_float_native,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (rc != PASS) {
|
||||
DBG_RETURN(ret);
|
||||
|
@ -1024,8 +1023,8 @@ mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void *param, unsigned int flags
|
|||
current_row,
|
||||
result->meta->field_count,
|
||||
result->meta->fields,
|
||||
result->conn->options.numeric_and_datetime_as_unicode,
|
||||
result->conn->options.int_and_float_native,
|
||||
result->conn->options->numeric_and_datetime_as_unicode,
|
||||
result->conn->options->int_and_float_native,
|
||||
result->conn->stats TSRMLS_CC);
|
||||
if (rc != PASS) {
|
||||
DBG_RETURN(FAIL);
|
||||
|
@ -1116,14 +1115,14 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
|
|||
|
||||
result->stored_data = set = mnd_ecalloc(1, sizeof(MYSQLND_RES_BUFFERED));
|
||||
if (!set) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
if (free_rows) {
|
||||
set->row_buffers = mnd_emalloc((size_t)(free_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)));
|
||||
if (!set->row_buffers) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
@ -1133,7 +1132,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
|
|||
/* non-persistent */
|
||||
row_packet = conn->protocol->m.get_row_packet(conn->protocol, FALSE TSRMLS_CC);
|
||||
if (!row_packet) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
@ -1154,13 +1153,13 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
|
|||
|
||||
/* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */
|
||||
if (total_allocated_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *) > SIZE_MAX) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
new_row_buffers = mnd_erealloc(set->row_buffers, (size_t)(total_allocated_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)));
|
||||
if (!new_row_buffers) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
@ -1186,14 +1185,14 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
|
|||
if (set->row_count) {
|
||||
/* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */
|
||||
if (set->row_count * meta->field_count * sizeof(zval *) > SIZE_MAX) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
/* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */
|
||||
set->data = mnd_emalloc((size_t)(set->row_count * meta->field_count * sizeof(zval *)));
|
||||
if (!set->data) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
@ -1207,21 +1206,21 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
|
|||
|
||||
/* Finally clean */
|
||||
if (row_packet->eof) {
|
||||
conn->upsert_status.warning_count = row_packet->warning_count;
|
||||
conn->upsert_status.server_status = row_packet->server_status;
|
||||
conn->upsert_status->warning_count = row_packet->warning_count;
|
||||
conn->upsert_status->server_status = row_packet->server_status;
|
||||
}
|
||||
/* save some memory */
|
||||
if (free_rows) {
|
||||
/* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */
|
||||
if (set->row_count * sizeof(MYSQLND_MEMORY_POOL_CHUNK *) > SIZE_MAX) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
ret = FAIL;
|
||||
goto end;
|
||||
}
|
||||
set->row_buffers = mnd_erealloc(set->row_buffers, (size_t) (set->row_count * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)));
|
||||
}
|
||||
|
||||
if (conn->upsert_status.server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
if (conn->upsert_status->server_status & SERVER_MORE_RESULTS_EXISTS) {
|
||||
CONN_SET_STATE(conn, CONN_NEXT_RESULT_PENDING);
|
||||
} else {
|
||||
CONN_SET_STATE(conn, CONN_READY);
|
||||
|
@ -1234,10 +1233,10 @@ MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQL
|
|||
set->data_cursor = set->data;
|
||||
|
||||
/* libmysql's documentation says it should be so for SELECT statements */
|
||||
conn->upsert_status.affected_rows = set->row_count;
|
||||
conn->upsert_status->affected_rows = set->row_count;
|
||||
}
|
||||
DBG_INF_FMT("ret=%s row_count=%u warnings=%u server_status=%u",
|
||||
ret == PASS? "PASS":"FAIL", (uint) set->row_count, conn->upsert_status.warning_count, conn->upsert_status.server_status);
|
||||
ret == PASS? "PASS":"FAIL", (uint) set->row_count, conn->upsert_status->warning_count, conn->upsert_status->server_status);
|
||||
end:
|
||||
PACKET_FREE(row_packet);
|
||||
|
||||
|
@ -1268,7 +1267,7 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,
|
|||
result->lengths = mnd_ecalloc(result->field_count, sizeof(unsigned long));
|
||||
|
||||
if (!result->result_set_memory_pool || !result->lengths) {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
DBG_RETURN(NULL);
|
||||
}
|
||||
|
||||
|
@ -1277,14 +1276,14 @@ MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result,
|
|||
ret = result->m.store_result_fetch_data(conn, result, result->meta, ps_protocol TSRMLS_CC);
|
||||
if (FAIL == ret) {
|
||||
if (result->stored_data) {
|
||||
COPY_CLIENT_ERROR(conn->error_info, result->stored_data->error_info);
|
||||
COPY_CLIENT_ERROR(*conn->error_info, result->stored_data->error_info);
|
||||
} else {
|
||||
SET_OOM_ERROR(conn->error_info);
|
||||
SET_OOM_ERROR(*conn->error_info);
|
||||
}
|
||||
DBG_RETURN(NULL);
|
||||
}
|
||||
/* libmysql's documentation says it should be so for SELECT statements */
|
||||
conn->upsert_status.affected_rows = result->stored_data->row_count;
|
||||
conn->upsert_status->affected_rows = result->stored_data->row_count;
|
||||
|
||||
DBG_RETURN(result);
|
||||
}
|
||||
|
@ -1567,7 +1566,7 @@ MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * result, unsigned int flags,
|
|||
if ((!result->unbuf && !set)) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "fetch_all can be used only with buffered sets");
|
||||
if (result->conn) {
|
||||
SET_CLIENT_ERROR(result->conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "fetch_all can be used only with buffered sets");
|
||||
SET_CLIENT_ERROR(*result->conn->error_info, CR_NOT_IMPLEMENTED, UNKNOWN_SQLSTATE, "fetch_all can be used only with buffered sets");
|
||||
}
|
||||
RETVAL_NULL();
|
||||
DBG_VOID_RETURN;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue