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