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