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 289285 2009-10-07 17:33:51Z 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 : {
43 : zval **values_entry;
44 : HashPosition pos_values;
45 :
46 : zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
47 : while (zend_hash_get_current_data_ex(Z_ARRVAL_P(values),
48 : (void **)&values_entry, &pos_values) == SUCCESS) {
49 : TSRMLS_FETCH();
50 : zstr string_key;
51 : uint string_key_len;
52 : ulong num_key;
53 : int s_len;
54 : char *s = NULL;
55 :
56 : zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);
57 :
58 : convert_to_string(*values_entry);
59 :
60 : 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 : php_info_print_table_row(2, s, Z_STRVAL_PP(values_entry));
63 : }
64 : if (s) {
65 : mnd_efree(s);
66 : }
67 :
68 : zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
69 : }
70 : }
71 : #else
72 : void mysqlnd_minfo_print_hash(zval *values)
73 168 : {
74 : zval **values_entry;
75 : HashPosition pos_values;
76 :
77 168 : zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
78 7602 : 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 7266 : zend_hash_get_current_key_ex(Z_ARRVAL_P(values), &string_key, &string_key_len, &num_key, 0, &pos_values);
84 :
85 7266 : convert_to_string(*values_entry);
86 7266 : php_info_print_table_row(2, string_key, Z_STRVAL_PP(values_entry));
87 :
88 7266 : zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
89 : }
90 168 : }
91 : #endif
92 : /* }}} */
93 :
94 :
95 : /* {{{ PHP_MINFO_FUNCTION
96 : */
97 : PHP_MINFO_FUNCTION(mysqlnd)
98 42 : {
99 : char buf[32];
100 : zval values;
101 :
102 42 : php_info_print_table_start();
103 42 : php_info_print_table_header(2, "mysqlnd", "enabled");
104 42 : php_info_print_table_row(2, "Version", mysqlnd_get_client_info());
105 42 : snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_cmd_buffer_size));
106 42 : php_info_print_table_row(2, "Command buffer size", buf);
107 42 : snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_buffer_size));
108 42 : php_info_print_table_row(2, "Read buffer size", buf);
109 42 : snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_timeout));
110 42 : php_info_print_table_row(2, "Read timeout", buf);
111 42 : php_info_print_table_row(2, "Collecting statistics", MYSQLND_G(collect_statistics)? "Yes":"No");
112 42 : php_info_print_table_row(2, "Collecting memory statistics", MYSQLND_G(collect_memory_statistics)? "Yes":"No");
113 42 : php_info_print_table_end();
114 :
115 : /* Print client stats */
116 42 : php_info_print_table_start();
117 42 : php_info_print_table_header(2, "Client statistics", "");
118 42 : mysqlnd_get_client_stats(&values);
119 42 : mysqlnd_minfo_print_hash(&values);
120 :
121 42 : zval_dtor(&values);
122 42 : php_info_print_table_end();
123 42 : }
124 : /* }}} */
125 :
126 :
127 : ZEND_DECLARE_MODULE_GLOBALS(mysqlnd);
128 :
129 :
130 : /* {{{ PHP_GINIT_FUNCTION
131 : */
132 : static PHP_GINIT_FUNCTION(mysqlnd)
133 17633 : {
134 17633 : mysqlnd_globals->collect_statistics = TRUE;
135 17633 : mysqlnd_globals->collect_memory_statistics = FALSE;
136 17633 : mysqlnd_globals->debug = NULL; /* The actual string */
137 17633 : mysqlnd_globals->dbg = NULL; /* The DBG object*/
138 17633 : mysqlnd_globals->net_cmd_buffer_size = MYSQLND_NET_CMD_BUFFER_MIN_SIZE;
139 17633 : mysqlnd_globals->net_read_buffer_size = 32768;
140 17633 : mysqlnd_globals->net_read_timeout = 31536000;
141 17633 : mysqlnd_globals->log_mask = 0;
142 17633 : }
143 : /* }}} */
144 :
145 :
146 : static PHP_INI_MH(OnUpdateNetCmdBufferSize)
147 17633 : {
148 17633 : long long_value = atol(new_value);
149 17633 : if (long_value < MYSQLND_NET_CMD_BUFFER_MIN_SIZE) {
150 0 : return FAILURE;
151 : }
152 17633 : MYSQLND_G(net_cmd_buffer_size) = long_value;
153 :
154 17633 : return SUCCESS;
155 : }
156 :
157 : /* {{{ PHP_INI_BEGIN
158 : */
159 : PHP_INI_BEGIN()
160 : STD_PHP_INI_BOOLEAN("mysqlnd.collect_statistics", "1", PHP_INI_ALL, OnUpdateBool, collect_statistics, zend_mysqlnd_globals, mysqlnd_globals)
161 : STD_PHP_INI_BOOLEAN("mysqlnd.collect_memory_statistics", "0", PHP_INI_SYSTEM, OnUpdateBool, collect_memory_statistics, zend_mysqlnd_globals, mysqlnd_globals)
162 : STD_PHP_INI_ENTRY("mysqlnd.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_mysqlnd_globals, mysqlnd_globals)
163 : 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)
164 : STD_PHP_INI_ENTRY("mysqlnd.net_read_buffer_size", "32768",PHP_INI_ALL, OnUpdateLong, net_read_buffer_size, zend_mysqlnd_globals, mysqlnd_globals)
165 : STD_PHP_INI_ENTRY("mysqlnd.net_read_timeout", "31536000", PHP_INI_SYSTEM, OnUpdateLong, net_read_timeout, zend_mysqlnd_globals, mysqlnd_globals)
166 : STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals)
167 : PHP_INI_END()
168 : /* }}} */
169 :
170 :
171 : /* {{{ PHP_MINIT_FUNCTION
172 : */
173 : static PHP_MINIT_FUNCTION(mysqlnd)
174 17633 : {
175 17633 : REGISTER_INI_ENTRIES();
176 :
177 17633 : mysqlnd_library_init(TSRMLS_C);
178 17633 : return SUCCESS;
179 : }
180 : /* }}} */
181 :
182 :
183 : /* {{{ PHP_MSHUTDOWN_FUNCTION
184 : */
185 : static PHP_MSHUTDOWN_FUNCTION(mysqlnd)
186 17665 : {
187 17665 : mysqlnd_library_end(TSRMLS_C);
188 :
189 17665 : UNREGISTER_INI_ENTRIES();
190 17665 : return SUCCESS;
191 : }
192 : /* }}} */
193 :
194 :
195 : #if defined(PHP_DEBUG) || defined(MYSQLND_THREADED)
196 : /* {{{ PHP_RINIT_FUNCTION
197 : */
198 : static PHP_RINIT_FUNCTION(mysqlnd)
199 17619 : {
200 : #if defined(PHP_DEBUG)
201 17619 : if (MYSQLND_G(debug)) {
202 1 : MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C);
203 1 : if (!dbg) {
204 0 : return FAILURE;
205 : }
206 1 : dbg->m->set_mode(dbg, MYSQLND_G(debug));
207 1 : MYSQLND_G(dbg) = dbg;
208 : }
209 : #endif
210 : #ifdef MYSQLND_THREADED
211 : MYSQLND_G(thread_id) = tsrm_thread_id();
212 : #endif
213 17619 : return SUCCESS;
214 : }
215 : /* }}} */
216 : #endif
217 :
218 :
219 : #if defined(PHP_DEBUG)
220 : /* {{{ PHP_RSHUTDOWN_FUNCTION
221 : */
222 : static PHP_RSHUTDOWN_FUNCTION(mysqlnd)
223 17651 : {
224 17651 : MYSQLND_DEBUG *dbg = MYSQLND_G(dbg);
225 17651 : DBG_ENTER("RSHUTDOWN");
226 17651 : if (dbg) {
227 1 : dbg->m->close(dbg);
228 1 : dbg->m->free_handle(dbg);
229 1 : MYSQLND_G(dbg) = NULL;
230 : }
231 17651 : return SUCCESS;
232 : }
233 : /* }}} */
234 : #endif
235 :
236 :
237 : /* {{{ mysqlnd_module_entry
238 : */
239 : zend_module_entry mysqlnd_module_entry = {
240 : STANDARD_MODULE_HEADER,
241 : "mysqlnd",
242 : mysqlnd_functions,
243 : PHP_MINIT(mysqlnd),
244 : PHP_MSHUTDOWN(mysqlnd),
245 : #if defined(PHP_DEBUG) || defined(MYSQLND_THREADED)
246 : PHP_RINIT(mysqlnd),
247 : #else
248 : NULL,
249 : #endif
250 : #ifdef PHP_DEBUG
251 : PHP_RSHUTDOWN(mysqlnd),
252 : #else
253 : NULL,
254 : #endif
255 : PHP_MINFO(mysqlnd),
256 : MYSQLND_VERSION,
257 : PHP_MODULE_GLOBALS(mysqlnd),
258 : PHP_GINIT(mysqlnd),
259 : NULL,
260 : NULL,
261 : STANDARD_MODULE_PROPERTIES_EX
262 : };
263 : /* }}} */
264 :
265 :
266 : /*
267 : * Local variables:
268 : * tab-width: 4
269 : * c-basic-offset: 4
270 : * End:
271 : * vim600: noet sw=4 ts=4 fdm=marker
272 : * vim<600: noet sw=4 ts=4
273 : */
|