38static void mysqlnd_stmt_separate_result_bind(
MYSQLND_STMT *
const stmt);
50 if (conn->command->stmt_fetch(conn, payload) ==
FAIL) {
79 DBG_ENTER(
"mysqlnd_stmt::store_result");
80 if (!stmt || !conn || !stmt->
result) {
91 if (!mysqlnd_stmt_check_state(stmt)) {
103 if (mysqlnd_stmt_send_cursor_fetch_command(stmt, -1) ==
FAIL) {
113 if (!
result->stored_data) {
121 result->stored_data->current_row = 0;
149 DBG_ENTER(
"mysqlnd_stmt::get_result");
150 if (!stmt || !conn || !stmt->
result) {
161 if (!mysqlnd_stmt_check_state(stmt)) {
171 if (mysqlnd_stmt_send_cursor_fetch_command(stmt, -1) ==
FAIL) {
215 DBG_ENTER(
"mysqlnd_stmt::more_results");
229 DBG_ENTER(
"mysqlnd_stmt::next_result");
230 if (!stmt || !conn || !stmt->
result) {
242 s->m->free_stmt_result(
s);
263 DBG_ENTER(
"mysqlnd_stmt_skip_metadata");
264 if (!stmt || !conn) {
301 DBG_ENTER(
"mysqlnd_stmt_read_prepare_response");
302 if (!stmt || !conn) {
341 DBG_ENTER(
"mysqlnd_stmt_prepare_read_eof");
342 if (!stmt || !conn) {
377 DBG_ENTER(
"mysqlnd_stmt::prepare");
378 if (!stmt || !conn) {
382 DBG_INF_FMT(
"query=%s", query);
403 memcpy(tmp_swap,
s, real_size);
404 memcpy(
s, s_to_prepare, real_size);
405 memcpy(s_to_prepare, tmp_swap, real_size);
409 stmt_to_prepare = stmt;
410 stmt = tmp_swap_data;
412 s_to_prepare->m->dtor(s_to_prepare,
TRUE);
419 ret = conn->command->stmt_prepare(conn, query_string);
426 if (
FAIL == mysqlnd_stmt_read_prepare_response(
s)) {
431 if (
FAIL == mysqlnd_stmt_skip_metadata(
s) ||
432 FAIL == mysqlnd_stmt_prepare_read_eof(
s))
452 result->conn = conn->m->get_reference(conn);
457 FAIL == mysqlnd_stmt_prepare_read_eof(
s))
482 DBG_ENTER(
"mysqlnd_stmt_execute_parse_response");
483 if (!stmt || !conn) {
488 ret = conn->m->query_read_result_set_header(conn,
s);
525 stmt->
result->
conn = conn->m->get_reference(conn);
534 for (
unsigned i = conn->
field_count; i < stmt->field_count; i++) {
542 for (
unsigned i = stmt->
field_count; i < conn->field_count; i++) {
562 DBG_INF(
"cursor exists");
567 DBG_INF(
"use_result");
569 DBG_INF(
"asked for cursor but got none");
582 DBG_INF(
"store_result");
585 DBG_INF(
"no cursor");
588 DBG_INF(
"use_result");
592#ifndef MYSQLND_DONT_SKIP_OUT_PARAMS_RESULTSET
594 s->m->free_stmt_content(
s);
595 DBG_INF(
"PS OUT Variable RSet, skipping");
607 DBG_INF(
ret ==
PASS?
"PASS":
"FAIL");
617 DBG_ENTER(
"mysqlnd_stmt::execute");
639 DBG_ENTER(
"mysqlnd_stmt::send_execute");
640 if (!stmt || !conn) {
670 unsigned int i, not_bound = 0;
683 mnd_sprintf(&
msg, 0,
"No data supplied for %u parameter%s in prepared statement",
684 not_bound, not_bound>1 ?
"s":
"");
693 ret =
s->m->generate_execute_request(
s, &request, &request_len, &free_request);
697 ret = conn->command->stmt_execute(conn, payload);
726 DBG_ENTER(
"mysqlnd_stmt::use_result");
727 if (!stmt || !conn || !stmt->
result) {
732 if (!stmt->
field_count || !mysqlnd_stmt_check_state(stmt)) {
734 DBG_ERR(
"command out of sync");
749 DBG_INF_FMT(
"%p",
result);
765 DBG_ENTER(
"mysqlnd_fetch_stmt_row_cursor");
768 DBG_ERR(
"no statement");
776 DBG_ERR(
"command out of sync");
779 if (!(row_packet =
result->unbuf->row_packet)) {
787 if (mysqlnd_stmt_send_cursor_fetch_command(stmt, 1) ==
FAIL) {
791 checkpoint =
result->memory_pool->checkpoint;
799 *row_ptr =
result->row_data;
809 result->memory_pool->checkpoint = checkpoint;
813 DBG_INF(
"skipping extraction");
820 result->unbuf->row_count++;
821 *fetched_anything =
TRUE;
823 *fetched_anything =
FALSE;
830 result->unbuf->eof_reached = row_packet->
eof;
839 result->memory_pool->checkpoint = checkpoint;
841 DBG_INF_FMT(
"ret=%s fetched=%u server_status=%u warnings=%u eof=%u",
842 ret ==
PASS?
"PASS":
"FAIL", *fetched_anything,
844 result->unbuf->eof_reached);
857 DBG_ENTER(
"mysqlnd_stmt::fetch");
858 if (!stmt || !stmt->
conn) {
865 DBG_ERR(
"command out of sync");
879 ret = stmt->
result->m.fetch_row(stmt->
result, &row_data, 0, fetched_anything);
880 if (
ret ==
PASS && *fetched_anything) {
882 for (
unsigned i = 0; i < field_count; i++) {
885 DBG_INF_FMT(
"i=%u type=%u", i,
Z_TYPE(row_data[i]));
888 zval_ptr_dtor_nogc(&row_data[i]);
908 DBG_ENTER(
"mysqlnd_stmt::reset");
909 if (!stmt || !conn) {
921 DBG_INF(
"resetting long data");
939 size_t stmt_id = stmt->
stmt_id;
941 ret = stmt->
conn->command->stmt_reset(stmt->
conn, stmt_id);
948 DBG_INF(
ret ==
PASS?
"PASS":
"FAIL");
962 DBG_ENTER(
"mysqlnd_stmt::flush");
963 if (!stmt || !conn) {
976 DBG_INF(
"fetching result set header");
982 DBG_INF(
"skipping result");
987 DBG_INF(
ret ==
PASS?
"PASS":
"FAIL");
1003 DBG_ENTER(
"mysqlnd_stmt::send_long_data");
1004 if (!stmt || !conn) {
1014 DBG_ERR(
"not prepared");
1019 DBG_ERR(
"command out of sync");
1024 DBG_ERR(
"invalid param_no");
1029 DBG_ERR(
"param_no is not of a blob type");
1047 ret = conn->command->stmt_send_long_data(conn, payload);
1075#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
1076#if defined(HAVE_USLEEP) && !defined(PHP_WIN32)
1081 "while sending long data. Probably max_allowed_packet_size "
1082 "is smaller than the data. You have to increase it or send "
1083 "smaller chunks of data. Answer was %zu bytes long.", packet_len);
1085 "Server responded to COM_STMT_SEND_LONG_DATA.");
1091 DBG_INF(
ret ==
PASS?
"PASS":
"FAIL");
1104 DBG_ENTER(
"mysqlnd_stmt::bind_param");
1105 if (!stmt || !conn) {
1112 DBG_ERR(
"not prepared");
1114 s->m->free_parameter_bind(
s, param_bind);
1127 DBG_ERR(
"Re-binding (still) not supported");
1160 }
else if (param_bind && param_bind != stmt->
param_bind) {
1161 s->m->free_parameter_bind(
s, param_bind);
1177 DBG_ENTER(
"mysqlnd_stmt::bind_one_parameter");
1178 if (!stmt || !conn) {
1185 DBG_ERR(
"not prepared");
1191 DBG_ERR(
"invalid param_no");
1233 DBG_ENTER(
"mysqlnd_stmt::refresh_bind_param");
1234 if (!stmt || !conn) {
1241 DBG_ERR(
"not prepared");
1264 DBG_ENTER(
"mysqlnd_stmt::bind_result");
1265 if (!stmt || !conn) {
1273 s->m->free_result_bind(
s, result_bind);
1275 DBG_ERR(
"not prepared");
1286 DBG_ERR(
"no result bind passed");
1290 mysqlnd_stmt_separate_result_bind(
s);
1305 }
else if (result_bind) {
1306 s->m->free_result_bind(
s, result_bind);
1321 DBG_ENTER(
"mysqlnd_stmt::bind_one_result");
1322 if (!stmt || !conn) {
1329 DBG_ERR(
"not prepared");
1335 DBG_ERR(
"invalid param_no");
1476 DBG_ENTER(
"mysqlnd_stmt::result_metadata");
1477 if (!stmt || ! conn) {
1494 result_meta = conn->m->result_init(stmt->
field_count);
1500 if (!result_meta->
unbuf) {
1505 if (!result_meta->
meta) {
1509 DBG_INF_FMT(
"result_meta=%p", result_meta);
1515 result_meta->m.free_result(result_meta,
TRUE);
1526 const void *
const value)
1529 DBG_ENTER(
"mysqlnd_stmt::attr_set");
1535 switch (attr_type) {
1546 unsigned long ival = *(
unsigned long *)
value;
1572 DBG_ENTER(
"mysqlnd_stmt::attr_get");
1578 switch (attr_type) {
1581 DBG_INF_FMT(
"value=%d", *(
bool *)
value);
1585 DBG_INF_FMT(
"value=%lu", *(
unsigned long *)
value);
1603 DBG_ENTER(
"mysqlnd_stmt::free_result");
1604 if (!stmt || !conn) {
1610 DBG_INF(
"no result");
1619 DBG_INF(
"fetching result set header");
1626 DBG_INF(
"skipping result");
1633 mysqlnd_stmt_separate_result_bind(
s);
1656 DBG_ENTER(
"mysqlnd_stmt_separate_result_bind");
1692 DBG_ENTER(
"mysqlnd_stmt::free_stmt_result");
1701 mysqlnd_stmt_separate_result_bind(
s);
1719 DBG_ENTER(
"mysqlnd_stmt::free_stmt_content");
1744 s->m->free_stmt_result(
s);
1758 DBG_ENTER(
"mysqlnd_stmt::close_on_server");
1759 if (!stmt || !conn) {
1774 DBG_INF(
"fetching result set header");
1781 DBG_INF(
"skipping result");
1795 const size_t stmt_id = stmt->
stmt_id;
1797 ret = conn->command->stmt_close(conn, stmt_id);
1823 s->m->free_stmt_content(
s);
1826 conn->m->free_reference(conn);
1841 DBG_ENTER(
"mysqlnd_stmt::dtor");
1843 DBG_INF_FMT(
"stmt=%p", stmt);
1848 ret =
s->m->close_on_server(
s, implicit);
1853 DBG_INF(
ret ==
PASS?
"PASS":
"FAIL");
1864 DBG_ENTER(
"mysqlnd_stmt::alloc_param_bind");
1878 DBG_ENTER(
"mysqlnd_stmt::alloc_result_bind");
usleep(int $microseconds)
reset(array|object &$array)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
PHPAPI ZEND_COLD void php_error_docref(const char *docref, int type, const char *format,...)
#define MYSQLND_INC_GLOBAL_STATISTIC(statistic)
#define mysqlnd_stmt_next_result(stmt)
PHPAPI unsigned int mysqlnd_plugin_count(void)
#define mysqlnd_num_rows(result)
#define MYSQLND_METHOD_PRIVATE(class, method)
#define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic)
#define mysqlnd_stmt_more_results(stmt)
zend_long mempool_default_size
#define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value)
#define MYSQLND_METHOD(class, method)
#define mnd_sprintf_free(p)
#define mnd_sprintf(p, mx_len, fmt,...)
#define mnd_erealloc(ptr, new_size)
#define mnd_ecalloc(nmemb, size)
#define mnd_emalloc(size)
PHPAPI void mysqlnd_mempool_destroy(MYSQLND_MEMORY_POOL *pool)
PHPAPI void mysqlnd_mempool_restore_state(MYSQLND_MEMORY_POOL *pool)
PHPAPI void mysqlnd_mempool_save_state(MYSQLND_MEMORY_POOL *pool)
PHPAPI MYSQLND_MEMORY_POOL * mysqlnd_mempool_create(size_t arena_size)
PHPAPI const char *const mysqlnd_out_of_sync
#define SET_CONNECTION_STATE(state_struct, s)
#define UPSERT_STATUS_GET_AFFECTED_ROWS(status)
#define UPSERT_STATUS_GET_SERVER_STATUS(status)
#define UPSERT_STATUS_GET_WARNINGS(status)
#define UPSERT_STATUS_GET_LAST_INSERT_ID(status)
#define UPSERT_STATUS_SET_WARNINGS(status, warnings)
#define UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(status)
#define GET_CONNECTION_STATE(state_struct)
#define UPSERT_STATUS_SET_LAST_INSERT_ID(status, id)
#define UPSERT_STATUS_RESET(status)
#define UPSERT_STATUS_SET_AFFECTED_ROWS(status, rows)
#define UPSERT_STATUS_SET_SERVER_STATUS(status, server_st)
#define DBG_RETURN(value)
@ CONN_NEXT_RESULT_PENDING
enum mysqlnd_send_execute_type enum_mysqlnd_send_execute_type
#define SERVER_STATUS_CURSOR_EXISTS
#define CR_NOT_IMPLEMENTED
#define MYSQLND_SQLSTATE_NULL
@ STAT_FREE_RESULT_EXPLICIT
@ STAT_PS_PREPARED_NEVER_EXECUTED
@ STAT_STMT_CLOSE_EXPLICIT
@ STAT_FREE_RESULT_IMPLICIT
@ STAT_PS_PREPARED_ONCE_USED
@ STAT_STMT_CLOSE_IMPLICIT
@ STAT_PS_UNBUFFERED_SETS
@ STAT_ROWS_FETCHED_FROM_CLIENT_PS_CURSOR
@ MYSQLND_PARSE_EXEC_RESPONSE_IMPLICIT
@ MYSQLND_PARSE_EXEC_RESPONSE_IMPLICIT_OUT_VARIABLES
@ MYSQLND_PARSE_EXEC_RESPONSE_IMPLICIT_NEXT_RESULT
#define CR_NO_PREPARE_STMT
#define SERVER_PS_OUT_PARAMS
#define CR_PARAMS_NOT_BOUND
enum mysqlnd_collected_stats enum_mysqlnd_collected_stats
#define CR_INVALID_PARAMETER_NO
#define MYSQLND_STMT_ID_LENGTH
@ MYSQLND_STMT_WAITING_USE_OR_STORE
@ MYSQLND_STMT_USER_FETCHING
@ MYSQLND_STMT_USE_OR_STORE_CALLED
#define CR_CONNECTION_ERROR
@ STMT_ATTR_UPDATE_MAX_LENGTH
#define CR_COMMANDS_OUT_OF_SYNC
@ COM_STMT_SEND_LONG_DATA
enum mysqlnd_parse_exec_response_type enum_mysqlnd_parse_exec_response_type
#define CR_INVALID_BUFFER_USE
#define SERVER_MORE_RESULTS_EXISTS
@ MYSQLND_PARAM_BIND_BLOB_USED
enum func_status enum_func_status
@ MYSQLND_SEND_EXECUTE_IMPLICIT
#define mysqlnd_stmt_set_methods(m)
void _mysqlnd_init_ps_subsystem(void)
const char *const mysqlnd_not_bound_as_blob
mysqlnd_stmt_execute_generate_request
enum_func_status mysqlnd_stmt_execute_batch_generate_request(MYSQLND_STMT *const s, zend_uchar **request, size_t *request_len, bool *free_buffer)
enum_func_status mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES *result, zval **row_ptr, const unsigned int flags, bool *fetched_anything)
const char *const mysqlnd_stmt_not_prepared
mysqlnd_stmt_execute_parse_response
void _mysqlnd_init_ps_fetch_subsystem(void)
PHPAPI MYSQLND_RES_BUFFERED * mysqlnd_result_buffered_init(MYSQLND_RES *result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt)
PHPAPI MYSQLND_RES_UNBUFFERED * mysqlnd_result_unbuffered_init(MYSQLND_RES *result, const unsigned int field_count, MYSQLND_STMT_DATA *stmt)
#define MYSQLND_CLASS_METHODS_END
struct st_mysqlnd_connection_data MYSQLND_CONN_DATA
struct st_mysqlnd_const_string MYSQLND_CSTRING
struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL
struct st_mysqlnd_param_bind MYSQLND_PARAM_BIND
#define SET_EMPTY_ERROR(info)
struct st_mysqlnd_stmt_data MYSQLND_STMT_DATA
#define COPY_CLIENT_ERROR(dest, source)
struct st_mysqlnd_stmt MYSQLND_STMT
#define SET_OOM_ERROR(info)
struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND
#define SET_CLIENT_ERROR(info, err_no, sqlstate, error)
#define MYSQLND_CLASS_METHODS_START(class)
struct st_mysqlnd_res MYSQLND_RES
#define MYSQLND_CLASS_METHOD_TABLE_NAME(class)
struct st_mysqlnd_packet_prepare_response MYSQLND_PACKET_PREPARE_RESPONSE
struct st_mysqlnd_packet_eof MYSQLND_PACKET_EOF
#define PACKET_FREE(packet)
struct st_mysqlnd_packet_res_field MYSQLND_PACKET_RES_FIELD
#define PACKET_READ(conn, packet)
struct st_mysqlnd_packet_row MYSQLND_PACKET_ROW
MYSQLND_SESSION_OPTIONS * options
MYSQLND_UPSERT_STATUS * upsert_status
enum_mysqlnd_query_type last_query_type
MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory
MYSQLND_ERROR_INFO * error_info
MYSQLND_PFC * protocol_frame_codec
MYSQLND_CONNECTION_STATE state
char sqlstate[MYSQLND_SQLSTATE_LENGTH+1]
char error[MYSQLND_ERRMSG_SIZE+1]
unsigned int warning_count
MYSQLND_ERROR_INFO error_info
MYSQLND_MEMORY_POOL * memory_pool
MYSQLND_FIELD * fields_metadata
MYSQLND_ROW_BUFFER row_buffer
enum_param_bind_flags flags
MYSQLND_RES_METADATA * meta
MYSQLND_RES_UNBUFFERED * unbuf
MYSQLND_RES_BUFFERED * stored_data
enum_mysqlnd_res_type type
bool int_and_float_native
enum_mysqlnd_stmt_state state
mysqlnd_stmt_use_or_store_func default_rset_handler
MYSQLND_CMD_BUFFER execute_cmd_buffer
unsigned int execute_count
unsigned char send_types_to_server
MYSQLND_ERROR_INFO * error_info
MYSQLND_UPSERT_STATUS * upsert_status
MYSQLND_PARAM_BIND * param_bind
MYSQLND_RESULT_BIND * result_bind
#define ZEND_TRY_ASSIGN_VALUE_EX(zv, other_zv, strict)
ZEND_API void zend_llist_clean(zend_llist *l)
#define Z_TRY_ADDREF_P(pz)
#define Z_REFCOUNTED(zval)
#define ZVAL_COPY_VALUE(z, v)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)