1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 6 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 2006-2009 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 of the PHP license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.php.net/license/3_01.txt |
11 : | If you did not receive a copy of the PHP license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@php.net so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Authors: Georg Richter <georg@mysql.com> |
16 : | Andrey Hristov <andrey@mysql.com> |
17 : | Ulf Wendel <uwendel@mysql.com> |
18 : +----------------------------------------------------------------------+
19 : */
20 :
21 : /* $Id: php_mysqlnd.c 291051 2009-11-20 08:12:14Z andrey $ */
22 : #include "php.h"
23 : #include "php_ini.h"
24 : #include "mysqlnd.h"
25 : #include "mysqlnd_priv.h"
26 : #include "mysqlnd_debug.h"
27 : #include "ext/standard/info.h"
28 :
29 : /* {{{ mysqlnd_functions[]
30 : *
31 : * Every user visible function must have an entry in mysqlnd_functions[].
32 : */
33 : static zend_function_entry mysqlnd_functions[] = {
34 : {NULL, NULL, NULL} /* Must be the last line in mysqlnd_functions[] */
35 : };
36 : /* }}} */
37 :
38 :
39 : /* {{{ mysqlnd_minfo_print_hash */
40 : #if PHP_MAJOR_VERSION >= 6
41 : PHPAPI void mysqlnd_minfo_print_hash(zval *values)
42 172 : {
43 : zval **values_entry;
44 : HashPosition pos_values;
45 :
46 172 : zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
47 7783 : while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values),
48 : (void **)&values_entry, &pos_values) == SUCCESS) {
49 : zstr string_key;
50 : uint string_key_len;
51 : ulong num_key;
52 : int s_len;
53 7439 : char *s = NULL;
54 :
55 : TSRMLS_FETCH();
56 7439 : zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);
57 :
58 7439 : convert_to_string(*values_entry);
59 :
60 7439 : if (zend_unicode_to_string(ZEND_U_CONVERTER(UG(runtime_encoding_conv)),
61 : &s, &s_len, string_key.u, string_key_len TSRMLS_CC) == SUCCESS) {
62 7439 : php_info_print_table_row(2, s, Z_STRVAL_PP(values_entry));
63 : }
64 7439 : if (s) {
65 7439 : mnd_efree(s);
66 : }
67 :
68 7439 : zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
69 : }
70 172 : }
71 : #else
72 : void mysqlnd_minfo_print_hash(zval *values)
73 : {
74 : zval **values_entry;
75 : HashPosition pos_values;
76 :
77 : zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
78 : while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values), (void **)&values_entry, &pos_values) == SUCCESS) {
79 : char *string_key;
80 : uint string_key_len;
81 : ulong num_key;
82 :
83 : zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);
84 :
85 : convert_to_string(*values_entry);
86 : php_info_print_table_row(2, string_key, Z_STRVAL_PP(values_entry));
87 :
88 : zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
89 : }
90 : }
91 : #endif
92 : /* }}} */
93 :
94 :
95 : /* {{{ PHP_MINFO_FUNCTION
96 : */
97 : PHP_MINFO_FUNCTION(mysqlnd)
98 43 : {
99 : char buf[32];
100 : zval values;
101 :
102 43 : php_info_print_table_start();
103 43 : php_info_print_table_header(2, "mysqlnd", "enabled");
104 43 : php_info_print_table_row(2, "Version", mysqlnd_get_client_info());
105 43 : php_info_print_table_row(2, "Compression",
106 : #ifdef MYSQLND_COMPRESSION_ENABLED
107 : "supported");
108 : #else
109 : "not supported");
110 : #endif
111 43 : snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_cmd_buffer_size));
112 43 : php_info_print_table_row(2, "Command buffer size", buf);
113 43 : snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_buffer_size));
114 43 : php_info_print_table_row(2, "Read buffer size", buf);
115 43 : snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_timeout));
116 43 : php_info_print_table_row(2, "Read timeout", buf);
117 43 : php_info_print_table_row(2, "Collecting statistics", MYSQLND_G(collect_statistics)? "Yes":"No");
118 43 : php_info_print_table_row(2, "Collecting memory statistics", MYSQLND_G(collect_memory_statistics)? "Yes":"No");
119 43 : php_info_print_table_end();
120 :
121 : /* Print client stats */
122 43 : php_info_print_table_start();
123 43 : php_info_print_table_header(2, "Client statistics", "");
124 43 : mysqlnd_get_client_stats(&values);
125 43 : mysqlnd_minfo_print_hash(&values);
126 :
127 43 : zval_dtor(&values);
128 43 : php_info_print_table_end();
129 43 : }
130 : /* }}} */
131 :
132 :
133 : ZEND_DECLARE_MODULE_GLOBALS(mysqlnd);
134 :
135 :
136 : /* {{{ PHP_GINIT_FUNCTION
137 : */
138 : static PHP_GINIT_FUNCTION(mysqlnd)
139 17007 : {
140 17007 : mysqlnd_globals->collect_statistics = TRUE;
141 17007 : mysqlnd_globals->collect_memory_statistics = FALSE;
142 17007 : mysqlnd_globals->debug = NULL; /* The actual string */
143 17007 : mysqlnd_globals->dbg = NULL; /* The DBG object*/
144 17007 : mysqlnd_globals->net_cmd_buffer_size = MYSQLND_NET_CMD_BUFFER_MIN_SIZE;
145 17007 : mysqlnd_globals->net_read_buffer_size = 32768;
146 17007 : mysqlnd_globals->net_read_timeout = 31536000;
147 17007 : mysqlnd_globals->log_mask = 0;
148 17007 : }
149 : /* }}} */
150 :
151 :
152 : static PHP_INI_MH(OnUpdateNetCmdBufferSize)
153 17007 : {
154 17007 : long long_value = atol(new_value);
155 17007 : if (long_value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) {
156 0 : return FAILURE;
157 : }
158 17007 : MYSQLND_G(net_cmd_buffer_size) = long_value;
159 :
160 17007 : return SUCCESS;
161 : }
162 :
163 : /* {{{ PHP_INI_BEGIN
164 : */
165 : PHP_INI_BEGIN()
166 : STD_PHP_INI_BOOLEAN("mysqlnd.collect_statistics", "1", PHP_INI_ALL, OnUpdateBool, collect_statistics, zend_mysqlnd_globals, mysqlnd_globals)
167 : STD_PHP_INI_BOOLEAN("mysqlnd.collect_memory_statistics", "0", PHP_INI_SYSTEM, OnUpdateBool, collect_memory_statistics, zend_mysqlnd_globals, mysqlnd_globals)
168 : STD_PHP_INI_ENTRY("mysqlnd.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_mysqlnd_globals, mysqlnd_globals)
169 : STD_PHP_INI_ENTRY("mysqlnd.net_cmd_buffer_size", MYSQLND_NET_CMD_BUFFER_MIN_SIZE_STR, PHP_INI_ALL, OnUpdateNetCmdBufferSize, net_cmd_buffer_size, zend_mysqlnd_globals, mysqlnd_globals)
170 : STD_PHP_INI_ENTRY("mysqlnd.net_read_buffer_size", "32768",PHP_INI_ALL, OnUpdateLong, net_read_buffer_size, zend_mysqlnd_globals, mysqlnd_globals)
171 : STD_PHP_INI_ENTRY("mysqlnd.net_read_timeout", "31536000", PHP_INI_SYSTEM, OnUpdateLong, net_read_timeout, zend_mysqlnd_globals, mysqlnd_globals)
172 : STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals)
173 : PHP_INI_END()
174 : /* }}} */
175 :
176 :
177 : /* {{{ PHP_MINIT_FUNCTION
178 : */
179 : static PHP_MINIT_FUNCTION(mysqlnd)
180 17007 : {
181 17007 : REGISTER_INI_ENTRIES();
182 :
183 17007 : mysqlnd_library_init(TSRMLS_C);
184 17007 : return SUCCESS;
185 : }
186 : /* }}} */
187 :
188 :
189 : /* {{{ PHP_MSHUTDOWN_FUNCTION
190 : */
191 : static PHP_MSHUTDOWN_FUNCTION(mysqlnd)
192 17039 : {
193 17039 : mysqlnd_library_end(TSRMLS_C);
194 :
195 17039 : UNREGISTER_INI_ENTRIES();
196 17039 : return SUCCESS;
197 : }
198 : /* }}} */
199 :
200 :
201 : #if defined(PHP_DEBUG) || defined(MYSQLND_THREADED)
202 : /* {{{ PHP_RINIT_FUNCTION
203 : */
204 : static PHP_RINIT_FUNCTION(mysqlnd)
205 16993 : {
206 : #if defined(PHP_DEBUG)
207 16993 : if (MYSQLND_G(debug)) {
208 1 : MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C);
209 1 : if (!dbg) {
210 0 : return FAILURE;
211 : }
212 1 : dbg->m->set_mode(dbg, MYSQLND_G(debug));
213 1 : MYSQLND_G(dbg) = dbg;
214 : }
215 : #endif
216 : #ifdef MYSQLND_THREADED
217 : MYSQLND_G(thread_id) = tsrm_thread_id();
218 : #endif
219 16993 : return SUCCESS;
220 : }
221 : /* }}} */
222 : #endif
223 :
224 :
225 : #if defined(PHP_DEBUG)
226 : /* {{{ PHP_RSHUTDOWN_FUNCTION
227 : */
228 : static PHP_RSHUTDOWN_FUNCTION(mysqlnd)
229 17025 : {
230 17025 : MYSQLND_DEBUG *dbg = MYSQLND_G(dbg);
231 17025 : DBG_ENTER("RSHUTDOWN");
232 17025 : if (dbg) {
233 1 : dbg->m->close(dbg);
234 1 : dbg->m->free_handle(dbg);
235 1 : MYSQLND_G(dbg) = NULL;
236 : }
237 17025 : return SUCCESS;
238 : }
239 : /* }}} */
240 : #endif
241 :
242 :
243 :
244 : static const zend_module_dep mysqlnd_deps[] = {
245 : ZEND_MOD_REQUIRED("standard")
246 : {NULL, NULL, NULL}
247 : };
248 :
249 : /* {{{ mysqlnd_module_entry
250 : */
251 : zend_module_entry mysqlnd_module_entry = {
252 : STANDARD_MODULE_HEADER_EX,
253 : NULL,
254 : mysqlnd_deps,
255 : "mysqlnd",
256 : mysqlnd_functions,
257 : PHP_MINIT(mysqlnd),
258 : PHP_MSHUTDOWN(mysqlnd),
259 : #if defined(PHP_DEBUG) || defined(MYSQLND_THREADED)
260 : PHP_RINIT(mysqlnd),
261 : #else
262 : NULL,
263 : #endif
264 : #ifdef PHP_DEBUG
265 : PHP_RSHUTDOWN(mysqlnd),
266 : #else
267 : NULL,
268 : #endif
269 : PHP_MINFO(mysqlnd),
270 : MYSQLND_VERSION,
271 : PHP_MODULE_GLOBALS(mysqlnd),
272 : PHP_GINIT(mysqlnd),
273 : NULL,
274 : NULL,
275 : STANDARD_MODULE_PROPERTIES_EX
276 : };
277 : /* }}} */
278 :
279 :
280 : /*
281 : * Local variables:
282 : * tab-width: 4
283 : * c-basic-offset: 4
284 : * End:
285 : * vim600: noet sw=4 ts=4 fdm=marker
286 : * vim<600: noet sw=4 ts=4
287 : */
|