1 /* 2 +----------------------------------------------------------------------+ 3 | PHP Version 7 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2006-2017 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: Andrey Hristov <andrey@php.net> | 16 | Ulf Wendel <uw@php.net> | 17 | Georg Richter <georg@php.net> | 18 +----------------------------------------------------------------------+ 19 */ 20 21 #ifndef MYSQLND_STRUCTS_H 22 #define MYSQLND_STRUCTS_H 23 24 #include "zend_smart_str_public.h" 25 26 #define MYSQLND_TYPEDEFED_METHODS 27 28 #define MYSQLND_CLASS_METHOD_TABLE_NAME(class) mysqlnd_##class##_methods 29 #define MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(class) struct st_##class##_methods MYSQLND_CLASS_METHOD_TABLE_NAME(class) 30 31 #define MYSQLND_CLASS_METHODS_START(class) MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(class) = { 32 #define MYSQLND_CLASS_METHODS_END } 33 34 35 typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL; 36 typedef struct st_mysqlnd_memory_pool_chunk MYSQLND_MEMORY_POOL_CHUNK; 37 typedef struct st_mysqlnd_memory_pool_chunk_llist MYSQLND_MEMORY_POOL_CHUNK_LLIST; 38 39 40 #define MYSQLND_MEMORY_POOL_CHUNK_LIST_SIZE 100 41 42 struct st_mysqlnd_memory_pool 43 { 44 zend_uchar *arena; 45 unsigned int refcount; 46 unsigned int arena_size; 47 unsigned int free_size; 48 49 MYSQLND_MEMORY_POOL_CHUNK* (*get_chunk)(MYSQLND_MEMORY_POOL * pool, unsigned int size); 50 }; 51 52 struct st_mysqlnd_memory_pool_chunk 53 { 54 size_t app; 55 MYSQLND_MEMORY_POOL *pool; 56 zend_uchar *ptr; 57 enum_func_status (*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size); 58 void (*free_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk); 59 unsigned int size; 60 zend_bool from_pool; 61 }; 62 63 64 typedef struct st_mysqlnd_cmd_buffer 65 { 66 zend_uchar *buffer; 67 size_t length; 68 } MYSQLND_CMD_BUFFER; 69 70 71 typedef struct st_mysqlnd_field 72 { 73 zend_string *sname; /* Name of column */ 74 const char *name; /* Name of column in C string */ 75 const char *org_name; /* Original column name, if an alias */ 76 const char *table; /* Table of column if column was a field */ 77 const char *org_table; /* Org table name, if table was an alias */ 78 const char *db; /* Database for table */ 79 const char *catalog; /* Catalog for table */ 80 char *def; /* Default value (set by mysql_list_fields) */ 81 zend_ulong length; /* Width of column (create length) */ 82 zend_ulong max_length; /* Max width for selected set */ 83 unsigned int name_length; 84 unsigned int org_name_length; 85 unsigned int table_length; 86 unsigned int org_table_length; 87 unsigned int db_length; 88 unsigned int catalog_length; 89 unsigned int def_length; 90 unsigned int flags; /* Diverse flags */ 91 unsigned int decimals; /* Number of decimals in field */ 92 unsigned int charsetnr; /* Character set */ 93 enum mysqlnd_field_types type; /* Type of field. See mysql_com.h for types */ 94 char *root; 95 size_t root_len; 96 } MYSQLND_FIELD; 97 98 99 typedef struct st_mysqlnd_upsert_result 100 { 101 unsigned int warning_count; 102 unsigned int server_status; 103 uint64_t affected_rows; 104 uint64_t last_insert_id; 105 } MYSQLND_UPSERT_STATUS; 106 107 108 typedef struct st_mysqlnd_error_info 109 { 110 char error[MYSQLND_ERRMSG_SIZE+1]; 111 char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1]; 112 unsigned int error_no; 113 zend_llist * error_list; 114 } MYSQLND_ERROR_INFO; 115 116 117 typedef struct st_mysqlnd_error_list_element 118 { 119 char * error; 120 char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1]; 121 unsigned int error_no; 122 } MYSQLND_ERROR_LIST_ELEMENT; 123 124 125 typedef struct st_mysqlnd_infile_info 126 { 127 php_stream *fd; 128 int error_no; 129 char error_msg[MYSQLND_ERRMSG_SIZE + 1]; 130 const char *filename; 131 } MYSQLND_INFILE_INFO; 132 133 134 /* character set information */ 135 typedef struct st_mysqlnd_charset 136 { 137 unsigned int nr; 138 const char *name; 139 const char *collation; 140 unsigned int char_minlen; 141 unsigned int char_maxlen; 142 const char *comment; 143 unsigned int (*mb_charlen)(unsigned int c); 144 unsigned int (*mb_valid)(const char *start, const char *end); 145 } MYSQLND_CHARSET; 146 147 148 /* local infile handler */ 149 typedef struct st_mysqlnd_infile 150 { 151 int (*local_infile_init)(void **ptr, const char * const filename); 152 int (*local_infile_read)(void *ptr, zend_uchar * buf, unsigned int buf_len); 153 int (*local_infile_error)(void *ptr, char * error_msg, unsigned int error_msg_len); 154 void (*local_infile_end)(void *ptr); 155 } MYSQLND_INFILE; 156 157 typedef struct st_mysqlnd_options 158 { 159 ulong flags; 160 161 /* init commands - we need to send them to server directly after connect */ 162 unsigned int num_commands; 163 char **init_commands; 164 165 /* configuration file information */ 166 char *cfg_file; 167 char *cfg_section; 168 169 char *auth_protocol; 170 /* 171 We need to keep these because otherwise st_mysqlnd_conn will be changed. 172 The ABI will be broken and the methods structure will be somewhere else 173 in the memory which can crash external code. Feel free to reuse these. 174 */ 175 HashTable * connect_attr; 176 char * unused3; 177 char * unused4; 178 char * unused5; 179 180 enum_mysqlnd_protocol_type protocol; 181 182 char *charset_name; 183 /* maximum allowed packet size for communication */ 184 ulong max_allowed_packet; 185 186 #ifdef MYSQLND_STRING_TO_INT_CONVERSION 187 zend_bool int_and_float_native; 188 #endif 189 } MYSQLND_OPTIONS; 190 191 typedef struct st_mysqlnd_net_options 192 { 193 /* timeouts */ 194 unsigned int timeout_connect; 195 unsigned int timeout_read; 196 unsigned int timeout_write; 197 198 size_t net_read_buffer_size; 199 200 /* SSL information */ 201 char *ssl_key; 202 char *ssl_cert; 203 char *ssl_ca; 204 char *ssl_capath; 205 char *ssl_cipher; 206 char *ssl_passphrase; 207 enum mysqlnd_ssl_peer { 208 MYSQLND_SSL_PEER_DEFAULT = 0, 209 MYSQLND_SSL_PEER_VERIFY = 1, 210 MYSQLND_SSL_PEER_DONT_VERIFY = 2, 211 212 #define MYSQLND_SSL_PEER_DEFAULT_ACTION MYSQLND_SSL_PEER_VERIFY 213 } ssl_verify_peer; 214 uint64_t flags; 215 216 char * sha256_server_public_key; 217 218 char * unused1; 219 char * unused2; 220 char * unused3; 221 char * unused4; 222 } MYSQLND_NET_OPTIONS; 223 224 225 226 typedef struct st_mysqlnd_connection MYSQLND; 227 typedef struct st_mysqlnd_connection_data MYSQLND_CONN_DATA; 228 typedef struct st_mysqlnd_net MYSQLND_NET; 229 typedef struct st_mysqlnd_net_data MYSQLND_NET_DATA; 230 typedef struct st_mysqlnd_protocol MYSQLND_PROTOCOL; 231 typedef struct st_mysqlnd_res MYSQLND_RES; 232 typedef char** MYSQLND_ROW_C; /* return data as array of strings */ 233 typedef struct st_mysqlnd_stmt_data MYSQLND_STMT_DATA; 234 typedef struct st_mysqlnd_stmt MYSQLND_STMT; 235 typedef unsigned int MYSQLND_FIELD_OFFSET; 236 237 typedef struct st_mysqlnd_param_bind MYSQLND_PARAM_BIND; 238 239 typedef struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND; 240 241 typedef struct st_mysqlnd_result_metadata MYSQLND_RES_METADATA; 242 typedef struct st_mysqlnd_buffered_result_parent MYSQLND_RES_BUFFERED; 243 typedef struct st_mysqlnd_buffered_result_zval MYSQLND_RES_BUFFERED_ZVAL; 244 typedef struct st_mysqlnd_buffered_result_c MYSQLND_RES_BUFFERED_C; 245 typedef struct st_mysqlnd_unbuffered_result MYSQLND_RES_UNBUFFERED; 246 247 typedef struct st_mysqlnd_debug MYSQLND_DEBUG; 248 249 250 typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * const); 251 typedef enum_func_status (*mysqlnd_fetch_row_func)(MYSQLND_RES *result, 252 void * param, 253 const unsigned int flags, 254 zend_bool * fetched_anything 255 ); 256 257 258 typedef struct st_mysqlnd_stats MYSQLND_STATS; 259 260 typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change); 261 262 struct st_mysqlnd_stats 263 { 264 uint64_t *values; 265 mysqlnd_stat_trigger *triggers; 266 size_t count; 267 zend_bool in_trigger; 268 #ifdef ZTS 269 MUTEX_T LOCK_access; 270 #endif 271 }; 272 273 274 typedef struct st_mysqlnd_read_buffer { 275 zend_uchar * data; 276 size_t offset; 277 size_t size; 278 size_t len; 279 zend_bool (*is_empty)(struct st_mysqlnd_read_buffer *); 280 void (*read)(struct st_mysqlnd_read_buffer *, size_t count, zend_uchar * dest); 281 size_t (*bytes_left)(struct st_mysqlnd_read_buffer *); 282 void (*free_buffer)(struct st_mysqlnd_read_buffer **); 283 } MYSQLND_READ_BUFFER; 284 285 286 287 typedef enum_func_status (*func_mysqlnd_net__set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_option option, const char * const value); 288 typedef enum_func_status (*func_mysqlnd_net__decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, const zend_uchar * const compressed_data, const size_t compressed_data_len); 289 typedef enum_func_status (*func_mysqlnd_net__encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, const zend_uchar * const uncompressed_data, const size_t uncompressed_data_len); 290 typedef size_t (*func_mysqlnd_net__consume_uneaten_data)(MYSQLND_NET * const net, enum php_mysqlnd_server_command cmd); 291 typedef void (*func_mysqlnd_net__free_contents)(MYSQLND_NET * net); 292 typedef enum_func_status (*func_mysqlnd_net__enable_ssl)(MYSQLND_NET * const net); 293 typedef enum_func_status (*func_mysqlnd_net__disable_ssl)(MYSQLND_NET * const net); 294 typedef enum_func_status (*func_mysqlnd_net__network_read_ex)(MYSQLND_NET * const net, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); 295 typedef size_t (*func_mysqlnd_net__network_write_ex)(MYSQLND_NET * const net, const zend_uchar * const buf, const size_t count, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); 296 typedef size_t (*func_mysqlnd_net__send_ex)(MYSQLND_NET * const net, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); 297 typedef enum_func_status (*func_mysqlnd_net__receive_ex)(MYSQLND_NET * const net, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); 298 typedef enum_func_status (*func_mysqlnd_net__init)(MYSQLND_NET * const net, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info); 299 typedef void (*func_mysqlnd_net__dtor)(MYSQLND_NET * const net, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); 300 typedef enum_func_status (*func_mysqlnd_net__connect_ex)(MYSQLND_NET * const net, const char * const scheme, const size_t scheme_len, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); 301 typedef void (*func_mysqlnd_net__close_stream)(MYSQLND_NET * const net, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); 302 typedef php_stream * (*func_mysqlnd_net__open_stream)(MYSQLND_NET * const net, const char * const scheme, const size_t scheme_len, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); 303 typedef php_stream * (*func_mysqlnd_net__get_stream)(const MYSQLND_NET * const net); 304 typedef php_stream * (*func_mysqlnd_net__set_stream)(MYSQLND_NET * const net, php_stream * net_stream); 305 typedef func_mysqlnd_net__open_stream (*func_mysqlnd_net__get_open_stream)(MYSQLND_NET * const net, const char * const scheme, const size_t scheme_len, MYSQLND_ERROR_INFO * const error_info); 306 typedef void (*func_mysqlnd_net__post_connect_set_opt)(MYSQLND_NET * const net, const char * const scheme, const size_t scheme_len, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info); 307 typedef enum_func_status (*func_mysqlnd_net__read_compressed_packet_from_stream_and_fill_read_buffer)(MYSQLND_NET * net, size_t net_payload_size, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info); 308 309 struct st_mysqlnd_net_methods 310 { 311 func_mysqlnd_net__init init; 312 func_mysqlnd_net__dtor dtor; 313 func_mysqlnd_net__connect_ex connect_ex; 314 func_mysqlnd_net__close_stream close_stream; 315 func_mysqlnd_net__open_stream open_pipe; 316 func_mysqlnd_net__open_stream open_tcp_or_unix; 317 318 func_mysqlnd_net__get_stream get_stream; 319 func_mysqlnd_net__set_stream set_stream; 320 func_mysqlnd_net__get_open_stream get_open_stream; 321 322 func_mysqlnd_net__post_connect_set_opt post_connect_set_opt; 323 324 func_mysqlnd_net__set_client_option set_client_option; 325 func_mysqlnd_net__decode decode; 326 func_mysqlnd_net__encode encode; 327 func_mysqlnd_net__consume_uneaten_data consume_uneaten_data; 328 func_mysqlnd_net__free_contents free_contents; 329 func_mysqlnd_net__enable_ssl enable_ssl; 330 func_mysqlnd_net__disable_ssl disable_ssl; 331 332 func_mysqlnd_net__network_read_ex network_read_ex; 333 func_mysqlnd_net__network_write_ex network_write_ex; 334 func_mysqlnd_net__send_ex send_ex; 335 func_mysqlnd_net__receive_ex receive_ex; 336 337 func_mysqlnd_net__read_compressed_packet_from_stream_and_fill_read_buffer read_compressed_packet_from_stream_and_fill_read_buffer; 338 339 void * unused1; 340 void * unused2; 341 void * unused3; 342 void * unused4; 343 void * unused5; 344 }; 345 346 347 struct st_mysqlnd_packet_greet; 348 struct st_mysqlnd_packet_greet; 349 struct st_mysqlnd_packet_auth; 350 struct st_mysqlnd_packet_ok; 351 struct st_mysqlnd_packet_command; 352 struct st_mysqlnd_packet_eof; 353 struct st_mysqlnd_packet_rset_header; 354 struct st_mysqlnd_packet_res_field; 355 struct st_mysqlnd_packet_row; 356 struct st_mysqlnd_packet_stats; 357 struct st_mysqlnd_packet_prepare_response; 358 struct st_mysqlnd_packet_chg_user_resp; 359 struct st_mysqlnd_packet_auth_pam; 360 struct st_mysqlnd_packet_sha256_pk_request; 361 struct st_mysqlnd_packet_sha256_pk_request_response; 362 363 typedef struct st_mysqlnd_packet_greet * (*func_mysqlnd_protocol__get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 364 typedef struct st_mysqlnd_packet_auth * (*func_mysqlnd_protocol__get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 365 typedef struct st_mysqlnd_packet_auth_response *(*func_mysqlnd_protocol__get_auth_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 366 typedef struct st_mysqlnd_packet_change_auth_response * (*func_mysqlnd_protocol__get_change_auth_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 367 typedef struct st_mysqlnd_packet_ok * (*func_mysqlnd_protocol__get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 368 typedef struct st_mysqlnd_packet_command * (*func_mysqlnd_protocol__get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 369 typedef struct st_mysqlnd_packet_eof * (*func_mysqlnd_protocol__get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 370 typedef struct st_mysqlnd_packet_rset_header * (*func_mysqlnd_protocol__get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 371 typedef struct st_mysqlnd_packet_res_field * (*func_mysqlnd_protocol__get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 372 typedef struct st_mysqlnd_packet_row * (*func_mysqlnd_protocol__get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 373 typedef struct st_mysqlnd_packet_stats * (*func_mysqlnd_protocol__get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 374 typedef struct st_mysqlnd_packet_prepare_response *(*func_mysqlnd_protocol__get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 375 typedef struct st_mysqlnd_packet_chg_user_resp*(*func_mysqlnd_protocol__get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 376 typedef struct st_mysqlnd_packet_sha256_pk_request *(*func_mysqlnd_protocol__get_sha256_pk_request_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 377 typedef struct st_mysqlnd_packet_sha256_pk_request_response *(*func_mysqlnd_protocol__get_sha256_pk_request_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent); 378 379 struct st_mysqlnd_protocol_methods 380 { 381 func_mysqlnd_protocol__get_greet_packet get_greet_packet; 382 func_mysqlnd_protocol__get_auth_packet get_auth_packet; 383 func_mysqlnd_protocol__get_auth_response_packet get_auth_response_packet; 384 func_mysqlnd_protocol__get_change_auth_response_packet get_change_auth_response_packet; 385 func_mysqlnd_protocol__get_ok_packet get_ok_packet; 386 func_mysqlnd_protocol__get_command_packet get_command_packet; 387 func_mysqlnd_protocol__get_eof_packet get_eof_packet; 388 func_mysqlnd_protocol__get_rset_header_packet get_rset_header_packet; 389 func_mysqlnd_protocol__get_result_field_packet get_result_field_packet; 390 func_mysqlnd_protocol__get_row_packet get_row_packet; 391 func_mysqlnd_protocol__get_stats_packet get_stats_packet; 392 func_mysqlnd_protocol__get_prepare_response_packet get_prepare_response_packet; 393 func_mysqlnd_protocol__get_change_user_response_packet get_change_user_response_packet; 394 func_mysqlnd_protocol__get_sha256_pk_request_packet get_sha256_pk_request_packet; 395 func_mysqlnd_protocol__get_sha256_pk_request_response_packet get_sha256_pk_request_response_packet; 396 397 void * unused1; 398 void * unused2; 399 void * unused3; 400 }; 401 402 403 typedef MYSQLND * (*func_mysqlnd_object_factory__get_connection)(zend_bool persistent); 404 typedef MYSQLND * (*func_mysqlnd_object_factory__clone_connection_object)(MYSQLND * conn); 405 typedef MYSQLND_STMT * (*func_mysqlnd_object_factory__get_prepared_statement)(MYSQLND_CONN_DATA * conn); 406 typedef MYSQLND_NET * (*func_mysqlnd_object_factory__get_io_channel)(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info); 407 typedef MYSQLND_PROTOCOL * (*func_mysqlnd_object_factory__get_protocol_decoder)(zend_bool persistent); 408 409 410 struct st_mysqlnd_object_factory_methods 411 { 412 func_mysqlnd_object_factory__get_connection get_connection; 413 func_mysqlnd_object_factory__clone_connection_object clone_connection_object; 414 func_mysqlnd_object_factory__get_prepared_statement get_prepared_statement; 415 func_mysqlnd_object_factory__get_io_channel get_io_channel; 416 func_mysqlnd_object_factory__get_protocol_decoder get_protocol_decoder; 417 }; 418 419 420 typedef enum_func_status (*func_mysqlnd_conn_data__init)(MYSQLND_CONN_DATA * conn); 421 typedef enum_func_status (*func_mysqlnd_conn_data__connect)(MYSQLND_CONN_DATA * 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); 422 typedef zend_ulong (*func_mysqlnd_conn_data__escape_string)(MYSQLND_CONN_DATA * const conn, char *newstr, const char *escapestr, size_t escapestr_len); 423 typedef enum_func_status (*func_mysqlnd_conn_data__set_charset)(MYSQLND_CONN_DATA * const conn, const char * const charset); 424 typedef enum_func_status (*func_mysqlnd_conn_data__query)(MYSQLND_CONN_DATA * conn, const char * query, unsigned int query_len); 425 typedef enum_func_status (*func_mysqlnd_conn_data__send_query)(MYSQLND_CONN_DATA * conn, const char *query, unsigned int query_len, enum_mysqlnd_send_query_type type, zval *read_cb, zval *err_cb); 426 typedef enum_func_status (*func_mysqlnd_conn_data__reap_query)(MYSQLND_CONN_DATA * conn, enum_mysqlnd_reap_result_type type); 427 typedef MYSQLND_RES * (*func_mysqlnd_conn_data__use_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags); 428 typedef MYSQLND_RES * (*func_mysqlnd_conn_data__store_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags); 429 typedef enum_func_status (*func_mysqlnd_conn_data__next_result)(MYSQLND_CONN_DATA * const conn); 430 typedef zend_bool (*func_mysqlnd_conn_data__more_results)(const MYSQLND_CONN_DATA * const conn); 431 432 typedef MYSQLND_STMT * (*func_mysqlnd_conn_data__stmt_init)(MYSQLND_CONN_DATA * const conn); 433 434 typedef enum_func_status (*func_mysqlnd_conn_data__shutdown_server)(MYSQLND_CONN_DATA * const conn, uint8_t level); 435 typedef enum_func_status (*func_mysqlnd_conn_data__refresh_server)(MYSQLND_CONN_DATA * const conn, uint8_t options); 436 437 typedef enum_func_status (*func_mysqlnd_conn_data__ping)(MYSQLND_CONN_DATA * const conn); 438 typedef enum_func_status (*func_mysqlnd_conn_data__kill_connection)(MYSQLND_CONN_DATA * conn, unsigned int pid); 439 typedef enum_func_status (*func_mysqlnd_conn_data__select_db)(MYSQLND_CONN_DATA * const conn, const char * const db, unsigned int db_len); 440 typedef enum_func_status (*func_mysqlnd_conn_data__server_dump_debug_information)(MYSQLND_CONN_DATA * const conn); 441 typedef enum_func_status (*func_mysqlnd_conn_data__change_user)(MYSQLND_CONN_DATA * const conn, const char * user, const char * passwd, const char * db, zend_bool silent, size_t passwd_len); 442 443 typedef unsigned int (*func_mysqlnd_conn_data__get_error_no)(const MYSQLND_CONN_DATA * const conn); 444 typedef const char * (*func_mysqlnd_conn_data__get_error_str)(const MYSQLND_CONN_DATA * const conn); 445 typedef const char * (*func_mysqlnd_conn_data__get_sqlstate)(const MYSQLND_CONN_DATA * const conn); 446 typedef uint64_t (*func_mysqlnd_conn_data__get_thread_id)(const MYSQLND_CONN_DATA * const conn); 447 typedef void (*func_mysqlnd_conn_data__get_statistics)(const MYSQLND_CONN_DATA * const conn, zval *return_value ZEND_FILE_LINE_DC); 448 449 typedef zend_ulong (*func_mysqlnd_conn_data__get_server_version)(const MYSQLND_CONN_DATA * const conn); 450 typedef const char * (*func_mysqlnd_conn_data__get_server_information)(const MYSQLND_CONN_DATA * const conn); 451 typedef enum_func_status (*func_mysqlnd_conn_data__get_server_statistics)(MYSQLND_CONN_DATA * conn, zend_string **message); 452 typedef const char * (*func_mysqlnd_conn_data__get_host_information)(const MYSQLND_CONN_DATA * const conn); 453 typedef unsigned int (*func_mysqlnd_conn_data__get_protocol_information)(const MYSQLND_CONN_DATA * const conn); 454 typedef const char * (*func_mysqlnd_conn_data__get_last_message)(const MYSQLND_CONN_DATA * const conn); 455 typedef const char * (*func_mysqlnd_conn_data__charset_name)(const MYSQLND_CONN_DATA * const conn); 456 typedef MYSQLND_RES * (*func_mysqlnd_conn_data__list_fields)(MYSQLND_CONN_DATA * conn, const char * table, const char * achtung_wild); 457 typedef MYSQLND_RES * (*func_mysqlnd_conn_data__list_method)(MYSQLND_CONN_DATA * conn, const char * query, const char * achtung_wild, char *par1); 458 459 typedef uint64_t (*func_mysqlnd_conn_data__get_last_insert_id)(const MYSQLND_CONN_DATA * const conn); 460 typedef uint64_t (*func_mysqlnd_conn_data__get_affected_rows)(const MYSQLND_CONN_DATA * const conn); 461 typedef unsigned int (*func_mysqlnd_conn_data__get_warning_count)(const MYSQLND_CONN_DATA * const conn); 462 463 typedef unsigned int (*func_mysqlnd_conn_data__get_field_count)(const MYSQLND_CONN_DATA * const conn); 464 465 typedef unsigned int (*func_mysqlnd_conn_data__get_server_status)(const MYSQLND_CONN_DATA * const conn); 466 typedef enum_func_status (*func_mysqlnd_conn_data__set_server_option)(MYSQLND_CONN_DATA * const conn, enum_mysqlnd_server_option option); 467 typedef enum_func_status (*func_mysqlnd_conn_data__set_client_option)(MYSQLND_CONN_DATA * const conn, enum_mysqlnd_option option, const char * const value); 468 typedef void (*func_mysqlnd_conn_data__free_contents)(MYSQLND_CONN_DATA * conn);/* private */ 469 typedef void (*func_mysqlnd_conn_data__free_options)(MYSQLND_CONN_DATA * conn); /* private */ 470 typedef void (*func_mysqlnd_conn_data__dtor)(MYSQLND_CONN_DATA * conn); /* private */ 471 472 typedef enum_func_status (*func_mysqlnd_conn_data__query_read_result_set_header)(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * stmt); 473 474 typedef MYSQLND_CONN_DATA * (*func_mysqlnd_conn_data__get_reference)(MYSQLND_CONN_DATA * const conn); 475 typedef enum_func_status (*func_mysqlnd_conn_data__free_reference)(MYSQLND_CONN_DATA * const conn); 476 typedef enum mysqlnd_connection_state (*func_mysqlnd_conn_data__get_state)(const MYSQLND_CONN_DATA * const conn); 477 typedef void (*func_mysqlnd_conn_data__set_state)(MYSQLND_CONN_DATA * const conn, enum mysqlnd_connection_state new_state); 478 479 typedef enum_func_status (*func_mysqlnd_conn_data__simple_command)(MYSQLND_CONN_DATA * conn, enum php_mysqlnd_server_command command, const zend_uchar * const arg, size_t arg_len, enum mysqlnd_packet_type ok_packet, zend_bool silent, zend_bool ignore_upsert_status); 480 typedef enum_func_status (*func_mysqlnd_conn_data__simple_command_handle_response)(MYSQLND_CONN_DATA * conn, enum mysqlnd_packet_type ok_packet, zend_bool silent, enum php_mysqlnd_server_command command, zend_bool ignore_upsert_status); 481 482 typedef enum_func_status (*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn); 483 typedef enum_func_status (*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn); 484 typedef enum_func_status (*func_mysqlnd_conn_data__send_close)(MYSQLND_CONN_DATA * conn); 485 486 typedef enum_func_status (*func_mysqlnd_conn_data__ssl_set)(MYSQLND_CONN_DATA * const conn, const char * key, const char * const cert, const char * const ca, const char * const capath, const char * const cipher); 487 488 typedef MYSQLND_RES * (*func_mysqlnd_conn_data__result_init)(unsigned int field_count, zend_bool persistent); 489 490 typedef enum_func_status (*func_mysqlnd_conn_data__set_autocommit)(MYSQLND_CONN_DATA * conn, unsigned int mode); 491 typedef enum_func_status (*func_mysqlnd_conn_data__tx_commit)(MYSQLND_CONN_DATA * conn); 492 typedef enum_func_status (*func_mysqlnd_conn_data__tx_rollback)(MYSQLND_CONN_DATA * conn); 493 typedef enum_func_status (*func_mysqlnd_conn_data__tx_begin)(MYSQLND_CONN_DATA * conn, const unsigned int mode, const char * const name); 494 typedef enum_func_status (*func_mysqlnd_conn_data__tx_commit_or_rollback)(MYSQLND_CONN_DATA * conn, const zend_bool commit, const unsigned int flags, const char * const name); 495 typedef void (*func_mysqlnd_conn_data__tx_cor_options_to_string)(const MYSQLND_CONN_DATA * const conn, smart_str * tmp_str, const unsigned int mode); 496 typedef enum_func_status (*func_mysqlnd_conn_data__tx_savepoint)(MYSQLND_CONN_DATA * conn, const char * const name); 497 typedef enum_func_status (*func_mysqlnd_conn_data__tx_savepoint_release)(MYSQLND_CONN_DATA * conn, const char * const name); 498 499 typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_start)(MYSQLND_CONN_DATA * conn, size_t this_func); 500 typedef enum_func_status (*func_mysqlnd_conn_data__local_tx_end)(MYSQLND_CONN_DATA * conn, size_t this_func, enum_func_status status); 501 typedef enum_func_status (*func_mysqlnd_conn_data__execute_init_commands)(MYSQLND_CONN_DATA * conn); 502 typedef unsigned int (*func_mysqlnd_conn_data__get_updated_connect_flags)(MYSQLND_CONN_DATA * conn, unsigned int mysql_flags); 503 typedef enum_func_status (*func_mysqlnd_conn_data__connect_handshake)(MYSQLND_CONN_DATA * conn, const char * const host, const char * const user, const char * const passwd, const unsigned int passwd_len, const char * const db, const unsigned int db_len, const unsigned int mysql_flags); 504 typedef enum_func_status (*func_mysqlnd_conn_data__simple_command_send_request)(MYSQLND_CONN_DATA * conn, enum php_mysqlnd_server_command command, const zend_uchar * const arg, size_t arg_len, zend_bool silent, zend_bool ignore_upsert_status); 505 typedef struct st_mysqlnd_authentication_plugin * (*func_mysqlnd_conn_data__fetch_auth_plugin_by_name)(const char * const requested_protocol); 506 507 typedef enum_func_status (*func_mysqlnd_conn_data__set_client_option_2d)(MYSQLND_CONN_DATA * const conn, enum mysqlnd_option option, const char * const key, const char * const value); 508 509 510 typedef unsigned int (*func_mysqlnd_conn_data__negotiate_client_api_capabilities)(MYSQLND_CONN_DATA * const conn, const unsigned int flags); 511 typedef unsigned int (*func_mysqlnd_conn_data__get_client_api_capabilities)(const MYSQLND_CONN_DATA * const conn); 512 513 514 struct st_mysqlnd_conn_data_methods 515 { 516 func_mysqlnd_conn_data__init init; 517 func_mysqlnd_conn_data__connect connect; 518 func_mysqlnd_conn_data__escape_string escape_string; 519 func_mysqlnd_conn_data__set_charset set_charset; 520 func_mysqlnd_conn_data__query query; 521 func_mysqlnd_conn_data__send_query send_query; 522 func_mysqlnd_conn_data__reap_query reap_query; 523 func_mysqlnd_conn_data__use_result use_result; 524 func_mysqlnd_conn_data__store_result store_result; 525 func_mysqlnd_conn_data__next_result next_result; 526 func_mysqlnd_conn_data__more_results more_results; 527 528 func_mysqlnd_conn_data__stmt_init stmt_init; 529 530 func_mysqlnd_conn_data__shutdown_server shutdown_server; 531 func_mysqlnd_conn_data__refresh_server refresh_server; 532 533 func_mysqlnd_conn_data__ping ping; 534 func_mysqlnd_conn_data__kill_connection kill_connection; 535 func_mysqlnd_conn_data__select_db select_db; 536 func_mysqlnd_conn_data__server_dump_debug_information server_dump_debug_information; 537 func_mysqlnd_conn_data__change_user change_user; 538 539 func_mysqlnd_conn_data__get_error_no get_error_no; 540 func_mysqlnd_conn_data__get_error_str get_error_str; 541 func_mysqlnd_conn_data__get_sqlstate get_sqlstate; 542 func_mysqlnd_conn_data__get_thread_id get_thread_id; 543 func_mysqlnd_conn_data__get_statistics get_statistics; 544 545 func_mysqlnd_conn_data__get_server_version get_server_version; 546 func_mysqlnd_conn_data__get_server_information get_server_information; 547 func_mysqlnd_conn_data__get_server_statistics get_server_statistics; 548 func_mysqlnd_conn_data__get_host_information get_host_information; 549 func_mysqlnd_conn_data__get_protocol_information get_protocol_information; 550 func_mysqlnd_conn_data__get_last_message get_last_message; 551 func_mysqlnd_conn_data__charset_name charset_name; 552 func_mysqlnd_conn_data__list_fields list_fields; 553 func_mysqlnd_conn_data__list_method list_method; 554 555 func_mysqlnd_conn_data__get_last_insert_id get_last_insert_id; 556 func_mysqlnd_conn_data__get_affected_rows get_affected_rows; 557 func_mysqlnd_conn_data__get_warning_count get_warning_count; 558 559 func_mysqlnd_conn_data__get_field_count get_field_count; 560 561 func_mysqlnd_conn_data__get_server_status get_server_status; 562 563 func_mysqlnd_conn_data__set_server_option set_server_option; 564 func_mysqlnd_conn_data__set_client_option set_client_option; 565 func_mysqlnd_conn_data__free_contents free_contents; 566 func_mysqlnd_conn_data__free_options free_options; 567 func_mysqlnd_conn_data__dtor dtor; 568 569 func_mysqlnd_conn_data__query_read_result_set_header query_read_result_set_header; 570 571 func_mysqlnd_conn_data__get_reference get_reference; 572 func_mysqlnd_conn_data__free_reference free_reference; 573 func_mysqlnd_conn_data__get_state get_state; 574 func_mysqlnd_conn_data__set_state set_state; 575 576 func_mysqlnd_conn_data__simple_command simple_command; 577 func_mysqlnd_conn_data__simple_command_handle_response simple_command_handle_response; 578 579 func_mysqlnd_conn_data__restart_psession restart_psession; 580 func_mysqlnd_conn_data__end_psession end_psession; 581 func_mysqlnd_conn_data__send_close send_close; 582 583 func_mysqlnd_conn_data__ssl_set ssl_set; 584 585 func_mysqlnd_conn_data__result_init result_init; 586 func_mysqlnd_conn_data__set_autocommit set_autocommit; 587 func_mysqlnd_conn_data__tx_commit tx_commit; 588 func_mysqlnd_conn_data__tx_rollback tx_rollback; 589 func_mysqlnd_conn_data__tx_begin tx_begin; 590 func_mysqlnd_conn_data__tx_commit_or_rollback tx_commit_or_rollback; 591 func_mysqlnd_conn_data__tx_cor_options_to_string tx_cor_options_to_string; 592 func_mysqlnd_conn_data__tx_savepoint tx_savepoint; 593 func_mysqlnd_conn_data__tx_savepoint_release tx_savepoint_release; 594 595 func_mysqlnd_conn_data__local_tx_start local_tx_start; 596 func_mysqlnd_conn_data__local_tx_end local_tx_end; 597 598 func_mysqlnd_conn_data__execute_init_commands execute_init_commands; 599 func_mysqlnd_conn_data__get_updated_connect_flags get_updated_connect_flags; 600 func_mysqlnd_conn_data__connect_handshake connect_handshake; 601 func_mysqlnd_conn_data__simple_command_send_request simple_command_send_request; 602 func_mysqlnd_conn_data__fetch_auth_plugin_by_name fetch_auth_plugin_by_name; 603 604 func_mysqlnd_conn_data__set_client_option_2d set_client_option_2d; 605 606 func_mysqlnd_conn_data__negotiate_client_api_capabilities negotiate_client_api_capabilities; 607 func_mysqlnd_conn_data__get_client_api_capabilities get_client_api_capabilities; 608 }; 609 610 611 typedef enum_func_status (*func_mysqlnd_data__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); 612 typedef MYSQLND * (*func_mysqlnd_conn__clone_object)(MYSQLND * const conn); 613 typedef void (*func_mysqlnd_conn__dtor)(MYSQLND * conn); 614 typedef enum_func_status (*func_mysqlnd_conn__close)(MYSQLND * conn, enum_connection_close_type close_type); 615 616 struct st_mysqlnd_conn_methods 617 { 618 func_mysqlnd_data__connect connect; 619 func_mysqlnd_conn__clone_object clone_object; 620 func_mysqlnd_conn__dtor dtor; 621 func_mysqlnd_conn__close close; 622 }; 623 624 /* for decoding - binary or text protocol */ 625 typedef enum_func_status (*func_mysqlnd_res__row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval * fields, 626 unsigned int field_count, const MYSQLND_FIELD * fields_metadata, 627 zend_bool as_int_or_float, MYSQLND_STATS * stats); 628 629 630 typedef MYSQLND_RES * (*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, zend_bool ps_protocol); 631 typedef MYSQLND_RES * (*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND_CONN_DATA * const conn, const unsigned int flags); 632 typedef void (*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, const unsigned int flags, zval *return_value, enum_mysqlnd_extension ext ZEND_FILE_LINE_DC); 633 typedef MYSQLND_ROW_C (*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result); 634 typedef void (*func_mysqlnd_res__fetch_all)(MYSQLND_RES *result, const unsigned int flags, zval *return_value ZEND_FILE_LINE_DC); 635 typedef void (*func_mysqlnd_res__fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value); 636 typedef uint64_t (*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result); 637 typedef unsigned int (*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result); 638 typedef enum_func_status (*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result); 639 typedef enum_func_status (*func_mysqlnd_res__seek_data)(MYSQLND_RES * const result, const uint64_t row); 640 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__seek_field)(MYSQLND_RES * const result, const MYSQLND_FIELD_OFFSET field_offset); 641 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__field_tell)(const MYSQLND_RES * const result); 642 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field)(MYSQLND_RES * const result); 643 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field_direct)(MYSQLND_RES * const result, const MYSQLND_FIELD_OFFSET fieldnr); 644 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_fields)(MYSQLND_RES * const result); 645 646 typedef enum_func_status (*func_mysqlnd_res__read_result_metadata)(MYSQLND_RES * result, MYSQLND_CONN_DATA * conn); 647 typedef zend_ulong * (*func_mysqlnd_res__fetch_lengths)(MYSQLND_RES * const result); 648 typedef enum_func_status (*func_mysqlnd_res__store_result_fetch_data)(MYSQLND_CONN_DATA * const conn, MYSQLND_RES * result, MYSQLND_RES_METADATA * meta, MYSQLND_MEMORY_POOL_CHUNK *** row_buffers, zend_bool binary_protocol); 649 650 typedef void (*func_mysqlnd_res__free_result_buffers)(MYSQLND_RES * result); /* private */ 651 typedef enum_func_status (*func_mysqlnd_res__free_result)(MYSQLND_RES * result, zend_bool implicit); 652 typedef void (*func_mysqlnd_res__free_result_internal)(MYSQLND_RES *result); 653 typedef void (*func_mysqlnd_res__free_result_contents)(MYSQLND_RES *result); 654 typedef void (*func_mysqlnd_res__free_buffered_data)(MYSQLND_RES *result); 655 typedef void (*func_mysqlnd_res__unbuffered_free_last_data)(MYSQLND_RES *result); 656 657 658 typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res__result_meta_init)(unsigned int field_count, zend_bool persistent); 659 660 struct st_mysqlnd_res_methods 661 { 662 mysqlnd_fetch_row_func fetch_row; 663 664 func_mysqlnd_res__use_result use_result; 665 func_mysqlnd_res__store_result store_result; 666 func_mysqlnd_res__fetch_into fetch_into; 667 func_mysqlnd_res__fetch_row_c fetch_row_c; 668 func_mysqlnd_res__fetch_all fetch_all; 669 func_mysqlnd_res__fetch_field_data fetch_field_data; 670 func_mysqlnd_res__num_rows num_rows; 671 func_mysqlnd_res__num_fields num_fields; 672 func_mysqlnd_res__skip_result skip_result; 673 func_mysqlnd_res__seek_data seek_data; 674 func_mysqlnd_res__seek_field seek_field; 675 func_mysqlnd_res__field_tell field_tell; 676 func_mysqlnd_res__fetch_field fetch_field; 677 func_mysqlnd_res__fetch_field_direct fetch_field_direct; 678 func_mysqlnd_res__fetch_fields fetch_fields; 679 func_mysqlnd_res__read_result_metadata read_result_metadata; 680 func_mysqlnd_res__fetch_lengths fetch_lengths; 681 func_mysqlnd_res__store_result_fetch_data store_result_fetch_data; 682 func_mysqlnd_res__free_result_buffers free_result_buffers; 683 func_mysqlnd_res__free_result free_result; 684 func_mysqlnd_res__free_result_internal free_result_internal; 685 func_mysqlnd_res__free_result_contents free_result_contents; 686 687 func_mysqlnd_res__result_meta_init result_meta_init; 688 689 void * unused1; 690 void * unused2; 691 void * unused3; 692 void * unused4; 693 void * unused5; 694 }; 695 696 697 typedef uint64_t (*func_mysqlnd_result_unbuffered__num_rows)(const MYSQLND_RES_UNBUFFERED * const result); 698 typedef zend_ulong * (*func_mysqlnd_result_unbuffered__fetch_lengths)(MYSQLND_RES_UNBUFFERED * const result); 699 typedef void (*func_mysqlnd_result_unbuffered__free_last_data)(MYSQLND_RES_UNBUFFERED * result, MYSQLND_STATS * const global_stats); 700 typedef void (*func_mysqlnd_result_unbuffered__free_result)(MYSQLND_RES_UNBUFFERED * const result, MYSQLND_STATS * const global_stats); 701 702 struct st_mysqlnd_result_unbuffered_methods 703 { 704 mysqlnd_fetch_row_func fetch_row; 705 func_mysqlnd_res__row_decoder row_decoder; 706 func_mysqlnd_result_unbuffered__num_rows num_rows; 707 func_mysqlnd_result_unbuffered__fetch_lengths fetch_lengths; 708 func_mysqlnd_result_unbuffered__free_last_data free_last_data; 709 func_mysqlnd_result_unbuffered__free_result free_result; 710 }; 711 712 typedef uint64_t (*func_mysqlnd_result_buffered__num_rows)(const MYSQLND_RES_BUFFERED * const result); 713 typedef enum_func_status (*func_mysqlnd_result_buffered__initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result, MYSQLND_RES_METADATA * const meta, 714 MYSQLND_STATS * stats, zend_bool int_and_float_native); 715 typedef zend_ulong * (*func_mysqlnd_result_buffered__fetch_lengths)(MYSQLND_RES_BUFFERED * const result); 716 typedef enum_func_status (*func_mysqlnd_result_buffered__data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row); 717 typedef void (*func_mysqlnd_result_buffered__free_result)(MYSQLND_RES_BUFFERED * const result); 718 719 struct st_mysqlnd_result_buffered_methods 720 { 721 mysqlnd_fetch_row_func fetch_row; 722 func_mysqlnd_res__row_decoder row_decoder; 723 func_mysqlnd_result_buffered__num_rows num_rows; 724 func_mysqlnd_result_buffered__fetch_lengths fetch_lengths; 725 func_mysqlnd_result_buffered__data_seek data_seek; 726 func_mysqlnd_result_buffered__initialize_result_set_rest initialize_result_set_rest; 727 func_mysqlnd_result_buffered__free_result free_result; 728 }; 729 730 731 typedef const MYSQLND_FIELD * (*func_mysqlnd_res_meta__fetch_field)(MYSQLND_RES_METADATA * const meta); 732 typedef const MYSQLND_FIELD * (*func_mysqlnd_res_meta__fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, const MYSQLND_FIELD_OFFSET fieldnr); 733 typedef const MYSQLND_FIELD * (*func_mysqlnd_res_meta__fetch_fields)(MYSQLND_RES_METADATA * const meta); 734 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res_meta__field_tell)(const MYSQLND_RES_METADATA * const meta); 735 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res_meta__field_seek)(MYSQLND_RES_METADATA * const meta, const MYSQLND_FIELD_OFFSET field_offset); 736 typedef enum_func_status (*func_mysqlnd_res_meta__read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND_CONN_DATA * conn); 737 typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res_meta__clone_metadata)(const MYSQLND_RES_METADATA * const meta, zend_bool persistent); 738 typedef void (*func_mysqlnd_res_meta__free_metadata)(MYSQLND_RES_METADATA * meta); 739 740 struct st_mysqlnd_res_meta_methods 741 { 742 func_mysqlnd_res_meta__fetch_field fetch_field; 743 func_mysqlnd_res_meta__fetch_field_direct fetch_field_direct; 744 func_mysqlnd_res_meta__fetch_fields fetch_fields; 745 func_mysqlnd_res_meta__field_tell field_tell; 746 func_mysqlnd_res_meta__field_seek field_seek; 747 func_mysqlnd_res_meta__read_metadata read_metadata; 748 func_mysqlnd_res_meta__clone_metadata clone_metadata; 749 func_mysqlnd_res_meta__free_metadata free_metadata; 750 }; 751 752 753 typedef enum_func_status (*func_mysqlnd_stmt__prepare)(MYSQLND_STMT * const stmt, const char * const query, unsigned int query_len); 754 typedef enum_func_status (*func_mysqlnd_stmt__send_execute)(MYSQLND_STMT * const s, enum_mysqlnd_send_execute_type type, zval * read_cb, zval * err_cb); 755 typedef enum_func_status (*func_mysqlnd_stmt__execute)(MYSQLND_STMT * const stmt); 756 typedef MYSQLND_RES * (*func_mysqlnd_stmt__use_result)(MYSQLND_STMT * const stmt); 757 typedef MYSQLND_RES * (*func_mysqlnd_stmt__store_result)(MYSQLND_STMT * const stmt); 758 typedef MYSQLND_RES * (*func_mysqlnd_stmt__get_result)(MYSQLND_STMT * const stmt); 759 typedef zend_bool (*func_mysqlnd_stmt__more_results)(const MYSQLND_STMT * const stmt); 760 typedef enum_func_status (*func_mysqlnd_stmt__next_result)(MYSQLND_STMT * const stmt); 761 typedef enum_func_status (*func_mysqlnd_stmt__free_result)(MYSQLND_STMT * const stmt); 762 typedef enum_func_status (*func_mysqlnd_stmt__seek_data)(const MYSQLND_STMT * const stmt, uint64_t row); 763 typedef enum_func_status (*func_mysqlnd_stmt__reset)(MYSQLND_STMT * const stmt); 764 typedef enum_func_status (*func_mysqlnd_stmt__net_close)(MYSQLND_STMT * const stmt, zend_bool implicit); /* private */ 765 typedef enum_func_status (*func_mysqlnd_stmt__dtor)(MYSQLND_STMT * const stmt, zend_bool implicit); /* use this for mysqlnd_stmt_close */ 766 typedef enum_func_status (*func_mysqlnd_stmt__fetch)(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything); 767 typedef enum_func_status (*func_mysqlnd_stmt__bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind); 768 typedef enum_func_status (*func_mysqlnd_stmt__bind_one_parameter)(MYSQLND_STMT * const stmt, unsigned int param_no, zval * const zv, zend_uchar type); 769 typedef enum_func_status (*func_mysqlnd_stmt__refresh_bind_param)(MYSQLND_STMT * const stmt); 770 typedef enum_func_status (*func_mysqlnd_stmt__bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind); 771 typedef enum_func_status (*func_mysqlnd_stmt__bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no); 772 typedef enum_func_status (*func_mysqlnd_stmt__send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, const char * const data, zend_ulong length); 773 typedef MYSQLND_RES * (*func_mysqlnd_stmt__get_parameter_metadata)(MYSQLND_STMT * const stmt); 774 typedef MYSQLND_RES * (*func_mysqlnd_stmt__get_result_metadata)(MYSQLND_STMT * const stmt); 775 typedef uint64_t (*func_mysqlnd_stmt__get_last_insert_id)(const MYSQLND_STMT * const stmt); 776 typedef uint64_t (*func_mysqlnd_stmt__get_affected_rows)(const MYSQLND_STMT * const stmt); 777 typedef uint64_t (*func_mysqlnd_stmt__get_num_rows)(const MYSQLND_STMT * const stmt); 778 typedef unsigned int (*func_mysqlnd_stmt__get_param_count)(const MYSQLND_STMT * const stmt); 779 typedef unsigned int (*func_mysqlnd_stmt__get_field_count)(const MYSQLND_STMT * const stmt); 780 typedef unsigned int (*func_mysqlnd_stmt__get_warning_count)(const MYSQLND_STMT * const stmt); 781 typedef unsigned int (*func_mysqlnd_stmt__get_error_no)(const MYSQLND_STMT * const stmt); 782 typedef const char * (*func_mysqlnd_stmt__get_error_str)(const MYSQLND_STMT * const stmt); 783 typedef const char * (*func_mysqlnd_stmt__get_sqlstate)(const MYSQLND_STMT * const stmt); 784 typedef enum_func_status (*func_mysqlnd_stmt__get_attribute)(const MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void * const value); 785 typedef enum_func_status (*func_mysqlnd_stmt__set_attribute)(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, const void * const value); 786 typedef MYSQLND_PARAM_BIND *(*func_mysqlnd_stmt__alloc_param_bind)(MYSQLND_STMT * const stmt); 787 typedef MYSQLND_RESULT_BIND*(*func_mysqlnd_stmt__alloc_result_bind)(MYSQLND_STMT * const stmt); 788 typedef void (*func_mysqlnd_stmt__free_parameter_bind)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND *); 789 typedef void (*func_mysqlnd_stmt__free_result_bind)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND *); 790 typedef unsigned int (*func_mysqlnd_stmt__server_status)(const MYSQLND_STMT * const stmt); 791 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); 792 typedef enum_func_status (*func_mysqlnd_stmt__parse_execute_response)(MYSQLND_STMT * const s, enum_mysqlnd_parse_exec_response_type type); 793 typedef void (*func_mysqlnd_stmt__free_stmt_content)(MYSQLND_STMT * const s); 794 typedef enum_func_status (*func_mysqlnd_stmt__flush)(MYSQLND_STMT * const stmt); 795 typedef void (*func_mysqlnd_stmt__free_stmt_result)(MYSQLND_STMT * const s); 796 797 struct st_mysqlnd_stmt_methods 798 { 799 func_mysqlnd_stmt__prepare prepare; 800 func_mysqlnd_stmt__send_execute send_execute; 801 func_mysqlnd_stmt__execute execute; 802 func_mysqlnd_stmt__use_result use_result; 803 func_mysqlnd_stmt__store_result store_result; 804 func_mysqlnd_stmt__get_result get_result; 805 func_mysqlnd_stmt__more_results more_results; 806 func_mysqlnd_stmt__next_result next_result; 807 func_mysqlnd_stmt__free_result free_result; 808 func_mysqlnd_stmt__seek_data seek_data; 809 func_mysqlnd_stmt__reset reset; 810 func_mysqlnd_stmt__net_close net_close; 811 func_mysqlnd_stmt__dtor dtor; 812 func_mysqlnd_stmt__fetch fetch; 813 814 func_mysqlnd_stmt__bind_parameters bind_parameters; 815 func_mysqlnd_stmt__bind_one_parameter bind_one_parameter; 816 func_mysqlnd_stmt__refresh_bind_param refresh_bind_param; 817 func_mysqlnd_stmt__bind_result bind_result; 818 func_mysqlnd_stmt__bind_one_result bind_one_result; 819 func_mysqlnd_stmt__send_long_data send_long_data; 820 func_mysqlnd_stmt__get_parameter_metadata get_parameter_metadata; 821 func_mysqlnd_stmt__get_result_metadata get_result_metadata; 822 823 func_mysqlnd_stmt__get_last_insert_id get_last_insert_id; 824 func_mysqlnd_stmt__get_affected_rows get_affected_rows; 825 func_mysqlnd_stmt__get_num_rows get_num_rows; 826 827 func_mysqlnd_stmt__get_param_count get_param_count; 828 func_mysqlnd_stmt__get_field_count get_field_count; 829 func_mysqlnd_stmt__get_warning_count get_warning_count; 830 831 func_mysqlnd_stmt__get_error_no get_error_no; 832 func_mysqlnd_stmt__get_error_str get_error_str; 833 func_mysqlnd_stmt__get_sqlstate get_sqlstate; 834 835 func_mysqlnd_stmt__get_attribute get_attribute; 836 func_mysqlnd_stmt__set_attribute set_attribute; 837 838 func_mysqlnd_stmt__alloc_param_bind alloc_parameter_bind; 839 func_mysqlnd_stmt__alloc_result_bind alloc_result_bind; 840 841 func_mysqlnd_stmt__free_parameter_bind free_parameter_bind; 842 func_mysqlnd_stmt__free_result_bind free_result_bind; 843 844 func_mysqlnd_stmt__server_status get_server_status; 845 846 func_mysqlnd_stmt__generate_execute_request generate_execute_request; 847 func_mysqlnd_stmt__parse_execute_response parse_execute_response; 848 849 func_mysqlnd_stmt__free_stmt_content free_stmt_content; 850 851 func_mysqlnd_stmt__flush flush; 852 853 func_mysqlnd_stmt__free_stmt_result free_stmt_result; 854 }; 855 856 857 struct st_mysqlnd_net_data 858 { 859 php_stream *stream; 860 zend_bool compressed; 861 zend_bool ssl; 862 #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND 863 zend_uchar last_command; 864 #else 865 zend_uchar unused_pad1; 866 #endif 867 MYSQLND_NET_OPTIONS options; 868 869 unsigned int refcount; 870 871 zend_bool persistent; 872 873 struct st_mysqlnd_net_methods m; 874 }; 875 876 877 struct st_mysqlnd_net 878 { 879 /* cmd buffer */ 880 MYSQLND_CMD_BUFFER cmd_buffer; 881 882 struct st_mysqlnd_net_data * data; 883 884 #ifdef MYSQLND_COMPRESSION_ENABLED 885 MYSQLND_READ_BUFFER * uncompressed_data; 886 #else 887 void * unused_pad1; 888 #endif 889 890 zend_bool persistent; 891 892 /* sequence for simple checking of correct packets */ 893 zend_uchar packet_no; 894 zend_uchar compressed_envelope_packet_no; 895 }; 896 897 898 struct st_mysqlnd_protocol 899 { 900 zend_bool persistent; 901 struct st_mysqlnd_protocol_methods m; 902 }; 903 904 905 struct st_mysqlnd_connection_data 906 { 907 /* Operation related */ 908 MYSQLND_NET * net; 909 MYSQLND_PROTOCOL * protocol; 910 911 /* Information related */ 912 char *host; 913 unsigned int host_len; 914 char *unix_socket; 915 unsigned int unix_socket_len; 916 char *user; 917 unsigned int user_len; 918 char *passwd; 919 unsigned int passwd_len; 920 char *scheme; 921 unsigned int scheme_len; 922 uint64_t thread_id; 923 char *server_version; 924 char *host_info; 925 zend_uchar *auth_plugin_data; 926 size_t auth_plugin_data_len; 927 const MYSQLND_CHARSET *charset; 928 const MYSQLND_CHARSET *greet_charset; 929 char *connect_or_select_db; 930 unsigned int connect_or_select_db_len; 931 MYSQLND_INFILE infile; 932 unsigned int protocol_version; 933 zend_ulong max_packet_size; 934 unsigned int port; 935 zend_ulong client_flag; 936 zend_ulong server_capabilities; 937 938 /* For UPSERT queries */ 939 MYSQLND_UPSERT_STATUS * upsert_status; 940 MYSQLND_UPSERT_STATUS upsert_status_impl; 941 char *last_message; 942 unsigned int last_message_len; 943 944 /* If error packet, we use these */ 945 MYSQLND_ERROR_INFO * error_info; 946 MYSQLND_ERROR_INFO error_info_impl; 947 948 /* 949 To prevent queries during unbuffered fetches. Also to 950 mark the connection as destroyed for garbage collection. 951 */ 952 enum mysqlnd_connection_state state; 953 enum_mysqlnd_query_type last_query_type; 954 /* Temporary storage between query and (use|store)_result() call */ 955 MYSQLND_RES *current_result; 956 957 /* 958 How many result sets reference this connection. 959 It won't be freed until this number reaches 0. 960 The last one, please close the door! :-) 961 The result set objects can determine by inspecting 962 'quit_sent' whether the connection is still valid. 963 */ 964 unsigned int refcount; 965 966 /* Temporal storage for mysql_query */ 967 unsigned int field_count; 968 969 /* options */ 970 MYSQLND_OPTIONS * options; 971 MYSQLND_OPTIONS options_impl; 972 973 /* stats */ 974 MYSQLND_STATS * stats; 975 976 unsigned int client_api_capabilities; 977 978 zval async_read_cb; 979 zval async_err_cb; 980 zend_bool in_async_read_cb; 981 zend_bool in_async_err_cb; 982 983 struct st_mysqlnd_conn_data_methods * m; 984 985 /* persistent connection */ 986 zend_bool persistent; 987 }; 988 989 990 struct st_mysqlnd_connection 991 { 992 MYSQLND_CONN_DATA * data; 993 zend_bool persistent; 994 struct st_mysqlnd_conn_methods * m; 995 }; 996 997 998 struct mysqlnd_field_hash_key 999 { 1000 zend_bool is_numeric; 1001 zend_ulong key; 1002 }; 1003 1004 1005 struct st_mysqlnd_result_metadata 1006 { 1007 MYSQLND_FIELD *fields; 1008 struct mysqlnd_field_hash_key *zend_hash_keys; 1009 1010 struct st_mysqlnd_res_meta_methods * m; 1011 1012 size_t bit_fields_total_len; /* trailing \0 not counted */ 1013 /* We need this to make fast allocs in rowp_read */ 1014 unsigned int bit_fields_count; 1015 1016 unsigned int current_field; 1017 unsigned int field_count; 1018 1019 zend_bool persistent; 1020 }; 1021 1022 1023 #define def_mysqlnd_buffered_result_parent \ 1024 MYSQLND_MEMORY_POOL_CHUNK **row_buffers; \ 1025 uint64_t row_count; \ 1026 uint64_t initialized_rows; \ 1027 \ 1028 /* Column lengths of current row - both buffered and unbuffered. For buffered results it duplicates the data found in **data */ \ 1029 zend_ulong *lengths; \ 1030 \ 1031 MYSQLND_MEMORY_POOL *result_set_memory_pool; \ 1032 \ 1033 unsigned int references; \ 1034 \ 1035 MYSQLND_ERROR_INFO error_info; \ 1036 \ 1037 unsigned int field_count; \ 1038 zend_bool ps; \ 1039 zend_bool persistent; \ 1040 struct st_mysqlnd_result_buffered_methods m; \ 1041 enum mysqlnd_buffered_type type; \ 1042 void * unused1; \ 1043 void * unused2; \ 1044 void * unused3 1045 1046 1047 struct st_mysqlnd_buffered_result_parent 1048 { 1049 def_mysqlnd_buffered_result_parent; 1050 }; 1051 1052 1053 struct st_mysqlnd_buffered_result_zval 1054 { 1055 def_mysqlnd_buffered_result_parent; 1056 1057 zval *data; 1058 zval *data_cursor; 1059 }; 1060 1061 1062 struct st_mysqlnd_buffered_result_c 1063 { 1064 def_mysqlnd_buffered_result_parent; 1065 1066 zend_uchar *initialized; /* every row is a single bit */ 1067 uint64_t current_row; 1068 }; 1069 1070 1071 struct st_mysqlnd_unbuffered_result 1072 { 1073 struct st_mysqlnd_result_unbuffered_methods m; 1074 uint64_t row_count; 1075 1076 /* For unbuffered (both normal and PS) */ 1077 zval *last_row_data; 1078 MYSQLND_MEMORY_POOL_CHUNK *last_row_buffer; 1079 1080 /* 1081 Column lengths of current row - both buffered and unbuffered. 1082 For buffered results it duplicates the data found in **data 1083 */ 1084 zend_ulong *lengths; 1085 1086 MYSQLND_MEMORY_POOL *result_set_memory_pool; 1087 1088 struct st_mysqlnd_packet_row * row_packet; 1089 1090 unsigned int field_count; 1091 1092 zend_bool eof_reached; 1093 1094 zend_bool ps; 1095 zend_bool persistent; 1096 1097 }; 1098 1099 1100 struct st_mysqlnd_res 1101 { 1102 MYSQLND_CONN_DATA *conn; 1103 enum_mysqlnd_res_type type; 1104 unsigned int field_count; 1105 1106 /* For metadata functions */ 1107 MYSQLND_RES_METADATA *meta; 1108 1109 /* To be used with store_result() - both normal and PS */ 1110 MYSQLND_RES_BUFFERED *stored_data; 1111 MYSQLND_RES_UNBUFFERED *unbuf; 1112 1113 zend_bool persistent; 1114 1115 struct st_mysqlnd_res_methods m; 1116 }; 1117 1118 1119 struct st_mysqlnd_param_bind 1120 { 1121 zval zv; 1122 zend_uchar type; 1123 enum_param_bind_flags flags; 1124 }; 1125 1126 struct st_mysqlnd_result_bind 1127 { 1128 zval zv; 1129 zend_bool bound; 1130 }; 1131 1132 1133 struct st_mysqlnd_stmt_data 1134 { 1135 MYSQLND_CONN_DATA *conn; 1136 zend_ulong stmt_id; 1137 zend_ulong flags;/* cursor is set here */ 1138 enum_mysqlnd_stmt_state state; 1139 unsigned int warning_count; 1140 MYSQLND_RES *result; 1141 unsigned int field_count; 1142 unsigned int param_count; 1143 unsigned char send_types_to_server; 1144 MYSQLND_PARAM_BIND *param_bind; 1145 MYSQLND_RESULT_BIND *result_bind; 1146 zend_bool result_zvals_separated_once; 1147 zend_bool persistent; 1148 1149 MYSQLND_UPSERT_STATUS * upsert_status; 1150 MYSQLND_UPSERT_STATUS upsert_status_impl; 1151 1152 MYSQLND_ERROR_INFO * error_info; 1153 MYSQLND_ERROR_INFO error_info_impl; 1154 1155 zend_bool update_max_length; 1156 zend_ulong prefetch_rows; 1157 1158 zend_bool cursor_exists; 1159 mysqlnd_stmt_use_or_store_func default_rset_handler; 1160 1161 zval execute_read_cb; 1162 zval execute_err_cb; 1163 zend_bool in_execute_read_cb; 1164 zend_bool in_execute_err_cb; 1165 1166 MYSQLND_CMD_BUFFER execute_cmd_buffer; 1167 unsigned int execute_count;/* count how many times the stmt was executed */ 1168 }; 1169 1170 1171 struct st_mysqlnd_stmt 1172 { 1173 MYSQLND_STMT_DATA * data; 1174 struct st_mysqlnd_stmt_methods *m; 1175 zend_bool persistent; 1176 }; 1177 1178 1179 typedef struct st_mysqlnd_string 1180 { 1181 char *s; 1182 size_t l; 1183 } MYSQLND_STRING; 1184 1185 1186 struct st_mysqlnd_plugin_header 1187 { 1188 unsigned int plugin_api_version; 1189 const char * plugin_name; 1190 zend_ulong plugin_version; 1191 const char * plugin_string_version; 1192 const char * plugin_license; 1193 const char * plugin_author; 1194 struct 1195 { 1196 MYSQLND_STATS * values; 1197 const MYSQLND_STRING * names; 1198 } plugin_stats; 1199 1200 struct 1201 { 1202 enum_func_status (*plugin_shutdown)(void * plugin); 1203 } m; 1204 }; 1205 1206 1207 struct st_mysqlnd_plugin_core 1208 { 1209 struct st_mysqlnd_plugin_header plugin_header; 1210 }; 1211 1212 1213 struct st_mysqlnd_typeii_plugin_example 1214 { 1215 struct st_mysqlnd_plugin_header plugin_header; 1216 void * methods; 1217 unsigned int counter; 1218 }; 1219 1220 struct st_mysqlnd_authentication_plugin; 1221 1222 typedef zend_uchar * (*func_auth_plugin__get_auth_data)(struct st_mysqlnd_authentication_plugin * self, 1223 size_t * auth_data_len, 1224 MYSQLND_CONN_DATA * conn, const char * const user, const char * const passwd, 1225 const size_t passwd_len, zend_uchar * auth_plugin_data, size_t auth_plugin_data_len, 1226 const MYSQLND_OPTIONS * const options, 1227 const MYSQLND_NET_OPTIONS * const net_options, zend_ulong mysql_flags 1228 ); 1229 1230 struct st_mysqlnd_authentication_plugin 1231 { 1232 struct st_mysqlnd_plugin_header plugin_header; 1233 struct { 1234 func_auth_plugin__get_auth_data get_auth_data; 1235 } methods; 1236 }; 1237 1238 1239 #endif /* MYSQLND_STRUCTS_H */ 1240