1 /*
2   +----------------------------------------------------------------------+
3   | PHP Version 7                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 2006-2018 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   +----------------------------------------------------------------------+
18 */
19 
20 #ifndef MYSQLND_STRUCTS_H
21 #define MYSQLND_STRUCTS_H
22 
23 #include "zend_smart_str_public.h"
24 
25 #define MYSQLND_TYPEDEFED_METHODS
26 
27 #define MYSQLND_CLASS_METHOD_TABLE_NAME(class) mysqlnd_##class##_methods
28 #define MYSQLND_CLASS_METHODS_TYPE(class) struct st_##class##_methods
29 #define MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(class) MYSQLND_CLASS_METHODS_TYPE(class) 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 #define MYSQLND_CLASS_METHODS_INSTANCE_NAME(class)		mysqlnd_##class##_methods_ptr
35 #define MYSQLND_CLASS_METHODS_INSTANCE_DECLARE(class)	extern const MYSQLND_CLASS_METHODS_TYPE(class) * MYSQLND_CLASS_METHODS_INSTANCE_NAME(class)
36 #define MYSQLND_CLASS_METHODS_INSTANCE_DEFINE(class)	const MYSQLND_CLASS_METHODS_TYPE(class) * MYSQLND_CLASS_METHODS_INSTANCE_NAME(class) = & MYSQLND_CLASS_METHOD_TABLE_NAME(class)
37 
38 typedef struct st_mysqlnd_string
39 {
40 	char	*s;
41 	size_t	l;
42 } MYSQLND_STRING;
43 
44 typedef struct st_mysqlnd_const_string
45 {
46 	const char *s;
47 	size_t	l;
48 } MYSQLND_CSTRING;
49 
50 
51 typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL;
52 
53 struct st_mysqlnd_memory_pool
54 {
55 	zend_arena		*arena;
56 	void			*last;
57 	void            *checkpoint;
58 
59 	void*	(*get_chunk)(MYSQLND_MEMORY_POOL * pool, size_t size);
60 	void*	(*resize_chunk)(MYSQLND_MEMORY_POOL * pool, void * ptr, size_t old_size, size_t size);
61 	void	(*free_chunk)(MYSQLND_MEMORY_POOL * pool, void * ptr);
62 };
63 
64 
65 typedef struct st_mysqlnd_row_buffer MYSQLND_ROW_BUFFER;
66 
67 struct st_mysqlnd_row_buffer
68 {
69 	void			*ptr;
70 	size_t			size;
71 };
72 
73 
74 typedef struct st_mysqlnd_cmd_buffer
75 {
76 	zend_uchar		*buffer;
77 	size_t			length;
78 } MYSQLND_CMD_BUFFER;
79 
80 
81 typedef struct st_mysqlnd_field
82 {
83 	zend_string *sname;			/* Name of column */
84 	zend_bool    is_numeric;
85 	zend_ulong	 num_key;
86 	const char  *name;          /* Name of column in C string */
87 	const char  *org_name;		/* Original column name, if an alias */
88 	const char  *table;			/* Table of column if column was a field */
89 	const char  *org_table;		/* Org table name, if table was an alias */
90 	const char  *db;			/* Database for table */
91 	const char  *catalog;		/* Catalog for table */
92 	char  *def;                 /* Default value */
93 	zend_ulong length;		/* Width of column (create length) */
94 	zend_ulong max_length;	/* Max width for selected set */
95 	unsigned int name_length;
96 	unsigned int org_name_length;
97 	unsigned int table_length;
98 	unsigned int org_table_length;
99 	unsigned int db_length;
100 	unsigned int catalog_length;
101 	unsigned int def_length;
102 	unsigned int flags;			/* Diverse flags */
103 	unsigned int decimals;		/* Number of decimals in field */
104 	unsigned int charsetnr;		/* Character set */
105 	enum mysqlnd_field_types type;	/* Type of field. See mysql_com.h for types */
106 	char *root;
107 	size_t root_len;
108 } MYSQLND_FIELD;
109 
110 
111 typedef struct st_mysqlnd_upsert_status MYSQLND_UPSERT_STATUS;
112 typedef void (*func_mysqlnd_upsert_status__reset)(MYSQLND_UPSERT_STATUS * const upsert_status);
113 typedef void (*func_mysqlnd_upsert_status__set_affected_rows_to_error)(MYSQLND_UPSERT_STATUS * const upsert_status);
114 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_upsert_status)115 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_upsert_status)
116 {
117 	func_mysqlnd_upsert_status__reset reset;
118 	func_mysqlnd_upsert_status__set_affected_rows_to_error set_affected_rows_to_error;
119 };
120 
121 struct st_mysqlnd_upsert_status
122 {
123 	unsigned int	warning_count;
124 	unsigned int	server_status;
125 	uint64_t		affected_rows;
126 	uint64_t		last_insert_id;
127 
128 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_upsert_status) *m;
129 };
130 
131 #define SET_EMPTY_ERROR(info)							(info)->m->reset((info))
132 #define SET_CLIENT_ERROR(info, err_no, sqlstate, error)	(err_no)? (info)->m->set_client_error((info), (err_no), (sqlstate), (error)) : (info)->m->reset((info))
133 #define SET_OOM_ERROR(info) 							SET_CLIENT_ERROR((info), CR_OUT_OF_MEMORY, UNKNOWN_SQLSTATE, mysqlnd_out_of_memory)
134 #define COPY_CLIENT_ERROR(dest, source)					SET_CLIENT_ERROR((dest), (source).error_no, (source).sqlstate, (source).error)
135 
136 
137 typedef struct st_mysqlnd_error_info MYSQLND_ERROR_INFO;
138 typedef void (*func_mysqlnd_error_info__reset)(MYSQLND_ERROR_INFO * const info);
139 typedef void (*func_mysqlnd_error_info__set_client_error)(MYSQLND_ERROR_INFO * const info, const unsigned int err_no, const char * const sqlstate, const char * const error);
140 
141 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info)142 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info)
143 {
144 	func_mysqlnd_error_info__reset reset;
145 	func_mysqlnd_error_info__set_client_error set_client_error;
146 };
147 
148 struct st_mysqlnd_error_info
149 {
150 	char error[MYSQLND_ERRMSG_SIZE+1];
151 	char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
152 	unsigned int error_no;
153 	zend_llist error_list;
154 
155 	zend_bool persistent;
156 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_error_info) *m;
157 };
158 
159 
160 typedef struct st_mysqlnd_error_list_element
161 {
162 	char * error;
163 	char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
164 	unsigned int error_no;
165 } MYSQLND_ERROR_LIST_ELEMENT;
166 
167 
168 typedef struct st_mysqlnd_infile_info
169 {
170 	php_stream	*fd;
171 	int			error_no;
172 	char		error_msg[MYSQLND_ERRMSG_SIZE + 1];
173 	const char	*filename;
174 } MYSQLND_INFILE_INFO;
175 
176 
177 /* character set information */
178 typedef struct st_mysqlnd_charset
179 {
180 	unsigned int	nr;
181 	const char		*name;
182 	const char		*collation;
183 	unsigned int	char_minlen;
184 	unsigned int	char_maxlen;
185 	const char		*comment;
186 	unsigned int 	(*mb_charlen)(unsigned int c);
187 	unsigned int 	(*mb_valid)(const char *start, const char *end);
188 } MYSQLND_CHARSET;
189 
190 
191 /* local infile handler */
192 typedef struct st_mysqlnd_infile
193 {
194 	int		(*local_infile_init)(void **ptr, const char * const filename);
195 	int		(*local_infile_read)(void *ptr, zend_uchar * buf, unsigned int buf_len);
196 	int		(*local_infile_error)(void *ptr, char * error_msg, unsigned int error_msg_len);
197 	void	(*local_infile_end)(void *ptr);
198 } MYSQLND_INFILE;
199 
200 typedef struct st_mysqlnd_session_options
201 {
202 	ulong		flags;
203 
204 	/* init commands - we need to send them to server directly after connect */
205 	unsigned int	num_commands;
206 	char			**init_commands;
207 
208 	/* configuration file information */
209 	char 		*cfg_file;
210 	char		*cfg_section;
211 
212 	char		*auth_protocol;
213 	/*
214 	  We need to keep these because otherwise st_mysqlnd_conn will be changed.
215 	  The ABI will be broken and the methods structure will be somewhere else
216 	  in the memory which can crash external code. Feel free to reuse these.
217 	*/
218 	HashTable	* connect_attr;
219 	char		* unused1;
220 	char		* unused2;
221 	char		* unused3;
222 
223 	enum_mysqlnd_session_protocol_type protocol;
224 
225 	char 		*charset_name;
226 	/* maximum allowed packet size for communication */
227 	ulong		max_allowed_packet;
228 
229 #ifdef MYSQLND_STRING_TO_INT_CONVERSION
230 	zend_bool	int_and_float_native;
231 #endif
232 } MYSQLND_SESSION_OPTIONS;
233 
234 
235 typedef struct st_mysqlnd_vio_options
236 {
237 	/* timeouts */
238 	unsigned int timeout_connect;
239 	unsigned int timeout_read;
240 	unsigned int timeout_write;
241 
242 	size_t		net_read_buffer_size;
243 
244 	/* SSL information */
245 	char		*ssl_key;
246 	char		*ssl_cert;
247 	char		*ssl_ca;
248 	char		*ssl_capath;
249 	char		*ssl_cipher;
250 	char		*ssl_passphrase;
251 	enum mysqlnd_ssl_peer {
252 		MYSQLND_SSL_PEER_DEFAULT = 0,
253 		MYSQLND_SSL_PEER_VERIFY = 1,
254 		MYSQLND_SSL_PEER_DONT_VERIFY = 2,
255 
256 #define MYSQLND_SSL_PEER_DEFAULT_ACTION  MYSQLND_SSL_PEER_VERIFY
257 	} ssl_verify_peer;
258 } MYSQLND_VIO_OPTIONS;
259 
260 
261 
262 typedef struct st_mysqlnd_connection MYSQLND;
263 typedef struct st_mysqlnd_connection_data MYSQLND_CONN_DATA;
264 typedef struct st_mysqlnd_protocol_frame_codec		MYSQLND_PFC;
265 typedef struct st_mysqlnd_protocol_frame_codec_data	MYSQLND_PFC_DATA;
266 typedef struct st_mysqlnd_vio		MYSQLND_VIO;
267 typedef struct st_mysqlnd_vio_data	MYSQLND_VIO_DATA;
268 typedef struct st_mysqlnd_protocol_payload_decoder_factory	MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY;
269 typedef struct st_mysqlnd_res	MYSQLND_RES;
270 typedef char** 					MYSQLND_ROW_C;		/* return data as array of strings */
271 typedef struct st_mysqlnd_stmt_data	MYSQLND_STMT_DATA;
272 typedef struct st_mysqlnd_stmt	MYSQLND_STMT;
273 typedef unsigned int			MYSQLND_FIELD_OFFSET;
274 
275 typedef struct st_mysqlnd_param_bind MYSQLND_PARAM_BIND;
276 
277 typedef struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND;
278 
279 typedef struct st_mysqlnd_result_metadata MYSQLND_RES_METADATA;
280 typedef struct st_mysqlnd_buffered_result_parent MYSQLND_RES_BUFFERED;
281 typedef struct st_mysqlnd_buffered_result_zval MYSQLND_RES_BUFFERED_ZVAL;
282 typedef struct st_mysqlnd_buffered_result_c MYSQLND_RES_BUFFERED_C;
283 typedef struct st_mysqlnd_unbuffered_result MYSQLND_RES_UNBUFFERED;
284 
285 typedef struct st_mysqlnd_debug MYSQLND_DEBUG;
286 
287 
288 typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * const);
289 typedef enum_func_status  (*mysqlnd_fetch_row_func)(MYSQLND_RES *result,
290 													void * param,
291 													const unsigned int flags,
292 													zend_bool * fetched_anything
293 													);
294 
295 
296 typedef struct st_mysqlnd_stats MYSQLND_STATS;
297 
298 typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change);
299 
300 struct st_mysqlnd_stats
301 {
302 	uint64_t				*values;
303 	mysqlnd_stat_trigger	*triggers;
304 	size_t					count;
305 	zend_bool				in_trigger;
306 #ifdef ZTS
307 	MUTEX_T	LOCK_access;
308 #endif
309 };
310 
311 
312 typedef enum_func_status	(*func_mysqlnd_vio__init)(MYSQLND_VIO * const vio, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
313 typedef void				(*func_mysqlnd_vio__dtor)(MYSQLND_VIO * const vio, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
314 
315 typedef enum_func_status	(*func_mysqlnd_vio__connect)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
316 
317 typedef void				(*func_mysqlnd_vio__close_stream)(MYSQLND_VIO * const vio, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
318 typedef php_stream *		(*func_mysqlnd_vio__open_stream)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, const zend_bool persistent, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
319 typedef php_stream *		(*func_mysqlnd_vio__get_stream)(const MYSQLND_VIO * const vio);
320 typedef enum_func_status	(*func_mysqlnd_vio__set_stream)(MYSQLND_VIO * const vio, php_stream * vio_stream);
321 typedef zend_bool			(*func_mysqlnd_vio__has_valid_stream)(const MYSQLND_VIO * const vio);
322 typedef func_mysqlnd_vio__open_stream (*func_mysqlnd_vio__get_open_stream)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, MYSQLND_ERROR_INFO * const error_info);
323 
324 typedef enum_func_status	(*func_mysqlnd_vio__set_client_option)(MYSQLND_VIO * const vio, enum_mysqlnd_client_option option, const char * const value);
325 typedef void				(*func_mysqlnd_vio__post_connect_set_opt)(MYSQLND_VIO * const vio, const MYSQLND_CSTRING scheme, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
326 
327 typedef enum_func_status	(*func_mysqlnd_vio__enable_ssl)(MYSQLND_VIO * const vio);
328 typedef enum_func_status	(*func_mysqlnd_vio__disable_ssl)(MYSQLND_VIO * const vio);
329 typedef enum_func_status	(*func_mysqlnd_vio__network_read)(MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
330 typedef size_t				(*func_mysqlnd_vio__network_write)(MYSQLND_VIO * const vio, const zend_uchar * const buf, const size_t count, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
331 
332 typedef size_t				(*func_mysqlnd_vio__consume_uneaten_data)(MYSQLND_VIO * const vio, enum php_mysqlnd_server_command cmd);
333 
334 typedef void				(*func_mysqlnd_vio__free_contents)(MYSQLND_VIO * vio);
335 
336 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio)337 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio)
338 {
339 	func_mysqlnd_vio__init init;
340 	func_mysqlnd_vio__dtor dtor;
341 	func_mysqlnd_vio__connect connect;
342 
343 	func_mysqlnd_vio__close_stream close_stream;
344 	func_mysqlnd_vio__open_stream open_pipe;
345 	func_mysqlnd_vio__open_stream open_tcp_or_unix;
346 
347 	func_mysqlnd_vio__get_stream get_stream;
348 	func_mysqlnd_vio__set_stream set_stream;
349 	func_mysqlnd_vio__has_valid_stream has_valid_stream;
350 	func_mysqlnd_vio__get_open_stream get_open_stream;
351 
352 	func_mysqlnd_vio__set_client_option set_client_option;
353 	func_mysqlnd_vio__post_connect_set_opt post_connect_set_opt;
354 
355 	func_mysqlnd_vio__enable_ssl enable_ssl;
356 	func_mysqlnd_vio__disable_ssl disable_ssl;
357 
358 	func_mysqlnd_vio__network_read network_read;
359 	func_mysqlnd_vio__network_write network_write;
360 
361 	func_mysqlnd_vio__consume_uneaten_data consume_uneaten_data;
362 
363 	func_mysqlnd_vio__free_contents free_contents;
364 };
365 
366 
367 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory);
368 
369 typedef MYSQLND * (*func_mysqlnd_object_factory__get_connection)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) * factory, const zend_bool persistent);
370 typedef MYSQLND * (*func_mysqlnd_object_factory__clone_connection_object)(MYSQLND * conn);
371 typedef MYSQLND_STMT * (*func_mysqlnd_object_factory__get_prepared_statement)(MYSQLND_CONN_DATA * conn);
372 typedef MYSQLND_PFC * (*func_mysqlnd_object_factory__get_pfc)(const zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
373 typedef MYSQLND_VIO * (*func_mysqlnd_object_factory__get_vio)(const zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info);
374 typedef MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * (*func_mysqlnd_object_factory__get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, const zend_bool persistent);
375 
376 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory)377 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory)
378 {
379 	func_mysqlnd_object_factory__get_connection get_connection;
380 	func_mysqlnd_object_factory__clone_connection_object clone_connection_object;
381 	func_mysqlnd_object_factory__get_prepared_statement get_prepared_statement;
382 	func_mysqlnd_object_factory__get_pfc get_protocol_frame_codec;
383 	func_mysqlnd_object_factory__get_vio get_vio;
384 	func_mysqlnd_object_factory__get_protocol_payload_decoder_factory get_protocol_payload_decoder_factory;
385 };
386 
387 
388 typedef enum_func_status	(*func_mysqlnd_conn_data__connect)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING username, MYSQLND_CSTRING password, MYSQLND_CSTRING database, unsigned int port, MYSQLND_CSTRING socket_or_pipe, unsigned int mysql_flags);
389 typedef zend_ulong			(*func_mysqlnd_conn_data__escape_string)(MYSQLND_CONN_DATA * const conn, char *newstr, const char *escapestr, size_t escapestr_len);
390 typedef enum_func_status	(*func_mysqlnd_conn_data__set_charset)(MYSQLND_CONN_DATA * const conn, const char * const charset);
391 typedef enum_func_status	(*func_mysqlnd_conn_data__query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len);
392 typedef enum_func_status	(*func_mysqlnd_conn_data__send_query)(MYSQLND_CONN_DATA * conn, const char * const query, const size_t query_len, enum_mysqlnd_send_query_type type, zval *read_cb, zval *err_cb);
393 typedef enum_func_status	(*func_mysqlnd_conn_data__reap_query)(MYSQLND_CONN_DATA * conn, enum_mysqlnd_reap_result_type type);
394 typedef MYSQLND_RES *		(*func_mysqlnd_conn_data__use_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags);
395 typedef MYSQLND_RES *		(*func_mysqlnd_conn_data__store_result)(MYSQLND_CONN_DATA * const conn, const unsigned int flags);
396 typedef enum_func_status	(*func_mysqlnd_conn_data__next_result)(MYSQLND_CONN_DATA * const conn);
397 typedef zend_bool			(*func_mysqlnd_conn_data__more_results)(const MYSQLND_CONN_DATA * const conn);
398 
399 typedef MYSQLND_STMT *		(*func_mysqlnd_conn_data__stmt_init)(MYSQLND_CONN_DATA * const conn);
400 
401 typedef enum_func_status	(*func_mysqlnd_conn_data__shutdown_server)(MYSQLND_CONN_DATA * const conn, uint8_t level);
402 typedef enum_func_status	(*func_mysqlnd_conn_data__refresh_server)(MYSQLND_CONN_DATA * const conn, uint8_t options);
403 
404 typedef enum_func_status	(*func_mysqlnd_conn_data__ping)(MYSQLND_CONN_DATA * const conn);
405 typedef enum_func_status	(*func_mysqlnd_conn_data__kill_connection)(MYSQLND_CONN_DATA * conn, unsigned int pid);
406 typedef enum_func_status	(*func_mysqlnd_conn_data__select_db)(MYSQLND_CONN_DATA * const conn, const char * const db, const size_t db_len);
407 typedef enum_func_status	(*func_mysqlnd_conn_data__server_dump_debug_information)(MYSQLND_CONN_DATA * const conn);
408 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);
409 
410 typedef unsigned int		(*func_mysqlnd_conn_data__get_error_no)(const MYSQLND_CONN_DATA * const conn);
411 typedef const char *		(*func_mysqlnd_conn_data__get_error_str)(const MYSQLND_CONN_DATA * const conn);
412 typedef const char *		(*func_mysqlnd_conn_data__get_sqlstate)(const MYSQLND_CONN_DATA * const conn);
413 typedef uint64_t			(*func_mysqlnd_conn_data__get_thread_id)(const MYSQLND_CONN_DATA * const conn);
414 typedef void				(*func_mysqlnd_conn_data__get_statistics)(const MYSQLND_CONN_DATA * const conn, zval *return_value ZEND_FILE_LINE_DC);
415 
416 typedef zend_ulong			(*func_mysqlnd_conn_data__get_server_version)(const MYSQLND_CONN_DATA * const conn);
417 typedef const char *		(*func_mysqlnd_conn_data__get_server_information)(const MYSQLND_CONN_DATA * const conn);
418 typedef enum_func_status	(*func_mysqlnd_conn_data__get_server_statistics)(MYSQLND_CONN_DATA * conn, zend_string **message);
419 typedef const char *		(*func_mysqlnd_conn_data__get_host_information)(const MYSQLND_CONN_DATA * const conn);
420 typedef unsigned int		(*func_mysqlnd_conn_data__get_protocol_information)(const MYSQLND_CONN_DATA * const conn);
421 typedef const char *		(*func_mysqlnd_conn_data__get_last_message)(const MYSQLND_CONN_DATA * const conn);
422 typedef const char *		(*func_mysqlnd_conn_data__charset_name)(const MYSQLND_CONN_DATA * const conn);
423 typedef MYSQLND_RES *		(*func_mysqlnd_conn_data__list_method)(MYSQLND_CONN_DATA * conn, const char * const query, const char * const achtung_wild, const char * const par1);
424 
425 typedef uint64_t			(*func_mysqlnd_conn_data__get_last_insert_id)(const MYSQLND_CONN_DATA * const conn);
426 typedef uint64_t			(*func_mysqlnd_conn_data__get_affected_rows)(const MYSQLND_CONN_DATA * const conn);
427 typedef unsigned int		(*func_mysqlnd_conn_data__get_warning_count)(const MYSQLND_CONN_DATA * const conn);
428 
429 typedef unsigned int		(*func_mysqlnd_conn_data__get_field_count)(const MYSQLND_CONN_DATA * const conn);
430 
431 typedef unsigned int		(*func_mysqlnd_conn_data__get_server_status)(const MYSQLND_CONN_DATA * const conn);
432 typedef enum_func_status	(*func_mysqlnd_conn_data__set_server_option)(MYSQLND_CONN_DATA * const conn, enum_mysqlnd_server_option option);
433 typedef enum_func_status	(*func_mysqlnd_conn_data__set_client_option)(MYSQLND_CONN_DATA * const conn, enum_mysqlnd_client_option option, const char * const value);
434 typedef void				(*func_mysqlnd_conn_data__free_contents)(MYSQLND_CONN_DATA * conn);/* private */
435 typedef void				(*func_mysqlnd_conn_data__free_options)(MYSQLND_CONN_DATA * conn);	/* private */
436 typedef void				(*func_mysqlnd_conn_data__dtor)(MYSQLND_CONN_DATA * conn);	/* private */
437 
438 typedef enum_func_status	(*func_mysqlnd_conn_data__query_read_result_set_header)(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * stmt);
439 
440 typedef MYSQLND_CONN_DATA *	(*func_mysqlnd_conn_data__get_reference)(MYSQLND_CONN_DATA * const conn);
441 typedef enum_func_status	(*func_mysqlnd_conn_data__free_reference)(MYSQLND_CONN_DATA * const conn);
442 
443 typedef enum_func_status	(*func_mysqlnd_conn_data__send_command_do_request)(MYSQLND_CONN_DATA * const conn, const enum php_mysqlnd_server_command command, const zend_uchar * const arg, const size_t arg_len, const zend_bool silent, const zend_bool ignore_upsert_status);
444 typedef enum_func_status	(*func_mysqlnd_conn_data__send_command_handle_response)(MYSQLND_CONN_DATA * const conn, const enum mysqlnd_packet_type ok_packet, const zend_bool silent, const enum php_mysqlnd_server_command command, const zend_bool ignore_upsert_status);
445 
446 typedef enum_func_status	(*func_mysqlnd_conn_data__restart_psession)(MYSQLND_CONN_DATA * conn);
447 typedef enum_func_status	(*func_mysqlnd_conn_data__end_psession)(MYSQLND_CONN_DATA * conn);
448 typedef enum_func_status	(*func_mysqlnd_conn_data__send_close)(MYSQLND_CONN_DATA * conn);
449 
450 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);
451 
452 typedef MYSQLND_RES * 		(*func_mysqlnd_conn_data__result_init)(unsigned int field_count);
453 
454 typedef enum_func_status	(*func_mysqlnd_conn_data__set_autocommit)(MYSQLND_CONN_DATA * conn, unsigned int mode);
455 typedef enum_func_status	(*func_mysqlnd_conn_data__tx_commit)(MYSQLND_CONN_DATA * conn);
456 typedef enum_func_status	(*func_mysqlnd_conn_data__tx_rollback)(MYSQLND_CONN_DATA * conn);
457 typedef enum_func_status	(*func_mysqlnd_conn_data__tx_begin)(MYSQLND_CONN_DATA * conn, const unsigned int mode, const char * const name);
458 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);
459 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);
460 typedef enum_func_status	(*func_mysqlnd_conn_data__tx_savepoint)(MYSQLND_CONN_DATA * conn, const char * const name);
461 typedef enum_func_status	(*func_mysqlnd_conn_data__tx_savepoint_release)(MYSQLND_CONN_DATA * conn, const char * const name);
462 
463 typedef enum_func_status	(*func_mysqlnd_conn_data__local_tx_start)(MYSQLND_CONN_DATA * conn, const size_t this_func);
464 typedef enum_func_status	(*func_mysqlnd_conn_data__local_tx_end)(MYSQLND_CONN_DATA * conn, const size_t this_func, const enum_func_status status);
465 typedef enum_func_status	(*func_mysqlnd_conn_data__execute_init_commands)(MYSQLND_CONN_DATA * conn);
466 typedef unsigned int		(*func_mysqlnd_conn_data__get_updated_connect_flags)(MYSQLND_CONN_DATA * conn, unsigned int mysql_flags);
467 typedef enum_func_status	(*func_mysqlnd_conn_data__connect_handshake)(MYSQLND_CONN_DATA * conn, const MYSQLND_CSTRING * const scheme, const MYSQLND_CSTRING * const username, const MYSQLND_CSTRING * const password, const MYSQLND_CSTRING * const database, const unsigned int mysql_flags);
468 typedef struct st_mysqlnd_authentication_plugin * (*func_mysqlnd_conn_data__fetch_auth_plugin_by_name)(const char * const requested_protocol);
469 
470 typedef enum_func_status	(*func_mysqlnd_conn_data__set_client_option_2d)(MYSQLND_CONN_DATA * const conn, const enum_mysqlnd_client_option option, const char * const key, const char * const value);
471 
472 
473 typedef size_t				(*func_mysqlnd_conn_data__negotiate_client_api_capabilities)(MYSQLND_CONN_DATA * const conn, const size_t flags);
474 typedef size_t				(*func_mysqlnd_conn_data__get_client_api_capabilities)(const MYSQLND_CONN_DATA * const conn);
475 
476 typedef MYSQLND_STRING		(*func_mysqlnd_conn_data__get_scheme)(MYSQLND_CONN_DATA * conn, MYSQLND_CSTRING hostname, MYSQLND_CSTRING *socket_or_pipe, unsigned int port, zend_bool * unix_socket, zend_bool * named_pipe);
477 
478 
479 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data)480 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data)
481 {
482 	func_mysqlnd_conn_data__connect connect;
483 	func_mysqlnd_conn_data__escape_string escape_string;
484 	func_mysqlnd_conn_data__set_charset set_charset;
485 	func_mysqlnd_conn_data__query query;
486 	func_mysqlnd_conn_data__send_query send_query;
487 	func_mysqlnd_conn_data__reap_query reap_query;
488 	func_mysqlnd_conn_data__use_result use_result;
489 	func_mysqlnd_conn_data__store_result store_result;
490 	func_mysqlnd_conn_data__next_result next_result;
491 	func_mysqlnd_conn_data__more_results more_results;
492 
493 	func_mysqlnd_conn_data__stmt_init stmt_init;
494 
495 	func_mysqlnd_conn_data__shutdown_server shutdown_server;
496 	func_mysqlnd_conn_data__refresh_server refresh_server;
497 
498 	func_mysqlnd_conn_data__ping ping;
499 	func_mysqlnd_conn_data__kill_connection kill_connection;
500 	func_mysqlnd_conn_data__select_db select_db;
501 	func_mysqlnd_conn_data__server_dump_debug_information server_dump_debug_information;
502 	func_mysqlnd_conn_data__change_user change_user;
503 
504 	func_mysqlnd_conn_data__get_error_no get_error_no;
505 	func_mysqlnd_conn_data__get_error_str get_error_str;
506 	func_mysqlnd_conn_data__get_sqlstate get_sqlstate;
507 	func_mysqlnd_conn_data__get_thread_id get_thread_id;
508 	func_mysqlnd_conn_data__get_statistics get_statistics;
509 
510 	func_mysqlnd_conn_data__get_server_version get_server_version;
511 	func_mysqlnd_conn_data__get_server_information get_server_information;
512 	func_mysqlnd_conn_data__get_server_statistics get_server_statistics;
513 	func_mysqlnd_conn_data__get_host_information get_host_information;
514 	func_mysqlnd_conn_data__get_protocol_information get_protocol_information;
515 	func_mysqlnd_conn_data__get_last_message get_last_message;
516 	func_mysqlnd_conn_data__charset_name charset_name;
517 	func_mysqlnd_conn_data__list_method list_method;
518 
519 	func_mysqlnd_conn_data__get_last_insert_id get_last_insert_id;
520 	func_mysqlnd_conn_data__get_affected_rows get_affected_rows;
521 	func_mysqlnd_conn_data__get_warning_count get_warning_count;
522 
523 	func_mysqlnd_conn_data__get_field_count get_field_count;
524 
525 	func_mysqlnd_conn_data__get_server_status get_server_status;
526 
527 	func_mysqlnd_conn_data__set_server_option set_server_option;
528 	func_mysqlnd_conn_data__set_client_option set_client_option;
529 	func_mysqlnd_conn_data__free_contents free_contents;
530 	func_mysqlnd_conn_data__free_options free_options;
531 	func_mysqlnd_conn_data__dtor dtor;
532 
533 	func_mysqlnd_conn_data__query_read_result_set_header query_read_result_set_header;
534 
535 	func_mysqlnd_conn_data__get_reference get_reference;
536 	func_mysqlnd_conn_data__free_reference free_reference;
537 
538 	func_mysqlnd_conn_data__restart_psession restart_psession;
539 	func_mysqlnd_conn_data__end_psession end_psession;
540 	func_mysqlnd_conn_data__send_close send_close;
541 
542 	func_mysqlnd_conn_data__ssl_set ssl_set;
543 
544 	func_mysqlnd_conn_data__result_init result_init;
545 	func_mysqlnd_conn_data__set_autocommit set_autocommit;
546 	func_mysqlnd_conn_data__tx_commit tx_commit;
547 	func_mysqlnd_conn_data__tx_rollback tx_rollback;
548 	func_mysqlnd_conn_data__tx_begin tx_begin;
549 	func_mysqlnd_conn_data__tx_commit_or_rollback tx_commit_or_rollback;
550 	func_mysqlnd_conn_data__tx_cor_options_to_string tx_cor_options_to_string;
551 	func_mysqlnd_conn_data__tx_savepoint tx_savepoint;
552 	func_mysqlnd_conn_data__tx_savepoint_release tx_savepoint_release;
553 
554 	func_mysqlnd_conn_data__local_tx_start local_tx_start;
555 	func_mysqlnd_conn_data__local_tx_end local_tx_end;
556 
557 	func_mysqlnd_conn_data__execute_init_commands execute_init_commands;
558 	func_mysqlnd_conn_data__get_updated_connect_flags get_updated_connect_flags;
559 	func_mysqlnd_conn_data__connect_handshake connect_handshake;
560 	func_mysqlnd_conn_data__fetch_auth_plugin_by_name fetch_auth_plugin_by_name;
561 
562 	func_mysqlnd_conn_data__set_client_option_2d set_client_option_2d;
563 
564 	func_mysqlnd_conn_data__negotiate_client_api_capabilities negotiate_client_api_capabilities;
565 	func_mysqlnd_conn_data__get_client_api_capabilities get_client_api_capabilities;
566 
567 	func_mysqlnd_conn_data__get_scheme get_scheme;
568 };
569 
570 
571 typedef enum_func_status	(*func_mysqlnd_data__connect)(MYSQLND * conn, const MYSQLND_CSTRING hostname, const MYSQLND_CSTRING username, const MYSQLND_CSTRING password, const MYSQLND_CSTRING database, unsigned int port, const MYSQLND_CSTRING socket_or_pipe, unsigned int mysql_flags);
572 typedef MYSQLND *			(*func_mysqlnd_conn__clone_object)(MYSQLND * const conn);
573 typedef void				(*func_mysqlnd_conn__dtor)(MYSQLND * conn);
574 typedef enum_func_status	(*func_mysqlnd_conn__close)(MYSQLND * conn, const enum_connection_close_type close_type);
575 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn)576 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn)
577 {
578 	func_mysqlnd_data__connect connect;
579 	func_mysqlnd_conn__clone_object clone_object;
580 	func_mysqlnd_conn__dtor dtor;
581 	func_mysqlnd_conn__close close;
582 };
583 
584 
585 	/* for decoding - binary or text protocol */
586 typedef enum_func_status	(*func_mysqlnd_res__row_decoder)(MYSQLND_ROW_BUFFER * row_buffer, zval * fields,
587 									unsigned int field_count, const MYSQLND_FIELD * fields_metadata,
588 									zend_bool as_int_or_float, MYSQLND_STATS * stats);
589 
590 
591 typedef MYSQLND_RES *		(*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, const zend_bool ps_protocol);
592 typedef MYSQLND_RES *		(*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND_CONN_DATA * const conn, const unsigned int flags);
593 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);
594 typedef MYSQLND_ROW_C 		(*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result);
595 typedef void 				(*func_mysqlnd_res__fetch_all)(MYSQLND_RES *result, const unsigned int flags, zval *return_value ZEND_FILE_LINE_DC);
596 typedef void 				(*func_mysqlnd_res__fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value);
597 typedef uint64_t			(*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result);
598 typedef unsigned int		(*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result);
599 typedef enum_func_status	(*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result);
600 typedef enum_func_status	(*func_mysqlnd_res__seek_data)(MYSQLND_RES * const result, const uint64_t row);
601 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__seek_field)(MYSQLND_RES * const result, const MYSQLND_FIELD_OFFSET field_offset);
602 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__field_tell)(const MYSQLND_RES * const result);
603 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field)(MYSQLND_RES * const result);
604 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field_direct)(MYSQLND_RES * const result, const MYSQLND_FIELD_OFFSET fieldnr);
605 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_fields)(MYSQLND_RES * const result);
606 
607 typedef enum_func_status	(*func_mysqlnd_res__read_result_metadata)(MYSQLND_RES * result, MYSQLND_CONN_DATA * conn);
608 typedef const size_t *		(*func_mysqlnd_res__fetch_lengths)(MYSQLND_RES * const result);
609 typedef enum_func_status	(*func_mysqlnd_res__store_result_fetch_data)(MYSQLND_CONN_DATA * const conn, MYSQLND_RES * result, MYSQLND_RES_METADATA * meta, MYSQLND_ROW_BUFFER ** row_buffers, zend_bool binary_protocol);
610 
611 typedef void				(*func_mysqlnd_res__free_result_buffers)(MYSQLND_RES * result);	/* private */
612 typedef enum_func_status	(*func_mysqlnd_res__free_result)(MYSQLND_RES * result, const zend_bool implicit);
613 typedef void				(*func_mysqlnd_res__free_result_internal)(MYSQLND_RES *result);
614 typedef void				(*func_mysqlnd_res__free_result_contents)(MYSQLND_RES *result);
615 typedef void				(*func_mysqlnd_res__free_buffered_data)(MYSQLND_RES *result);
616 typedef void				(*func_mysqlnd_res__unbuffered_free_last_data)(MYSQLND_RES *result);
617 
618 
619 typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res__result_meta_init)(MYSQLND_RES *result, unsigned int field_count);
620 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res)621 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res)
622 {
623 	mysqlnd_fetch_row_func	fetch_row;
624 
625 	func_mysqlnd_res__use_result use_result;
626 	func_mysqlnd_res__store_result store_result;
627 	func_mysqlnd_res__fetch_into fetch_into;
628 	func_mysqlnd_res__fetch_row_c fetch_row_c;
629 	func_mysqlnd_res__fetch_all fetch_all;
630 	func_mysqlnd_res__fetch_field_data fetch_field_data;
631 	func_mysqlnd_res__num_rows num_rows;
632 	func_mysqlnd_res__num_fields num_fields;
633 	func_mysqlnd_res__skip_result skip_result;
634 	func_mysqlnd_res__seek_data seek_data;
635 	func_mysqlnd_res__seek_field seek_field;
636 	func_mysqlnd_res__field_tell field_tell;
637 	func_mysqlnd_res__fetch_field fetch_field;
638 	func_mysqlnd_res__fetch_field_direct fetch_field_direct;
639 	func_mysqlnd_res__fetch_fields fetch_fields;
640 	func_mysqlnd_res__read_result_metadata read_result_metadata;
641 	func_mysqlnd_res__fetch_lengths fetch_lengths;
642 	func_mysqlnd_res__store_result_fetch_data store_result_fetch_data;
643 	func_mysqlnd_res__free_result_buffers free_result_buffers;
644 	func_mysqlnd_res__free_result free_result;
645 	func_mysqlnd_res__free_result_internal free_result_internal;
646 	func_mysqlnd_res__free_result_contents free_result_contents;
647 
648 	func_mysqlnd_res__result_meta_init result_meta_init;
649 
650 	void * unused1;
651 	void * unused2;
652 	void * unused3;
653 	void * unused4;
654 	void * unused5;
655 };
656 
657 
658 typedef uint64_t		(*func_mysqlnd_result_unbuffered__num_rows)(const MYSQLND_RES_UNBUFFERED * const result);
659 typedef const size_t *	(*func_mysqlnd_result_unbuffered__fetch_lengths)(MYSQLND_RES_UNBUFFERED * const result);
660 typedef void			(*func_mysqlnd_result_unbuffered__free_last_data)(MYSQLND_RES_UNBUFFERED * result, MYSQLND_STATS * const global_stats);
661 typedef void			(*func_mysqlnd_result_unbuffered__free_result)(MYSQLND_RES_UNBUFFERED * const result, MYSQLND_STATS * const global_stats);
662 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered)663 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered)
664 {
665 	mysqlnd_fetch_row_func							fetch_row;
666 	func_mysqlnd_res__row_decoder					row_decoder;
667 	func_mysqlnd_result_unbuffered__num_rows		num_rows;
668 	func_mysqlnd_result_unbuffered__fetch_lengths	fetch_lengths;
669 	func_mysqlnd_result_unbuffered__free_last_data	free_last_data;
670 	func_mysqlnd_result_unbuffered__free_result		free_result;
671 };
672 
673 typedef uint64_t			(*func_mysqlnd_result_buffered__num_rows)(const MYSQLND_RES_BUFFERED * const result);
674 typedef enum_func_status	(*func_mysqlnd_result_buffered__initialize_result_set_rest)(MYSQLND_RES_BUFFERED * const result, MYSQLND_RES_METADATA * const meta,
675 																						MYSQLND_STATS * stats, zend_bool int_and_float_native);
676 typedef const size_t *		(*func_mysqlnd_result_buffered__fetch_lengths)(MYSQLND_RES_BUFFERED * const result);
677 typedef enum_func_status	(*func_mysqlnd_result_buffered__data_seek)(MYSQLND_RES_BUFFERED * const result, const uint64_t row);
678 typedef void				(*func_mysqlnd_result_buffered__free_result)(MYSQLND_RES_BUFFERED * const result);
679 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered)680 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered)
681 {
682 	mysqlnd_fetch_row_func						fetch_row;
683 	func_mysqlnd_res__row_decoder				row_decoder;
684 	func_mysqlnd_result_buffered__num_rows		num_rows;
685 	func_mysqlnd_result_buffered__fetch_lengths	fetch_lengths;
686 	func_mysqlnd_result_buffered__data_seek		data_seek;
687 	func_mysqlnd_result_buffered__initialize_result_set_rest initialize_result_set_rest;
688 	func_mysqlnd_result_buffered__free_result	free_result;
689 };
690 
691 
692 typedef const MYSQLND_FIELD *	(*func_mysqlnd_res_meta__fetch_field)(MYSQLND_RES_METADATA * const meta);
693 typedef const MYSQLND_FIELD *	(*func_mysqlnd_res_meta__fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, const MYSQLND_FIELD_OFFSET fieldnr);
694 typedef const MYSQLND_FIELD *	(*func_mysqlnd_res_meta__fetch_fields)(MYSQLND_RES_METADATA * const meta);
695 typedef MYSQLND_FIELD_OFFSET	(*func_mysqlnd_res_meta__field_tell)(const MYSQLND_RES_METADATA * const meta);
696 typedef MYSQLND_FIELD_OFFSET	(*func_mysqlnd_res_meta__field_seek)(MYSQLND_RES_METADATA * const meta, const MYSQLND_FIELD_OFFSET field_offset);
697 typedef enum_func_status		(*func_mysqlnd_res_meta__read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND_CONN_DATA * conn, MYSQLND_RES * result);
698 typedef MYSQLND_RES_METADATA *	(*func_mysqlnd_res_meta__clone_metadata)(MYSQLND_RES *result, const MYSQLND_RES_METADATA * const meta);
699 typedef void					(*func_mysqlnd_res_meta__free_metadata)(MYSQLND_RES_METADATA * meta);
700 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res_meta)701 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res_meta)
702 {
703 	func_mysqlnd_res_meta__fetch_field fetch_field;
704 	func_mysqlnd_res_meta__fetch_field_direct fetch_field_direct;
705 	func_mysqlnd_res_meta__fetch_fields fetch_fields;
706 	func_mysqlnd_res_meta__field_tell field_tell;
707 	func_mysqlnd_res_meta__field_seek field_seek;
708 	func_mysqlnd_res_meta__read_metadata read_metadata;
709 	func_mysqlnd_res_meta__clone_metadata clone_metadata;
710 	func_mysqlnd_res_meta__free_metadata free_metadata;
711 };
712 
713 
714 typedef enum_func_status	(*func_mysqlnd_stmt__prepare)(MYSQLND_STMT * const stmt, const char * const query, const size_t query_len);
715 typedef enum_func_status	(*func_mysqlnd_stmt__send_execute)(MYSQLND_STMT * const s, const enum_mysqlnd_send_execute_type type, zval * read_cb, zval * err_cb);
716 typedef enum_func_status	(*func_mysqlnd_stmt__execute)(MYSQLND_STMT * const stmt);
717 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__use_result)(MYSQLND_STMT * const stmt);
718 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__store_result)(MYSQLND_STMT * const stmt);
719 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__get_result)(MYSQLND_STMT * const stmt);
720 typedef zend_bool			(*func_mysqlnd_stmt__more_results)(const MYSQLND_STMT * const stmt);
721 typedef enum_func_status	(*func_mysqlnd_stmt__next_result)(MYSQLND_STMT * const stmt);
722 typedef enum_func_status	(*func_mysqlnd_stmt__free_result)(MYSQLND_STMT * const stmt);
723 typedef enum_func_status	(*func_mysqlnd_stmt__seek_data)(const MYSQLND_STMT * const stmt, uint64_t row);
724 typedef enum_func_status	(*func_mysqlnd_stmt__reset)(MYSQLND_STMT * const stmt);
725 typedef enum_func_status	(*func_mysqlnd_stmt__close_on_server)(MYSQLND_STMT * const stmt, zend_bool implicit); /* private */
726 typedef enum_func_status	(*func_mysqlnd_stmt__dtor)(MYSQLND_STMT * const stmt, zend_bool implicit); /* use this for mysqlnd_stmt_close */
727 typedef enum_func_status	(*func_mysqlnd_stmt__fetch)(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything);
728 typedef enum_func_status	(*func_mysqlnd_stmt__bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind);
729 typedef enum_func_status	(*func_mysqlnd_stmt__bind_one_parameter)(MYSQLND_STMT * const stmt, unsigned int param_no, zval * const zv, zend_uchar	type);
730 typedef enum_func_status	(*func_mysqlnd_stmt__refresh_bind_param)(MYSQLND_STMT * const stmt);
731 typedef enum_func_status	(*func_mysqlnd_stmt__bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind);
732 typedef enum_func_status	(*func_mysqlnd_stmt__bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no);
733 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);
734 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__get_parameter_metadata)(MYSQLND_STMT * const stmt);
735 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__get_result_metadata)(MYSQLND_STMT * const stmt);
736 typedef uint64_t			(*func_mysqlnd_stmt__get_last_insert_id)(const MYSQLND_STMT * const stmt);
737 typedef uint64_t			(*func_mysqlnd_stmt__get_affected_rows)(const MYSQLND_STMT * const stmt);
738 typedef uint64_t			(*func_mysqlnd_stmt__get_num_rows)(const MYSQLND_STMT * const stmt);
739 typedef unsigned int		(*func_mysqlnd_stmt__get_param_count)(const MYSQLND_STMT * const stmt);
740 typedef unsigned int		(*func_mysqlnd_stmt__get_field_count)(const MYSQLND_STMT * const stmt);
741 typedef unsigned int		(*func_mysqlnd_stmt__get_warning_count)(const MYSQLND_STMT * const stmt);
742 typedef unsigned int		(*func_mysqlnd_stmt__get_error_no)(const MYSQLND_STMT * const stmt);
743 typedef const char *		(*func_mysqlnd_stmt__get_error_str)(const MYSQLND_STMT * const stmt);
744 typedef const char *		(*func_mysqlnd_stmt__get_sqlstate)(const MYSQLND_STMT * const stmt);
745 typedef enum_func_status	(*func_mysqlnd_stmt__get_attribute)(const MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void * const value);
746 typedef enum_func_status	(*func_mysqlnd_stmt__set_attribute)(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, const void * const value);
747 typedef MYSQLND_PARAM_BIND *(*func_mysqlnd_stmt__alloc_param_bind)(MYSQLND_STMT * const stmt);
748 typedef MYSQLND_RESULT_BIND*(*func_mysqlnd_stmt__alloc_result_bind)(MYSQLND_STMT * const stmt);
749 typedef	void 				(*func_mysqlnd_stmt__free_parameter_bind)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND *);
750 typedef	void 				(*func_mysqlnd_stmt__free_result_bind)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND *);
751 typedef unsigned int		(*func_mysqlnd_stmt__server_status)(const MYSQLND_STMT * const stmt);
752 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);
753 typedef enum_func_status	(*func_mysqlnd_stmt__parse_execute_response)(MYSQLND_STMT * const s, enum_mysqlnd_parse_exec_response_type type);
754 typedef void 				(*func_mysqlnd_stmt__free_stmt_content)(MYSQLND_STMT * const s);
755 typedef enum_func_status	(*func_mysqlnd_stmt__flush)(MYSQLND_STMT * const stmt);
756 typedef void 				(*func_mysqlnd_stmt__free_stmt_result)(MYSQLND_STMT * const s);
757 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt)758 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt)
759 {
760 	func_mysqlnd_stmt__prepare prepare;
761 	func_mysqlnd_stmt__send_execute send_execute;
762 	func_mysqlnd_stmt__execute execute;
763 	func_mysqlnd_stmt__use_result use_result;
764 	func_mysqlnd_stmt__store_result store_result;
765 	func_mysqlnd_stmt__get_result get_result;
766 	func_mysqlnd_stmt__more_results more_results;
767 	func_mysqlnd_stmt__next_result next_result;
768 	func_mysqlnd_stmt__free_result free_result;
769 	func_mysqlnd_stmt__seek_data seek_data;
770 	func_mysqlnd_stmt__reset reset;
771 	func_mysqlnd_stmt__close_on_server close_on_server;
772 	func_mysqlnd_stmt__dtor dtor;
773 	func_mysqlnd_stmt__fetch fetch;
774 
775 	func_mysqlnd_stmt__bind_parameters bind_parameters;
776 	func_mysqlnd_stmt__bind_one_parameter bind_one_parameter;
777 	func_mysqlnd_stmt__refresh_bind_param refresh_bind_param;
778 	func_mysqlnd_stmt__bind_result bind_result;
779 	func_mysqlnd_stmt__bind_one_result bind_one_result;
780 	func_mysqlnd_stmt__send_long_data send_long_data;
781 	func_mysqlnd_stmt__get_parameter_metadata get_parameter_metadata;
782 	func_mysqlnd_stmt__get_result_metadata get_result_metadata;
783 
784 	func_mysqlnd_stmt__get_last_insert_id get_last_insert_id;
785 	func_mysqlnd_stmt__get_affected_rows get_affected_rows;
786 	func_mysqlnd_stmt__get_num_rows get_num_rows;
787 
788 	func_mysqlnd_stmt__get_param_count get_param_count;
789 	func_mysqlnd_stmt__get_field_count get_field_count;
790 	func_mysqlnd_stmt__get_warning_count get_warning_count;
791 
792 	func_mysqlnd_stmt__get_error_no get_error_no;
793 	func_mysqlnd_stmt__get_error_str get_error_str;
794 	func_mysqlnd_stmt__get_sqlstate get_sqlstate;
795 
796 	func_mysqlnd_stmt__get_attribute get_attribute;
797 	func_mysqlnd_stmt__set_attribute set_attribute;
798 
799 	func_mysqlnd_stmt__alloc_param_bind alloc_parameter_bind;
800 	func_mysqlnd_stmt__alloc_result_bind alloc_result_bind;
801 
802 	func_mysqlnd_stmt__free_parameter_bind free_parameter_bind;
803 	func_mysqlnd_stmt__free_result_bind free_result_bind;
804 
805 	func_mysqlnd_stmt__server_status get_server_status;
806 
807 	func_mysqlnd_stmt__generate_execute_request generate_execute_request;
808 	func_mysqlnd_stmt__parse_execute_response parse_execute_response;
809 
810 	func_mysqlnd_stmt__free_stmt_content free_stmt_content;
811 
812 	func_mysqlnd_stmt__flush flush;
813 
814 	func_mysqlnd_stmt__free_stmt_result free_stmt_result;
815 };
816 
817 
818 struct st_mysqlnd_vio_data
819 {
820 	php_stream			*stream;
821 	zend_bool			ssl;
822 	MYSQLND_VIO_OPTIONS	options;
823 #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
824 	zend_uchar			last_command;
825 #else
826 	zend_uchar			unused_pad1;
827 #endif
828 
829 	zend_bool			persistent;
830 
831 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_vio) m;
832 };
833 
834 
835 struct st_mysqlnd_vio
836 {
837 	struct st_mysqlnd_vio_data * data;
838 
839 	zend_bool persistent;
840 };
841 
842 
843 
844 typedef enum_func_status (*func_mysqlnd__run_command)(enum php_mysqlnd_server_command command, ...);
845 
846 
847 
848 typedef struct st_mysqlnd_connection_state MYSQLND_CONNECTION_STATE;
849 typedef enum mysqlnd_connection_state (*func_mysqlnd_connection_state__get)(const MYSQLND_CONNECTION_STATE * const state_struct);
850 typedef void (*func_mysqlnd_connection_state__set)(MYSQLND_CONNECTION_STATE * const state_struct, const enum mysqlnd_connection_state state);
851 
852 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_connection_state)853 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_connection_state)
854 {
855 	func_mysqlnd_connection_state__get get;
856 	func_mysqlnd_connection_state__set set;
857 };
858 
859 struct st_mysqlnd_connection_state
860 {
861 	enum mysqlnd_connection_state state;
862 
863 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_connection_state) *m;
864 };
865 
866 struct st_mysqlnd_connection_data
867 {
868 /* Operation related */
869 	MYSQLND_PFC		* protocol_frame_codec;
870 	MYSQLND_VIO		* vio;
871 	MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory;
872 
873 /* Information related */
874 	MYSQLND_STRING	hostname;
875 	MYSQLND_STRING	unix_socket;
876 	MYSQLND_STRING	username;
877 	MYSQLND_STRING	password;
878 	MYSQLND_STRING	scheme;
879 	uint64_t		thread_id;
880 	char			*server_version;
881 	char			*host_info;
882 	MYSQLND_STRING	authentication_plugin_data;
883 	const MYSQLND_CHARSET *charset;
884 	const MYSQLND_CHARSET *greet_charset;
885 	MYSQLND_STRING	connect_or_select_db;
886 	MYSQLND_INFILE	infile;
887 	unsigned int	protocol_version;
888 	unsigned int	port;
889 	zend_ulong		server_capabilities;
890 
891 	/* For UPSERT queries */
892 	MYSQLND_UPSERT_STATUS * upsert_status;
893 	MYSQLND_UPSERT_STATUS upsert_status_impl;
894 	MYSQLND_STRING last_message;
895 
896 	/* If error packet, we use these */
897 	MYSQLND_ERROR_INFO	* error_info;
898 	MYSQLND_ERROR_INFO	error_info_impl;
899 
900 	MYSQLND_CONNECTION_STATE	state;
901 	enum_mysqlnd_query_type		last_query_type;
902 	/* Temporary storage between query and (use|store)_result() call */
903 	MYSQLND_RES						*current_result;
904 
905 	/*
906 	  How many result sets reference this connection.
907 	  It won't be freed until this number reaches 0.
908 	  The last one, please close the door! :-)
909 	  The result set objects can determine by inspecting
910 	  'quit_sent' whether the connection is still valid.
911 	*/
912 	unsigned int	refcount;
913 
914 	/* Temporal storage for mysql_query */
915 	unsigned int	field_count;
916 
917 	/* options */
918 	MYSQLND_SESSION_OPTIONS	* options;
919 	MYSQLND_SESSION_OPTIONS	options_impl;
920 
921 	/* stats */
922 	MYSQLND_STATS	* stats;
923 
924 	size_t			client_api_capabilities;
925 
926 	zval			async_read_cb;
927 	zval			async_err_cb;
928 	zend_bool		in_async_read_cb;
929 	zend_bool		in_async_err_cb;
930 
931 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) object_factory;
932 	func_mysqlnd__run_command run_command;
933 
934 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn_data) * m;
935 
936 	/* persistent connection */
937 	zend_bool		persistent;
938 };
939 
940 
941 struct st_mysqlnd_connection
942 {
943 	MYSQLND_CONN_DATA * data;
944 	zend_bool persistent;
945 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_conn) * m;
946 };
947 
948 
949 
950 struct st_mysqlnd_packet_greet;
951 struct st_mysqlnd_packet_auth;
952 struct st_mysqlnd_packet_auth_response;
953 struct st_mysqlnd_packet_change_auth_response;
954 struct st_mysqlnd_packet_ok;
955 struct st_mysqlnd_packet_command;
956 struct st_mysqlnd_packet_eof;
957 struct st_mysqlnd_packet_rset_header;
958 struct st_mysqlnd_packet_res_field;
959 struct st_mysqlnd_packet_row;
960 struct st_mysqlnd_packet_stats;
961 struct st_mysqlnd_packet_prepare_response;
962 struct st_mysqlnd_packet_chg_user_resp;
963 struct st_mysqlnd_packet_auth_pam;
964 struct st_mysqlnd_packet_sha256_pk_request;
965 struct st_mysqlnd_packet_sha256_pk_request_response;
966 
967 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_greet_packet)(struct st_mysqlnd_packet_greet *packet);
968 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_auth_packet)(struct st_mysqlnd_packet_auth *packet);
969 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_auth_response_packet)(struct st_mysqlnd_packet_auth_response *packet);
970 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_change_auth_response_packet)(struct st_mysqlnd_packet_change_auth_response *packet);
971 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_ok_packet)(struct st_mysqlnd_packet_ok *packet);
972 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_command_packet)(struct st_mysqlnd_packet_command *packet);
973 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_eof_packet)(struct st_mysqlnd_packet_eof *packet);
974 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_rset_header_packet)(struct st_mysqlnd_packet_rset_header *packet);
975 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_result_field_packet)(struct st_mysqlnd_packet_res_field *packet);
976 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_row_packet)(struct st_mysqlnd_packet_row *packet);
977 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_stats_packet)(struct st_mysqlnd_packet_stats *packet);
978 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_prepare_response_packet)(struct st_mysqlnd_packet_prepare_response *packet);
979 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_change_user_response_packet)(struct st_mysqlnd_packet_chg_user_resp *packet);
980 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_sha256_pk_request_packet)(struct st_mysqlnd_packet_sha256_pk_request *packet);
981 typedef void (*func_mysqlnd_protocol_payload_decoder_factory__init_sha256_pk_request_response_packet)(struct st_mysqlnd_packet_sha256_pk_request_response *packet);
982 
983 typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_command)(
984 			MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory,
985 			const enum php_mysqlnd_server_command command,
986 			const zend_uchar * const arg, const size_t arg_len,
987 			const zend_bool silent,
988 
989 			MYSQLND_CONNECTION_STATE * connection_state,
990 			MYSQLND_ERROR_INFO	* error_info,
991 			MYSQLND_UPSERT_STATUS * upsert_status,
992 			MYSQLND_STATS * stats,
993 			func_mysqlnd_conn_data__send_close send_close,
994 			void * send_close_ctx);
995 
996 typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_OK)(
997 			MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory,
998 			MYSQLND_ERROR_INFO * const error_info,
999 			MYSQLND_UPSERT_STATUS * const upsert_status,
1000 			const zend_bool ignore_upsert_status,  /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
1001 			MYSQLND_STRING * const last_message);
1002 
1003 typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_EOF)(
1004 			MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * const payload_decoder_factory,
1005 			MYSQLND_ERROR_INFO * const error_info,
1006 			MYSQLND_UPSERT_STATUS * const upsert_status);
1007 
1008 typedef enum_func_status (*func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response)(
1009 			MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * payload_decoder_factory,
1010 			const enum mysqlnd_packet_type ok_packet,
1011 			const zend_bool silent,
1012 			const enum php_mysqlnd_server_command command,
1013 			const zend_bool ignore_upsert_status, /* actually used only by LOAD DATA. COM_QUERY and COM_EXECUTE handle the responses themselves */
1014 
1015 			MYSQLND_ERROR_INFO	* error_info,
1016 			MYSQLND_UPSERT_STATUS * upsert_status,
1017 			MYSQLND_STRING * last_message);
1018 
1019 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory)1020 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory)
1021 {
1022 	func_mysqlnd_protocol_payload_decoder_factory__init_greet_packet init_greet_packet;
1023 	func_mysqlnd_protocol_payload_decoder_factory__init_auth_packet init_auth_packet;
1024 	func_mysqlnd_protocol_payload_decoder_factory__init_auth_response_packet init_auth_response_packet;
1025 	func_mysqlnd_protocol_payload_decoder_factory__init_change_auth_response_packet init_change_auth_response_packet;
1026 	func_mysqlnd_protocol_payload_decoder_factory__init_ok_packet init_ok_packet;
1027 	func_mysqlnd_protocol_payload_decoder_factory__init_command_packet init_command_packet;
1028 	func_mysqlnd_protocol_payload_decoder_factory__init_eof_packet init_eof_packet;
1029 	func_mysqlnd_protocol_payload_decoder_factory__init_rset_header_packet init_rset_header_packet;
1030 	func_mysqlnd_protocol_payload_decoder_factory__init_result_field_packet init_result_field_packet;
1031 	func_mysqlnd_protocol_payload_decoder_factory__init_row_packet init_row_packet;
1032 	func_mysqlnd_protocol_payload_decoder_factory__init_stats_packet init_stats_packet;
1033 	func_mysqlnd_protocol_payload_decoder_factory__init_prepare_response_packet init_prepare_response_packet;
1034 	func_mysqlnd_protocol_payload_decoder_factory__init_change_user_response_packet init_change_user_response_packet;
1035 	func_mysqlnd_protocol_payload_decoder_factory__init_sha256_pk_request_packet init_sha256_pk_request_packet;
1036 	func_mysqlnd_protocol_payload_decoder_factory__init_sha256_pk_request_response_packet init_sha256_pk_request_response_packet;
1037 
1038 	func_mysqlnd_protocol_payload_decoder_factory__send_command send_command;
1039 	func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_response send_command_handle_response;
1040 	func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_OK send_command_handle_OK;
1041 	func_mysqlnd_protocol_payload_decoder_factory__send_command_handle_EOF send_command_handle_EOF;
1042 };
1043 
1044 struct st_mysqlnd_protocol_payload_decoder_factory
1045 {
1046 	MYSQLND_CONN_DATA * conn;
1047 	zend_bool persistent;
1048 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_payload_decoder_factory) m;
1049 };
1050 
1051 
1052 typedef struct st_mysqlnd_read_buffer {
1053 	zend_uchar 	* data;
1054 	size_t 		offset;
1055 	size_t 		size;
1056 	size_t		len;
1057 	zend_bool	(*is_empty)(const struct st_mysqlnd_read_buffer *);
1058 	void		(*read)(struct st_mysqlnd_read_buffer *, size_t count, zend_uchar * dest);
1059 	size_t		(*bytes_left)(const struct st_mysqlnd_read_buffer *);
1060 	void		(*free_buffer)(struct st_mysqlnd_read_buffer **);
1061 } MYSQLND_READ_BUFFER;
1062 
1063 
1064 
1065 typedef enum_func_status	(*func_mysqlnd_pfc__init)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const stats, MYSQLND_ERROR_INFO * const error_info);
1066 typedef void				(*func_mysqlnd_pfc__dtor)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
1067 typedef enum_func_status	(*func_mysqlnd_pfc__reset)(MYSQLND_PFC * const pfc, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
1068 typedef enum_func_status	(*func_mysqlnd_pfc__set_client_option)(MYSQLND_PFC * const pfc, enum_mysqlnd_client_option option, const char * const value);
1069 typedef enum_func_status	(*func_mysqlnd_pfc__decode)(zend_uchar * uncompressed_data, const size_t uncompressed_data_len, const zend_uchar * const compressed_data, const size_t compressed_data_len);
1070 typedef enum_func_status	(*func_mysqlnd_pfc__encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, const zend_uchar * const uncompressed_data, const size_t uncompressed_data_len);
1071 typedef size_t				(*func_mysqlnd_pfc__send)(MYSQLND_PFC * const pfc, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
1072 typedef enum_func_status	(*func_mysqlnd_pfc__receive)(MYSQLND_PFC * const pfc, MYSQLND_VIO * const vio, zend_uchar * const buffer, const size_t count, MYSQLND_STATS * const conn_stats, MYSQLND_ERROR_INFO * const error_info);
1073 typedef enum_func_status	(*func_mysqlnd_pfc__read_compressed_packet_from_stream_and_fill_read_buffer)(MYSQLND_PFC * pfc, MYSQLND_VIO * const vio, size_t net_payload_size, MYSQLND_STATS * conn_stats, MYSQLND_ERROR_INFO * error_info);
1074 typedef void				(*func_mysqlnd_pfc__free_contents)(MYSQLND_PFC * pfc);
1075 
MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec)1076 MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec)
1077 {
1078 	func_mysqlnd_pfc__init init;
1079 	func_mysqlnd_pfc__dtor dtor;
1080 	func_mysqlnd_pfc__reset reset;
1081 	func_mysqlnd_pfc__set_client_option set_client_option;
1082 
1083 	func_mysqlnd_pfc__decode decode;
1084 	func_mysqlnd_pfc__encode encode;
1085 
1086 	func_mysqlnd_pfc__send send;
1087 	func_mysqlnd_pfc__receive receive;
1088 
1089 	func_mysqlnd_pfc__read_compressed_packet_from_stream_and_fill_read_buffer read_compressed_packet_from_stream_and_fill_read_buffer;
1090 
1091 	func_mysqlnd_pfc__free_contents free_contents;
1092 };
1093 
1094 
1095 struct st_mysqlnd_protocol_frame_codec_data
1096 {
1097 	php_stream		*stream;
1098 	zend_bool		compressed;
1099 	zend_bool		ssl;
1100 	uint64_t		flags;
1101 	char *			sha256_server_public_key;
1102 
1103 #ifdef MYSQLND_COMPRESSION_ENABLED
1104 	MYSQLND_READ_BUFFER	* uncompressed_data;
1105 #else
1106 	void * 				unused_pad1;
1107 #endif
1108 
1109 	/* sequence for simple checking of correct packets */
1110 	zend_uchar		packet_no;
1111 	zend_uchar		compressed_envelope_packet_no;
1112 
1113 	zend_bool		persistent;
1114 
1115 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_protocol_packet_frame_codec) m;
1116 };
1117 
1118 
1119 struct st_mysqlnd_protocol_frame_codec
1120 {
1121 	MYSQLND_CMD_BUFFER	cmd_buffer;
1122 
1123 	struct st_mysqlnd_protocol_frame_codec_data * data;
1124 
1125 	zend_bool 		persistent;
1126 };
1127 
1128 
1129 struct st_mysqlnd_result_metadata
1130 {
1131 	MYSQLND_FIELD					*fields;
1132 
1133 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res_meta) * m;
1134 
1135 	unsigned int					current_field;
1136 	unsigned int					field_count;
1137 };
1138 
1139 
1140 #define def_mysqlnd_buffered_result_parent 			\
1141 	MYSQLND_ROW_BUFFER	*row_buffers;				\
1142 	uint64_t			row_count;					\
1143 	uint64_t			initialized_rows;			\
1144 													\
1145 	/*  Column lengths of current row - both buffered and unbuffered. For buffered results it duplicates the data found in **data */ \
1146 	size_t				*lengths;					\
1147 													\
1148 	MYSQLND_MEMORY_POOL	*result_set_memory_pool;	\
1149 													\
1150 	unsigned int		references;					\
1151 													\
1152 	MYSQLND_ERROR_INFO	error_info;					\
1153 													\
1154 	unsigned int		field_count;				\
1155 	zend_bool			ps;							\
1156 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_buffered) m;	\
1157 	enum mysqlnd_buffered_type type;				\
1158 	void				* unused1;					\
1159 	void				* unused2;					\
1160 	void				* unused3
1161 
1162 
1163 struct st_mysqlnd_buffered_result_parent
1164 {
1165 	def_mysqlnd_buffered_result_parent;
1166 };
1167 
1168 
1169 struct st_mysqlnd_buffered_result_zval
1170 {
1171 	def_mysqlnd_buffered_result_parent;
1172 
1173 	zval	*data;
1174 	zval	*data_cursor;
1175 };
1176 
1177 
1178 struct st_mysqlnd_buffered_result_c
1179 {
1180 	def_mysqlnd_buffered_result_parent;
1181 
1182 	zend_uchar	*initialized; /* every row is a single bit */
1183 	uint64_t	current_row;
1184 };
1185 
1186 
1187 struct st_mysqlnd_unbuffered_result
1188 {
1189 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_result_unbuffered) m;
1190 	uint64_t			row_count;
1191 
1192 	/* For unbuffered (both normal and PS) */
1193 	zval				*last_row_data;
1194 	MYSQLND_ROW_BUFFER	 last_row_buffer;
1195 
1196 	/*
1197 	  Column lengths of current row - both buffered and unbuffered.
1198 	  For buffered results it duplicates the data found in **data
1199 	*/
1200 	size_t				*lengths;
1201 
1202 	MYSQLND_MEMORY_POOL	*result_set_memory_pool;
1203 
1204 	struct st_mysqlnd_packet_row *row_packet;
1205 
1206 	unsigned int		field_count;
1207 
1208 	zend_bool			eof_reached;
1209 
1210 	zend_bool			ps;
1211 };
1212 
1213 
1214 struct st_mysqlnd_res
1215 {
1216 	MYSQLND_CONN_DATA		*conn;
1217 	enum_mysqlnd_res_type	type;
1218 	unsigned int			field_count;
1219 
1220 	/* For metadata functions */
1221 	MYSQLND_RES_METADATA	*meta;
1222 
1223 	/* To be used with store_result() - both normal and PS */
1224 	MYSQLND_RES_BUFFERED	*stored_data;
1225 	MYSQLND_RES_UNBUFFERED	*unbuf;
1226 
1227 	MYSQLND_MEMORY_POOL		*memory_pool;
1228 
1229 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_res) m;
1230 };
1231 
1232 
1233 struct st_mysqlnd_param_bind
1234 {
1235 	zval		zv;
1236 	zend_uchar	type;
1237 	enum_param_bind_flags	flags;
1238 };
1239 
1240 struct st_mysqlnd_result_bind
1241 {
1242 	zval		zv;
1243 	zend_bool	bound;
1244 };
1245 
1246 
1247 struct st_mysqlnd_stmt_data
1248 {
1249 	MYSQLND_CONN_DATA			*conn;
1250 	zend_ulong					stmt_id;
1251 	zend_ulong					flags;/* cursor is set here */
1252 	enum_mysqlnd_stmt_state		state;
1253 	MYSQLND_RES					*result;
1254 	unsigned int				field_count;
1255 	unsigned int				param_count;
1256 	unsigned char				send_types_to_server;
1257 	MYSQLND_PARAM_BIND			*param_bind;
1258 	MYSQLND_RESULT_BIND			*result_bind;
1259 	zend_bool					result_zvals_separated_once;
1260 
1261 	MYSQLND_UPSERT_STATUS * 	upsert_status;
1262 	MYSQLND_UPSERT_STATUS 		upsert_status_impl;
1263 
1264 	MYSQLND_ERROR_INFO *		error_info;
1265 	MYSQLND_ERROR_INFO			error_info_impl;
1266 
1267 	zend_bool					update_max_length;
1268 	zend_ulong					prefetch_rows;
1269 
1270 	zend_bool					cursor_exists;
1271 	mysqlnd_stmt_use_or_store_func default_rset_handler;
1272 
1273 	zval						execute_read_cb;
1274 	zval						execute_err_cb;
1275 	zend_bool					in_execute_read_cb;
1276 	zend_bool					in_execute_err_cb;
1277 
1278 	MYSQLND_CMD_BUFFER			execute_cmd_buffer;
1279 	unsigned int				execute_count;/* count how many times the stmt was executed */
1280 };
1281 
1282 
1283 struct st_mysqlnd_stmt
1284 {
1285 	MYSQLND_STMT_DATA * data;
1286 	MYSQLND_CLASS_METHODS_TYPE(mysqlnd_stmt) * m;
1287 };
1288 
1289 
1290 struct st_mysqlnd_plugin_header
1291 {
1292 	unsigned int	plugin_api_version;
1293 	const char *	plugin_name;
1294 	zend_ulong	plugin_version;
1295 	const char *	plugin_string_version;
1296 	const char *	plugin_license;
1297 	const char *	plugin_author;
1298 	struct
1299 	{
1300 		MYSQLND_STATS *			values;
1301 		const MYSQLND_STRING *	names;
1302 	} plugin_stats;
1303 
1304 	struct
1305 	{
1306 		enum_func_status (*plugin_shutdown)(void * plugin);
1307 	} m;
1308 };
1309 
1310 
1311 struct st_mysqlnd_plugin_core
1312 {
1313 	struct st_mysqlnd_plugin_header plugin_header;
1314 };
1315 
1316 
1317 struct st_mysqlnd_typeii_plugin_example
1318 {
1319 	struct st_mysqlnd_plugin_header plugin_header;
1320 	void * methods;
1321 	unsigned int counter;
1322 };
1323 
1324 struct st_mysqlnd_authentication_plugin;
1325 
1326 typedef zend_uchar * (*func_auth_plugin__get_auth_data)(struct st_mysqlnd_authentication_plugin * self,
1327 														size_t * auth_data_len,
1328 														MYSQLND_CONN_DATA * conn, const char * const user, const char * const passwd,
1329 														const size_t passwd_len, zend_uchar * auth_plugin_data, size_t auth_plugin_data_len,
1330 														const MYSQLND_SESSION_OPTIONS * const session_options,
1331 														const MYSQLND_PFC_DATA * const pfc_data, zend_ulong mysql_flags
1332 														);
1333 
1334 struct st_mysqlnd_authentication_plugin
1335 {
1336 	struct st_mysqlnd_plugin_header plugin_header;
1337 	struct {
1338 		func_auth_plugin__get_auth_data get_auth_data;
1339 	} methods;
1340 };
1341 
1342 #endif /* MYSQLND_STRUCTS_H */
1343