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