version 1.1.1.1, 2012/02/21 23:47:58
|
version 1.1.1.2, 2012/05/29 12:34:41
|
Line 12
|
Line 12
|
| obtain it through the world-wide-web, please send a note to | |
| obtain it through the world-wide-web, please send a note to | |
| license@php.net so we can mail you a copy immediately. | |
| license@php.net so we can mail you a copy immediately. | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| Authors: Georg Richter <georg@mysql.com> | | | Authors: Andrey Hristov <andrey@mysql.com> | |
| Andrey Hristov <andrey@mysql.com> | | |
| Ulf Wendel <uwendel@mysql.com> | |
| Ulf Wendel <uwendel@mysql.com> | |
|
| Georg Richter <georg@mysql.com> | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
*/ |
*/ |
|
|
Line 28
|
Line 28
|
#include "mysqlnd_result_meta.h" |
#include "mysqlnd_result_meta.h" |
#include "mysqlnd_statistics.h" |
#include "mysqlnd_statistics.h" |
#include "mysqlnd_debug.h" |
#include "mysqlnd_debug.h" |
|
#include "mysqlnd_ext_plugin.h" |
|
|
#define MYSQLND_SILENT |
#define MYSQLND_SILENT |
|
|
Line 54 MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest
|
Line 55 MYSQLND_METHOD(mysqlnd_res, initialize_result_set_rest
|
data_cursor, |
data_cursor, |
result->meta->field_count, |
result->meta->field_count, |
result->meta->fields, |
result->meta->fields, |
result->stored_data->persistent, | result->conn->options->numeric_and_datetime_as_unicode, |
result->conn->options.numeric_and_datetime_as_unicode, | result->conn->options->int_and_float_native, |
result->conn->options.int_and_float_native, | |
result->conn->stats TSRMLS_CC); |
result->conn->stats TSRMLS_CC); |
if (rc != PASS) { |
if (rc != PASS) { |
ret = FAIL; |
ret = FAIL; |
Line 150 MYSQLND_METHOD(mysqlnd_res, unbuffered_free_last_data)
|
Line 150 MYSQLND_METHOD(mysqlnd_res, unbuffered_free_last_data)
|
DBG_VOID_RETURN; |
DBG_VOID_RETURN; |
} |
} |
|
|
DBG_INF_FMT("last_row_data=%p", unbuf->last_row_data); |
|
if (unbuf->last_row_data) { |
if (unbuf->last_row_data) { |
unsigned int i, ctor_called_count = 0; |
unsigned int i, ctor_called_count = 0; |
zend_bool copy_ctor_called; |
zend_bool copy_ctor_called; |
MYSQLND_STATS *global_stats = result->conn? result->conn->stats:NULL; |
MYSQLND_STATS *global_stats = result->conn? result->conn->stats:NULL; |
|
|
DBG_INF_FMT("%u columns to free", result->field_count); |
|
for (i = 0; i < result->field_count; i++) { |
for (i = 0; i < result->field_count; i++) { |
mysqlnd_rset_zval_ptr_dtor(&(unbuf->last_row_data[i]), result->type, ©_ctor_called TSRMLS_CC); |
mysqlnd_rset_zval_ptr_dtor(&(unbuf->last_row_data[i]), result->type, ©_ctor_called TSRMLS_CC); |
if (copy_ctor_called) { |
if (copy_ctor_called) { |
Line 197 MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLN
|
Line 195 MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLN
|
DBG_ENTER("mysqlnd_res::free_buffered_data"); |
DBG_ENTER("mysqlnd_res::free_buffered_data"); |
DBG_INF_FMT("Freeing "MYSQLND_LLU_SPEC" row(s)", set->row_count); |
DBG_INF_FMT("Freeing "MYSQLND_LLU_SPEC" row(s)", set->row_count); |
|
|
DBG_INF("Freeing data & row_buffer"); |
|
if (set->data) { |
if (set->data) { |
unsigned int copy_on_write_performed = 0; |
unsigned int copy_on_write_performed = 0; |
unsigned int copy_on_write_saved = 0; |
unsigned int copy_on_write_saved = 0; |
|
|
DBG_INF_FMT("before: real_usage=%lu usage=%lu", zend_memory_usage(TRUE TSRMLS_CC), zend_memory_usage(FALSE TSRMLS_CC)); |
|
for (row = set->row_count - 1; row >= 0; row--) { |
for (row = set->row_count - 1; row >= 0; row--) { |
zval **current_row = set->data + row * field_count; |
zval **current_row = set->data + row * field_count; |
MYSQLND_MEMORY_POOL_CHUNK *current_buffer = set->row_buffers[row]; |
MYSQLND_MEMORY_POOL_CHUNK *current_buffer = set->row_buffers[row]; |
Line 213 MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLN
|
Line 209 MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLN
|
if (current_row[col]) { |
if (current_row[col]) { |
zend_bool copy_ctor_called; |
zend_bool copy_ctor_called; |
mysqlnd_rset_zval_ptr_dtor(&(current_row[col]), result->type, ©_ctor_called TSRMLS_CC); |
mysqlnd_rset_zval_ptr_dtor(&(current_row[col]), result->type, ©_ctor_called TSRMLS_CC); |
#if MYSQLND_DEBUG_MEMORY |
|
DBG_INF_FMT("Copy_ctor_called=%u", copy_ctor_called); |
|
#endif |
|
if (copy_ctor_called) { |
if (copy_ctor_called) { |
++copy_on_write_performed; |
++copy_on_write_performed; |
} else { |
} else { |
Line 224 MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLN
|
Line 217 MYSQLND_METHOD(mysqlnd_res, free_buffered_data)(MYSQLN
|
} |
} |
} |
} |
} |
} |
#if MYSQLND_DEBUG_MEMORY |
|
DBG_INF("Freeing current_row & current_buffer"); |
|
#endif |
|
current_buffer->free_chunk(current_buffer TSRMLS_CC); |
current_buffer->free_chunk(current_buffer TSRMLS_CC); |
} |
} |
|
|
MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_COPY_ON_WRITE_PERFORMED, copy_on_write_performed, |
MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(STAT_COPY_ON_WRITE_PERFORMED, copy_on_write_performed, |
STAT_COPY_ON_WRITE_SAVED, copy_on_write_saved); |
STAT_COPY_ON_WRITE_SAVED, copy_on_write_saved); |
mnd_pefree(set->data, set->persistent); | mnd_efree(set->data); |
set->data = NULL; |
set->data = NULL; |
} |
} |
|
|
if (set->row_buffers) { |
if (set->row_buffers) { |
mnd_pefree(set->row_buffers, set->persistent); | mnd_efree(set->row_buffers); |
set->row_buffers = NULL; |
set->row_buffers = NULL; |
} |
} |
set->data_cursor = NULL; |
set->data_cursor = NULL; |
set->row_count = 0; |
set->row_count = 0; |
|
|
DBG_INF("Freeing set"); | mnd_efree(set); |
mnd_pefree(set, set->persistent); | |
|
|
DBG_INF_FMT("after: real_usage=%lu usage=%lu", zend_memory_usage(TRUE TSRMLS_CC), zend_memory_usage(FALSE TSRMLS_CC)); |
|
DBG_VOID_RETURN; |
DBG_VOID_RETURN; |
} |
} |
/* }}} */ |
/* }}} */ |
Line 274 MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQL
|
Line 262 MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQL
|
} |
} |
|
|
if (result->row_packet) { |
if (result->row_packet) { |
DBG_INF("Freeing packet"); |
|
PACKET_FREE(result->row_packet); |
PACKET_FREE(result->row_packet); |
result->row_packet = NULL; |
result->row_packet = NULL; |
} |
} |
|
|
if (result->result_set_memory_pool) { |
if (result->result_set_memory_pool) { |
DBG_INF("Freeing memory pool"); |
|
mysqlnd_mempool_destroy(result->result_set_memory_pool TSRMLS_CC); |
mysqlnd_mempool_destroy(result->result_set_memory_pool TSRMLS_CC); |
result->result_set_memory_pool = NULL; |
result->result_set_memory_pool = NULL; |
} |
} |
Line 329 void mysqlnd_internal_free_result(MYSQLND_RES * result
|
Line 315 void mysqlnd_internal_free_result(MYSQLND_RES * result
|
|
|
/* {{{ mysqlnd_res::read_result_metadata */ |
/* {{{ mysqlnd_res::read_result_metadata */ |
static enum_func_status |
static enum_func_status |
MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND *conn TSRMLS_DC) | MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQLND_RES * result, MYSQLND_CONN_DATA * conn TSRMLS_DC) |
{ |
{ |
DBG_ENTER("mysqlnd_res::read_result_metadata"); |
DBG_ENTER("mysqlnd_res::read_result_metadata"); |
|
|
Line 346 MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQ
|
Line 332 MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQ
|
|
|
result->meta = result->m.result_meta_init(result->field_count, result->persistent TSRMLS_CC); |
result->meta = result->m.result_meta_init(result->field_count, result->persistent TSRMLS_CC); |
if (!result->meta) { |
if (!result->meta) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
DBG_RETURN(FAIL); |
DBG_RETURN(FAIL); |
} |
} |
|
|
Line 374 MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQ
|
Line 360 MYSQLND_METHOD(mysqlnd_res, read_result_metadata)(MYSQ
|
|
|
/* {{{ mysqlnd_query_read_result_set_header */ |
/* {{{ mysqlnd_query_read_result_set_header */ |
enum_func_status |
enum_func_status |
mysqlnd_query_read_result_set_header(MYSQLND *conn, MYSQLND_STMT * s TSRMLS_DC) | mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s TSRMLS_DC) |
{ |
{ |
MYSQLND_STMT_DATA * stmt = s ? s->data:NULL; |
MYSQLND_STMT_DATA * stmt = s ? s->data:NULL; |
enum_func_status ret; |
enum_func_status ret; |
Line 388 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 374 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
do { |
do { |
rset_header = conn->protocol->m.get_rset_header_packet(conn->protocol, FALSE TSRMLS_CC); |
rset_header = conn->protocol->m.get_rset_header_packet(conn->protocol, FALSE TSRMLS_CC); |
if (!rset_header) { |
if (!rset_header) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
break; |
break; |
} |
} |
Line 410 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 396 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
a multi-statement or a stored procedure, so it should be |
a multi-statement or a stored procedure, so it should be |
safe to unconditionally turn off the flag here. |
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 |
This will copy the error code and the messages, as they |
are buffers in the struct |
are buffers in the struct |
*/ |
*/ |
conn->error_info = rset_header->error_info; | COPY_CLIENT_ERROR(*conn->error_info, rset_header->error_info); |
ret = FAIL; |
ret = FAIL; |
DBG_ERR_FMT("error=%s", rset_header->error_info.error); |
DBG_ERR_FMT("error=%s", rset_header->error_info.error); |
/* Return back from CONN_QUERY_SENT */ |
/* Return back from CONN_QUERY_SENT */ |
CONN_SET_STATE(conn, CONN_READY); |
CONN_SET_STATE(conn, CONN_READY); |
break; |
break; |
} |
} |
conn->error_info.error_no = 0; | conn->error_info->error_no = 0; |
|
|
switch (rset_header->field_count) { |
switch (rset_header->field_count) { |
case MYSQLND_NULL_LENGTH: { /* LOAD DATA LOCAL INFILE */ |
case MYSQLND_NULL_LENGTH: { /* LOAD DATA LOCAL INFILE */ |
Line 440 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 426 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
DBG_INF("UPSERT"); |
DBG_INF("UPSERT"); |
conn->last_query_type = QUERY_UPSERT; |
conn->last_query_type = QUERY_UPSERT; |
conn->field_count = rset_header->field_count; |
conn->field_count = rset_header->field_count; |
conn->upsert_status.warning_count = rset_header->warning_count; | conn->upsert_status->warning_count = rset_header->warning_count; |
conn->upsert_status.server_status = rset_header->server_status; | conn->upsert_status->server_status = rset_header->server_status; |
conn->upsert_status.affected_rows = rset_header->affected_rows; | conn->upsert_status->affected_rows = rset_header->affected_rows; |
conn->upsert_status.last_insert_id = rset_header->last_insert_id; | conn->upsert_status->last_insert_id = rset_header->last_insert_id; |
SET_NEW_MESSAGE(conn->last_message, conn->last_message_len, |
SET_NEW_MESSAGE(conn->last_message, conn->last_message_len, |
rset_header->info_or_local_file, rset_header->info_or_local_file_len, |
rset_header->info_or_local_file, rset_header->info_or_local_file_len, |
conn->persistent); |
conn->persistent); |
/* Result set can follow UPSERT statement, check server_status */ |
/* 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); |
CONN_SET_STATE(conn, CONN_NEXT_RESULT_PENDING); |
} else { |
} else { |
CONN_SET_STATE(conn, CONN_READY); |
CONN_SET_STATE(conn, CONN_READY); |
Line 464 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 450 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
SET_EMPTY_MESSAGE(conn->last_message, conn->last_message_len, conn->persistent); |
SET_EMPTY_MESSAGE(conn->last_message, conn->last_message_len, conn->persistent); |
|
|
MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_RSET_QUERY); |
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 */ |
/* restore after zeroing */ |
SET_ERROR_AFF_ROWS(conn); |
SET_ERROR_AFF_ROWS(conn); |
|
|
Line 500 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 486 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
result = stmt->result; |
result = stmt->result; |
} |
} |
if (!result) { |
if (!result) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
break; |
break; |
} |
} |
Line 518 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 504 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
/* Check for SERVER_STATUS_MORE_RESULTS if needed */ |
/* Check for SERVER_STATUS_MORE_RESULTS if needed */ |
fields_eof = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC); |
fields_eof = conn->protocol->m.get_eof_packet(conn->protocol, FALSE TSRMLS_CC); |
if (!fields_eof) { |
if (!fields_eof) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
break; |
break; |
} |
} |
Line 537 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 523 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
unsigned int to_log = MYSQLND_G(log_mask); |
unsigned int to_log = MYSQLND_G(log_mask); |
to_log &= fields_eof->server_status; |
to_log &= fields_eof->server_status; |
DBG_INF_FMT("warnings=%u server_status=%u", fields_eof->warning_count, 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() |
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 |
The first packet after sending the query/com_execute has the bit set only |
Line 545 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
Line 531 mysqlnd_query_read_result_set_header(MYSQLND *conn, MY
|
will include many result sets. What actually matters are the bits set at the end |
will include many result sets. What actually matters are the bits set at the end |
of every result set (the EOF packet). |
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) { |
if (fields_eof->server_status & SERVER_QUERY_NO_GOOD_INDEX_USED) { |
statistic = STAT_BAD_INDEX_USED; |
statistic = STAT_BAD_INDEX_USED; |
} else if (fields_eof->server_status & SERVER_QUERY_NO_INDEX_USED) { |
} else if (fields_eof->server_status & SERVER_QUERY_NO_INDEX_USED) { |
Line 648 mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TS
|
Line 634 mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TS
|
DBG_RETURN(retrow); |
DBG_RETURN(retrow); |
} |
} |
if (CONN_GET_STATE(result->conn) != CONN_FETCHING_DATA) { |
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); |
UNKNOWN_SQLSTATE, mysqlnd_out_of_sync); |
DBG_RETURN(retrow); |
DBG_RETURN(retrow); |
} |
} |
Line 683 mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TS
|
Line 669 mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TS
|
result->unbuf->last_row_data, |
result->unbuf->last_row_data, |
row_packet->field_count, |
row_packet->field_count, |
row_packet->fields_metadata, |
row_packet->fields_metadata, |
FALSE, | result->conn->options->numeric_and_datetime_as_unicode, |
result->conn->options.numeric_and_datetime_as_unicode, | result->conn->options->int_and_float_native, |
result->conn->options.int_and_float_native, | |
result->conn->stats TSRMLS_CC); |
result->conn->stats TSRMLS_CC); |
if (PASS != rc) { |
if (PASS != rc) { |
DBG_RETURN(retrow); |
DBG_RETURN(retrow); |
Line 715 mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TS
|
Line 700 mysqlnd_fetch_row_unbuffered_c(MYSQLND_RES * result TS
|
} |
} |
} |
} |
} else { |
} else { |
SET_OOM_ERROR(result->conn->error_info); | SET_OOM_ERROR(*result->conn->error_info); |
} |
} |
} |
} |
} else if (ret == FAIL) { |
} else if (ret == FAIL) { |
if (row_packet->error_info.error_no) { |
if (row_packet->error_info.error_no) { |
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); |
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); |
CONN_SET_STATE(result->conn, CONN_READY); |
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */ |
result->unbuf->eof_reached = TRUE; /* so next time we won't get an error */ |
} else if (row_packet->eof) { |
} else if (row_packet->eof) { |
/* Mark the connection as usable again */ |
/* Mark the connection as usable again */ |
DBG_INF_FMT("warningss=%u server_status=%u", row_packet->warning_count, row_packet->server_status); | DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status); |
result->unbuf->eof_reached = TRUE; |
result->unbuf->eof_reached = TRUE; |
result->conn->upsert_status.warning_count = row_packet->warning_count; | result->conn->upsert_status->warning_count = row_packet->warning_count; |
result->conn->upsert_status.server_status = row_packet->server_status; | result->conn->upsert_status->server_status = row_packet->server_status; |
/* |
/* |
result->row_packet will be cleaned when |
result->row_packet will be cleaned when |
destroying the result object |
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); |
CONN_SET_STATE(result->conn, CONN_NEXT_RESULT_PENDING); |
} else { |
} else { |
CONN_SET_STATE(result->conn, CONN_READY); |
CONN_SET_STATE(result->conn, CONN_READY); |
Line 757 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
Line 742 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
MYSQLND_PACKET_ROW *row_packet = result->row_packet; |
MYSQLND_PACKET_ROW *row_packet = result->row_packet; |
|
|
DBG_ENTER("mysqlnd_fetch_row_unbuffered"); |
DBG_ENTER("mysqlnd_fetch_row_unbuffered"); |
DBG_INF_FMT("flags=%u", flags); |
|
|
|
*fetched_anything = FALSE; |
*fetched_anything = FALSE; |
if (result->unbuf->eof_reached) { |
if (result->unbuf->eof_reached) { |
Line 765 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
Line 749 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
DBG_RETURN(PASS); |
DBG_RETURN(PASS); |
} |
} |
if (CONN_GET_STATE(result->conn) != CONN_FETCHING_DATA) { |
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); |
DBG_RETURN(FAIL); |
} |
} |
if (!row_packet) { |
if (!row_packet) { |
Line 800 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
Line 784 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
result->unbuf->last_row_data, |
result->unbuf->last_row_data, |
field_count, |
field_count, |
row_packet->fields_metadata, |
row_packet->fields_metadata, |
FALSE, | result->conn->options->numeric_and_datetime_as_unicode, |
result->conn->options.numeric_and_datetime_as_unicode, | result->conn->options->int_and_float_native, |
result->conn->options.int_and_float_native, | |
result->conn->stats TSRMLS_CC); |
result->conn->stats TSRMLS_CC); |
if (PASS != rc) { |
if (PASS != rc) { |
DBG_RETURN(FAIL); |
DBG_RETURN(FAIL); |
Line 857 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
Line 840 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
result->unbuf->row_count++; |
result->unbuf->row_count++; |
} else if (ret == FAIL) { |
} else if (ret == FAIL) { |
if (row_packet->error_info.error_no) { |
if (row_packet->error_info.error_no) { |
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); |
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); |
CONN_SET_STATE(result->conn, CONN_READY); |
Line 866 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
Line 849 mysqlnd_fetch_row_unbuffered(MYSQLND_RES * result, voi
|
/* Mark the connection as usable again */ |
/* Mark the connection as usable again */ |
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status); |
DBG_INF_FMT("warnings=%u server_status=%u", row_packet->warning_count, row_packet->server_status); |
result->unbuf->eof_reached = TRUE; |
result->unbuf->eof_reached = TRUE; |
result->conn->upsert_status.warning_count = row_packet->warning_count; | result->conn->upsert_status->warning_count = row_packet->warning_count; |
result->conn->upsert_status.server_status = row_packet->server_status; | result->conn->upsert_status->server_status = row_packet->server_status; |
/* |
/* |
result->row_packet will be cleaned when |
result->row_packet will be cleaned when |
destroying the result object |
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); |
CONN_SET_STATE(result->conn, CONN_NEXT_RESULT_PENDING); |
} else { |
} else { |
CONN_SET_STATE(result->conn, CONN_READY); |
CONN_SET_STATE(result->conn, CONN_READY); |
Line 891 static MYSQLND_RES *
|
Line 874 static MYSQLND_RES *
|
MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps TSRMLS_DC) |
MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES * const result, zend_bool ps TSRMLS_DC) |
{ |
{ |
DBG_ENTER("mysqlnd_res::use_result"); |
DBG_ENTER("mysqlnd_res::use_result"); |
DBG_INF_FMT("ps=%u", ps); |
|
|
|
SET_EMPTY_ERROR(result->conn->error_info); | SET_EMPTY_ERROR(*result->conn->error_info); |
|
|
|
|
if (ps == FALSE) { |
if (ps == FALSE) { |
result->type = MYSQLND_RES_NORMAL; |
result->type = MYSQLND_RES_NORMAL; |
result->m.fetch_row = result->m.fetch_row_normal_unbuffered; |
result->m.fetch_row = result->m.fetch_row_normal_unbuffered; |
Line 939 MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES *
|
Line 920 MYSQLND_METHOD(mysqlnd_res, use_result)(MYSQLND_RES *
|
|
|
DBG_RETURN(result); |
DBG_RETURN(result); |
oom: |
oom: |
SET_OOM_ERROR(result->conn->error_info); | SET_OOM_ERROR(*result->conn->error_info); |
DBG_RETURN(NULL); |
DBG_RETURN(NULL); |
} |
} |
/* }}} */ |
/* }}} */ |
Line 969 mysqlnd_fetch_row_buffered_c(MYSQLND_RES * result TSRM
|
Line 950 mysqlnd_fetch_row_buffered_c(MYSQLND_RES * result TSRM
|
current_row, |
current_row, |
result->meta->field_count, |
result->meta->field_count, |
result->meta->fields, |
result->meta->fields, |
FALSE, | result->conn->options->numeric_and_datetime_as_unicode, |
result->conn->options.numeric_and_datetime_as_unicode, | result->conn->options->int_and_float_native, |
result->conn->options.int_and_float_native, | |
result->conn->stats TSRMLS_CC); |
result->conn->stats TSRMLS_CC); |
if (rc != PASS) { |
if (rc != PASS) { |
DBG_RETURN(ret); |
DBG_RETURN(ret); |
Line 1028 mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void
|
Line 1008 mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void
|
enum_func_status ret = FAIL; |
enum_func_status ret = FAIL; |
|
|
DBG_ENTER("mysqlnd_fetch_row_buffered"); |
DBG_ENTER("mysqlnd_fetch_row_buffered"); |
DBG_INF_FMT("flags=%u row=%p", flags, row); |
|
|
|
/* If we haven't read everything */ |
/* If we haven't read everything */ |
if (set->data_cursor && |
if (set->data_cursor && |
Line 1044 mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void
|
Line 1023 mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void
|
current_row, |
current_row, |
result->meta->field_count, |
result->meta->field_count, |
result->meta->fields, |
result->meta->fields, |
result->stored_data->persistent, | result->conn->options->numeric_and_datetime_as_unicode, |
result->conn->options.numeric_and_datetime_as_unicode, | result->conn->options->int_and_float_native, |
result->conn->options.int_and_float_native, | |
result->conn->stats TSRMLS_CC); |
result->conn->stats TSRMLS_CC); |
if (rc != PASS) { |
if (rc != PASS) { |
DBG_RETURN(FAIL); |
DBG_RETURN(FAIL); |
Line 1124 mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void
|
Line 1102 mysqlnd_fetch_row_buffered(MYSQLND_RES * result, void
|
|
|
/* {{{ mysqlnd_res::store_result_fetch_data */ |
/* {{{ mysqlnd_res::store_result_fetch_data */ |
enum_func_status |
enum_func_status |
MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND * const conn, MYSQLND_RES * result, | MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(MYSQLND_CONN_DATA * const conn, MYSQLND_RES * result, |
MYSQLND_RES_METADATA *meta, |
MYSQLND_RES_METADATA *meta, |
zend_bool binary_protocol, | zend_bool binary_protocol TSRMLS_DC) |
zend_bool to_cache TSRMLS_DC) | |
{ |
{ |
enum_func_status ret; |
enum_func_status ret; |
MYSQLND_PACKET_ROW *row_packet = NULL; |
MYSQLND_PACKET_ROW *row_packet = NULL; |
Line 1135 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
Line 1112 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
MYSQLND_RES_BUFFERED *set; |
MYSQLND_RES_BUFFERED *set; |
|
|
DBG_ENTER("mysqlnd_res::store_result_fetch_data"); |
DBG_ENTER("mysqlnd_res::store_result_fetch_data"); |
DBG_INF_FMT("conn=%llu binary_proto=%u to_cache=%u", |
|
conn->thread_id, binary_protocol, to_cache); |
|
|
|
result->stored_data = set = mnd_pecalloc(1, sizeof(MYSQLND_RES_BUFFERED), to_cache); | result->stored_data = set = mnd_ecalloc(1, sizeof(MYSQLND_RES_BUFFERED)); |
if (!set) { |
if (!set) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
if (free_rows) { |
if (free_rows) { |
set->row_buffers = mnd_pemalloc((size_t)(free_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)), to_cache); | set->row_buffers = mnd_emalloc((size_t)(free_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *))); |
if (!set->row_buffers) { |
if (!set->row_buffers) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
} |
} |
set->persistent = to_cache; |
|
set->references = 1; |
set->references = 1; |
|
|
result->m.row_decoder = binary_protocol? php_mysqlnd_rowp_read_binary_protocol: |
|
php_mysqlnd_rowp_read_text_protocol; |
|
|
|
/* non-persistent */ |
/* non-persistent */ |
row_packet = conn->protocol->m.get_row_packet(conn->protocol, FALSE TSRMLS_CC); |
row_packet = conn->protocol->m.get_row_packet(conn->protocol, FALSE TSRMLS_CC); |
if (!row_packet) { |
if (!row_packet) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
Line 1182 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
Line 1153 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
|
|
/* don't try to allocate more than possible - mnd_XXalloc expects size_t, and it can have narrower range than uint64_t */ |
/* 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) { |
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; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
new_row_buffers = mnd_perealloc(set->row_buffers, | new_row_buffers = mnd_erealloc(set->row_buffers, (size_t)(total_allocated_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *))); |
(size_t)(total_allocated_rows * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)), | |
set->persistent); | |
if (!new_row_buffers) { |
if (!new_row_buffers) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
Line 1216 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
Line 1185 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
if (set->row_count) { |
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 */ |
/* 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) { |
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; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
/* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */ |
/* if pecalloc is used valgrind barks gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux) */ |
set->data = mnd_pemalloc((size_t)(set->row_count * meta->field_count * sizeof(zval *)), to_cache); | set->data = mnd_emalloc((size_t)(set->row_count * meta->field_count * sizeof(zval *))); |
if (!set->data) { |
if (!set->data) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
ret = FAIL; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
Line 1237 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
Line 1206 MYSQLND_METHOD(mysqlnd_res, store_result_fetch_data)(M
|
|
|
/* Finally clean */ |
/* Finally clean */ |
if (row_packet->eof) { |
if (row_packet->eof) { |
conn->upsert_status.warning_count = row_packet->warning_count; | conn->upsert_status->warning_count = row_packet->warning_count; |
conn->upsert_status.server_status = row_packet->server_status; | conn->upsert_status->server_status = row_packet->server_status; |
} |
} |
/* save some memory */ |
/* save some memory */ |
if (free_rows) { |
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 */ |
/* 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) { |
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; |
ret = FAIL; |
goto end; |
goto end; |
} |
} |
set->row_buffers = mnd_perealloc(set->row_buffers, | set->row_buffers = mnd_erealloc(set->row_buffers, (size_t) (set->row_count * sizeof(MYSQLND_MEMORY_POOL_CHUNK *))); |
(size_t) (set->row_count * sizeof(MYSQLND_MEMORY_POOL_CHUNK *)), | |
set->persistent); | |
} |
} |
|
|
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); |
CONN_SET_STATE(conn, CONN_NEXT_RESULT_PENDING); |
} else { |
} else { |
CONN_SET_STATE(conn, CONN_READY); |
CONN_SET_STATE(conn, CONN_READY); |
} |
} |
|
|
if (ret == FAIL) { |
if (ret == FAIL) { |
set->error_info = row_packet->error_info; | COPY_CLIENT_ERROR(set->error_info, row_packet->error_info); |
} else { |
} else { |
/* Position at the first row */ |
/* Position at the first row */ |
set->data_cursor = set->data; |
set->data_cursor = set->data; |
|
|
/* libmysql's documentation says it should be so for SELECT statements */ |
/* 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", |
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: |
end: |
PACKET_FREE(row_packet); |
PACKET_FREE(row_packet); |
|
|
Line 1281 end:
|
Line 1248 end:
|
/* {{{ mysqlnd_res::store_result */ |
/* {{{ mysqlnd_res::store_result */ |
static MYSQLND_RES * |
static MYSQLND_RES * |
MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, |
MYSQLND_METHOD(mysqlnd_res, store_result)(MYSQLND_RES * result, |
MYSQLND * const conn, | MYSQLND_CONN_DATA * const conn, |
zend_bool ps_protocol TSRMLS_DC) |
zend_bool ps_protocol TSRMLS_DC) |
{ |
{ |
enum_func_status ret; |
enum_func_status ret; |
zend_bool to_cache = FALSE; |
|
|
|
DBG_ENTER("mysqlnd_res::store_result"); |
DBG_ENTER("mysqlnd_res::store_result"); |
DBG_INF_FMT("conn=%u ps_protocol=%u", conn->thread_id, ps_protocol); |
|
|
|
/* We need the conn because we are doing lazy zval initialization in buffered_fetch_row */ |
/* We need the conn because we are doing lazy zval initialization in buffered_fetch_row */ |
result->conn = conn->m->get_reference(conn TSRMLS_CC); |
result->conn = conn->m->get_reference(conn TSRMLS_CC); |
result->type = MYSQLND_RES_NORMAL; |
result->type = MYSQLND_RES_NORMAL; |
result->m.fetch_row = result->m.fetch_row_normal_buffered; |
result->m.fetch_row = result->m.fetch_row_normal_buffered; |
result->m.fetch_lengths = mysqlnd_fetch_lengths_buffered; |
result->m.fetch_lengths = mysqlnd_fetch_lengths_buffered; |
|
result->m.row_decoder = ps_protocol? php_mysqlnd_rowp_read_binary_protocol: |
|
php_mysqlnd_rowp_read_text_protocol; |
|
|
result->result_set_memory_pool = mysqlnd_mempool_create(MYSQLND_G(mempool_default_size) TSRMLS_CC); |
result->result_set_memory_pool = mysqlnd_mempool_create(MYSQLND_G(mempool_default_size) TSRMLS_CC); |
result->lengths = mnd_ecalloc(result->field_count, sizeof(unsigned long)); |
result->lengths = mnd_ecalloc(result->field_count, sizeof(unsigned long)); |
|
|
if (!result->result_set_memory_pool || !result->lengths) { |
if (!result->result_set_memory_pool || !result->lengths) { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
DBG_RETURN(NULL); |
DBG_RETURN(NULL); |
} |
} |
|
|
CONN_SET_STATE(conn, CONN_FETCHING_DATA); |
CONN_SET_STATE(conn, CONN_FETCHING_DATA); |
|
|
ret = result->m.store_result_fetch_data(conn, result, result->meta, ps_protocol, to_cache TSRMLS_CC); | ret = result->m.store_result_fetch_data(conn, result, result->meta, ps_protocol TSRMLS_CC); |
if (FAIL == ret) { |
if (FAIL == ret) { |
if (result->stored_data) { |
if (result->stored_data) { |
conn->error_info = result->stored_data->error_info; | COPY_CLIENT_ERROR(*conn->error_info, result->stored_data->error_info); |
} else { |
} else { |
SET_OOM_ERROR(conn->error_info); | SET_OOM_ERROR(*conn->error_info); |
} |
} |
DBG_RETURN(NULL); |
DBG_RETURN(NULL); |
} |
} |
/* libmysql's documentation says it should be so for SELECT statements */ |
/* 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); |
DBG_RETURN(result); |
} |
} |
Line 1357 static enum_func_status
|
Line 1325 static enum_func_status
|
MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC) |
MYSQLND_METHOD(mysqlnd_res, free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC) |
{ |
{ |
DBG_ENTER("mysqlnd_res::free_result"); |
DBG_ENTER("mysqlnd_res::free_result"); |
DBG_INF_FMT("implicit=%u", implicit); |
|
|
|
result->m.skip_result(result TSRMLS_CC); |
result->m.skip_result(result TSRMLS_CC); |
MYSQLND_INC_CONN_STATISTIC(result->conn? result->conn->stats : NULL, |
MYSQLND_INC_CONN_STATISTIC(result->conn? result->conn->stats : NULL, |
Line 1522 MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_
|
Line 1489 MYSQLND_METHOD(mysqlnd_res, field_tell)(const MYSQLND_
|
/* }}} */ |
/* }}} */ |
|
|
|
|
/* for php_addslashes */ |
|
#include "ext/standard/php_string.h" |
|
|
|
/* {{{ mysqlnd_res::fetch_into */ |
/* {{{ mysqlnd_res::fetch_into */ |
static void |
static void |
MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, unsigned int flags, |
MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES * result, unsigned int flags, |
Line 1534 MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES *
|
Line 1498 MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES *
|
zend_bool fetched_anything; |
zend_bool fetched_anything; |
|
|
DBG_ENTER("mysqlnd_res::fetch_into"); |
DBG_ENTER("mysqlnd_res::fetch_into"); |
DBG_INF_FMT("flags=%u mysqlnd_extension=%u", flags, extension); |
|
|
|
if (!result->m.fetch_row) { |
if (!result->m.fetch_row) { |
RETVAL_NULL(); |
RETVAL_NULL(); |
Line 1559 MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES *
|
Line 1522 MYSQLND_METHOD(mysqlnd_res, fetch_into)(MYSQLND_RES *
|
break; |
break; |
default:exit(0); |
default:exit(0); |
} |
} |
} | } |
/* |
/* |
return_value is IS_NULL for no more data and an array for data. Thus it's ok |
return_value is IS_NULL for no more data and an array for data. Thus it's ok |
to return here. |
to return here. |
Line 1599 MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * r
|
Line 1562 MYSQLND_METHOD(mysqlnd_res, fetch_all)(MYSQLND_RES * r
|
MYSQLND_RES_BUFFERED *set = result->stored_data; |
MYSQLND_RES_BUFFERED *set = result->stored_data; |
|
|
DBG_ENTER("mysqlnd_res::fetch_all"); |
DBG_ENTER("mysqlnd_res::fetch_all"); |
DBG_INF_FMT("flags=%u", flags); |
|
|
|
if ((!result->unbuf && !set)) { |
if ((!result->unbuf && !set)) { |
php_error_docref(NULL TSRMLS_CC, E_WARNING, "fetch_all can be used only with buffered sets"); |
php_error_docref(NULL TSRMLS_CC, E_WARNING, "fetch_all can be used only with buffered sets"); |
if (result->conn) { |
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(); |
RETVAL_NULL(); |
DBG_VOID_RETURN; |
DBG_VOID_RETURN; |
Line 1672 MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_
|
Line 1634 MYSQLND_METHOD(mysqlnd_res, fetch_field_data)(MYSQLND_
|
/* }}} */ |
/* }}} */ |
|
|
|
|
static |
|
MYSQLND_CLASS_METHODS_START(mysqlnd_res) |
MYSQLND_CLASS_METHODS_START(mysqlnd_res) |
NULL, /* fetch_row */ |
NULL, /* fetch_row */ |
mysqlnd_fetch_row_buffered, |
mysqlnd_fetch_row_buffered, |
Line 1717 mysqlnd_result_init(unsigned int field_count, zend_boo
|
Line 1678 mysqlnd_result_init(unsigned int field_count, zend_boo
|
MYSQLND_RES *ret = mnd_pecalloc(1, alloc_size, persistent); |
MYSQLND_RES *ret = mnd_pecalloc(1, alloc_size, persistent); |
|
|
DBG_ENTER("mysqlnd_result_init"); |
DBG_ENTER("mysqlnd_result_init"); |
DBG_INF_FMT("field_count=%u", field_count); |
|
|
|
if (!ret) { |
if (!ret) { |
DBG_RETURN(NULL); |
DBG_RETURN(NULL); |
Line 1725 mysqlnd_result_init(unsigned int field_count, zend_boo
|
Line 1685 mysqlnd_result_init(unsigned int field_count, zend_boo
|
|
|
ret->persistent = persistent; |
ret->persistent = persistent; |
ret->field_count = field_count; |
ret->field_count = field_count; |
ret->m = mysqlnd_mysqlnd_res_methods; | ret->m = *mysqlnd_result_get_methods(); |
|
|
DBG_RETURN(ret); |
DBG_RETURN(ret); |
} |
} |
/* }}} */ |
/* }}} */ |
|
|
|
|
/* {{{ _mysqlnd_plugin_get_plugin_result_data */ |
|
PHPAPI void ** _mysqlnd_plugin_get_plugin_result_data(const MYSQLND_RES * result, unsigned int plugin_id TSRMLS_DC) |
|
{ |
|
DBG_ENTER("_mysqlnd_plugin_get_plugin_result_data"); |
|
DBG_INF_FMT("plugin_id=%u", plugin_id); |
|
if (!result || plugin_id >= mysqlnd_plugin_count()) { |
|
return NULL; |
|
} |
|
DBG_RETURN((void *)((char *)result + sizeof(MYSQLND_RES) + plugin_id * sizeof(void *))); |
|
} |
|
/* }}} */ |
|
|
|
|
|
/* {{{ mysqlnd_result_get_methods */ |
|
PHPAPI struct st_mysqlnd_res_methods * |
|
mysqlnd_result_get_methods() |
|
{ |
|
return &mysqlnd_mysqlnd_res_methods; |
|
} |
|
/* }}} */ |
|
|
|
/* |
/* |
* Local variables: |
* Local variables: |