1 /* 2 +----------------------------------------------------------------------+ 3 | PHP Version 7 | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2006-2017 The PHP Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 3.01 of the PHP license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.php.net/license/3_01.txt | 11 | If you did not receive a copy of the PHP license and are unable to | 12 | obtain it through the world-wide-web, please send a note to | 13 | license@php.net so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Authors: Andrey Hristov <andrey@php.net> | 16 | Ulf Wendel <uw@php.net> | 17 | Georg Richter <georg@php.net> | 18 +----------------------------------------------------------------------+ 19 */ 20 21 #ifndef MYSQLND_H 22 #define MYSQLND_H 23 24 #define PHP_MYSQLND_VERSION "mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $" 25 #define MYSQLND_VERSION_ID 50012 26 27 #define MYSQLND_PLUGIN_API_VERSION 2 28 29 #define MYSQLND_STRING_TO_INT_CONVERSION 30 /* 31 This force mysqlnd to do a single (or more depending on amount of data) 32 non-blocking read() calls before sending a command to the server. Useful 33 for debugging, if previous function hasn't consumed all the output sent 34 to it - like stmt_send_long_data() error because the data was larger that 35 max_allowed_packet_size, and COM_STMT_SEND_LONG_DATA by protocol doesn't 36 use response packets, thus letting the next command to fail miserably, if 37 the connector implementor is not aware of this deficiency. Should be off 38 on production systems, if of course measured performance degradation is not 39 minimal. 40 */ 41 #if A0 && PHP_DEBUG 42 #define MYSQLND_DO_WIRE_CHECK_BEFORE_COMMAND 1 43 #endif 44 45 #if PHP_DEBUG 46 #define MYSQLND_DBG_ENABLED 1 47 #else 48 #define MYSQLND_DBG_ENABLED 0 49 #endif 50 51 #if defined(MYSQLND_COMPRESSION_WANTED) && defined(HAVE_ZLIB) 52 #define MYSQLND_COMPRESSION_ENABLED 1 53 #endif 54 55 #ifdef ZTS 56 #include "TSRM.h" 57 #endif 58 59 #include "mysqlnd_portability.h" 60 #include "mysqlnd_enum_n_def.h" 61 #include "mysqlnd_structs.h" 62 63 64 /* Library related */ 65 PHPAPI void mysqlnd_library_init(void); 66 PHPAPI void mysqlnd_library_end(void); 67 68 PHPAPI unsigned int mysqlnd_plugin_register(); 69 PHPAPI unsigned int mysqlnd_plugin_register_ex(struct st_mysqlnd_plugin_header * plugin); 70 PHPAPI unsigned int mysqlnd_plugin_count(); 71 PHPAPI void * mysqlnd_plugin_find(const char * const name); 72 73 PHPAPI void mysqlnd_plugin_apply_with_argument(apply_func_arg_t apply_func, void * argument); 74 75 #define mysqlnd_restart_psession(conn) ((conn)->data)->m->restart_psession((conn)->data) 76 #define mysqlnd_end_psession(conn) ((conn)->data)->m->end_psession((conn)->data) 77 PHPAPI void mysqlnd_minfo_print_hash(zval *values); 78 #define mysqlnd_thread_safe() TRUE 79 80 PHPAPI const MYSQLND_CHARSET * mysqlnd_find_charset_nr(unsigned int charsetno); 81 PHPAPI const MYSQLND_CHARSET * mysqlnd_find_charset_name(const char * const charsetname); 82 83 84 /* Connect */ 85 PHPAPI MYSQLND * mysqlnd_init(unsigned int client_flags, zend_bool persistent); 86 PHPAPI MYSQLND * mysqlnd_connect(MYSQLND * conn, 87 const char * host, const char * user, 88 const char * passwd, unsigned int passwd_len, 89 const char * db, unsigned int db_len, 90 unsigned int port, 91 const char * socket_or_pipe, 92 unsigned int mysql_flags, 93 unsigned int client_api_flags 94 ); 95 96 #define mysqlnd_change_user(conn, user, passwd, db, silent) ((conn)->data)->m->change_user((conn)->data, (user), (passwd), (db), (silent), strlen((passwd))) 97 #define mysqlnd_change_user_ex(conn, user, passwd, db, silent, passwd_len) ((conn)->data)->m->change_user((conn)->data, (user), (passwd), (db), (silent), (passwd_len)) 98 99 PHPAPI void mysqlnd_debug(const char *mode); 100 101 /* Query */ 102 #define mysqlnd_fetch_into(result, flags, ret_val, ext) (result)->m.fetch_into((result), (flags), (ret_val), (ext) ZEND_FILE_LINE_CC) 103 #define mysqlnd_fetch_row_c(result) (result)->m.fetch_row_c((result)) 104 #define mysqlnd_fetch_all(result, flags, return_value) (result)->m.fetch_all((result), (flags), (return_value) ZEND_FILE_LINE_CC) 105 #define mysqlnd_result_fetch_field_data(res,offset,ret) (res)->m.fetch_field_data((res), (offset), (ret)) 106 #define mysqlnd_get_connection_stats(conn, values) ((conn)->data)->m->get_statistics((conn)->data, (values) ZEND_FILE_LINE_CC) 107 #define mysqlnd_get_client_stats(values) _mysqlnd_get_client_stats((values) ZEND_FILE_LINE_CC) 108 109 #define mysqlnd_close(conn,is_forced) (conn)->m->close((conn), (is_forced)) 110 #define mysqlnd_query(conn, query_str, query_len) ((conn)->data)->m->query((conn)->data, (query_str), (query_len)) 111 #define mysqlnd_async_query(conn, query_str, query_len) ((conn)->data)->m->send_query((conn)->data, (query_str), (query_len), MYSQLND_SEND_QUERY_EXPLICIT, NULL, NULL) 112 #define mysqlnd_reap_async_query(conn) ((conn)->data)->m->reap_query((conn)->data, MYSQLND_REAP_RESULT_EXPLICIT) 113 #define mysqlnd_unbuffered_skip_result(result) (result)->m.skip_result((result)) 114 115 PHPAPI enum_func_status mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long sec, long usec, int * desc_num); 116 117 #define mysqlnd_use_result(conn) ((conn)->data)->m->use_result((conn)->data, 0) 118 #define mysqlnd_store_result(conn) ((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_NO_COPY) 119 #define mysqlnd_store_result_ofs(conn) ((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_COPY) 120 #define mysqlnd_next_result(conn) ((conn)->data)->m->next_result((conn)->data) 121 #define mysqlnd_more_results(conn) ((conn)->data)->m->more_results((conn)->data) 122 #define mysqlnd_free_result(r,e_or_i) ((MYSQLND_RES*)r)->m.free_result(((MYSQLND_RES*)(r)), (e_or_i)) 123 #define mysqlnd_data_seek(result, row) (result)->m.seek_data((result), (row)) 124 125 /* Errors */ 126 #define mysqlnd_errno(conn) ((conn)->data)->m->get_error_no((conn)->data) 127 #define mysqlnd_error(conn) ((conn)->data)->m->get_error_str((conn)->data) 128 #define mysqlnd_sqlstate(conn) ((conn)->data)->m->get_sqlstate((conn)->data) 129 130 /* Charset */ 131 #define mysqlnd_character_set_name(conn) ((conn)->data)->m->charset_name((conn)->data) 132 133 /* Simple metadata */ 134 #define mysqlnd_field_count(conn) ((conn)->data)->m->get_field_count((conn)->data) 135 #define mysqlnd_insert_id(conn) ((conn)->data)->m->get_last_insert_id((conn)->data) 136 #define mysqlnd_affected_rows(conn) ((conn)->data)->m->get_affected_rows((conn)->data) 137 #define mysqlnd_warning_count(conn) ((conn)->data)->m->get_warning_count((conn)->data) 138 #define mysqlnd_info(conn) ((conn)->data)->m->get_last_message((conn)->data) 139 #define mysqlnd_get_server_info(conn) ((conn)->data)->m->get_server_information((conn)->data) 140 #define mysqlnd_get_server_version(conn) ((conn)->data)->m->get_server_version((conn)->data) 141 #define mysqlnd_get_host_info(conn) ((conn)->data)->m->get_host_information((conn)->data) 142 #define mysqlnd_get_proto_info(conn) ((conn)->data)->m->get_protocol_information((conn)->data) 143 #define mysqlnd_thread_id(conn) ((conn)->data)->m->get_thread_id((conn)->data) 144 #define mysqlnd_get_server_status(conn) ((conn)->data)->m->get_server_status((conn)->data) 145 146 #define mysqlnd_num_rows(result) (result)->m.num_rows((result)) 147 #define mysqlnd_num_fields(result) (result)->m.num_fields((result)) 148 149 #define mysqlnd_fetch_lengths(result) (result)->m.fetch_lengths((result)) 150 151 #define mysqlnd_field_seek(result, ofs) (result)->m.seek_field((result), (ofs)) 152 #define mysqlnd_field_tell(result) (result)->m.field_tell((result)) 153 #define mysqlnd_fetch_field(result) (result)->m.fetch_field((result)) 154 #define mysqlnd_fetch_field_direct(result,fnr) (result)->m.fetch_field_direct((result), (fnr)) 155 #define mysqlnd_fetch_fields(result) (result)->m.fetch_fields((result)) 156 157 /* mysqlnd metadata */ 158 PHPAPI const char * mysqlnd_get_client_info(); 159 PHPAPI unsigned int mysqlnd_get_client_version(); 160 161 #define mysqlnd_ssl_set(conn, key, cert, ca, capath, cipher) ((conn)->data)->m->ssl_set((conn)->data, (key), (cert), (ca), (capath), (cipher)) 162 163 /* PS */ 164 #define mysqlnd_stmt_insert_id(stmt) (stmt)->m->get_last_insert_id((stmt)) 165 #define mysqlnd_stmt_affected_rows(stmt) (stmt)->m->get_affected_rows((stmt)) 166 #define mysqlnd_stmt_num_rows(stmt) (stmt)->m->get_num_rows((stmt)) 167 #define mysqlnd_stmt_param_count(stmt) (stmt)->m->get_param_count((stmt)) 168 #define mysqlnd_stmt_field_count(stmt) (stmt)->m->get_field_count((stmt)) 169 #define mysqlnd_stmt_warning_count(stmt) (stmt)->m->get_warning_count((stmt)) 170 #define mysqlnd_stmt_server_status(stmt) (stmt)->m->get_server_status((stmt)) 171 #define mysqlnd_stmt_errno(stmt) (stmt)->m->get_error_no((stmt)) 172 #define mysqlnd_stmt_error(stmt) (stmt)->m->get_error_str((stmt)) 173 #define mysqlnd_stmt_sqlstate(stmt) (stmt)->m->get_sqlstate((stmt)) 174 175 176 PHPAPI void mysqlnd_efree_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind); 177 PHPAPI void mysqlnd_efree_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind); 178 PHPAPI void mysqlnd_free_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind); 179 PHPAPI void mysqlnd_free_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind); 180 181 182 PHPAPI const char * mysqlnd_field_type_name(enum mysqlnd_field_types field_type); 183 184 /* LOAD DATA LOCAL */ 185 void mysqlnd_local_infile_default(MYSQLND_CONN_DATA * conn); 186 187 /* Simple commands */ 188 #define mysqlnd_autocommit(conn, mode) ((conn)->data)->m->set_autocommit((conn)->data, (mode)) 189 #define mysqlnd_begin_transaction(conn,flags,name) ((conn)->data)->m->tx_begin((conn)->data, (flags), (name)) 190 #define mysqlnd_commit(conn, flags, name) ((conn)->data)->m->tx_commit_or_rollback((conn)->data, TRUE, (flags), (name)) 191 #define mysqlnd_rollback(conn, flags, name) ((conn)->data)->m->tx_commit_or_rollback((conn)->data, FALSE, (flags), (name)) 192 #define mysqlnd_savepoint(conn, name) ((conn)->data)->m->tx_savepoint((conn)->data, (name)) 193 #define mysqlnd_release_savepoint(conn, name) ((conn)->data)->m->tx_savepoint_release((conn)->data, (name)) 194 #define mysqlnd_list_dbs(conn, wild) ((conn)->data)->m->list_method((conn)->data, wild? "SHOW DATABASES LIKE %s":"SHOW DATABASES", (wild), NULL) 195 #define mysqlnd_list_fields(conn, tab,wild) ((conn)->data)->m->list_fields((conn)->data, (tab), (wild)) 196 #define mysqlnd_list_processes(conn) ((conn)->data)->m->list_method((conn)->data, "SHOW PROCESSLIST", NULL, NULL) 197 #define mysqlnd_list_tables(conn, wild) ((conn)->data)->m->list_method((conn)->data, wild? "SHOW TABLES LIKE %s":"SHOW TABLES", (wild), NULL) 198 #define mysqlnd_dump_debug_info(conn) ((conn)->data)->m->server_dump_debug_information((conn)->data) 199 #define mysqlnd_select_db(conn, db, db_len) ((conn)->data)->m->select_db((conn)->data, (db), (db_len)) 200 #define mysqlnd_ping(conn) ((conn)->data)->m->ping((conn)->data) 201 #define mysqlnd_kill(conn, pid) ((conn)->data)->m->kill_connection((conn)->data, (pid)) 202 #define mysqlnd_refresh(conn, options) ((conn)->data)->m->refresh_server((conn)->data, (options)) 203 #define mysqlnd_shutdown(conn, level) ((conn)->data)->m->shutdown_server((conn)->data, (level)) 204 #define mysqlnd_set_character_set(conn, cs) ((conn)->data)->m->set_charset((conn)->data, (cs)) 205 #define mysqlnd_stat(conn, msg) ((conn)->data)->m->get_server_statistics(((conn)->data), (msg)) 206 #define mysqlnd_options(conn, opt, value) ((conn)->data)->m->set_client_option((conn)->data, (opt), (value)) 207 #define mysqlnd_options4(conn, opt, k, v) ((conn)->data)->m->set_client_option_2d((conn)->data, (opt), (k), (v)) 208 #define mysqlnd_set_server_option(conn, op) ((conn)->data)->m->set_server_option((conn)->data, (op)) 209 210 /* Escaping */ 211 #define mysqlnd_real_escape_string(conn, newstr, escapestr, escapestr_len) \ 212 ((conn)->data)->m->escape_string((conn)->data, (newstr), (escapestr), (escapestr_len)) 213 #define mysqlnd_escape_string(newstr, escapestr, escapestr_len) \ 214 mysqlnd_old_escape_string((newstr), (escapestr), (escapestr_len)) 215 216 PHPAPI zend_ulong mysqlnd_old_escape_string(char * newstr, const char * escapestr, size_t escapestr_len); 217 218 219 /* PS */ 220 #define mysqlnd_stmt_init(conn) ((conn)->data)->m->stmt_init(((conn)->data)) 221 #define mysqlnd_stmt_store_result(stmt) (!mysqlnd_stmt_field_count((stmt)) ? PASS:((stmt)->m->store_result((stmt))? PASS:FAIL)) 222 #define mysqlnd_stmt_get_result(stmt) (stmt)->m->get_result((stmt)) 223 #define mysqlnd_stmt_more_results(stmt) (stmt)->m->more_results((stmt)) 224 #define mysqlnd_stmt_next_result(stmt) (stmt)->m->next_result((stmt)) 225 #define mysqlnd_stmt_data_seek(stmt, row) (stmt)->m->seek_data((stmt), (row)) 226 #define mysqlnd_stmt_prepare(stmt, q, qlen) (stmt)->m->prepare((stmt), (q), (qlen)) 227 #define mysqlnd_stmt_execute(stmt) (stmt)->m->execute((stmt)) 228 #define mysqlnd_stmt_send_long_data(stmt,p,d,l) (stmt)->m->send_long_data((stmt), (p), (d), (l)) 229 #define mysqlnd_stmt_alloc_param_bind(stmt) (stmt)->m->alloc_parameter_bind((stmt)) 230 #define mysqlnd_stmt_free_param_bind(stmt,bind) (stmt)->m->free_parameter_bind((stmt), (bind)) 231 #define mysqlnd_stmt_bind_param(stmt,bind) (stmt)->m->bind_parameters((stmt), (bind)) 232 #define mysqlnd_stmt_bind_one_param(stmt,n,z,t) (stmt)->m->bind_one_parameter((stmt), (n), (z), (t)) 233 #define mysqlnd_stmt_refresh_bind_param(s) (s)->m->refresh_bind_param((s)) 234 #define mysqlnd_stmt_alloc_result_bind(stmt) (stmt)->m->alloc_result_bind((stmt)) 235 #define mysqlnd_stmt_free_result_bind(stmt,bind) (stmt)->m->free_result_bind((stmt), (bind)) 236 #define mysqlnd_stmt_bind_result(stmt,bind) (stmt)->m->bind_result((stmt), (bind)) 237 #define mysqlnd_stmt_bind_one_result(s,no) (s)->m->bind_one_result((s), (no)) 238 #define mysqlnd_stmt_param_metadata(stmt) (stmt)->m->get_parameter_metadata((stmt)) 239 #define mysqlnd_stmt_result_metadata(stmt) (stmt)->m->get_result_metadata((stmt)) 240 241 #define mysqlnd_stmt_free_result(stmt) (stmt)->m->free_result((stmt)) 242 #define mysqlnd_stmt_close(stmt, implicit) (stmt)->m->dtor((stmt), (implicit)) 243 #define mysqlnd_stmt_reset(stmt) (stmt)->m->reset((stmt)) 244 #define mysqlnd_stmt_flush(stmt) (stmt)->m->flush((stmt)) 245 246 247 #define mysqlnd_stmt_attr_get(stmt, attr, value) (stmt)->m->get_attribute((stmt), (attr), (value)) 248 #define mysqlnd_stmt_attr_set(stmt, attr, value) (stmt)->m->set_attribute((stmt), (attr), (value)) 249 250 #define mysqlnd_stmt_fetch(stmt, fetched) (stmt)->m->fetch((stmt), (fetched)) 251 252 253 /* Performance statistics */ 254 PHPAPI void _mysqlnd_get_client_stats(zval *return_value ZEND_FILE_LINE_DC); 255 256 /* double check the class name to avoid naming conflicts when using these: */ 257 #define MYSQLND_METHOD(class, method) php_##class##_##method##_pub 258 #define MYSQLND_METHOD_PRIVATE(class, method) php_##class##_##method##_priv 259 260 ZEND_BEGIN_MODULE_GLOBALS(mysqlnd) 261 char * debug; /* The actual string */ 262 char * trace_alloc_settings; /* The actual string */ 263 MYSQLND_DEBUG * dbg; /* The DBG object for standard tracing */ 264 MYSQLND_DEBUG * trace_alloc; /* The DBG object for allocation tracing */ 265 zend_long net_cmd_buffer_size; 266 zend_long net_read_buffer_size; 267 zend_long log_mask; 268 zend_long net_read_timeout; 269 zend_long mempool_default_size; 270 zend_long debug_emalloc_fail_threshold; 271 zend_long debug_ecalloc_fail_threshold; 272 zend_long debug_erealloc_fail_threshold; 273 zend_long debug_malloc_fail_threshold; 274 zend_long debug_calloc_fail_threshold; 275 zend_long debug_realloc_fail_threshold; 276 char * sha256_server_public_key; 277 zend_bool fetch_data_copy; 278 zend_bool collect_statistics; 279 zend_bool collect_memory_statistics; 280 ZEND_END_MODULE_GLOBALS(mysqlnd) 281 282 PHPAPI ZEND_EXTERN_MODULE_GLOBALS(mysqlnd) 283 #define MYSQLND_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mysqlnd, v) 284 285 #if defined(ZTS) && defined(COMPILE_DL_MYSQLND) 286 ZEND_TSRMLS_CACHE_EXTERN() 287 #endif 288 289 290 PHPAPI void mysqlnd_minfo_print_hash(zval *values); 291 292 #endif /* MYSQLND_H */ 293 294 295 /* 296 * Local variables: 297 * tab-width: 4 298 * c-basic-offset: 4 299 * End: 300 * vim600: noet sw=4 ts=4 fdm=marker 301 * vim<600: noet sw=4 ts=4 302 */ 303