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