xref: /PHP-5.3/ext/mysqlnd/mysqlnd_structs.h (revision bc11e6fd)
1 /*
2   +----------------------------------------------------------------------+
3   | PHP Version 5                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 2006-2013 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: Georg Richter <georg@mysql.com>                             |
16   |          Andrey Hristov <andrey@mysql.com>                           |
17   |          Ulf Wendel <uwendel@mysql.com>                              |
18   +----------------------------------------------------------------------+
19 */
20 
21 /* $Id$ */
22 
23 #ifndef MYSQLND_STRUCTS_H
24 #define MYSQLND_STRUCTS_H
25 
26 #define MYSQLND_TYPEDEFED_METHODS
27 
28 typedef struct st_mysqlnd_memory_pool MYSQLND_MEMORY_POOL;
29 typedef struct st_mysqlnd_memory_pool_chunk MYSQLND_MEMORY_POOL_CHUNK;
30 typedef struct st_mysqlnd_memory_pool_chunk_llist MYSQLND_MEMORY_POOL_CHUNK_LLIST;
31 
32 
33 #define MYSQLND_MEMORY_POOL_CHUNK_LIST_SIZE 100
34 
35 struct st_mysqlnd_memory_pool
36 {
37 	zend_uchar *arena;
38 	unsigned int refcount;
39 	unsigned int arena_size;
40 	unsigned int free_size;
41 
42 	MYSQLND_MEMORY_POOL_CHUNK*	(*get_chunk)(MYSQLND_MEMORY_POOL * pool, unsigned int size TSRMLS_DC);
43 };
44 
45 struct st_mysqlnd_memory_pool_chunk
46 {
47 	size_t				app;
48 	MYSQLND_MEMORY_POOL	*pool;
49 	zend_uchar			*ptr;
50 	unsigned int		size;
51 	enum_func_status	(*resize_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk, unsigned int size TSRMLS_DC);
52 	void				(*free_chunk)(MYSQLND_MEMORY_POOL_CHUNK * chunk TSRMLS_DC);
53 	zend_bool			from_pool;
54 };
55 
56 
57 typedef struct st_mysqlnd_cmd_buffer
58 {
59 	zend_uchar		*buffer;
60 	size_t			length;
61 } MYSQLND_CMD_BUFFER;
62 
63 
64 typedef struct st_mysqlnd_field
65 {
66 	const char *name;			/* Name of column */
67 	const char *org_name;		/* Original column name, if an alias */
68 	const char *table;			/* Table of column if column was a field */
69 	const char *org_table;		/* Org table name, if table was an alias */
70 	const char *db;				/* Database for table */
71 	const char *catalog;		/* Catalog for table */
72 	char *def;					/* Default value (set by mysql_list_fields) */
73 	unsigned long length;		/* Width of column (create length) */
74 	unsigned long max_length;	/* Max width for selected set */
75 	unsigned int name_length;
76 	unsigned int org_name_length;
77 	unsigned int table_length;
78 	unsigned int org_table_length;
79 	unsigned int db_length;
80 	unsigned int catalog_length;
81 	unsigned int def_length;
82 	unsigned int flags;			/* Diverse flags */
83 	unsigned int decimals;		/* Number of decimals in field */
84 	unsigned int charsetnr;		/* Character set */
85 	enum mysqlnd_field_types type;	/* Type of field. See mysql_com.h for types */
86 	char *root;
87 	size_t root_len;
88 } MYSQLND_FIELD;
89 
90 
91 typedef struct st_mysqlnd_upsert_result
92 {
93 	unsigned int	warning_count;
94 	unsigned int	server_status;
95 	uint64_t		affected_rows;
96 	uint64_t		last_insert_id;
97 } MYSQLND_UPSERT_STATUS;
98 
99 
100 typedef struct st_mysqlnd_error_info
101 {
102 	char error[MYSQLND_ERRMSG_SIZE+1];
103 	char sqlstate[MYSQLND_SQLSTATE_LENGTH + 1];
104 	unsigned int error_no;
105 } MYSQLND_ERROR_INFO;
106 
107 
108 typedef struct st_mysqlnd_infile_info
109 {
110 	php_stream	*fd;
111 	int			error_no;
112 	char		error_msg[MYSQLND_ERRMSG_SIZE + 1];
113 	const char	*filename;
114 } MYSQLND_INFILE_INFO;
115 
116 
117 /* character set information */
118 typedef struct st_mysqlnd_charset
119 {
120 	unsigned int	nr;
121 	const char		*name;
122 	const char		*collation;
123 	unsigned int	char_minlen;
124 	unsigned int	char_maxlen;
125 	const char		*comment;
126 	unsigned int 	(*mb_charlen)(unsigned int c);
127 	unsigned int 	(*mb_valid)(const char *start, const char *end);
128 } MYSQLND_CHARSET;
129 
130 
131 /* local infile handler */
132 typedef struct st_mysqlnd_infile
133 {
134 	int		(*local_infile_init)(void **ptr, char *filename, void **userdata TSRMLS_DC);
135 	int		(*local_infile_read)(void *ptr, char *buf, unsigned int buf_len TSRMLS_DC);
136 	int		(*local_infile_error)(void *ptr, char *error_msg, unsigned int error_msg_len TSRMLS_DC);
137 	void	(*local_infile_end)(void *ptr TSRMLS_DC);
138 	zval	*callback;
139 	void	*userdata;
140 } MYSQLND_INFILE;
141 
142 typedef struct st_mysqlnd_options
143 {
144 	ulong		flags;
145 
146 	/* init commands - we need to send them to server directly after connect */
147 	unsigned int	num_commands;
148 	char			**init_commands;
149 
150 	/* configuration file information */
151 	char 		*cfg_file;
152 	char		*cfg_section;
153 
154 	/*
155 	  We need to keep these because otherwise st_mysqlnd_conn will be changed.
156 	  The ABI will be broken and the methods structure will be somewhere else
157 	  in the memory which can crash external code. Feel free to reuse these.
158 	*/
159 	char		* unused1;
160 	char		* unused2;
161 	char		* unused3;
162 	char		* unused4;
163 	char		* unused5;
164 
165 	enum_mysqlnd_protocol_type protocol;
166 
167 	char 		*charset_name;
168 	/* maximum allowed packet size for communication */
169 	ulong		max_allowed_packet;
170 
171 	zend_bool	numeric_and_datetime_as_unicode;
172 #ifdef MYSQLND_STRING_TO_INT_CONVERSION
173 	zend_bool	int_and_float_native;
174 #endif
175 } MYSQLND_OPTIONS;
176 
177 typedef struct st_mysqlnd_net_options
178 {
179 	/* timeouts */
180 	unsigned int timeout_connect;
181 	unsigned int timeout_read;
182 	unsigned int timeout_write;
183 
184 	unsigned int net_read_buffer_size;
185 
186 	/* SSL information */
187 	char		*ssl_key;
188 	char		*ssl_cert;
189 	char		*ssl_ca;
190 	char		*ssl_capath;
191 	char		*ssl_cipher;
192 	char		*ssl_passphrase;
193 	zend_bool	ssl_verify_peer;
194 	uint64_t	flags;
195 } MYSQLND_NET_OPTIONS;
196 
197 
198 typedef struct st_mysqlnd_connection MYSQLND;
199 typedef struct st_mysqlnd_net	MYSQLND_NET;
200 typedef struct st_mysqlnd_protocol	MYSQLND_PROTOCOL;
201 typedef struct st_mysqlnd_res	MYSQLND_RES;
202 typedef char** 					MYSQLND_ROW_C;		/* return data as array of strings */
203 typedef struct st_mysqlnd_stmt_data	MYSQLND_STMT_DATA;
204 typedef struct st_mysqlnd_stmt	MYSQLND_STMT;
205 typedef unsigned int			MYSQLND_FIELD_OFFSET;
206 
207 typedef struct st_mysqlnd_param_bind MYSQLND_PARAM_BIND;
208 
209 typedef struct st_mysqlnd_result_bind MYSQLND_RESULT_BIND;
210 
211 typedef struct st_mysqlnd_result_metadata MYSQLND_RES_METADATA;
212 typedef struct st_mysqlnd_buffered_result MYSQLND_RES_BUFFERED;
213 typedef struct st_mysqlnd_unbuffered_result MYSQLND_RES_UNBUFFERED;
214 
215 typedef struct st_mysqlnd_debug MYSQLND_DEBUG;
216 
217 
218 typedef MYSQLND_RES* (*mysqlnd_stmt_use_or_store_func)(MYSQLND_STMT * const TSRMLS_DC);
219 typedef enum_func_status  (*mysqlnd_fetch_row_func)(MYSQLND_RES *result,
220 													void *param,
221 													unsigned int flags,
222 													zend_bool *fetched_anything
223 													TSRMLS_DC);
224 
225 typedef struct st_mysqlnd_stats MYSQLND_STATS;
226 
227 typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change TSRMLS_DC);
228 
229 struct st_mysqlnd_stats
230 {
231 	uint64_t				*values;
232 	mysqlnd_stat_trigger	*triggers;
233 	size_t					count;
234 	zend_bool				in_trigger;
235 #ifdef ZTS
236 	MUTEX_T	LOCK_access;
237 #endif
238 };
239 
240 
241 typedef struct st_mysqlnd_read_buffer {
242 	zend_uchar 	* data;
243 	size_t 		offset;
244 	size_t 		size;
245 	size_t		len;
246 	zend_bool	(*is_empty)(struct st_mysqlnd_read_buffer *);
247 	void		(*read)(struct st_mysqlnd_read_buffer *, size_t count, zend_uchar * dest);
248 	size_t		(*bytes_left)(struct st_mysqlnd_read_buffer *);
249 	void		(*free_buffer)(struct st_mysqlnd_read_buffer ** TSRMLS_DC);
250 } MYSQLND_READ_BUFFER;
251 
252 
253 
254 typedef enum_func_status	(*func_mysqlnd_net__connect)(MYSQLND_NET * net, const char * const scheme, size_t scheme_len, zend_bool persistent, char **errstr, int * errcode TSRMLS_DC);
255 typedef size_t				(*func_mysqlnd_net__send)(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC);
256 typedef enum_func_status	(*func_mysqlnd_net__receive)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC);
257 typedef enum_func_status	(*func_mysqlnd_net__set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_option option, const char * const value TSRMLS_DC);
258 typedef enum_func_status	(*func_mysqlnd_net__network_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC);
259 typedef size_t				(*func_mysqlnd_net__network_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC);
260 typedef enum_func_status	(*func_mysqlnd_net__decode)(zend_uchar * uncompressed_data, size_t uncompressed_data_len, const zend_uchar * const compressed_data, size_t compressed_data_len TSRMLS_DC);
261 typedef enum_func_status	(*func_mysqlnd_net__encode)(zend_uchar * compress_buffer, size_t * compress_buffer_len, const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC);
262 typedef size_t				(*func_mysqlnd_net__consume_uneaten_data)(MYSQLND_NET * const net, enum php_mysqlnd_server_command cmd TSRMLS_DC);
263 typedef void				(*func_mysqlnd_net__free_contents)(MYSQLND_NET * net TSRMLS_DC);
264 typedef enum_func_status	(*func_mysqlnd_net__enable_ssl)(MYSQLND_NET * const net TSRMLS_DC);
265 typedef enum_func_status	(*func_mysqlnd_net__disable_ssl)(MYSQLND_NET * const net TSRMLS_DC);
266 
267 
268 struct st_mysqlnd_net_methods
269 {
270 	func_mysqlnd_net__connect connect;
271 	func_mysqlnd_net__send send;
272 	func_mysqlnd_net__receive receive;
273 	func_mysqlnd_net__set_client_option set_client_option;
274 	func_mysqlnd_net__network_read network_read;
275 	func_mysqlnd_net__network_write network_write;
276 	func_mysqlnd_net__decode decode;
277 	func_mysqlnd_net__encode encode;
278 	func_mysqlnd_net__consume_uneaten_data consume_uneaten_data;
279 	func_mysqlnd_net__free_contents free_contents;
280 	func_mysqlnd_net__enable_ssl enable_ssl;
281 	func_mysqlnd_net__disable_ssl disable_ssl;
282 
283 	void * unused1;
284 	void * unused2;
285 	void * unused3;
286 	void * unused4;
287 	void * unused5;
288 };
289 
290 
291 struct st_mysqlnd_packet_greet;
292 struct st_mysqlnd_packet_greet;
293 struct st_mysqlnd_packet_auth;
294 struct st_mysqlnd_packet_ok;
295 struct st_mysqlnd_packet_command;
296 struct st_mysqlnd_packet_eof;
297 struct st_mysqlnd_packet_rset_header;
298 struct st_mysqlnd_packet_res_field;
299 struct st_mysqlnd_packet_row;
300 struct st_mysqlnd_packet_stats;
301 struct st_mysqlnd_packet_prepare_response;
302 struct st_mysqlnd_packet_chg_user_resp;
303 
304 typedef struct st_mysqlnd_packet_greet *		(*func_mysqlnd_protocol__get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
305 typedef struct st_mysqlnd_packet_auth *			(*func_mysqlnd_protocol__get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
306 typedef struct st_mysqlnd_packet_ok *			(*func_mysqlnd_protocol__get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
307 typedef struct st_mysqlnd_packet_command *		(*func_mysqlnd_protocol__get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
308 typedef struct st_mysqlnd_packet_eof *			(*func_mysqlnd_protocol__get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
309 typedef struct st_mysqlnd_packet_rset_header *	(*func_mysqlnd_protocol__get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
310 typedef struct st_mysqlnd_packet_res_field *	(*func_mysqlnd_protocol__get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
311 typedef struct st_mysqlnd_packet_row *			(*func_mysqlnd_protocol__get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
312 typedef struct st_mysqlnd_packet_stats *		(*func_mysqlnd_protocol__get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
313 typedef struct st_mysqlnd_packet_prepare_response *(*func_mysqlnd_protocol__get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
314 typedef struct st_mysqlnd_packet_chg_user_resp*(*func_mysqlnd_protocol__get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
315 
316 struct st_mysqlnd_protocol_methods
317 {
318 	func_mysqlnd_protocol__get_greet_packet get_greet_packet;
319 	func_mysqlnd_protocol__get_auth_packet get_auth_packet;
320 	func_mysqlnd_protocol__get_ok_packet get_ok_packet;
321 	func_mysqlnd_protocol__get_command_packet get_command_packet;
322 	func_mysqlnd_protocol__get_eof_packet get_eof_packet;
323 	func_mysqlnd_protocol__get_rset_header_packet get_rset_header_packet;
324 	func_mysqlnd_protocol__get_result_field_packet get_result_field_packet;
325 	func_mysqlnd_protocol__get_row_packet get_row_packet;
326 	func_mysqlnd_protocol__get_stats_packet get_stats_packet;
327 	func_mysqlnd_protocol__get_prepare_response_packet get_prepare_response_packet;
328 	func_mysqlnd_protocol__get_change_user_response_packet get_change_user_response_packet;
329 
330 	void * unused1;
331 	void * unused2;
332 	void * unused3;
333 	void * unused4;
334 	void * unused5;
335 };
336 
337 
338 
339 typedef enum_func_status	(*func_mysqlnd_conn__init)(MYSQLND * conn TSRMLS_DC);
340 typedef enum_func_status	(*func_mysqlnd_conn__connect)(MYSQLND *conn, const char *host, const char * user, const char * passwd, unsigned int passwd_len, const char * db, unsigned int db_len, unsigned int port, const char * socket_or_pipe, unsigned int mysql_flags TSRMLS_DC);
341 typedef ulong				(*func_mysqlnd_conn__escape_string)(MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC);
342 typedef enum_func_status	(*func_mysqlnd_conn__set_charset)(MYSQLND * const conn, const char * const charset TSRMLS_DC);
343 typedef enum_func_status	(*func_mysqlnd_conn__query)(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC);
344 typedef enum_func_status	(*func_mysqlnd_conn__send_query)(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC);
345 typedef enum_func_status	(*func_mysqlnd_conn__reap_query)(MYSQLND *conn TSRMLS_DC);
346 typedef MYSQLND_RES *		(*func_mysqlnd_conn__use_result)(MYSQLND * const conn TSRMLS_DC);
347 typedef MYSQLND_RES *		(*func_mysqlnd_conn__store_result)(MYSQLND * const conn TSRMLS_DC);
348 typedef enum_func_status	(*func_mysqlnd_conn__next_result)(MYSQLND * const conn TSRMLS_DC);
349 typedef zend_bool			(*func_mysqlnd_conn__more_results)(const MYSQLND * const conn TSRMLS_DC);
350 
351 typedef MYSQLND_STMT *		(*func_mysqlnd_conn__stmt_init)(MYSQLND * const conn TSRMLS_DC);
352 
353 typedef enum_func_status	(*func_mysqlnd_conn__shutdown_server)(MYSQLND * const conn, uint8_t level TSRMLS_DC);
354 typedef enum_func_status	(*func_mysqlnd_conn__refresh_server)(MYSQLND * const conn, uint8_t options TSRMLS_DC);
355 
356 typedef enum_func_status	(*func_mysqlnd_conn__ping)(MYSQLND * const conn TSRMLS_DC);
357 typedef enum_func_status	(*func_mysqlnd_conn__kill_connection)(MYSQLND *conn, unsigned int pid TSRMLS_DC);
358 typedef enum_func_status	(*func_mysqlnd_conn__select_db)(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC);
359 typedef enum_func_status	(*func_mysqlnd_conn__server_dump_debug_information)(MYSQLND * const conn TSRMLS_DC);
360 typedef enum_func_status	(*func_mysqlnd_conn__change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db, zend_bool silent TSRMLS_DC);
361 
362 typedef unsigned int		(*func_mysqlnd_conn__get_error_no)(const MYSQLND * const conn TSRMLS_DC);
363 typedef const char *		(*func_mysqlnd_conn__get_error_str)(const MYSQLND * const conn TSRMLS_DC);
364 typedef const char *		(*func_mysqlnd_conn__get_sqlstate)(const MYSQLND * const conn TSRMLS_DC);
365 typedef uint64_t			(*func_mysqlnd_conn__get_thread_id)(const MYSQLND * const conn TSRMLS_DC);
366 typedef void				(*func_mysqlnd_conn__get_statistics)(const MYSQLND * const conn, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC);
367 
368 typedef unsigned long		(*func_mysqlnd_conn__get_server_version)(const MYSQLND * const conn TSRMLS_DC);
369 typedef const char *		(*func_mysqlnd_conn__get_server_information)(const MYSQLND * const conn TSRMLS_DC);
370 typedef enum_func_status	(*func_mysqlnd_conn__get_server_statistics)(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC);
371 typedef const char *		(*func_mysqlnd_conn__get_host_information)(const MYSQLND * const conn TSRMLS_DC);
372 typedef unsigned int		(*func_mysqlnd_conn__get_protocol_information)(const MYSQLND * const conn TSRMLS_DC);
373 typedef const char *		(*func_mysqlnd_conn__get_last_message)(const MYSQLND * const conn TSRMLS_DC);
374 typedef const char *		(*func_mysqlnd_conn__charset_name)(const MYSQLND * const conn TSRMLS_DC);
375 typedef MYSQLND_RES *		(*func_mysqlnd_conn__list_fields)(MYSQLND *conn, const char *table, const char *achtung_wild TSRMLS_DC);
376 typedef MYSQLND_RES *		(*func_mysqlnd_conn__list_method)(MYSQLND *conn, const char *query, const char *achtung_wild, char *par1 TSRMLS_DC);
377 
378 typedef uint64_t			(*func_mysqlnd_conn__get_last_insert_id)(const MYSQLND * const conn TSRMLS_DC);
379 typedef uint64_t			(*func_mysqlnd_conn__get_affected_rows)(const MYSQLND * const conn TSRMLS_DC);
380 typedef unsigned int		(*func_mysqlnd_conn__get_warning_count)(const MYSQLND * const conn TSRMLS_DC);
381 
382 typedef unsigned int		(*func_mysqlnd_conn__get_field_count)(const MYSQLND * const conn TSRMLS_DC);
383 
384 typedef enum_func_status	(*func_mysqlnd_conn__set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option option TSRMLS_DC);
385 typedef enum_func_status	(*func_mysqlnd_conn__set_client_option)(MYSQLND * const conn, enum_mysqlnd_option option, const char * const value TSRMLS_DC);
386 typedef void				(*func_mysqlnd_conn__free_contents)(MYSQLND *conn TSRMLS_DC);	/* private */
387 typedef void				(*func_mysqlnd_conn__free_options)(MYSQLND * conn TSRMLS_DC);	/* private */
388 typedef enum_func_status	(*func_mysqlnd_conn__close)(MYSQLND *conn, enum_connection_close_type close_type TSRMLS_DC);
389 typedef void				(*func_mysqlnd_conn__dtor)(MYSQLND *conn TSRMLS_DC);	/* private */
390 
391 typedef enum_func_status	(*func_mysqlnd_conn__query_read_result_set_header)(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC);
392 
393 typedef MYSQLND *			(*func_mysqlnd_conn__get_reference)(MYSQLND * const conn TSRMLS_DC);
394 typedef enum_func_status	(*func_mysqlnd_conn__free_reference)(MYSQLND * const conn TSRMLS_DC);
395 typedef enum mysqlnd_connection_state (*func_mysqlnd_conn__get_state)(MYSQLND * const conn TSRMLS_DC);
396 typedef void				(*func_mysqlnd_conn__set_state)(MYSQLND * const conn, enum mysqlnd_connection_state new_state TSRMLS_DC);
397 
398 typedef enum_func_status	(*func_mysqlnd_conn__simple_command)(MYSQLND *conn, enum php_mysqlnd_server_command command, const char * const arg, size_t arg_len, enum mysqlnd_packet_type ok_packet, zend_bool silent, zend_bool ignore_upsert_status TSRMLS_DC);
399 typedef enum_func_status	(*func_mysqlnd_conn__simple_command_handle_response)(MYSQLND *conn, enum mysqlnd_packet_type ok_packet, zend_bool silent, enum php_mysqlnd_server_command command, zend_bool ignore_upsert_status TSRMLS_DC);
400 
401 typedef enum_func_status	(*func_mysqlnd_conn__restart_psession)(MYSQLND *conn TSRMLS_DC);
402 typedef enum_func_status	(*func_mysqlnd_conn__end_psession)(MYSQLND *conn TSRMLS_DC);
403 typedef enum_func_status	(*func_mysqlnd_conn__send_close)(MYSQLND * conn TSRMLS_DC);
404 
405 typedef enum_func_status    (*func_mysqlnd_conn__ssl_set)(MYSQLND * const conn, const char * key, const char * const cert, const char * const ca, const char * const capath, const char * const cipher TSRMLS_DC);
406 
407 typedef MYSQLND_RES * 		(*func_mysqlnd_conn__result_init)(unsigned int field_count, zend_bool persistent TSRMLS_DC);
408 
409 typedef enum_func_status	(*func_mysqlnd_conn__set_autocommit)(MYSQLND * conn, unsigned int mode TSRMLS_DC);
410 typedef enum_func_status	(*func_mysqlnd_conn__tx_commit)(MYSQLND * conn TSRMLS_DC);
411 typedef enum_func_status	(*func_mysqlnd_conn__tx_rollback)(MYSQLND * conn TSRMLS_DC);
412 
413 
414 struct st_mysqlnd_conn_methods
415 {
416 	func_mysqlnd_conn__init init;
417 	func_mysqlnd_conn__connect connect;
418 	func_mysqlnd_conn__escape_string escape_string;
419 	func_mysqlnd_conn__set_charset set_charset;
420 	func_mysqlnd_conn__query query;
421 	func_mysqlnd_conn__send_query send_query;
422 	func_mysqlnd_conn__reap_query reap_query;
423 	func_mysqlnd_conn__use_result use_result;
424 	func_mysqlnd_conn__store_result store_result;
425 	func_mysqlnd_conn__next_result next_result;
426 	func_mysqlnd_conn__more_results more_results;
427 
428 	func_mysqlnd_conn__stmt_init stmt_init;
429 
430 	func_mysqlnd_conn__shutdown_server shutdown_server;
431 	func_mysqlnd_conn__refresh_server refresh_server;
432 
433 	func_mysqlnd_conn__ping ping;
434 	func_mysqlnd_conn__kill_connection kill_connection;
435 	func_mysqlnd_conn__select_db select_db;
436 	func_mysqlnd_conn__server_dump_debug_information server_dump_debug_information;
437 	func_mysqlnd_conn__change_user change_user;
438 
439 	func_mysqlnd_conn__get_error_no get_error_no;
440 	func_mysqlnd_conn__get_error_str get_error_str;
441 	func_mysqlnd_conn__get_sqlstate get_sqlstate;
442 	func_mysqlnd_conn__get_thread_id get_thread_id;
443 	func_mysqlnd_conn__get_statistics get_statistics;
444 
445 	func_mysqlnd_conn__get_server_version get_server_version;
446 	func_mysqlnd_conn__get_server_information get_server_information;
447 	func_mysqlnd_conn__get_server_statistics get_server_statistics;
448 	func_mysqlnd_conn__get_host_information get_host_information;
449 	func_mysqlnd_conn__get_protocol_information get_protocol_information;
450 	func_mysqlnd_conn__get_last_message get_last_message;
451 	func_mysqlnd_conn__charset_name charset_name;
452 	func_mysqlnd_conn__list_fields list_fields;
453 	func_mysqlnd_conn__list_method list_method;
454 
455 	func_mysqlnd_conn__get_last_insert_id get_last_insert_id;
456 	func_mysqlnd_conn__get_affected_rows get_affected_rows;
457 	func_mysqlnd_conn__get_warning_count get_warning_count;
458 
459 	func_mysqlnd_conn__get_field_count get_field_count;
460 
461 	func_mysqlnd_conn__set_server_option set_server_option;
462 	func_mysqlnd_conn__set_client_option set_client_option;
463 	func_mysqlnd_conn__free_contents free_contents;
464 	func_mysqlnd_conn__free_options free_options;
465 	func_mysqlnd_conn__close close;
466 	func_mysqlnd_conn__dtor dtor;
467 
468 	func_mysqlnd_conn__query_read_result_set_header query_read_result_set_header;
469 
470 	func_mysqlnd_conn__get_reference get_reference;
471 	func_mysqlnd_conn__free_reference free_reference;
472 	func_mysqlnd_conn__get_state get_state;
473 	func_mysqlnd_conn__set_state set_state;
474 
475 	func_mysqlnd_conn__simple_command simple_command;
476 	func_mysqlnd_conn__simple_command_handle_response simple_command_handle_response;
477 
478 	func_mysqlnd_conn__restart_psession restart_psession;
479 	func_mysqlnd_conn__end_psession end_psession;
480 	func_mysqlnd_conn__send_close send_close;
481 
482 	func_mysqlnd_conn__ssl_set ssl_set;
483 
484 	func_mysqlnd_conn__result_init result_init;
485 #ifdef AUTOCOMMIT_TX_COMMIT_ROLLBACK
486 	func_mysqlnd_conn__set_autocommit set_autocommit;
487 	func_mysqlnd_conn__tx_commit tx_commit;
488 	func_mysqlnd_conn__tx_rollback tx_rollback;
489 #endif
490 };
491 
492 
493 
494 
495 typedef mysqlnd_fetch_row_func	fetch_row;
496 typedef mysqlnd_fetch_row_func	fetch_row_normal_buffered; /* private */
497 typedef mysqlnd_fetch_row_func	fetch_row_normal_unbuffered; /* private */
498 
499 typedef MYSQLND_RES *		(*func_mysqlnd_res__use_result)(MYSQLND_RES * const result, zend_bool ps_protocol TSRMLS_DC);
500 typedef MYSQLND_RES *		(*func_mysqlnd_res__store_result)(MYSQLND_RES * result, MYSQLND * const conn, zend_bool ps TSRMLS_DC);
501 typedef void 				(*func_mysqlnd_res__fetch_into)(MYSQLND_RES *result, unsigned int flags, zval *return_value, enum_mysqlnd_extension ext TSRMLS_DC ZEND_FILE_LINE_DC);
502 typedef MYSQLND_ROW_C 		(*func_mysqlnd_res__fetch_row_c)(MYSQLND_RES *result TSRMLS_DC);
503 typedef void 				(*func_mysqlnd_res__fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC);
504 typedef void 				(*func_mysqlnd_res__fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value TSRMLS_DC);
505 typedef uint64_t			(*func_mysqlnd_res__num_rows)(const MYSQLND_RES * const result TSRMLS_DC);
506 typedef unsigned int		(*func_mysqlnd_res__num_fields)(const MYSQLND_RES * const result TSRMLS_DC);
507 typedef enum_func_status	(*func_mysqlnd_res__skip_result)(MYSQLND_RES * const result TSRMLS_DC);
508 typedef enum_func_status	(*func_mysqlnd_res__seek_data)(MYSQLND_RES * result, uint64_t row TSRMLS_DC);
509 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC);
510 typedef MYSQLND_FIELD_OFFSET (*func_mysqlnd_res__field_tell)(const MYSQLND_RES * const result TSRMLS_DC);
511 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field)(MYSQLND_RES * const result TSRMLS_DC);
512 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_field_direct)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC);
513 typedef const MYSQLND_FIELD *(*func_mysqlnd_res__fetch_fields)(MYSQLND_RES * const result TSRMLS_DC);
514 
515 typedef enum_func_status	(*func_mysqlnd_res__read_result_metadata)(MYSQLND_RES *result, MYSQLND * conn TSRMLS_DC);
516 typedef unsigned long *		(*func_mysqlnd_res__fetch_lengths)(MYSQLND_RES * const result TSRMLS_DC);
517 typedef enum_func_status	(*func_mysqlnd_res__store_result_fetch_data)(MYSQLND * const conn, MYSQLND_RES *result, MYSQLND_RES_METADATA *meta, zend_bool binary_protocol, zend_bool to_cache TSRMLS_DC);
518 typedef enum_func_status 	(*func_mysqlnd_res__initialize_result_set_rest)(MYSQLND_RES * const result TSRMLS_DC);
519 
520 typedef void				(*func_mysqlnd_res__free_result_buffers)(MYSQLND_RES * result TSRMLS_DC);	/* private */
521 typedef enum_func_status	(*func_mysqlnd_res__free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC);
522 typedef void				(*func_mysqlnd_res__free_result_internal)(MYSQLND_RES *result TSRMLS_DC);
523 typedef void				(*func_mysqlnd_res__free_result_contents)(MYSQLND_RES *result TSRMLS_DC);
524 typedef void				(*func_mysqlnd_res__free_buffered_data)(MYSQLND_RES *result TSRMLS_DC);
525 typedef void				(*func_mysqlnd_res__unbuffered_free_last_data)(MYSQLND_RES *result TSRMLS_DC);
526 
527 	/* for decoding - binary or text protocol */
528 typedef enum_func_status	(*func_mysqlnd_res__row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
529 									unsigned int field_count, MYSQLND_FIELD *fields_metadata,
530 									zend_bool persistent,
531 									zend_bool as_unicode, zend_bool as_int_or_float,
532 									MYSQLND_STATS * stats TSRMLS_DC);
533 
534 typedef MYSQLND_RES_METADATA * (*func_mysqlnd_res__result_meta_init)(unsigned int field_count, zend_bool persistent TSRMLS_DC);
535 
536 struct st_mysqlnd_res_methods
537 {
538 	mysqlnd_fetch_row_func	fetch_row;
539 	mysqlnd_fetch_row_func	fetch_row_normal_buffered; /* private */
540 	mysqlnd_fetch_row_func	fetch_row_normal_unbuffered; /* private */
541 
542 	func_mysqlnd_res__use_result use_result;
543 	func_mysqlnd_res__store_result store_result;
544 	func_mysqlnd_res__fetch_into fetch_into;
545 	func_mysqlnd_res__fetch_row_c fetch_row_c;
546 	func_mysqlnd_res__fetch_all fetch_all;
547 	func_mysqlnd_res__fetch_field_data fetch_field_data;
548 	func_mysqlnd_res__num_rows num_rows;
549 	func_mysqlnd_res__num_fields num_fields;
550 	func_mysqlnd_res__skip_result skip_result;
551 	func_mysqlnd_res__seek_data seek_data;
552 	func_mysqlnd_res__seek_field seek_field;
553 	func_mysqlnd_res__field_tell field_tell;
554 	func_mysqlnd_res__fetch_field fetch_field;
555 	func_mysqlnd_res__fetch_field_direct fetch_field_direct;
556 	func_mysqlnd_res__fetch_fields fetch_fields;
557 	func_mysqlnd_res__read_result_metadata read_result_metadata;
558 	func_mysqlnd_res__fetch_lengths fetch_lengths;
559 	func_mysqlnd_res__store_result_fetch_data store_result_fetch_data;
560 	func_mysqlnd_res__initialize_result_set_rest initialize_result_set_rest;
561 	func_mysqlnd_res__free_result_buffers free_result_buffers;
562 	func_mysqlnd_res__free_result free_result;
563 	func_mysqlnd_res__free_result_internal free_result_internal;
564 	func_mysqlnd_res__free_result_contents free_result_contents;
565 	func_mysqlnd_res__free_buffered_data free_buffered_data;
566 	func_mysqlnd_res__unbuffered_free_last_data unbuffered_free_last_data;
567 
568 	/* for decoding - binary or text protocol */
569 	func_mysqlnd_res__row_decoder row_decoder;
570 
571 	func_mysqlnd_res__result_meta_init result_meta_init;
572 
573 	void * unused1;
574 	void * unused2;
575 	void * unused3;
576 	void * unused4;
577 	void * unused5;
578 };
579 
580 
581 typedef const MYSQLND_FIELD *	(*func_mysqlnd_res_meta__fetch_field)(MYSQLND_RES_METADATA * const meta TSRMLS_DC);
582 typedef const MYSQLND_FIELD *	(*func_mysqlnd_res_meta__fetch_field_direct)(const MYSQLND_RES_METADATA * const meta, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC);
583 typedef const MYSQLND_FIELD *	(*func_mysqlnd_res_meta__fetch_fields)(MYSQLND_RES_METADATA * const meta TSRMLS_DC);
584 typedef MYSQLND_FIELD_OFFSET	(*func_mysqlnd_res_meta__field_tell)(const MYSQLND_RES_METADATA * const meta TSRMLS_DC);
585 typedef enum_func_status		(*func_mysqlnd_res_meta__read_metadata)(MYSQLND_RES_METADATA * const meta, MYSQLND * conn TSRMLS_DC);
586 typedef MYSQLND_RES_METADATA *	(*func_mysqlnd_res_meta__clone_metadata)(const MYSQLND_RES_METADATA * const meta, zend_bool persistent TSRMLS_DC);
587 typedef void					(*func_mysqlnd_res_meta__free_metadata)(MYSQLND_RES_METADATA * meta TSRMLS_DC);
588 
589 struct st_mysqlnd_res_meta_methods
590 {
591 	func_mysqlnd_res_meta__fetch_field fetch_field;
592 	func_mysqlnd_res_meta__fetch_field_direct fetch_field_direct;
593 	func_mysqlnd_res_meta__fetch_fields fetch_fields;
594 	func_mysqlnd_res_meta__field_tell field_tell;
595 	func_mysqlnd_res_meta__read_metadata read_metadata;
596 	func_mysqlnd_res_meta__clone_metadata clone_metadata;
597 	func_mysqlnd_res_meta__free_metadata free_metadata;
598 };
599 
600 
601 typedef enum_func_status	(*func_mysqlnd_stmt__prepare)(MYSQLND_STMT * const stmt, const char * const query, unsigned int query_len TSRMLS_DC);
602 typedef enum_func_status	(*func_mysqlnd_stmt__execute)(MYSQLND_STMT * const stmt TSRMLS_DC);
603 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__use_result)(MYSQLND_STMT * const stmt TSRMLS_DC);
604 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__store_result)(MYSQLND_STMT * const stmt TSRMLS_DC);
605 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__get_result)(MYSQLND_STMT * const stmt TSRMLS_DC);
606 typedef zend_bool			(*func_mysqlnd_stmt__more_results)(const MYSQLND_STMT * const stmt TSRMLS_DC);
607 typedef enum_func_status	(*func_mysqlnd_stmt__next_result)(MYSQLND_STMT * const stmt TSRMLS_DC);
608 typedef enum_func_status	(*func_mysqlnd_stmt__free_result)(MYSQLND_STMT * const stmt TSRMLS_DC);
609 typedef enum_func_status	(*func_mysqlnd_stmt__seek_data)(const MYSQLND_STMT * const stmt, uint64_t row TSRMLS_DC);
610 typedef enum_func_status	(*func_mysqlnd_stmt__reset)(MYSQLND_STMT * const stmt TSRMLS_DC);
611 typedef enum_func_status	(*func_mysqlnd_stmt__net_close)(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC); /* private */
612 typedef enum_func_status	(*func_mysqlnd_stmt__dtor)(MYSQLND_STMT * const stmt, zend_bool implicit TSRMLS_DC); /* use this for mysqlnd_stmt_close */
613 typedef enum_func_status	(*func_mysqlnd_stmt__fetch)(MYSQLND_STMT * const stmt, zend_bool * const fetched_anything TSRMLS_DC);
614 typedef enum_func_status	(*func_mysqlnd_stmt__bind_parameters)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * const param_bind TSRMLS_DC);
615 typedef enum_func_status	(*func_mysqlnd_stmt__bind_one_parameter)(MYSQLND_STMT * const stmt, unsigned int param_no, zval * const zv, zend_uchar	type TSRMLS_DC);
616 typedef enum_func_status	(*func_mysqlnd_stmt__refresh_bind_param)(MYSQLND_STMT * const stmt TSRMLS_DC);
617 typedef enum_func_status	(*func_mysqlnd_stmt__bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind TSRMLS_DC);
618 typedef enum_func_status	(*func_mysqlnd_stmt__bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no TSRMLS_DC);
619 typedef enum_func_status	(*func_mysqlnd_stmt__send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, const char * const data, unsigned long length TSRMLS_DC);
620 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__get_parameter_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC);
621 typedef MYSQLND_RES *		(*func_mysqlnd_stmt__get_result_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC);
622 typedef uint64_t			(*func_mysqlnd_stmt__get_last_insert_id)(const MYSQLND_STMT * const stmt TSRMLS_DC);
623 typedef uint64_t			(*func_mysqlnd_stmt__get_affected_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC);
624 typedef uint64_t			(*func_mysqlnd_stmt__get_num_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC);
625 typedef unsigned int		(*func_mysqlnd_stmt__get_param_count)(const MYSQLND_STMT * const stmt TSRMLS_DC);
626 typedef unsigned int		(*func_mysqlnd_stmt__get_field_count)(const MYSQLND_STMT * const stmt TSRMLS_DC);
627 typedef unsigned int		(*func_mysqlnd_stmt__get_warning_count)(const MYSQLND_STMT * const stmt TSRMLS_DC);
628 typedef unsigned int		(*func_mysqlnd_stmt__get_error_no)(const MYSQLND_STMT * const stmt TSRMLS_DC);
629 typedef const char *		(*func_mysqlnd_stmt__get_error_str)(const MYSQLND_STMT * const stmt TSRMLS_DC);
630 typedef const char *		(*func_mysqlnd_stmt__get_sqlstate)(const MYSQLND_STMT * const stmt TSRMLS_DC);
631 typedef enum_func_status	(*func_mysqlnd_stmt__get_attribute)(const MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void * const value TSRMLS_DC);
632 typedef enum_func_status	(*func_mysqlnd_stmt__set_attribute)(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, const void * const value TSRMLS_DC);
633 typedef MYSQLND_PARAM_BIND *(*func_mysqlnd_stmt__alloc_param_bind)(MYSQLND_STMT * const stmt TSRMLS_DC);
634 typedef MYSQLND_RESULT_BIND*(*func_mysqlnd_stmt__alloc_result_bind)(MYSQLND_STMT * const stmt TSRMLS_DC);
635 typedef	void 				(*func_mysqlnd_stmt__free_parameter_bind)(MYSQLND_STMT * const stmt, MYSQLND_PARAM_BIND * TSRMLS_DC);
636 typedef	void 				(*func_mysqlnd_stmt__free_result_bind)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * TSRMLS_DC);
637 typedef unsigned int		(*func_mysqlnd_stmt__server_status)(const MYSQLND_STMT * const stmt TSRMLS_DC);
638 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 TSRMLS_DC);
639 typedef enum_func_status	(*func_mysqlnd_stmt__parse_execute_response)(MYSQLND_STMT * const s TSRMLS_DC);
640 typedef void 				(*func_mysqlnd_stmt__free_stmt_content)(MYSQLND_STMT * const s TSRMLS_DC);
641 
642 struct st_mysqlnd_stmt_methods
643 {
644 	func_mysqlnd_stmt__prepare prepare;
645 	func_mysqlnd_stmt__execute execute;
646 	func_mysqlnd_stmt__use_result use_result;
647 	func_mysqlnd_stmt__store_result store_result;
648 	func_mysqlnd_stmt__get_result get_result;
649 	func_mysqlnd_stmt__more_results more_results;
650 	func_mysqlnd_stmt__next_result next_result;
651 	func_mysqlnd_stmt__free_result free_result;
652 	func_mysqlnd_stmt__seek_data seek_data;
653 	func_mysqlnd_stmt__reset reset;
654 	func_mysqlnd_stmt__net_close net_close;
655 	func_mysqlnd_stmt__dtor dtor;
656 	func_mysqlnd_stmt__fetch fetch;
657 
658 	func_mysqlnd_stmt__bind_parameters bind_parameters;
659 	func_mysqlnd_stmt__bind_one_parameter bind_one_parameter;
660 	func_mysqlnd_stmt__refresh_bind_param refresh_bind_param;
661 	func_mysqlnd_stmt__bind_result bind_result;
662 	func_mysqlnd_stmt__bind_one_result bind_one_result;
663 	func_mysqlnd_stmt__send_long_data send_long_data;
664 	func_mysqlnd_stmt__get_parameter_metadata get_parameter_metadata;
665 	func_mysqlnd_stmt__get_result_metadata get_result_metadata;
666 
667 	func_mysqlnd_stmt__get_last_insert_id get_last_insert_id;
668 	func_mysqlnd_stmt__get_affected_rows get_affected_rows;
669 	func_mysqlnd_stmt__get_num_rows get_num_rows;
670 
671 	func_mysqlnd_stmt__get_param_count get_param_count;
672 	func_mysqlnd_stmt__get_field_count get_field_count;
673 	func_mysqlnd_stmt__get_warning_count get_warning_count;
674 
675 	func_mysqlnd_stmt__get_error_no get_error_no;
676 	func_mysqlnd_stmt__get_error_str get_error_str;
677 	func_mysqlnd_stmt__get_sqlstate get_sqlstate;
678 
679 	func_mysqlnd_stmt__get_attribute get_attribute;
680 	func_mysqlnd_stmt__set_attribute set_attribute;
681 
682 	func_mysqlnd_stmt__alloc_param_bind alloc_parameter_bind;
683 	func_mysqlnd_stmt__alloc_result_bind alloc_result_bind;
684 
685 	func_mysqlnd_stmt__free_parameter_bind free_parameter_bind;
686 	func_mysqlnd_stmt__free_result_bind free_result_bind;
687 
688 	func_mysqlnd_stmt__server_status get_server_status;
689 
690 	func_mysqlnd_stmt__generate_execute_request generate_execute_request;
691 	func_mysqlnd_stmt__parse_execute_response parse_execute_response;
692 
693 	func_mysqlnd_stmt__free_stmt_content free_stmt_content;
694 };
695 
696 
697 struct st_mysqlnd_net
698 {
699 	php_stream			*stream;
700 	struct st_mysqlnd_net_methods m;
701 
702 	/* sequence for simple checking of correct packets */
703 	zend_uchar			packet_no;
704 	zend_bool			compressed;
705 	zend_uchar			compressed_envelope_packet_no;
706 #ifdef MYSQLND_COMPRESSION_ENABLED
707 	MYSQLND_READ_BUFFER	* uncompressed_data;
708 #endif
709 #ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
710 	zend_uchar			last_command;
711 #endif
712 	/* cmd buffer */
713 	MYSQLND_CMD_BUFFER	cmd_buffer;
714 
715 	MYSQLND_NET_OPTIONS	options;
716 
717 	zend_bool			persistent;
718 };
719 
720 
721 struct st_mysqlnd_protocol
722 {
723 	struct st_mysqlnd_protocol_methods m;
724 	zend_bool persistent;
725 };
726 
727 
728 struct st_mysqlnd_connection
729 {
730 /* Operation related */
731 	MYSQLND_NET		* net;
732 	MYSQLND_PROTOCOL * protocol;
733 
734 /* Information related */
735 	char			*host;
736 	unsigned int	host_len;
737 	char			*unix_socket;
738 	unsigned int	unix_socket_len;
739 	char			*user;
740 	unsigned int	user_len;
741 	char			*passwd;
742 	unsigned int	passwd_len;
743 	char			*scheme;
744 	unsigned int	scheme_len;
745 	uint64_t		thread_id;
746 	char			*server_version;
747 	char			*host_info;
748 	unsigned char	*scramble;
749 	const MYSQLND_CHARSET *charset;
750 	const MYSQLND_CHARSET *greet_charset;
751 	char			*connect_or_select_db;
752 	unsigned int	connect_or_select_db_len;
753 	MYSQLND_INFILE	infile;
754 	unsigned int	protocol_version;
755 	unsigned long	max_packet_size;
756 	unsigned int	port;
757 	unsigned long	client_flag;
758 	unsigned long	server_capabilities;
759 
760 	/* For UPSERT queries */
761 	MYSQLND_UPSERT_STATUS upsert_status;
762 	char			*last_message;
763 	unsigned int	last_message_len;
764 
765 	/* If error packet, we use these */
766 	MYSQLND_ERROR_INFO	error_info;
767 
768 	/*
769 	  To prevent queries during unbuffered fetches. Also to
770 	  mark the connection as destroyed for garbage collection.
771 	*/
772 	enum mysqlnd_connection_state	state;
773 	enum_mysqlnd_query_type			last_query_type;
774 	/* Temporary storage between query and (use|store)_result() call */
775 	MYSQLND_RES						*current_result;
776 
777 	/*
778 	  How many result sets reference this connection.
779 	  It won't be freed until this number reaches 0.
780 	  The last one, please close the door! :-)
781 	  The result set objects can determine by inspecting
782 	  'quit_sent' whether the connection is still valid.
783 	*/
784 	unsigned int	refcount;
785 
786 	/* Temporal storage for mysql_query */
787 	unsigned int	field_count;
788 
789 	/* persistent connection */
790 	zend_bool		persistent;
791 
792 	/* options */
793 	MYSQLND_OPTIONS	options;
794 
795 	/* stats */
796 	MYSQLND_STATS	* stats;
797 
798 	struct st_mysqlnd_conn_methods *m;
799 };
800 
801 
802 struct mysqlnd_field_hash_key
803 {
804 	zend_bool		is_numeric;
805 	unsigned long	key;
806 #if MYSQLND_UNICODE
807 	zstr			ustr;
808 	unsigned int	ulen;
809 #endif
810 };
811 
812 
813 struct st_mysqlnd_result_metadata
814 {
815 	MYSQLND_FIELD					*fields;
816 	struct mysqlnd_field_hash_key	*zend_hash_keys;
817 	unsigned int					current_field;
818 	unsigned int					field_count;
819 	/* We need this to make fast allocs in rowp_read */
820 	unsigned int					bit_fields_count;
821 	size_t							bit_fields_total_len; /* trailing \0 not counted */
822 	zend_bool						persistent;
823 
824 	struct st_mysqlnd_res_meta_methods *m;
825 };
826 
827 
828 struct st_mysqlnd_buffered_result
829 {
830 	zval				**data;
831 	zval				**data_cursor;
832 	MYSQLND_MEMORY_POOL_CHUNK **row_buffers;
833 	uint64_t			row_count;
834 	uint64_t			initialized_rows;
835 	zend_bool			persistent;
836 
837 	unsigned int		references;
838 
839 	MYSQLND_ERROR_INFO	error_info;
840 };
841 
842 
843 struct st_mysqlnd_unbuffered_result
844 {
845 	/* For unbuffered (both normal and PS) */
846 	zval				**last_row_data;
847 	MYSQLND_MEMORY_POOL_CHUNK *last_row_buffer;
848 
849 	uint64_t			row_count;
850 	zend_bool			eof_reached;
851 };
852 
853 
854 struct st_mysqlnd_res
855 {
856 	struct st_mysqlnd_res_methods m;
857 
858 	MYSQLND					*conn;
859 	enum_mysqlnd_res_type	type;
860 	unsigned int			field_count;
861 
862 	/* For metadata functions */
863 	MYSQLND_RES_METADATA	*meta;
864 
865 	/* To be used with store_result() - both normal and PS */
866 	MYSQLND_RES_BUFFERED		*stored_data;
867 	MYSQLND_RES_UNBUFFERED		*unbuf;
868 
869 	/*
870 	  Column lengths of current row - both buffered and unbuffered.
871 	  For buffered results it duplicates the data found in **data
872 	*/
873 	unsigned long			*lengths;
874 
875 	struct st_mysqlnd_packet_row * row_packet;
876 
877 	MYSQLND_MEMORY_POOL		* result_set_memory_pool;
878 	zend_bool				persistent;
879 };
880 
881 
882 struct st_mysqlnd_param_bind
883 {
884 	zval		*zv;
885 	zend_uchar	type;
886 	enum_param_bind_flags	flags;
887 };
888 
889 struct st_mysqlnd_result_bind
890 {
891 	zval		*zv;
892 	zend_bool	bound;
893 };
894 
895 
896 struct st_mysqlnd_stmt_data
897 {
898 	MYSQLND						*conn;
899 	unsigned long				stmt_id;
900 	unsigned long				flags;/* cursor is set here */
901 	enum_mysqlnd_stmt_state		state;
902 	unsigned int				warning_count;
903 	MYSQLND_RES					*result;
904 	unsigned int				field_count;
905 	unsigned int				param_count;
906 	unsigned char				send_types_to_server;
907 	MYSQLND_PARAM_BIND			*param_bind;
908 	MYSQLND_RESULT_BIND			*result_bind;
909 	zend_bool					result_zvals_separated_once;
910 	zend_bool					persistent;
911 
912 	MYSQLND_UPSERT_STATUS		upsert_status;
913 
914 	MYSQLND_ERROR_INFO			error_info;
915 
916 	zend_bool					update_max_length;
917 	unsigned long				prefetch_rows;
918 
919 	zend_bool					cursor_exists;
920 	mysqlnd_stmt_use_or_store_func default_rset_handler;
921 
922 	MYSQLND_CMD_BUFFER			execute_cmd_buffer;
923 	unsigned int				execute_count;/* count how many times the stmt was executed */
924 };
925 
926 
927 struct st_mysqlnd_stmt
928 {
929 	MYSQLND_STMT_DATA * data;
930 	struct st_mysqlnd_stmt_methods	*m;
931 	zend_bool persistent;
932 };
933 
934 #endif /* MYSQLND_STRUCTS_H */
935