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