1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-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 : | Author: George Schlossnagle <george@omniti.com> |
16 : | Johannes Schlueter <johannes@mysql.com> |
17 : +----------------------------------------------------------------------+
18 : */
19 :
20 : /* $Id: pdo_mysql.c 290053 2009-10-29 13:33:51Z iliaa $ */
21 :
22 : #ifdef HAVE_CONFIG_H
23 : #include "config.h"
24 : #endif
25 :
26 : #include "php.h"
27 : #include "php_ini.h"
28 : #include "ext/standard/info.h"
29 : #include "pdo/php_pdo.h"
30 : #include "pdo/php_pdo_driver.h"
31 : #include "php_pdo_mysql.h"
32 : #include "php_pdo_mysql_int.h"
33 :
34 : #ifdef COMPILE_DL_PDO_MYSQL
35 : ZEND_GET_MODULE(pdo_mysql)
36 : #endif
37 :
38 : #if PDO_USE_MYSQLND
39 : ZEND_DECLARE_MODULE_GLOBALS(pdo_mysql);
40 :
41 : #ifndef PHP_WIN32
42 : # ifndef PDO_MYSQL_UNIX_ADDR
43 : # ifdef PHP_MYSQL_UNIX_SOCK_ADDR
44 : # define PDO_MYSQL_UNIX_ADDR PHP_MYSQL_UNIX_SOCK_ADDR
45 : # else
46 : # define PDO_MYSQL_UNIX_ADDR "/tmp/mysql.sock"
47 : # endif
48 : # endif
49 : #endif
50 :
51 : /* {{{ PHP_INI_BEGIN
52 : */
53 : PHP_INI_BEGIN()
54 : #ifndef PHP_WIN32
55 : STD_PHP_INI_ENTRY("pdo_mysql.default_socket", PDO_MYSQL_UNIX_ADDR, PHP_INI_SYSTEM, OnUpdateString, default_socket, zend_pdo_mysql_globals, pdo_mysql_globals)
56 : #endif
57 : #if PDO_DBG_ENABLED
58 : STD_PHP_INI_ENTRY("pdo_mysql.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_pdo_mysql_globals, pdo_mysql_globals)
59 : #endif
60 : STD_PHP_INI_ENTRY("pdo_mysql.cache_size", "2000", PHP_INI_SYSTEM, OnUpdateLong, cache_size, zend_pdo_mysql_globals, pdo_mysql_globals)
61 : PHP_INI_END()
62 : /* }}} */
63 : #endif
64 :
65 : /* true global environment */
66 : #ifdef PDO_USE_MYSQLND
67 : static MYSQLND_ZVAL_PCACHE *pdo_mysqlnd_zval_cache;
68 : #endif
69 :
70 :
71 : /* {{{ PHP_MINIT_FUNCTION
72 : */
73 : static PHP_MINIT_FUNCTION(pdo_mysql)
74 17633 : {
75 : #if PDO_USE_MYSQLND
76 17633 : REGISTER_INI_ENTRIES();
77 : #endif
78 :
79 17633 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_USE_BUFFERED_QUERY", (long)PDO_MYSQL_ATTR_USE_BUFFERED_QUERY);
80 17633 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_LOCAL_INFILE", (long)PDO_MYSQL_ATTR_LOCAL_INFILE);
81 17633 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_INIT_COMMAND", (long)PDO_MYSQL_ATTR_INIT_COMMAND);
82 : #ifndef PDO_USE_MYSQLND
83 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_MAX_BUFFER_SIZE", (long)PDO_MYSQL_ATTR_MAX_BUFFER_SIZE);
84 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_FILE", (long)PDO_MYSQL_ATTR_READ_DEFAULT_FILE);
85 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_READ_DEFAULT_GROUP", (long)PDO_MYSQL_ATTR_READ_DEFAULT_GROUP);
86 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_COMPRESS", (long)PDO_MYSQL_ATTR_COMPRESS);
87 : #endif
88 17633 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_DIRECT_QUERY", (long)PDO_MYSQL_ATTR_DIRECT_QUERY);
89 17633 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_FOUND_ROWS", (long)PDO_MYSQL_ATTR_FOUND_ROWS);
90 17633 : REGISTER_PDO_CLASS_CONST_LONG("MYSQL_ATTR_IGNORE_SPACE", (long)PDO_MYSQL_ATTR_IGNORE_SPACE);
91 :
92 : #ifdef PDO_USE_MYSQLND
93 17633 : pdo_mysqlnd_zval_cache = mysqlnd_palloc_init_cache(PDO_MYSQL_G(cache_size));
94 : #endif
95 :
96 17633 : return php_pdo_register_driver(&pdo_mysql_driver);
97 : }
98 : /* }}} */
99 :
100 : /* {{{ PHP_MSHUTDOWN_FUNCTION
101 : */
102 : static PHP_MSHUTDOWN_FUNCTION(pdo_mysql)
103 17665 : {
104 17665 : php_pdo_unregister_driver(&pdo_mysql_driver);
105 : #if PDO_USE_MYSQLND
106 17665 : mysqlnd_palloc_free_cache(pdo_mysqlnd_zval_cache);
107 17665 : UNREGISTER_INI_ENTRIES();
108 : #endif
109 :
110 17665 : return SUCCESS;
111 : }
112 : /* }}} */
113 :
114 : /* {{{ PHP_MINFO_FUNCTION
115 : */
116 : static PHP_MINFO_FUNCTION(pdo_mysql)
117 42 : {
118 42 : php_info_print_table_start();
119 :
120 42 : php_info_print_table_header(2, "PDO Driver for MySQL", "enabled");
121 42 : php_info_print_table_row(2, "Client API version", mysql_get_client_info());
122 :
123 : #ifdef PDO_USE_MYSQLND
124 : {
125 : zval values;
126 :
127 42 : php_info_print_table_header(2, "Persistent cache", pdo_mysqlnd_zval_cache ? "enabled":"disabled");
128 :
129 42 : if (pdo_mysqlnd_zval_cache) {
130 : /* Now report cache status */
131 42 : mysqlnd_palloc_stats(pdo_mysqlnd_zval_cache, &values);
132 42 : mysqlnd_minfo_print_hash(&values);
133 42 : zval_dtor(&values);
134 : }
135 : }
136 : #endif
137 42 : php_info_print_table_end();
138 :
139 : #ifdef PDO_USE_MYSQLND
140 42 : DISPLAY_INI_ENTRIES();
141 : #endif
142 42 : }
143 : /* }}} */
144 :
145 :
146 : #if PDO_USE_MYSQLND
147 : /* {{{ PHP_RINIT_FUNCTION
148 : */
149 : static PHP_RINIT_FUNCTION(pdo_mysql)
150 17619 : {
151 17619 : PDO_MYSQL_G(mysqlnd_thd_zval_cache) = mysqlnd_palloc_rinit(pdo_mysqlnd_zval_cache);
152 :
153 : #if PDO_DBG_ENABLED
154 : if (PDO_MYSQL_G(debug)) {
155 : MYSQLND_DEBUG *dbg = mysqlnd_debug_init(TSRMLS_C);
156 : if (!dbg) {
157 : return FAILURE;
158 : }
159 : dbg->m->set_mode(dbg, PDO_MYSQL_G(debug));
160 : PDO_MYSQL_G(dbg) = dbg;
161 : }
162 : #endif
163 :
164 17619 : return SUCCESS;
165 : }
166 : /* }}} */
167 :
168 :
169 : /* {{{ PHP_RSHUTDOWN_FUNCTION
170 : */
171 : static PHP_RSHUTDOWN_FUNCTION(pdo_mysql)
172 17651 : {
173 17651 : mysqlnd_palloc_rshutdown(PDO_MYSQL_G(mysqlnd_thd_zval_cache));
174 :
175 : #if PDO_DBG_ENABLED
176 : MYSQLND_DEBUG *dbg = PDO_MYSQL_G(dbg);
177 : PDO_DBG_ENTER("RSHUTDOWN");
178 : if (dbg) {
179 : dbg->m->close(dbg);
180 : dbg->m->free_handle(dbg);
181 : PDO_MYSQL_G(dbg) = NULL;
182 : }
183 : #endif
184 17651 : return SUCCESS;
185 : }
186 : /* }}} */
187 :
188 :
189 : /* {{{ PHP_GINIT_FUNCTION
190 : */
191 : static PHP_GINIT_FUNCTION(pdo_mysql)
192 17633 : {
193 17633 : pdo_mysql_globals->mysqlnd_thd_zval_cache = NULL; /* zval cache */
194 17633 : pdo_mysql_globals->cache_size = 0;
195 : #ifndef PHP_WIN32
196 17633 : pdo_mysql_globals->default_socket = NULL;
197 : #endif
198 : #if PDO_DBG_ENABLED
199 : pdo_mysql_globals->debug = NULL; /* The actual string */
200 : pdo_mysql_globals->dbg = NULL; /* The DBG object*/
201 : #endif
202 17633 : }
203 : /* }}} */
204 : #endif
205 :
206 :
207 : /* {{{ pdo_mysql_functions[] */
208 : const zend_function_entry pdo_mysql_functions[] = {
209 : {NULL, NULL, NULL}
210 : };
211 : /* }}} */
212 :
213 : /* {{{ pdo_mysql_deps[] */
214 : #if ZEND_MODULE_API_NO >= 20050922
215 : static const zend_module_dep pdo_mysql_deps[] = {
216 : ZEND_MOD_REQUIRED("pdo")
217 : #ifdef PDO_USE_MYSQLND
218 : ZEND_MOD_REQUIRED("mysqlnd")
219 : #endif
220 : {NULL, NULL, NULL}
221 : };
222 : #endif
223 : /* }}} */
224 :
225 : /* {{{ pdo_mysql_module_entry */
226 : zend_module_entry pdo_mysql_module_entry = {
227 : STANDARD_MODULE_HEADER_EX, NULL,
228 : pdo_mysql_deps,
229 : "pdo_mysql",
230 : pdo_mysql_functions,
231 : PHP_MINIT(pdo_mysql),
232 : PHP_MSHUTDOWN(pdo_mysql),
233 : #if PDO_USE_MYSQLND
234 : PHP_RINIT(pdo_mysql),
235 : PHP_RSHUTDOWN(pdo_mysql),
236 : #else
237 : NULL,
238 : NULL,
239 : #endif
240 : PHP_MINFO(pdo_mysql),
241 : "1.0.2",
242 : #if PDO_USE_MYSQLND
243 : PHP_MODULE_GLOBALS(pdo_mysql),
244 : PHP_GINIT(pdo_mysql),
245 : NULL,
246 : NULL,
247 : STANDARD_MODULE_PROPERTIES_EX
248 : #else
249 : STANDARD_MODULE_PROPERTIES
250 : #endif
251 : };
252 : /* }}} */
253 :
254 :
255 : /*
256 : * Local variables:
257 : * tab-width: 4
258 : * c-basic-offset: 4
259 : * End:
260 : * vim600: noet sw=4 ts=4 fdm=marker
261 : * vim<600: noet sw=4 ts=4
262 : */
|