208
208
zend_bool *fetched_anything
211
typedef struct st_mysqlnd_stats
211
typedef struct st_mysqlnd_stats MYSQLND_STATS;
213
typedef void (*mysqlnd_stat_trigger)(MYSQLND_STATS * stats, enum_mysqlnd_collected_stats stat, int64_t change TSRMLS_DC);
215
struct st_mysqlnd_stats
213
uint64_t values[STAT_LAST];
218
mysqlnd_stat_trigger *triggers;
220
zend_bool in_trigger;
215
222
MUTEX_T LOCK_access;
220
typedef struct st_mysqlnd_net
223
/* sequence for simple checking of correct packets */
224
zend_uchar packet_no;
226
#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
227
zend_uchar last_command;
231
MYSQLND_CMD_BUFFER cmd_buffer;
227
typedef struct st_mysqlnd_read_buffer {
232
zend_bool (*is_empty)(struct st_mysqlnd_read_buffer *);
233
void (*read)(struct st_mysqlnd_read_buffer *, size_t count, zend_uchar * dest);
234
size_t (*bytes_left)(struct st_mysqlnd_read_buffer *);
235
void (*free_buffer)(struct st_mysqlnd_read_buffer ** TSRMLS_DC);
236
} MYSQLND_READ_BUFFER;
239
struct st_mysqlnd_net_methods
241
enum_func_status (*connect)(MYSQLND_NET * net, const char * const scheme, size_t scheme_len, zend_bool persistent, char **errstr, int * errcode TSRMLS_DC);
242
size_t (*send)(MYSQLND * const conn, char * const buf, size_t count TSRMLS_DC);
243
size_t (*receive)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC);
244
enum_func_status (*set_client_option)(MYSQLND_NET * const net, enum_mysqlnd_option option, const char * const value TSRMLS_DC);
245
enum_func_status (*network_read)(MYSQLND * conn, zend_uchar * buffer, size_t count TSRMLS_DC);
246
size_t (*network_write)(MYSQLND * const conn, const zend_uchar * const buf, size_t count TSRMLS_DC);
247
enum_func_status (*decode)(zend_uchar * uncompressed_data, size_t uncompressed_data_len, const zend_uchar * const compressed_data, size_t compressed_data_len TSRMLS_DC);
248
enum_func_status (*encode)(zend_uchar * compress_buffer, size_t compress_buffer_len, const zend_uchar * const uncompressed_data, size_t uncompressed_data_len TSRMLS_DC);
249
size_t (*consume_uneaten_data)(MYSQLND_NET * const net, enum php_mysqlnd_server_command cmd TSRMLS_DC);
250
void (*free_contents)(MYSQLND_NET * net TSRMLS_DC);
254
struct st_mysqlnd_packet_greet;
255
struct st_mysqlnd_packet_greet;
256
struct st_mysqlnd_packet_auth;
257
struct st_mysqlnd_packet_ok;
258
struct st_mysqlnd_packet_command;
259
struct st_mysqlnd_packet_eof;
260
struct st_mysqlnd_packet_rset_header;
261
struct st_mysqlnd_packet_res_field;
262
struct st_mysqlnd_packet_row;
263
struct st_mysqlnd_packet_stats;
264
struct st_mysqlnd_packet_prepare_response;
265
struct st_mysqlnd_packet_chg_user_resp;
267
struct st_mysqlnd_protocol_methods
269
struct st_mysqlnd_packet_greet * (*get_greet_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
270
struct st_mysqlnd_packet_auth * (*get_auth_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
271
struct st_mysqlnd_packet_ok * (*get_ok_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
272
struct st_mysqlnd_packet_command * (*get_command_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
273
struct st_mysqlnd_packet_eof * (*get_eof_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
274
struct st_mysqlnd_packet_rset_header * (*get_rset_header_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
275
struct st_mysqlnd_packet_res_field * (*get_result_field_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
276
struct st_mysqlnd_packet_row * (*get_row_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
277
struct st_mysqlnd_packet_stats * (*get_stats_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
278
struct st_mysqlnd_packet_prepare_response *(*get_prepare_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
279
struct st_mysqlnd_packet_chg_user_resp*(*get_change_user_response_packet)(MYSQLND_PROTOCOL * const protocol, zend_bool persistent TSRMLS_DC);
235
283
struct st_mysqlnd_conn_methods
285
void (*init)(MYSQLND * conn TSRMLS_DC);
286
enum_func_status (*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, unsigned int mysql_flags TSRMLS_DC);
237
287
ulong (*escape_string)(const MYSQLND * const conn, char *newstr, const char *escapestr, size_t escapestr_len TSRMLS_DC);
238
288
enum_func_status (*set_charset)(MYSQLND * const conn, const char * const charset TSRMLS_DC);
239
289
enum_func_status (*query)(MYSQLND *conn, const char *query, unsigned int query_len TSRMLS_DC);
254
303
enum_func_status (*kill_connection)(MYSQLND *conn, unsigned int pid TSRMLS_DC);
255
304
enum_func_status (*select_db)(MYSQLND * const conn, const char * const db, unsigned int db_len TSRMLS_DC);
256
305
enum_func_status (*server_dump_debug_information)(MYSQLND * const conn TSRMLS_DC);
257
enum_func_status (*change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db TSRMLS_DC);
306
enum_func_status (*change_user)(MYSQLND * const conn, const char * user, const char * passwd, const char * db, zend_bool silent TSRMLS_DC);
259
unsigned int (*get_error_no)(const MYSQLND * const conn);
260
const char * (*get_error_str)(const MYSQLND * const conn);
261
const char * (*get_sqlstate)(const MYSQLND * const conn);
262
uint64_t (*get_thread_id)(const MYSQLND * const conn);
308
unsigned int (*get_error_no)(const MYSQLND * const conn TSRMLS_DC);
309
const char * (*get_error_str)(const MYSQLND * const conn TSRMLS_DC);
310
const char * (*get_sqlstate)(const MYSQLND * const conn TSRMLS_DC);
311
uint64_t (*get_thread_id)(const MYSQLND * const conn TSRMLS_DC);
263
312
void (*get_statistics)(const MYSQLND * const conn, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC);
265
unsigned long (*get_server_version)(const MYSQLND * const conn);
266
const char * (*get_server_information)(const MYSQLND * const conn);
314
unsigned long (*get_server_version)(const MYSQLND * const conn TSRMLS_DC);
315
const char * (*get_server_information)(const MYSQLND * const conn TSRMLS_DC);
267
316
enum_func_status (*get_server_statistics)(MYSQLND *conn, char **message, unsigned int * message_len TSRMLS_DC);
268
const char * (*get_host_information)(const MYSQLND * const conn);
269
unsigned int (*get_protocol_information)(const MYSQLND * const conn);
270
const char * (*get_last_message)(const MYSQLND * const conn);
271
const char * (*charset_name)(const MYSQLND * const conn);
317
const char * (*get_host_information)(const MYSQLND * const conn TSRMLS_DC);
318
unsigned int (*get_protocol_information)(const MYSQLND * const conn TSRMLS_DC);
319
const char * (*get_last_message)(const MYSQLND * const conn TSRMLS_DC);
320
const char * (*charset_name)(const MYSQLND * const conn TSRMLS_DC);
272
321
MYSQLND_RES * (*list_fields)(MYSQLND *conn, const char *table, const char *achtung_wild TSRMLS_DC);
273
322
MYSQLND_RES * (*list_method)(MYSQLND *conn, const char *query, const char *achtung_wild, char *par1 TSRMLS_DC);
275
uint64_t (*get_last_insert_id)(const MYSQLND * const conn);
276
uint64_t (*get_affected_rows)(const MYSQLND * const conn);
277
unsigned int (*get_warning_count)(const MYSQLND * const conn);
324
uint64_t (*get_last_insert_id)(const MYSQLND * const conn TSRMLS_DC);
325
uint64_t (*get_affected_rows)(const MYSQLND * const conn TSRMLS_DC);
326
unsigned int (*get_warning_count)(const MYSQLND * const conn TSRMLS_DC);
279
unsigned int (*get_field_count)(const MYSQLND * const conn);
328
unsigned int (*get_field_count)(const MYSQLND * const conn TSRMLS_DC);
281
330
enum_func_status (*set_server_option)(MYSQLND * const conn, enum_mysqlnd_server_option option TSRMLS_DC);
282
331
enum_func_status (*set_client_option)(MYSQLND * const conn, enum_mysqlnd_option option, const char * const value TSRMLS_DC);
285
334
enum_func_status (*close)(MYSQLND *conn, enum_connection_close_type close_type TSRMLS_DC);
286
335
void (*dtor)(MYSQLND *conn TSRMLS_DC); /* private */
337
enum_func_status (*query_read_result_set_header)(MYSQLND *conn, MYSQLND_STMT *stmt TSRMLS_DC);
288
339
MYSQLND * (*get_reference)(MYSQLND * const conn TSRMLS_DC);
289
340
enum_func_status (*free_reference)(MYSQLND * const conn TSRMLS_DC);
290
341
enum mysqlnd_connection_state (*get_state)(MYSQLND * const conn TSRMLS_DC);
291
342
void (*set_state)(MYSQLND * const conn, enum mysqlnd_connection_state new_state TSRMLS_DC);
344
enum_func_status (*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);
345
enum_func_status (*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);
347
enum_func_status (*restart_psession)(MYSQLND *conn TSRMLS_DC);
348
enum_func_status (*end_psession)(MYSQLND *conn TSRMLS_DC);
301
358
MYSQLND_RES * (*use_result)(MYSQLND_RES * const result, zend_bool ps_protocol TSRMLS_DC);
302
359
MYSQLND_RES * (*store_result)(MYSQLND_RES * result, MYSQLND * const conn, zend_bool ps TSRMLS_DC);
303
MYSQLND_RES * (*background_store_result)(MYSQLND_RES * result, MYSQLND * const conn, zend_bool ps TSRMLS_DC);
304
360
void (*fetch_into)(MYSQLND_RES *result, unsigned int flags, zval *return_value, enum_mysqlnd_extension ext TSRMLS_DC ZEND_FILE_LINE_DC);
305
361
MYSQLND_ROW_C (*fetch_row_c)(MYSQLND_RES *result TSRMLS_DC);
306
362
void (*fetch_all)(MYSQLND_RES *result, unsigned int flags, zval *return_value TSRMLS_DC ZEND_FILE_LINE_DC);
307
363
void (*fetch_field_data)(MYSQLND_RES *result, unsigned int offset, zval *return_value TSRMLS_DC);
308
uint64_t (*num_rows)(const MYSQLND_RES * const result);
309
unsigned int (*num_fields)(const MYSQLND_RES * const result);
364
uint64_t (*num_rows)(const MYSQLND_RES * const result TSRMLS_DC);
365
unsigned int (*num_fields)(const MYSQLND_RES * const result TSRMLS_DC);
310
366
enum_func_status (*skip_result)(MYSQLND_RES * const result TSRMLS_DC);
311
367
enum_func_status (*seek_data)(MYSQLND_RES * result, uint64_t row TSRMLS_DC);
312
MYSQLND_FIELD_OFFSET (*seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset);
313
MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES * const result);
368
MYSQLND_FIELD_OFFSET (*seek_field)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET field_offset TSRMLS_DC);
369
MYSQLND_FIELD_OFFSET (*field_tell)(const MYSQLND_RES * const result TSRMLS_DC);
314
370
const MYSQLND_FIELD *(*fetch_field)(MYSQLND_RES * const result TSRMLS_DC);
315
371
const MYSQLND_FIELD *(*fetch_field_direct)(MYSQLND_RES * const result, MYSQLND_FIELD_OFFSET fieldnr TSRMLS_DC);
316
372
const MYSQLND_FIELD *(*fetch_fields)(MYSQLND_RES * const result TSRMLS_DC);
318
enum_func_status (*read_result_metadata)(MYSQLND_RES *result, MYSQLND *conn TSRMLS_DC);
319
unsigned long * (*fetch_lengths)(MYSQLND_RES * const result);
374
enum_func_status (*read_result_metadata)(MYSQLND_RES *result, MYSQLND * conn TSRMLS_DC);
375
unsigned long * (*fetch_lengths)(MYSQLND_RES * const result TSRMLS_DC);
376
enum_func_status (*store_result_fetch_data)(MYSQLND * const conn, MYSQLND_RES *result, MYSQLND_RES_METADATA *meta, zend_bool binary_protocol, zend_bool to_cache TSRMLS_DC);
377
void (*initialize_result_set_rest)(MYSQLND_RES * const result TSRMLS_DC);
320
379
void (*free_result_buffers)(MYSQLND_RES * result TSRMLS_DC); /* private */
321
380
enum_func_status (*free_result)(MYSQLND_RES * result, zend_bool implicit TSRMLS_DC);
322
void (*free_result_internal)(MYSQLND_RES *result TSRMLS_DC);
323
void (*free_result_contents)(MYSQLND_RES *result TSRMLS_DC);
381
void (*free_result_internal)(MYSQLND_RES *result TSRMLS_DC);
382
void (*free_result_contents)(MYSQLND_RES *result TSRMLS_DC);
383
void (*free_buffered_data)(MYSQLND_RES *result TSRMLS_DC);
384
void (*unbuffered_free_last_data)(MYSQLND_RES *result TSRMLS_DC);
325
/* for decoding - binary or text protocol */
326
void (*row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields, unsigned int field_count, MYSQLND_FIELD *fields_metadata, MYSQLND *conn TSRMLS_DC);
386
/* for decoding - binary or text protocol */
387
void (*row_decoder)(MYSQLND_MEMORY_POOL_CHUNK * row_buffer, zval ** fields,
388
unsigned int field_count, MYSQLND_FIELD *fields_metadata,
389
zend_bool persistent,
390
zend_bool as_unicode, zend_bool as_int_or_float,
391
MYSQLND_STATS * stats TSRMLS_DC);
364
428
enum_func_status (*bind_result)(MYSQLND_STMT * const stmt, MYSQLND_RESULT_BIND * const result_bind TSRMLS_DC);
365
429
enum_func_status (*bind_one_result)(MYSQLND_STMT * const stmt, unsigned int param_no TSRMLS_DC);
366
430
void (*set_result_bind_dtor)(MYSQLND_STMT * const stmt, void (*result_bind_dtor)(MYSQLND_RESULT_BIND * TSRMLS_DC) TSRMLS_DC);
367
enum_func_status (*send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num,
368
const char * const data, unsigned long length TSRMLS_DC);
369
MYSQLND_RES * (*get_parameter_metadata)(MYSQLND_STMT * const stmt);
431
enum_func_status (*send_long_data)(MYSQLND_STMT * const stmt, unsigned int param_num, const char * const data, unsigned long length TSRMLS_DC);
432
MYSQLND_RES * (*get_parameter_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC);
370
433
MYSQLND_RES * (*get_result_metadata)(MYSQLND_STMT * const stmt TSRMLS_DC);
372
uint64_t (*get_last_insert_id)(const MYSQLND_STMT * const stmt);
373
uint64_t (*get_affected_rows)(const MYSQLND_STMT * const stmt);
374
uint64_t (*get_num_rows)(const MYSQLND_STMT * const stmt);
376
unsigned int (*get_param_count)(const MYSQLND_STMT * const stmt);
377
unsigned int (*get_field_count)(const MYSQLND_STMT * const stmt);
378
unsigned int (*get_warning_count)(const MYSQLND_STMT * const stmt);
380
unsigned int (*get_error_no)(const MYSQLND_STMT * const stmt);
381
const char * (*get_error_str)(const MYSQLND_STMT * const stmt);
382
const char * (*get_sqlstate)(const MYSQLND_STMT * const stmt);
435
uint64_t (*get_last_insert_id)(const MYSQLND_STMT * const stmt TSRMLS_DC);
436
uint64_t (*get_affected_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC);
437
uint64_t (*get_num_rows)(const MYSQLND_STMT * const stmt TSRMLS_DC);
439
unsigned int (*get_param_count)(const MYSQLND_STMT * const stmt TSRMLS_DC);
440
unsigned int (*get_field_count)(const MYSQLND_STMT * const stmt TSRMLS_DC);
441
unsigned int (*get_warning_count)(const MYSQLND_STMT * const stmt TSRMLS_DC);
443
unsigned int (*get_error_no)(const MYSQLND_STMT * const stmt TSRMLS_DC);
444
const char * (*get_error_str)(const MYSQLND_STMT * const stmt TSRMLS_DC);
445
const char * (*get_sqlstate)(const MYSQLND_STMT * const stmt TSRMLS_DC);
384
447
enum_func_status (*get_attribute)(const MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, void * const value TSRMLS_DC);
385
448
enum_func_status (*set_attribute)(MYSQLND_STMT * const stmt, enum mysqlnd_stmt_attr attr_type, const void * const value TSRMLS_DC);
452
struct st_mysqlnd_net
455
struct st_mysqlnd_net_methods m;
457
/* sequence for simple checking of correct packets */
458
zend_uchar packet_no;
459
zend_bool compressed;
460
zend_uchar compressed_envelope_packet_no;
461
#ifdef MYSQLND_COMPRESSION_ENABLED
462
MYSQLND_READ_BUFFER * uncompressed_data;
464
#ifdef MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND
465
zend_uchar last_command;
468
MYSQLND_CMD_BUFFER cmd_buffer;
470
MYSQLND_NET_OPTIONS options;
472
zend_bool persistent;
476
struct st_mysqlnd_protocol
478
struct st_mysqlnd_protocol_methods m;
479
zend_bool persistent;
389
483
struct st_mysqlnd_connection
391
485
/* Operation related */
487
MYSQLND_PROTOCOL * protocol;
394
489
/* Information related */
491
unsigned int host_len;
396
492
char *unix_socket;
493
unsigned int unix_socket_len;
495
unsigned int user_len;
399
unsigned int *passwd_len;
497
unsigned int passwd_len;
499
unsigned int scheme_len;
401
500
uint64_t thread_id;
402
501
char *server_version;
404
503
unsigned char *scramble;
405
504
const MYSQLND_CHARSET *charset;
406
505
const MYSQLND_CHARSET *greet_charset;
506
char *connect_or_select_db;
507
unsigned int connect_or_select_db_len;
407
508
MYSQLND_INFILE infile;
408
509
unsigned int protocol_version;
409
510
unsigned long max_packet_size;