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