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