1 /* 2 +----------------------------------------------------------------------+ 3 | PHP Version 5 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2006-2013 The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.php.net/license/3_01.txt | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Authors: Georg Richter <georg@mysql.com> | 16 | Andrey Hristov <andrey@mysql.com> | 17 | Ulf Wendel <uwendel@mysql.com> | 18 +----------------------------------------------------------------------+ 19 */ 20 21 /* $Id$ */ 22 23 #ifndef MYSQLND_STRUCTS_H 24 #define MYSQLND_STRUCTS_H 25 26 #define MYSQLND_TYPEDEFED_METHODS 27 28 typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL; 29 typedef struct st_mysqlnd_memory_pool_chunk MYSQLND_MEMORY_POOL_CHUNK; 30 typedef struct st_mysqlnd_memory_pool_chunk_llist MYSQLND_MEMORY_POOL_CHUNK_LLIST; 31 32 33 #define MYSQLND_MEMORY_POOL_CHUNK_LIST_SIZE 100 34 35 struct st_mysqlnd_memory_pool 36 { 37 zend_uchar *arena; 38 unsigned int refcount; 39 unsigned int arena_size; 40 unsigned int free_size; 41 42 MYSQLND_MEMORY_POOL_CHUNK* (*get_chunk)(MYSQLND_MEMORY_POOL * pool, unsigned int size TSRMLS_DC); 43 }; 44 45 struct st_mysqlnd_memory_pool_chunk 46 { 47 size_t app; 48 MYSQLND_MEMORY_POOL *pool; 49 zend_uchar *ptr; 50 unsigned int size; 51 enum_func_status (*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC); 52 void (*free_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk TSRMLS_DC); 53 zend_bool from_pool; 54 }; 55 56 57 typedef struct st_mysqlnd_cmd_buffer 58 { 59 zend_uchar *buffer; 60 size_t length; 61 } MYSQLND_CMD_BUFFER; 62 63 64 typedef struct st_mysqlnd_field 65 { 66 const char *name; /* Name of column */ 67 const char *org_name; /* Original column name, if an alias */ 68 const char *table; /* Table of column if column was a field */ 69 const char *org_table; /* Org table name, if table was an alias */ 70 const char *db; /* Database for table */ 71 const char *catalog; /* Catalog for table */ 72 char *def; /* Default value (set by mysql_list_fields) */ 73 unsigned long length; /* Width of column (create length) */ 74 unsigned long max_length; /* Max width for selected set */ 75 unsigned int name_length; 76 unsigned int org_name_length; 77 unsigned int table_length; 78 unsigned int org_table_length; 79 unsigned int db_length; 80 unsigned int catalog_length; 81 unsigned int def_length; 82 unsigned int flags; /* Diverse flags */ 83 unsigned int decimals; /* Number of decimals in field */ 84 unsigned int charsetnr; /* Character set */ 85 enum mysqlnd_field_types type; /* Type of field. See mysql_com.h for types */ 86 char *root; 87 size_t root_len; 88 } MYSQLND_FIELD; 89 90 91 typedef struct st_mysqlnd_upsert_result 92 { 93 unsigned int warning_count; 94 unsigned int server_status; 95 uint64_t affected_rows; 96 uint64_t last_insert_id; 97 } MYSQLND_UPSERT_STATUS; 98 99 100 typedef struct st_mysqlnd_error_info 101 { 102 char error[MYSQLND_ERRMSG_SIZE+1]; 103 char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1]; 104 unsigned int error_no; 105 } MYSQLND_ERROR_INFO; 106 107 108 typedef struct st_mysqlnd_infile_info 109 { 110 php_stream *fd; 111 int error_no; 112 char error_msg[MYSQLND_ERRMSG_SIZE + 1]; 113 const char *filename; 114 } MYSQLND_INFILE_INFO; 115 116 117 /* character set information */ 118 typedef struct st_mysqlnd_charset 119 { 120 unsigned int nr; 121 const char *name; 122 const char *collation; 123 unsigned int char_minlen; 124 unsigned int char_maxlen; 125 const char *comment; 126 unsigned int (*mb_charlen)(unsigned int c); 127 unsigned int (*mb_valid)(const char *start, const char *end); 128 } MYSQLND_CHARSET; 129 130 131 /* local infile handler */ 132 typedef struct st_mysqlnd_infile 133 { 134 int (*local_infile_init)(void **ptr, char *filename, void **userdata TSRMLS_DC); 135 int (*local_infile_read)(void *ptr, char *buf, unsigned int buf_len TSRMLS_DC); 136 int (*local_infile_error)(void *ptr, char *error_msg, unsigned int error_msg_len TSRMLS_DC); 137 void (*local_infile_end)(void *ptr TSRMLS_DC); 138 zval *callback; 139 void *userdata; 140 } MYSQLND_INFILE; 141 142 typedef struct st_mysqlnd_options 143 { 144 ulong flags; 145 146 /* init commands - we need to send them to server directly after connect */ 147 unsigned int num_commands; 148 char **init_commands; 149 150 /* configuration file information */ 151 char *cfg_file; 152 char *cfg_section; 153 154 /* 155 We need to keep these because otherwise st_mysqlnd_conn will be changed. 156 The ABI will be broken and the methods structure will be somewhere else 157 in the memory which can crash external code. Feel free to reuse these. 158 */ 159 char * unused1; 160 char * unused2; 161 char * unused3; 162 char * unused4; 163 char * unused5; 164 165 enum_mysqlnd_protocol_type protocol; 166 167 char *charset_name; 168 /* maximum allowed packet size for communication */ 169 ulong max_allowed_packet; 170 171 zend_bool numeric_and_datetime_as_unicode; 172 #ifdef MYSQLND_STRING_TO_INT_CONVERSION 173 zend_bool int_and_float_native; 174 #endif 175 } MYSQLND_OPTIONS; 176 177 typedef struct st_mysqlnd_net_options 178 { 179 /* timeouts */ 180 unsigned int timeout_connect; 181 unsigned int timeout_read; 182 unsigned int timeout_write; 183 184 unsigned int net_read_buffer_size; 185 186 /* SSL information */ 187 char *ssl_key; 188 char *ssl_cert; 189 char *ssl_ca; 190 char *ssl_capath; 191 char *ssl_cipher; 192 char *ssl_passphrase; 193 zend_bool ssl_verify_peer; 194 uint64_t flags; 195 } MYSQLND_NET_OPTIONS; 196 197 198 typedef struct st_mysqlnd_connection MYSQLND; 199 typedef struct st_mysqlnd_net MYSQLND_NET; 200 typedef struct st_mysqlnd_protocol MYSQLND_PROTOCOL; 201 typedef struct st_mysqlnd_res MYSQLND_RES; 202 typedef char** MYSQLND_ROW_C; /* return data as array of strings */ 203 typedef struct st_mysqlnd_stmt_data MYSQLND_STMT_DATA; 204 typedef struct st_mysqlnd_stmt MYSQLND_STMT; 205 typedef unsigned int MYSQLND_FIELD_OFFSET; 206 207 typedef struct st_mysqlnd_param_bind MYSQLND_PARAM_BIND; 208 209 typedef struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND; 210 211 typedef struct st_mysqlnd_result_metadata MYSQLND_RES_METADATA; 212 typedef struct st_mysqlnd_buffered_result MYSQLND_RES_BUFFERED; 213 typedef struct st_mysqlnd_unbuffered_result MYSQLND_RES_UNBUFFERED; 214 215 typedef struct st_mysqlnd_debug MYSQLND_DEBUG; 216 217 218 typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * const TSRMLS_DC); 219 typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result, 220 void *param, 221 unsigned int flags, 222 zend_bool *fetched_anything 223 TSRMLS_DC); 224 225 typedef struct st_mysqlnd_stats MYSQLND_STATS; 226 227 typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change TSRMLS_DC); 228 229 struct st_mysqlnd_stats 230 { 231 uint64_t *values; 232 mysqlnd_stat_trigger *triggers; 233 size_t count; 234 zend_bool in_trigger; 235 #ifdef ZTS 236 MUTEX_T LOCK_access; 237 #endif 238 }; 239 240 241 typedef struct st_mysqlnd_read_buffer { 242 zend_uchar * data; 243 size_t offset; 244 size_t size; 245 size_t len; 246 zend_bool (*is_empty)(struct st_mysqlnd_read_buffer *); 247 void (*read)(struct st_mysqlnd_read_buffer *, size_t count, zend_uchar * dest); 248 size_t (*bytes_left)(struct st_mysqlnd_read_buffer *); 249 void (*free_buffer)(struct st_mysqlnd_read_buffer ** TSRMLS_DC); 250 } MYSQLND_READ_BUFFER; 251 252 253 254 typedef enum_func_status (*func_mysqlnd_net__connect)(MYSQLND_NET * net, const char * const scheme, size_t scheme_len, zend_bool persistent, char **errstr, int * errcode TSRMLS_DC); 255 typedef size_t (*func_mysqlnd_net__send)(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC); 256 typedef enum_func_status (*func_mysqlnd_net__receive)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC); 257 typedef enum_func_status (*func_mysqlnd_net__set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_option option, const char * const value TSRMLS_DC); 258 typedef enum_func_status (*func_mysqlnd_net__network_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC); 259 typedef size_t (*func_mysqlnd_net__network_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC); 260 typedef enum_func_status (*func_mysqlnd_net__decode)(zend_uchar * uncompressed_data, size_t uncompressed_data_len, const zend_uchar * const compressed_data, size_t compressed_data_len TSRMLS_DC); 261 typedef enum_func_status (*func_mysqlnd_net__encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC); 262 typedef size_t (*func_mysqlnd_net__consume_uneaten_data)(MYSQLND_NET * const net, enum php_mysqlnd_server_command cmd TSRMLS_DC); 263 typedef void (*func_mysqlnd_net__free_contents)(MYSQLND_NET * net TSRMLS_DC); 264 typedef enum_func_status (*func_mysqlnd_net__enable_ssl)(MYSQLND_NET * const net TSRMLS_DC); 265 typedef enum_func_status (*func_mysqlnd_net__disable_ssl)(MYSQLND_NET * const net TSRMLS_DC); 266 267 268 struct st_mysqlnd_net_methods 269 { 270 func_mysqlnd_net__connect connect; 271 func_mysqlnd_net__send send; 272 func_mysqlnd_net__receive receive; 273 func_mysqlnd_net__set_client_option set_client_option; 274 func_mysqlnd_net__network_read network_read; 275 func_mysqlnd_net__network_write network_write; 276 func_mysqlnd_net__decode decode; 277 func_mysqlnd_net__encode encode; 278 func_mysqlnd_net__consume_uneaten_data consume_uneaten_data; 279 func_mysqlnd_net__free_contents free_contents; 280 func_mysqlnd_net__enable_ssl enable_ssl; 281 func_mysqlnd_net__disable_ssl disable_ssl; 282 283 void * unused1; 284 void * unused2; 285 void * unused3; 286 void * unused4; 287 void * unused5; 288 }; 289 290 291 struct st_mysqlnd_packet_greet; 292 struct st_mysqlnd_packet_greet; 293 struct st_mysqlnd_packet_auth; 294 struct st_mysqlnd_packet_ok; 295 struct st_mysqlnd_packet_command; 296 struct st_mysqlnd_packet_eof; 297 struct st_mysqlnd_packet_rset_header; 298 struct st_mysqlnd_packet_res_field; 299 struct st_mysqlnd_packet_row; 300 struct st_mysqlnd_packet_stats; 301 struct st_mysqlnd_packet_prepare_response; 302 struct st_mysqlnd_packet_chg_user_resp; 303 304 typedef struct st_mysqlnd_packet_greet * (*func_mysqlnd_protocol__get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 305 typedef struct st_mysqlnd_packet_auth * (*func_mysqlnd_protocol__get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 306 typedef struct st_mysqlnd_packet_ok * (*func_mysqlnd_protocol__get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 307 typedef struct st_mysqlnd_packet_command * (*func_mysqlnd_protocol__get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 308 typedef struct st_mysqlnd_packet_eof * (*func_mysqlnd_protocol__get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 309 typedef struct st_mysqlnd_packet_rset_header * (*func_mysqlnd_protocol__get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 310 typedef struct st_mysqlnd_packet_res_field * (*func_mysqlnd_protocol__get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 311 typedef struct st_mysqlnd_packet_row * (*func_mysqlnd_protocol__get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 312 typedef struct st_mysqlnd_packet_stats * (*func_mysqlnd_protocol__get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 313 typedef struct st_mysqlnd_packet_prepare_response *(*func_mysqlnd_protocol__get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 314 typedef struct st_mysqlnd_packet_chg_user_resp*(*func_mysqlnd_protocol__get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC); 315 316 struct st_mysqlnd_protocol_methods 317 { 318 func_mysqlnd_protocol__get_greet_packet get_greet_packet; 319 func_mysqlnd_protocol__get_auth_packet get_auth_packet; 320 func_mysqlnd_protocol__get_ok_packet get_ok_packet; 321 func_mysqlnd_protocol__get_command_packet get_command_packet; 322 func_mysqlnd_protocol__get_eof_packet get_eof_packet; 323 func_mysqlnd_protocol__get_rset_header_packet get_rset_header_packet; 324 func_mysqlnd_protocol__get_result_field_packet get_result_field_packet; 325 func_mysqlnd_protocol__get_row_packet get_row_packet; 326 func_mysqlnd_protocol__get_stats_packet get_stats_packet; 327 func_mysqlnd_protocol__get_prepare_response_packet get_prepare_response_packet; 328 func_mysqlnd_protocol__get_change_user_response_packet get_change_user_response_packet; 329 330 void * unused1; 331 void * unused2; 332 void * unused3; 333 void * unused4; 334 void * unused5; 335 }; 336 337 338 339 typedef enum_func_status (*func_mysqlnd_conn__init)(MYSQLND * conn TSRMLS_DC); 340 typedef enum_func_status (*func_mysqlnd_conn__connect)(MYSQLND *conn, const char *host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket_or_pipe, unsigned int mysql_flags TSRMLS_DC); 341 typedef ulong (*func_mysqlnd_conn__escape_string)(MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC); 342 typedef enum_func_status (*func_mysqlnd_conn__set_charset)(MYSQLND * const conn, const char * const charset TSRMLS_DC); 343 typedef enum_func_status (*func_mysqlnd_conn__query)(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC); 344 typedef enum_func_status (*func_mysqlnd_conn__send_query)(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC); 345 typedef enum_func_status (*func_mysqlnd_conn__reap_query)(MYSQLND *conn TSRMLS_DC); 346 typedef MYSQLND_RES * (*func_mysqlnd_conn__use_result)(MYSQLND * const conn TSRMLS_DC); 347 typedef MYSQLND_RES * (*func_mysqlnd_conn__store_result)(MYSQLND * const conn TSRMLS_DC); 348 typedef enum_func_status (*func_mysqlnd_conn__next_result)(MYSQLND * const conn TSRMLS_DC); 349 typedef zend_bool (*func_mysqlnd_conn__more_results)(const MYSQLND * const conn TSRMLS_DC); 350 351 typedef MYSQLND_STMT * (*func_mysqlnd_conn__stmt_init)(MYSQLND * const conn TSRMLS_DC); 352 353 typedef enum_func_status (*func_mysqlnd_conn__shutdown_server)(MYSQLND * const conn, uint8_t level TSRMLS_DC); 354 typedef enum_func_status (*func_mysqlnd_conn__refresh_server)(MYSQLND * const conn, uint8_t options TSRMLS_DC); 355 356 typedef enum_func_status (*func_mysqlnd_conn__ping)(MYSQLND * const conn TSRMLS_DC); 357 typedef enum_func_status (*func_mysqlnd_conn__kill_connection)(MYSQLND *conn, unsigned int pid TSRMLS_DC); 358 typedef enum_func_status (*func_mysqlnd_conn__select_db)(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC); 359 typedef enum_func_status (*func_mysqlnd_conn__server_dump_debug_information)(MYSQLND * const conn TSRMLS_DC); 360 typedef enum_func_status (*func_mysqlnd_conn__change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db, zend_bool silent TSRMLS_DC); 361 362 typedef unsigned int (*func_mysqlnd_conn__get_error_no)(const MYSQLND * const conn TSRMLS_DC); 363 typedef const char * (*func_mysqlnd_conn__get_error_str)(const MYSQLND * const conn TSRMLS_DC); 364 typedef const char * (*func_mysqlnd_conn__get_sqlstate)(const MYSQLND * const conn TSRMLS_DC); 365 typedef uint64_t (*func_mysqlnd_conn__get_thread_id)(const MYSQLND * const conn TSRMLS_DC); 366 typedef void (*func_mysqlnd_conn__get_statistics)(const MYSQLND * const conn, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); 367 368 typedef unsigned long (*func_mysqlnd_conn__get_server_version)(const MYSQLND * const conn TSRMLS_DC); 369 typedef const char * (*func_mysqlnd_conn__get_server_information)(const MYSQLND * const conn TSRMLS_DC); 370 typedef enum_func_status (*func_mysqlnd_conn__get_server_statistics)(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC); 371 typedef const char * (*func_mysqlnd_conn__get_host_information)(const MYSQLND * const conn TSRMLS_DC); 372 typedef unsigned int (*func_mysqlnd_conn__get_protocol_information)(const MYSQLND * const conn TSRMLS_DC); 373 typedef const char * (*func_mysqlnd_conn__get_last_message)(const MYSQLND * const conn TSRMLS_DC); 374 typedef const char * (*func_mysqlnd_conn__charset_name)(const MYSQLND * const conn TSRMLS_DC); 375 typedef MYSQLND_RES * (*func_mysqlnd_conn__list_fields)(MYSQLND *conn, const char *table, const char *achtung_wild TSRMLS_DC); 376 typedef MYSQLND_RES * (*func_mysqlnd_conn__list_method)(MYSQLND *conn, const char *query, const char *achtung_wild, char *par1 TSRMLS_DC); 377 378 typedef uint64_t (*func_mysqlnd_conn__get_last_insert_id)(const MYSQLND * const conn TSRMLS_DC); 379 typedef uint64_t (*func_mysqlnd_conn__get_affected_rows)(const MYSQLND * const conn TSRMLS_DC); 380 typedef unsigned int (*func_mysqlnd_conn__get_warning_count)(const MYSQLND * const conn TSRMLS_DC); 381 382 typedef unsigned int (*func_mysqlnd_conn__get_field_count)(const MYSQLND * const conn TSRMLS_DC); 383 384 typedef enum_func_status (*func_mysqlnd_conn__set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option option TSRMLS_DC); 385 typedef enum_func_status (*func_mysqlnd_conn__set_client_option)(MYSQLND * const conn, enum_mysqlnd_option option, const char * const value TSRMLS_DC); 386 typedef void (*func_mysqlnd_conn__free_contents)(MYSQLND *conn TSRMLS_DC); /* private */ 387 typedef void (*func_mysqlnd_conn__free_options)(MYSQLND * conn TSRMLS_DC); /* private */ 388 typedef enum_func_status (*func_mysqlnd_conn__close)(MYSQLND *conn, enum_connection_close_type close_type TSRMLS_DC); 389 typedef void (*func_mysqlnd_conn__dtor)(MYSQLND *conn TSRMLS_DC); /* private */ 390 391 typedef enum_func_status (*func_mysqlnd_conn__query_read_result_set_header)(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC); 392 393 typedef MYSQLND * (*func_mysqlnd_conn__get_reference)(MYSQLND * const conn TSRMLS_DC); 394 typedef enum_func_status (*func_mysqlnd_conn__free_reference)(MYSQLND * const conn TSRMLS_DC); 395 typedef enum mysqlnd_connection_state (*func_mysqlnd_conn__get_state)(MYSQLND * const conn TSRMLS_DC); 396 typedef void (*func_mysqlnd_conn__set_state)(MYSQLND * const conn, enum mysqlnd_connection_state new_state TSRMLS_DC); 397 398 typedef enum_func_status (*func_mysqlnd_conn__simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command, const char * const arg, size_t arg_len, enum mysqlnd_packet_type ok_packet, zend_bool silent, zend_bool ignore_upsert_status TSRMLS_DC); 399 typedef enum_func_status (*func_mysqlnd_conn__simple_command_handle_response)(MYSQLND *conn, enum mysqlnd_packet_type ok_packet, zend_bool silent, enum php_mysqlnd_server_command command, zend_bool ignore_upsert_status TSRMLS_DC); 400 401 typedef enum_func_status (*func_mysqlnd_conn__restart_psession)(MYSQLND *conn TSRMLS_DC); 402 typedef enum_func_status (*func_mysqlnd_conn__end_psession)(MYSQLND *conn TSRMLS_DC); 403 typedef enum_func_status (*func_mysqlnd_conn__send_close)(MYSQLND * conn TSRMLS_DC); 404 405 typedef enum_func_status (*func_mysqlnd_conn__ssl_set)(MYSQLND * const conn, const char * key, const char * const cert, const char * const ca, const char * const capath, const char * const cipher TSRMLS_DC); 406 407 typedef MYSQLND_RES * (*func_mysqlnd_conn__result_init)(unsigned int field_count, zend_bool persistent TSRMLS_DC); 408 409 typedef enum_func_status (*func_mysqlnd_conn__set_autocommit)(MYSQLND * conn, unsigned int mode TSRMLS_DC); 410 typedef enum_func_status (*func_mysqlnd_conn__tx_commit)(MYSQLND * conn TSRMLS_DC); 411 typedef enum_func_status (*func_mysqlnd_conn__tx_rollback)(MYSQLND * conn TSRMLS_DC); 412 413 414 struct st_mysqlnd_conn_methods 415 { 416 func_mysqlnd_conn__init init; 417 func_mysqlnd_conn__connect connect; 418 func_mysqlnd_conn__escape_string escape_string; 419 func_mysqlnd_conn__set_charset set_charset; 420 func_mysqlnd_conn__query query; 421 func_mysqlnd_conn__send_query send_query; 422 func_mysqlnd_conn__reap_query reap_query; 423 func_mysqlnd_conn__use_result use_result; 424 func_mysqlnd_conn__store_result store_result; 425 func_mysqlnd_conn__next_result next_result; 426 func_mysqlnd_conn__more_results more_results; 427 428 func_mysqlnd_conn__stmt_init stmt_init; 429 430 func_mysqlnd_conn__shutdown_server shutdown_server; 431 func_mysqlnd_conn__refresh_server refresh_server; 432 433 func_mysqlnd_conn__ping ping; 434 func_mysqlnd_conn__kill_connection kill_connection; 435 func_mysqlnd_conn__select_db select_db; 436 func_mysqlnd_conn__server_dump_debug_information server_dump_debug_information; 437 func_mysqlnd_conn__change_user change_user; 438 439 func_mysqlnd_conn__get_error_no get_error_no; 440 func_mysqlnd_conn__get_error_str get_error_str; 441 func_mysqlnd_conn__get_sqlstate get_sqlstate; 442 func_mysqlnd_conn__get_thread_id get_thread_id; 443 func_mysqlnd_conn__get_statistics get_statistics; 444 445 func_mysqlnd_conn__get_server_version get_server_version; 446 func_mysqlnd_conn__get_server_information get_server_information; 447 func_mysqlnd_conn__get_server_statistics get_server_statistics; 448 func_mysqlnd_conn__get_host_information get_host_information; 449 func_mysqlnd_conn__get_protocol_information get_protocol_information; 450 func_mysqlnd_conn__get_last_message get_last_message; 451 func_mysqlnd_conn__charset_name charset_name; 452 func_mysqlnd_conn__list_fields list_fields; 453 func_mysqlnd_conn__list_method list_method; 454 455 func_mysqlnd_conn__get_last_insert_id get_last_insert_id; 456 func_mysqlnd_conn__get_affected_rows get_affected_rows; 457 func_mysqlnd_conn__get_warning_count get_warning_count; 458 459 func_mysqlnd_conn__get_field_count get_field_count; 460 461 func_mysqlnd_conn__set_server_option set_server_option; 462 func_mysqlnd_conn__set_client_option set_client_option; 463 func_mysqlnd_conn__free_contents free_contents; 464 func_mysqlnd_conn__free_options free_options; 465 func_mysqlnd_conn__close close; 466 func_mysqlnd_conn__dtor dtor; 467 468 func_mysqlnd_conn__query_read_result_set_header query_read_result_set_header; 469 470 func_mysqlnd_conn__get_reference get_reference; 471 func_mysqlnd_conn__free_reference free_reference; 472 func_mysqlnd_conn__get_state get_state; 473 func_mysqlnd_conn__set_state set_state; 474 475 func_mysqlnd_conn__simple_command simple_command; 476 func_mysqlnd_conn__simple_command_handle_response simple_command_handle_response; 477 478 func_mysqlnd_conn__restart_psession restart_psession; 479 func_mysqlnd_conn__end_psession end_psession; 480 func_mysqlnd_conn__send_close send_close; 481 482 func_mysqlnd_conn__ssl_set ssl_set; 483 484 func_mysqlnd_conn__result_init result_init; 485 #ifdef AUTOCOMMIT_TX_COMMIT_ROLLBACK 486 func_mysqlnd_conn__set_autocommit set_autocommit; 487 func_mysqlnd_conn__tx_commit tx_commit; 488 func_mysqlnd_conn__tx_rollback tx_rollback; 489 #endif 490 }; 491 492 493 494 495 typedef mysqlnd_fetch_row_func fetch_row; 496 typedef mysqlnd_fetch_row_func fetch_row_normal_buffered; /* private */ 497 typedef mysqlnd_fetch_row_func fetch_row_normal_unbuffered; /* private */ 498 499 typedef MYSQLND_RES * (*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, zend_bool ps_protocol TSRMLS_DC); 500 typedef MYSQLND_RES * (*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND * const conn, zend_bool ps TSRMLS_DC); 501 typedef void (*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, unsigned int flags, zval *return_value, enum_mysqlnd_extension ext TSRMLS_DC ZEND_FILE_LINE_DC); 502 typedef MYSQLND_ROW_C (*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result TSRMLS_DC); 503 typedef void (*func_mysqlnd_res__fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC); 504 typedef void (*func_mysqlnd_res__fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value TSRMLS_DC); 505 typedef uint64_t (*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result TSRMLS_DC); 506 typedef unsigned int (*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result TSRMLS_DC); 507 typedef enum_func_status (*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result TSRMLS_DC); 508 typedef enum_func_status (*func_mysqlnd_res__seek_data)(MYSQLND_RES * result, uint64_t row TSRMLS_DC); 509 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC); 510 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__field_tell)(const MYSQLND_RES * const result TSRMLS_DC); 511 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field)(MYSQLND_RES * const result TSRMLS_DC); 512 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field_direct)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC); 513 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_fields)(MYSQLND_RES * const result TSRMLS_DC); 514 515 typedef enum_func_status (*func_mysqlnd_res__read_result_metadata)(MYSQLND_RES *result, MYSQLND * conn TSRMLS_DC); 516 typedef unsigned long * (*func_mysqlnd_res__fetch_lengths)(MYSQLND_RES * const result TSRMLS_DC); 517 typedef enum_func_status (*func_mysqlnd_res__store_result_fetch_data)(MYSQLND * const conn, MYSQLND_RES *result, MYSQLND_RES_METADATA *meta, zend_bool binary_protocol, zend_bool to_cache TSRMLS_DC); 518 typedef enum_func_status (*func_mysqlnd_res__initialize_result_set_rest)(MYSQLND_RES * const result TSRMLS_DC); 519 520 typedef void (*func_mysqlnd_res__free_result_buffers)(MYSQLND_RES * result TSRMLS_DC); /* private */ 521 typedef enum_func_status (*func_mysqlnd_res__free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC); 522 typedef void (*func_mysqlnd_res__free_result_internal)(MYSQLND_RES *result TSRMLS_DC); 523 typedef void (*func_mysqlnd_res__free_result_contents)(MYSQLND_RES *result TSRMLS_DC); 524 typedef void (*func_mysqlnd_res__free_buffered_data)(MYSQLND_RES *result TSRMLS_DC); 525 typedef void (*func_mysqlnd_res__unbuffered_free_last_data)(MYSQLND_RES *result TSRMLS_DC); 526 527 /* for decoding - binary or text protocol */ 528 typedef enum_func_status (*func_mysqlnd_res__row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, 529 unsigned int field_count, MYSQLND_FIELD *fields_metadata, 530 zend_bool persistent, 531 zend_bool as_unicode, zend_bool as_int_or_float, 532 MYSQLND_STATS * stats TSRMLS_DC); 533 534 typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res__result_meta_init)(unsigned int field_count, zend_bool persistent TSRMLS_DC); 535 536 struct st_mysqlnd_res_methods 537 { 538 mysqlnd_fetch_row_func fetch_row; 539 mysqlnd_fetch_row_func fetch_row_normal_buffered; /* private */ 540 mysqlnd_fetch_row_func fetch_row_normal_unbuffered; /* private */ 541 542 func_mysqlnd_res__use_result use_result; 543 func_mysqlnd_res__store_result store_result; 544 func_mysqlnd_res__fetch_into fetch_into; 545 func_mysqlnd_res__fetch_row_c fetch_row_c; 546 func_mysqlnd_res__fetch_all fetch_all; 547 func_mysqlnd_res__fetch_field_data fetch_field_data; 548 func_mysqlnd_res__num_rows num_rows; 549 func_mysqlnd_res__num_fields num_fields; 550 func_mysqlnd_res__skip_result skip_result; 551 func_mysqlnd_res__seek_data seek_data; 552 func_mysqlnd_res__seek_field seek_field; 553 func_mysqlnd_res__field_tell field_tell; 554 func_mysqlnd_res__fetch_field fetch_field; 555 func_mysqlnd_res__fetch_field_direct fetch_field_direct; 556 func_mysqlnd_res__fetch_fields fetch_fields; 557 func_mysqlnd_res__read_result_metadata read_result_metadata; 558 func_mysqlnd_res__fetch_lengths fetch_lengths; 559 func_mysqlnd_res__store_result_fetch_data store_result_fetch_data; 560 func_mysqlnd_res__initialize_result_set_rest initialize_result_set_rest; 561 func_mysqlnd_res__free_result_buffers free_result_buffers; 562 func_mysqlnd_res__free_result free_result; 563 func_mysqlnd_res__free_result_internal free_result_internal; 564 func_mysqlnd_res__free_result_contents free_result_contents; 565 func_mysqlnd_res__free_buffered_data free_buffered_data; 566 func_mysqlnd_res__unbuffered_free_last_data unbuffered_free_last_data; 567 568 /* for decoding - binary or text protocol */ 569 func_mysqlnd_res__row_decoder row_decoder; 570 571 func_mysqlnd_res__result_meta_init result_meta_init; 572 573 void * unused1; 574 void * unused2; 575 void * unused3; 576 void * unused4; 577 void * unused5; 578 }; 579 580 581 typedef const MYSQLND_FIELD * (*func_mysqlnd_res_meta__fetch_field)(MYSQLND_RES_METADATA * const meta TSRMLS_DC); 582 typedef const MYSQLND_FIELD * (*func_mysqlnd_res_meta__fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC); 583 typedef const MYSQLND_FIELD * (*func_mysqlnd_res_meta__fetch_fields)(MYSQLND_RES_METADATA * const meta TSRMLS_DC); 584 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res_meta__field_tell)(const MYSQLND_RES_METADATA * const meta TSRMLS_DC); 585 typedef enum_func_status (*func_mysqlnd_res_meta__read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND * conn TSRMLS_DC); 586 typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res_meta__clone_metadata)(const MYSQLND_RES_METADATA * const meta, zend_bool persistent TSRMLS_DC); 587 typedef void (*func_mysqlnd_res_meta__free_metadata)(MYSQLND_RES_METADATA * meta TSRMLS_DC); 588 589 struct st_mysqlnd_res_meta_methods 590 { 591 func_mysqlnd_res_meta__fetch_field fetch_field; 592 func_mysqlnd_res_meta__fetch_field_direct fetch_field_direct; 593 func_mysqlnd_res_meta__fetch_fields fetch_fields; 594 func_mysqlnd_res_meta__field_tell field_tell; 595 func_mysqlnd_res_meta__read_metadata read_metadata; 596 func_mysqlnd_res_meta__clone_metadata clone_metadata; 597 func_mysqlnd_res_meta__free_metadata free_metadata; 598 }; 599 600 601 typedef enum_func_status (*func_mysqlnd_stmt__prepare)(MYSQLND_STMT * const stmt, const char * const query, unsigned int query_len TSRMLS_DC); 602 typedef enum_func_status (*func_mysqlnd_stmt__execute)(MYSQLND_STMT * const stmt TSRMLS_DC); 603 typedef MYSQLND_RES * (*func_mysqlnd_stmt__use_result)(MYSQLND_STMT * const stmt TSRMLS_DC); 604 typedef MYSQLND_RES * (*func_mysqlnd_stmt__store_result)(MYSQLND_STMT * const stmt TSRMLS_DC); 605 typedef MYSQLND_RES * (*func_mysqlnd_stmt__get_result)(MYSQLND_STMT * const stmt TSRMLS_DC); 606 typedef zend_bool (*func_mysqlnd_stmt__more_results)(const MYSQLND_STMT * const stmt TSRMLS_DC); 607 typedef enum_func_status (*func_mysqlnd_stmt__next_result)(MYSQLND_STMT * const stmt TSRMLS_DC); 608 typedef enum_func_status (*func_mysqlnd_stmt__free_result)(MYSQLND_STMT * const stmt TSRMLS_DC); 609 typedef enum_func_status (*func_mysqlnd_stmt__seek_data)(const MYSQLND_STMT * const stmt, uint64_t row TSRMLS_DC); 610 typedef enum_func_status (*func_mysqlnd_stmt__reset)(MYSQLND_STMT * const stmt TSRMLS_DC); 611 typedef enum_func_status (*func_mysqlnd_stmt__net_close)(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC); /* private */ 612 typedef enum_func_status (*func_mysqlnd_stmt__dtor)(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC); /* use this for mysqlnd_stmt_close */ 613 typedef enum_func_status (*func_mysqlnd_stmt__fetch)(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything TSRMLS_DC); 614 typedef enum_func_status (*func_mysqlnd_stmt__bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind TSRMLS_DC); 615 typedef enum_func_status (*func_mysqlnd_stmt__bind_one_parameter)(MYSQLND_STMT * const stmt, unsigned int param_no, zval * const zv, zend_uchar type TSRMLS_DC); 616 typedef enum_func_status (*func_mysqlnd_stmt__refresh_bind_param)(MYSQLND_STMT * const stmt TSRMLS_DC); 617 typedef enum_func_status (*func_mysqlnd_stmt__bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind TSRMLS_DC); 618 typedef enum_func_status (*func_mysqlnd_stmt__bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no TSRMLS_DC); 619 typedef enum_func_status (*func_mysqlnd_stmt__send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, const char * const data, unsigned long length TSRMLS_DC); 620 typedef MYSQLND_RES * (*func_mysqlnd_stmt__get_parameter_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC); 621 typedef MYSQLND_RES * (*func_mysqlnd_stmt__get_result_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC); 622 typedef uint64_t (*func_mysqlnd_stmt__get_last_insert_id)(const MYSQLND_STMT * const stmt TSRMLS_DC); 623 typedef uint64_t (*func_mysqlnd_stmt__get_affected_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC); 624 typedef uint64_t (*func_mysqlnd_stmt__get_num_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC); 625 typedef unsigned int (*func_mysqlnd_stmt__get_param_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); 626 typedef unsigned int (*func_mysqlnd_stmt__get_field_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); 627 typedef unsigned int (*func_mysqlnd_stmt__get_warning_count)(const MYSQLND_STMT * const stmt TSRMLS_DC); 628 typedef unsigned int (*func_mysqlnd_stmt__get_error_no)(const MYSQLND_STMT * const stmt TSRMLS_DC); 629 typedef const char * (*func_mysqlnd_stmt__get_error_str)(const MYSQLND_STMT * const stmt TSRMLS_DC); 630 typedef const char * (*func_mysqlnd_stmt__get_sqlstate)(const MYSQLND_STMT * const stmt TSRMLS_DC); 631 typedef enum_func_status (*func_mysqlnd_stmt__get_attribute)(const MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void * const value TSRMLS_DC); 632 typedef enum_func_status (*func_mysqlnd_stmt__set_attribute)(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, const void * const value TSRMLS_DC); 633 typedef MYSQLND_PARAM_BIND *(*func_mysqlnd_stmt__alloc_param_bind)(MYSQLND_STMT * const stmt TSRMLS_DC); 634 typedef MYSQLND_RESULT_BIND*(*func_mysqlnd_stmt__alloc_result_bind)(MYSQLND_STMT * const stmt TSRMLS_DC); 635 typedef void (*func_mysqlnd_stmt__free_parameter_bind)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * TSRMLS_DC); 636 typedef void (*func_mysqlnd_stmt__free_result_bind)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * TSRMLS_DC); 637 typedef unsigned int (*func_mysqlnd_stmt__server_status)(const MYSQLND_STMT * const stmt TSRMLS_DC); 638 typedef enum_func_status (*func_mysqlnd_stmt__generate_execute_request)(MYSQLND_STMT * const s, zend_uchar ** request, size_t *request_len, zend_bool * free_buffer TSRMLS_DC); 639 typedef enum_func_status (*func_mysqlnd_stmt__parse_execute_response)(MYSQLND_STMT * const s TSRMLS_DC); 640 typedef void (*func_mysqlnd_stmt__free_stmt_content)(MYSQLND_STMT * const s TSRMLS_DC); 641 642 struct st_mysqlnd_stmt_methods 643 { 644 func_mysqlnd_stmt__prepare prepare; 645 func_mysqlnd_stmt__execute execute; 646 func_mysqlnd_stmt__use_result use_result; 647 func_mysqlnd_stmt__store_result store_result; 648 func_mysqlnd_stmt__get_result get_result; 649 func_mysqlnd_stmt__more_results more_results; 650 func_mysqlnd_stmt__next_result next_result; 651 func_mysqlnd_stmt__free_result free_result; 652 func_mysqlnd_stmt__seek_data seek_data; 653 func_mysqlnd_stmt__reset reset; 654 func_mysqlnd_stmt__net_close net_close; 655 func_mysqlnd_stmt__dtor dtor; 656 func_mysqlnd_stmt__fetch fetch; 657 658 func_mysqlnd_stmt__bind_parameters bind_parameters; 659 func_mysqlnd_stmt__bind_one_parameter bind_one_parameter; 660 func_mysqlnd_stmt__refresh_bind_param refresh_bind_param; 661 func_mysqlnd_stmt__bind_result bind_result; 662 func_mysqlnd_stmt__bind_one_result bind_one_result; 663 func_mysqlnd_stmt__send_long_data send_long_data; 664 func_mysqlnd_stmt__get_parameter_metadata get_parameter_metadata; 665 func_mysqlnd_stmt__get_result_metadata get_result_metadata; 666 667 func_mysqlnd_stmt__get_last_insert_id get_last_insert_id; 668 func_mysqlnd_stmt__get_affected_rows get_affected_rows; 669 func_mysqlnd_stmt__get_num_rows get_num_rows; 670 671 func_mysqlnd_stmt__get_param_count get_param_count; 672 func_mysqlnd_stmt__get_field_count get_field_count; 673 func_mysqlnd_stmt__get_warning_count get_warning_count; 674 675 func_mysqlnd_stmt__get_error_no get_error_no; 676 func_mysqlnd_stmt__get_error_str get_error_str; 677 func_mysqlnd_stmt__get_sqlstate get_sqlstate; 678 679 func_mysqlnd_stmt__get_attribute get_attribute; 680 func_mysqlnd_stmt__set_attribute set_attribute; 681 682 func_mysqlnd_stmt__alloc_param_bind alloc_parameter_bind; 683 func_mysqlnd_stmt__alloc_result_bind alloc_result_bind; 684 685 func_mysqlnd_stmt__free_parameter_bind free_parameter_bind; 686 func_mysqlnd_stmt__free_result_bind free_result_bind; 687 688 func_mysqlnd_stmt__server_status get_server_status; 689 690 func_mysqlnd_stmt__generate_execute_request generate_execute_request; 691 func_mysqlnd_stmt__parse_execute_response parse_execute_response; 692 693 func_mysqlnd_stmt__free_stmt_content free_stmt_content; 694 }; 695 696 697 struct st_mysqlnd_net 698 { 699 php_stream *stream; 700 struct st_mysqlnd_net_methods m; 701 702 /* sequence for simple checking of correct packets */ 703 zend_uchar packet_no; 704 zend_bool compressed; 705 zend_uchar compressed_envelope_packet_no; 706 #ifdef MYSQLND_COMPRESSION_ENABLED 707 MYSQLND_READ_BUFFER * uncompressed_data; 708 #endif 709 #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND 710 zend_uchar last_command; 711 #endif 712 /* cmd buffer */ 713 MYSQLND_CMD_BUFFER cmd_buffer; 714 715 MYSQLND_NET_OPTIONS options; 716 717 zend_bool persistent; 718 }; 719 720 721 struct st_mysqlnd_protocol 722 { 723 struct st_mysqlnd_protocol_methods m; 724 zend_bool persistent; 725 }; 726 727 728 struct st_mysqlnd_connection 729 { 730 /* Operation related */ 731 MYSQLND_NET * net; 732 MYSQLND_PROTOCOL * protocol; 733 734 /* Information related */ 735 char *host; 736 unsigned int host_len; 737 char *unix_socket; 738 unsigned int unix_socket_len; 739 char *user; 740 unsigned int user_len; 741 char *passwd; 742 unsigned int passwd_len; 743 char *scheme; 744 unsigned int scheme_len; 745 uint64_t thread_id; 746 char *server_version; 747 char *host_info; 748 unsigned char *scramble; 749 const MYSQLND_CHARSET *charset; 750 const MYSQLND_CHARSET *greet_charset; 751 char *connect_or_select_db; 752 unsigned int connect_or_select_db_len; 753 MYSQLND_INFILE infile; 754 unsigned int protocol_version; 755 unsigned long max_packet_size; 756 unsigned int port; 757 unsigned long client_flag; 758 unsigned long server_capabilities; 759 760 /* For UPSERT queries */ 761 MYSQLND_UPSERT_STATUS upsert_status; 762 char *last_message; 763 unsigned int last_message_len; 764 765 /* If error packet, we use these */ 766 MYSQLND_ERROR_INFO error_info; 767 768 /* 769 To prevent queries during unbuffered fetches. Also to 770 mark the connection as destroyed for garbage collection. 771 */ 772 enum mysqlnd_connection_state state; 773 enum_mysqlnd_query_type last_query_type; 774 /* Temporary storage between query and (use|store)_result() call */ 775 MYSQLND_RES *current_result; 776 777 /* 778 How many result sets reference this connection. 779 It won't be freed until this number reaches 0. 780 The last one, please close the door! :-) 781 The result set objects can determine by inspecting 782 'quit_sent' whether the connection is still valid. 783 */ 784 unsigned int refcount; 785 786 /* Temporal storage for mysql_query */ 787 unsigned int field_count; 788 789 /* persistent connection */ 790 zend_bool persistent; 791 792 /* options */ 793 MYSQLND_OPTIONS options; 794 795 /* stats */ 796 MYSQLND_STATS * stats; 797 798 struct st_mysqlnd_conn_methods *m; 799 }; 800 801 802 struct mysqlnd_field_hash_key 803 { 804 zend_bool is_numeric; 805 unsigned long key; 806 #if MYSQLND_UNICODE 807 zstr ustr; 808 unsigned int ulen; 809 #endif 810 }; 811 812 813 struct st_mysqlnd_result_metadata 814 { 815 MYSQLND_FIELD *fields; 816 struct mysqlnd_field_hash_key *zend_hash_keys; 817 unsigned int current_field; 818 unsigned int field_count; 819 /* We need this to make fast allocs in rowp_read */ 820 unsigned int bit_fields_count; 821 size_t bit_fields_total_len; /* trailing \0 not counted */ 822 zend_bool persistent; 823 824 struct st_mysqlnd_res_meta_methods *m; 825 }; 826 827 828 struct st_mysqlnd_buffered_result 829 { 830 zval **data; 831 zval **data_cursor; 832 MYSQLND_MEMORY_POOL_CHUNK **row_buffers; 833 uint64_t row_count; 834 uint64_t initialized_rows; 835 zend_bool persistent; 836 837 unsigned int references; 838 839 MYSQLND_ERROR_INFO error_info; 840 }; 841 842 843 struct st_mysqlnd_unbuffered_result 844 { 845 /* For unbuffered (both normal and PS) */ 846 zval **last_row_data; 847 MYSQLND_MEMORY_POOL_CHUNK *last_row_buffer; 848 849 uint64_t row_count; 850 zend_bool eof_reached; 851 }; 852 853 854 struct st_mysqlnd_res 855 { 856 struct st_mysqlnd_res_methods m; 857 858 MYSQLND *conn; 859 enum_mysqlnd_res_type type; 860 unsigned int field_count; 861 862 /* For metadata functions */ 863 MYSQLND_RES_METADATA *meta; 864 865 /* To be used with store_result() - both normal and PS */ 866 MYSQLND_RES_BUFFERED *stored_data; 867 MYSQLND_RES_UNBUFFERED *unbuf; 868 869 /* 870 Column lengths of current row - both buffered and unbuffered. 871 For buffered results it duplicates the data found in **data 872 */ 873 unsigned long *lengths; 874 875 struct st_mysqlnd_packet_row * row_packet; 876 877 MYSQLND_MEMORY_POOL * result_set_memory_pool; 878 zend_bool persistent; 879 }; 880 881 882 struct st_mysqlnd_param_bind 883 { 884 zval *zv; 885 zend_uchar type; 886 enum_param_bind_flags flags; 887 }; 888 889 struct st_mysqlnd_result_bind 890 { 891 zval *zv; 892 zend_bool bound; 893 }; 894 895 896 struct st_mysqlnd_stmt_data 897 { 898 MYSQLND *conn; 899 unsigned long stmt_id; 900 unsigned long flags;/* cursor is set here */ 901 enum_mysqlnd_stmt_state state; 902 unsigned int warning_count; 903 MYSQLND_RES *result; 904 unsigned int field_count; 905 unsigned int param_count; 906 unsigned char send_types_to_server; 907 MYSQLND_PARAM_BIND *param_bind; 908 MYSQLND_RESULT_BIND *result_bind; 909 zend_bool result_zvals_separated_once; 910 zend_bool persistent; 911 912 MYSQLND_UPSERT_STATUS upsert_status; 913 914 MYSQLND_ERROR_INFO error_info; 915 916 zend_bool update_max_length; 917 unsigned long prefetch_rows; 918 919 zend_bool cursor_exists; 920 mysqlnd_stmt_use_or_store_func default_rset_handler; 921 922 MYSQLND_CMD_BUFFER execute_cmd_buffer; 923 unsigned int execute_count;/* count how many times the stmt was executed */ 924 }; 925 926 927 struct st_mysqlnd_stmt 928 { 929 MYSQLND_STMT_DATA * data; 930 struct st_mysqlnd_stmt_methods *m; 931 zend_bool persistent; 932 }; 933 934 #endif /* MYSQLND_STRUCTS_H */ 935