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