xref: /PHP-7.4/ext/mysqlnd/mysqlnd.h (revision a230717f)
1 /*
2   +----------------------------------------------------------------------+
3   | PHP Version 7                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 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 " PHP_VERSION
25 #define MYSQLND_VERSION_ID PHP_VERSION_ID
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)
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 #define MYSQLND_STR_W_LEN(str)  str, (sizeof(str) - 1)
64 
65 /* Library related */
66 PHPAPI void mysqlnd_library_init(void);
67 PHPAPI void mysqlnd_library_end(void);
68 
69 PHPAPI unsigned int mysqlnd_plugin_register();
70 PHPAPI unsigned int mysqlnd_plugin_register_ex(struct st_mysqlnd_plugin_header * plugin);
71 PHPAPI unsigned int mysqlnd_plugin_count();
72 PHPAPI void * mysqlnd_plugin_find(const char * const name);
73 
74 PHPAPI void mysqlnd_plugin_apply_with_argument(apply_func_arg_t apply_func, void * argument);
75 
76 #define mysqlnd_restart_psession(conn)	((conn)->data)->m->restart_psession((conn)->data)
77 #define mysqlnd_end_psession(conn)		((conn)->data)->m->end_psession((conn)->data)
78 PHPAPI void mysqlnd_minfo_print_hash(zval *values);
79 #define mysqlnd_thread_safe()	TRUE
80 
81 PHPAPI const MYSQLND_CHARSET * mysqlnd_find_charset_nr(const unsigned int charsetno);
82 PHPAPI const MYSQLND_CHARSET * mysqlnd_find_charset_name(const char * const charsetname);
83 
84 
85 /* Connect */
86 #define mysqlnd_init(flags, persistent)		mysqlnd_connection_init((flags), (persistent), NULL /*use default factory*/)
87 #define mysqlnd_connect(conn, host, user, pass, pass_len, db, db_len, port, socket, mysql_flags, client_api_flags) \
88 			mysqlnd_connection_connect((conn), (host), (user), (pass), (pass_len), (db), (db_len), (port), (socket), (mysql_flags), (client_api_flags))
89 
90 PHPAPI MYSQLND * mysqlnd_connection_init(const size_t client_flags, const zend_bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory);
91 PHPAPI MYSQLND * mysqlnd_connection_connect(MYSQLND * conn,
92 											const char * const host,
93 											const char * const user,
94 											const char * const passwd, unsigned int passwd_len,
95 											const char * const db, unsigned int db_len,
96 											unsigned int port,
97 											const char * const socket_or_pipe,
98 											unsigned int mysql_flags,
99 											unsigned int client_api_flags
100 										);
101 
102 #define mysqlnd_change_user(conn, user, passwd, db, silent)					((conn)->data)->m->change_user((conn)->data, (user), (passwd), (db), (silent), strlen((passwd)))
103 #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))
104 
105 PHPAPI void mysqlnd_debug(const char *mode);
106 
107 /* Query */
108 #define mysqlnd_fetch_into(result, flags, ret_val, ext)	(result)->m.fetch_into((result), (flags), (ret_val), (ext) ZEND_FILE_LINE_CC)
109 #define mysqlnd_fetch_row_c(result)						(result)->m.fetch_row_c((result))
110 #define mysqlnd_fetch_all(result, flags, return_value)	(result)->m.fetch_all((result), (flags), (return_value) ZEND_FILE_LINE_CC)
111 #define mysqlnd_result_fetch_field_data(res,offset,ret)	(res)->m.fetch_field_data((res), (offset), (ret))
112 #define mysqlnd_get_connection_stats(conn, values)		((conn)->data)->m->get_statistics((conn)->data,  (values) ZEND_FILE_LINE_CC)
113 #define mysqlnd_get_client_stats(values)				_mysqlnd_get_client_stats(mysqlnd_global_stats, (values) ZEND_FILE_LINE_CC)
114 
115 #define mysqlnd_close(conn,is_forced)					(conn)->m->close((conn), (is_forced))
116 #define mysqlnd_query(conn, query_str, query_len)		((conn)->data)->m->query((conn)->data, (query_str), (query_len))
117 #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)
118 #define mysqlnd_reap_async_query(conn)					((conn)->data)->m->reap_query((conn)->data, MYSQLND_REAP_RESULT_EXPLICIT)
119 #define mysqlnd_unbuffered_skip_result(result)			(result)->m.skip_result((result))
120 
121 PHPAPI enum_func_status mysqlnd_poll(MYSQLND **r_array, MYSQLND **e_array, MYSQLND ***dont_poll, long sec, long usec, int * desc_num);
122 
123 #define mysqlnd_use_result(conn)		((conn)->data)->m->use_result((conn)->data, 0)
124 #define mysqlnd_store_result(conn)		((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_NO_COPY)
125 #define mysqlnd_store_result_ofs(conn)	((conn)->data)->m->store_result((conn)->data, MYSQLND_STORE_COPY)
126 #define mysqlnd_next_result(conn)		((conn)->data)->m->next_result((conn)->data)
127 #define mysqlnd_more_results(conn)		((conn)->data)->m->more_results((conn)->data)
128 #define mysqlnd_free_result(r,e_or_i)	((MYSQLND_RES*)r)->m.free_result(((MYSQLND_RES*)(r)), (e_or_i))
129 #define mysqlnd_data_seek(result, row)	(result)->m.seek_data((result), (row))
130 
131 /* Errors */
132 #define mysqlnd_errno(conn)				((conn)->data)->m->get_error_no((conn)->data)
133 #define mysqlnd_error(conn)				((conn)->data)->m->get_error_str((conn)->data)
134 #define mysqlnd_sqlstate(conn)			((conn)->data)->m->get_sqlstate((conn)->data)
135 
136 /* Charset */
137 #define mysqlnd_character_set_name(conn) ((conn)->data)->m->charset_name((conn)->data)
138 
139 /* Simple metadata */
140 #define mysqlnd_field_count(conn)		((conn)->data)->m->get_field_count((conn)->data)
141 #define mysqlnd_insert_id(conn)			((conn)->data)->m->get_last_insert_id((conn)->data)
142 #define mysqlnd_affected_rows(conn)		((conn)->data)->m->get_affected_rows((conn)->data)
143 #define mysqlnd_warning_count(conn)		((conn)->data)->m->get_warning_count((conn)->data)
144 #define mysqlnd_info(conn)				((conn)->data)->m->get_last_message((conn)->data)
145 #define mysqlnd_get_server_info(conn)	((conn)->data)->m->get_server_information((conn)->data)
146 #define mysqlnd_get_server_version(conn) ((conn)->data)->m->get_server_version((conn)->data)
147 #define mysqlnd_get_host_info(conn)		((conn)->data)->m->get_host_information((conn)->data)
148 #define mysqlnd_get_proto_info(conn)	((conn)->data)->m->get_protocol_information((conn)->data)
149 #define mysqlnd_thread_id(conn)			((conn)->data)->m->get_thread_id((conn)->data)
150 #define mysqlnd_get_server_status(conn)	((conn)->data)->m->get_server_status((conn)->data)
151 
152 #define mysqlnd_num_rows(result)		(result)->m.num_rows((result))
153 #define mysqlnd_num_fields(result)		(result)->m.num_fields((result))
154 
155 #define mysqlnd_fetch_lengths(result)	(result)->m.fetch_lengths((result))
156 
157 #define mysqlnd_field_seek(result, ofs)			(result)->m.seek_field((result), (ofs))
158 #define mysqlnd_field_tell(result)				(result)->m.field_tell((result))
159 #define mysqlnd_fetch_field(result)				(result)->m.fetch_field((result))
160 #define mysqlnd_fetch_field_direct(result,fnr)	(result)->m.fetch_field_direct((result), (fnr))
161 #define mysqlnd_fetch_fields(result)			(result)->m.fetch_fields((result))
162 
163 /* mysqlnd metadata */
164 PHPAPI const char *	mysqlnd_get_client_info();
165 PHPAPI unsigned long mysqlnd_get_client_version();
166 
167 #define mysqlnd_ssl_set(conn, key, cert, ca, capath, cipher) ((conn)->data)->m->ssl_set((conn)->data, (key), (cert), (ca), (capath), (cipher))
168 
169 /* PS */
170 #define mysqlnd_stmt_insert_id(stmt)		(stmt)->m->get_last_insert_id((stmt))
171 #define mysqlnd_stmt_affected_rows(stmt)	(stmt)->m->get_affected_rows((stmt))
172 #define mysqlnd_stmt_num_rows(stmt)			(stmt)->m->get_num_rows((stmt))
173 #define mysqlnd_stmt_param_count(stmt)		(stmt)->m->get_param_count((stmt))
174 #define mysqlnd_stmt_field_count(stmt)		(stmt)->m->get_field_count((stmt))
175 #define mysqlnd_stmt_warning_count(stmt)	(stmt)->m->get_warning_count((stmt))
176 #define mysqlnd_stmt_server_status(stmt)	(stmt)->m->get_server_status((stmt))
177 #define mysqlnd_stmt_errno(stmt)			(stmt)->m->get_error_no((stmt))
178 #define mysqlnd_stmt_error(stmt)			(stmt)->m->get_error_str((stmt))
179 #define mysqlnd_stmt_sqlstate(stmt)			(stmt)->m->get_sqlstate((stmt))
180 
181 
182 PHPAPI void mysqlnd_efree_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind);
183 PHPAPI void mysqlnd_efree_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind);
184 PHPAPI void mysqlnd_free_param_bind_dtor(MYSQLND_PARAM_BIND * param_bind);
185 PHPAPI void mysqlnd_free_result_bind_dtor(MYSQLND_RESULT_BIND * result_bind);
186 
187 
188 PHPAPI const char * mysqlnd_field_type_name(const enum mysqlnd_field_types field_type);
189 
190 /* LOAD DATA LOCAL */
191 PHPAPI void mysqlnd_local_infile_default(MYSQLND_CONN_DATA * conn);
192 
193 /* Simple commands */
194 #define mysqlnd_autocommit(conn, mode)		((conn)->data)->m->set_autocommit((conn)->data, (mode))
195 #define mysqlnd_begin_transaction(conn,flags,name) ((conn)->data)->m->tx_begin((conn)->data, (flags), (name))
196 #define mysqlnd_commit(conn, flags, name)	((conn)->data)->m->tx_commit_or_rollback((conn)->data, TRUE, (flags), (name))
197 #define mysqlnd_rollback(conn, flags, name)	((conn)->data)->m->tx_commit_or_rollback((conn)->data, FALSE, (flags), (name))
198 #define mysqlnd_savepoint(conn, name)		((conn)->data)->m->tx_savepoint((conn)->data, (name))
199 #define mysqlnd_release_savepoint(conn, name) ((conn)->data)->m->tx_savepoint_release((conn)->data, (name))
200 #define mysqlnd_list_dbs(conn, wild)		((conn)->data)->m->list_method((conn)->data, wild? "SHOW DATABASES LIKE %s":"SHOW DATABASES", (wild), NULL)
201 #define mysqlnd_list_processes(conn)		((conn)->data)->m->list_method((conn)->data, "SHOW PROCESSLIST", NULL, NULL)
202 #define mysqlnd_list_tables(conn, wild)		((conn)->data)->m->list_method((conn)->data, wild? "SHOW TABLES LIKE %s":"SHOW TABLES", (wild), NULL)
203 #define mysqlnd_dump_debug_info(conn)		((conn)->data)->m->server_dump_debug_information((conn)->data)
204 #define mysqlnd_select_db(conn, db, db_len)	((conn)->data)->m->select_db((conn)->data, (db), (db_len))
205 #define mysqlnd_ping(conn)					((conn)->data)->m->ping((conn)->data)
206 #define mysqlnd_kill(conn, pid)				((conn)->data)->m->kill_connection((conn)->data, (pid))
207 #define mysqlnd_refresh(conn, options)		((conn)->data)->m->refresh_server((conn)->data, (options))
208 #define mysqlnd_shutdown(conn, level)		((conn)->data)->m->shutdown_server((conn)->data, (level))
209 #define mysqlnd_set_character_set(conn, cs)	((conn)->data)->m->set_charset((conn)->data, (cs))
210 #define mysqlnd_stat(conn, msg)				((conn)->data)->m->get_server_statistics(((conn)->data), (msg))
211 #define mysqlnd_options(conn, opt, value)	((conn)->data)->m->set_client_option((conn)->data, (opt), (value))
212 #define mysqlnd_options4(conn, opt, k, v)	((conn)->data)->m->set_client_option_2d((conn)->data, (opt), (k), (v))
213 #define mysqlnd_set_server_option(conn, op)	((conn)->data)->m->set_server_option((conn)->data, (op))
214 
215 /* Escaping */
216 #define mysqlnd_real_escape_string(conn, newstr, escapestr, escapestr_len) \
217 		((conn)->data)->m->escape_string((conn)->data, (newstr), (escapestr), (escapestr_len))
218 #define mysqlnd_escape_string(newstr, escapestr, escapestr_len) \
219 		mysqlnd_old_escape_string((newstr), (escapestr), (escapestr_len))
220 
221 PHPAPI zend_ulong mysqlnd_old_escape_string(char * newstr, const char * escapestr, size_t escapestr_len);
222 
223 
224 /* PS */
225 #define mysqlnd_stmt_init(conn)						((conn)->data)->m->stmt_init(((conn)->data))
226 #define mysqlnd_stmt_store_result(stmt)				(!mysqlnd_stmt_field_count((stmt)) ? PASS:((stmt)->m->store_result((stmt))? PASS:FAIL))
227 #define mysqlnd_stmt_get_result(stmt)				(stmt)->m->get_result((stmt))
228 #define mysqlnd_stmt_more_results(stmt)				(stmt)->m->more_results((stmt))
229 #define mysqlnd_stmt_next_result(stmt)				(stmt)->m->next_result((stmt))
230 #define mysqlnd_stmt_data_seek(stmt, row)			(stmt)->m->seek_data((stmt), (row))
231 #define mysqlnd_stmt_prepare(stmt, q, qlen)			(stmt)->m->prepare((stmt), (q), (qlen))
232 #define mysqlnd_stmt_execute(stmt) 					(stmt)->m->execute((stmt))
233 #define mysqlnd_stmt_send_long_data(stmt,p,d,l) 	(stmt)->m->send_long_data((stmt), (p), (d), (l))
234 #define mysqlnd_stmt_alloc_param_bind(stmt)			(stmt)->m->alloc_parameter_bind((stmt))
235 #define mysqlnd_stmt_free_param_bind(stmt,bind)		(stmt)->m->free_parameter_bind((stmt), (bind))
236 #define mysqlnd_stmt_bind_param(stmt,bind)			(stmt)->m->bind_parameters((stmt), (bind))
237 #define mysqlnd_stmt_bind_one_param(stmt,n,z,t)		(stmt)->m->bind_one_parameter((stmt), (n), (z), (t))
238 #define mysqlnd_stmt_refresh_bind_param(s)			(s)->m->refresh_bind_param((s))
239 #define mysqlnd_stmt_alloc_result_bind(stmt)		(stmt)->m->alloc_result_bind((stmt))
240 #define mysqlnd_stmt_free_result_bind(stmt,bind)	(stmt)->m->free_result_bind((stmt), (bind))
241 #define mysqlnd_stmt_bind_result(stmt,bind)			(stmt)->m->bind_result((stmt), (bind))
242 #define mysqlnd_stmt_bind_one_result(s,no)			(s)->m->bind_one_result((s), (no))
243 #define mysqlnd_stmt_param_metadata(stmt)			(stmt)->m->get_parameter_metadata((stmt))
244 #define mysqlnd_stmt_result_metadata(stmt)			(stmt)->m->get_result_metadata((stmt))
245 
246 #define	mysqlnd_stmt_free_result(stmt)				(stmt)->m->free_result((stmt))
247 #define	mysqlnd_stmt_close(stmt, implicit)			(stmt)->m->dtor((stmt), (implicit))
248 #define	mysqlnd_stmt_reset(stmt)					(stmt)->m->reset((stmt))
249 #define	mysqlnd_stmt_flush(stmt)					(stmt)->m->flush((stmt))
250 
251 
252 #define mysqlnd_stmt_attr_get(stmt, attr, value)	(stmt)->m->get_attribute((stmt), (attr), (value))
253 #define mysqlnd_stmt_attr_set(stmt, attr, value)	(stmt)->m->set_attribute((stmt), (attr), (value))
254 
255 #define mysqlnd_stmt_fetch(stmt, fetched)	(stmt)->m->fetch((stmt), (fetched))
256 
257 
258 /* Performance statistics */
259 PHPAPI extern MYSQLND_STATS * mysqlnd_global_stats;
260 PHPAPI extern const MYSQLND_STRING mysqlnd_stats_values_names[];
261 PHPAPI void			_mysqlnd_get_client_stats(MYSQLND_STATS * stats, zval *return_value ZEND_FILE_LINE_DC);
262 
263 
264 #ifndef MYSQLND_CORE_STATISTICS_DISABLED
265 
266 #define MYSQLND_INC_GLOBAL_STATISTIC(statistic) \
267 	MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
268 
269 #define MYSQLND_DEC_GLOBAL_STATISTIC(statistic) \
270 	MYSQLND_DEC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic))
271 
272 #define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2) \
273 	MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2))
274 
275 #define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic) \
276 	MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic)); \
277 	MYSQLND_INC_STATISTIC(MYSQLND_G(collect_statistics), (conn_stats), (statistic));
278 
279 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value) \
280 	MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic), (value)); \
281 	MYSQLND_INC_STATISTIC_W_VALUE(MYSQLND_G(collect_statistics), (conn_stats), (statistic), (value));
282 
283 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2) \
284 	MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2)); \
285 	MYSQLND_INC_STATISTIC_W_VALUE2(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2));
286 
287 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3) \
288 	MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), mysqlnd_global_stats, (statistic1), (value1), (statistic2), (value2), (statistic3), (value3)); \
289 	MYSQLND_INC_STATISTIC_W_VALUE3(MYSQLND_G(collect_statistics), (conn_stats), (statistic1), (value1), (statistic2), (value2), (statistic3), (value3));
290 
291 #else
292 
293 #define MYSQLND_INC_GLOBAL_STATISTIC(statistic)
294 #define MYSQLND_DEC_GLOBAL_STATISTIC(statistic)
295 #define MYSQLND_INC_GLOBAL_STATISTIC_W_VALUE2(statistic1, value1, statistic2, value2)
296 #define MYSQLND_INC_CONN_STATISTIC(conn_stats, statistic)
297 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE(conn_stats, statistic, value)
298 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE2(conn_stats, statistic1, value1, statistic2, value2)
299 #define MYSQLND_INC_CONN_STATISTIC_W_VALUE3(conn_stats, statistic1, value1, statistic2, value2, statistic3, value3)
300 
301 #endif /* MYSQLND_CORE_STATISTICS_DISABLED */
302 
303 
304 /* double check the class name to avoid naming conflicts when using these: */
305 #define MYSQLND_METHOD(class, method) 			mysqlnd_##class##_##method##_pub
306 #define MYSQLND_METHOD_PRIVATE(class, method)	mysqlnd_##class##_##method##_priv
307 
308 ZEND_BEGIN_MODULE_GLOBALS(mysqlnd)
309 	char *			debug;	/* The actual string */
310 	char *			trace_alloc_settings;	/* The actual string */
311 	MYSQLND_DEBUG *	dbg;	/* The DBG object for standard tracing */
312 	MYSQLND_DEBUG *	trace_alloc;	/* The DBG object for allocation tracing */
313 	zend_long		net_cmd_buffer_size;
314 	zend_long		net_read_buffer_size;
315 	zend_long		log_mask;
316 	zend_long		net_read_timeout;
317 	zend_long		mempool_default_size;
318 	zend_long		debug_emalloc_fail_threshold;
319 	zend_long		debug_ecalloc_fail_threshold;
320 	zend_long		debug_erealloc_fail_threshold;
321 	zend_long		debug_malloc_fail_threshold;
322 	zend_long		debug_calloc_fail_threshold;
323 	zend_long		debug_realloc_fail_threshold;
324 	char *			sha256_server_public_key;
325 	zend_bool		fetch_data_copy;
326 	zend_bool		collect_statistics;
327 	zend_bool		collect_memory_statistics;
328 ZEND_END_MODULE_GLOBALS(mysqlnd)
329 
330 PHPAPI ZEND_EXTERN_MODULE_GLOBALS(mysqlnd)
331 #define MYSQLND_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mysqlnd, v)
332 
333 #if defined(ZTS) && defined(COMPILE_DL_MYSQLND)
334 ZEND_TSRMLS_CACHE_EXTERN()
335 #endif
336 
337 
338 PHPAPI void mysqlnd_minfo_print_hash(zval *values);
339 
340 #endif	/* MYSQLND_H */
341