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