xref: /PHP-5.5/ext/mysqlnd/mysqlnd_structs.h (revision 73c1be26)
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