php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
mysqlnd_driver.c
Go to the documentation of this file.
1/*
2 +----------------------------------------------------------------------+
3 | Copyright (c) The PHP Group |
4 +----------------------------------------------------------------------+
5 | This source file is subject to version 3.01 of the PHP license, |
6 | that is bundled with this package in the file LICENSE, and is |
7 | available through the world-wide-web at the following url: |
8 | https://www.php.net/license/3_01.txt |
9 | If you did not receive a copy of the PHP license and are unable to |
10 | obtain it through the world-wide-web, please send a note to |
11 | license@php.net so we can mail you a copy immediately. |
12 +----------------------------------------------------------------------+
13 | Authors: Andrey Hristov <andrey@php.net> |
14 | Ulf Wendel <uw@php.net> |
15 +----------------------------------------------------------------------+
16*/
17
18#include "php.h"
19#include "mysqlnd.h"
20#include "mysqlnd_vio.h"
23#include "mysqlnd_connection.h"
24#include "mysqlnd_ps.h"
25#include "mysqlnd_plugin.h"
26#include "mysqlnd_priv.h"
27#include "mysqlnd_statistics.h"
28#include "mysqlnd_debug.h"
29#include "mysqlnd_reverse_api.h"
30#include "mysqlnd_ext_plugin.h"
31
32static bool mysqlnd_library_initted = FALSE;
33
34static struct st_mysqlnd_plugin_core mysqlnd_plugin_core =
35{
36 {
38 "mysqlnd",
41 "PHP License 3.01",
42 "Andrey Hristov <andrey@php.net>, Ulf Wendel <uw@php.net>, Georg Richter <georg@php.net>",
43 {
44 NULL, /* will be filled later */
46 },
47 {
48 NULL /* plugin shutdown */
49 }
50 }
51};
52
53
54/* {{{ mysqlnd_library_end */
56{
57 if (mysqlnd_library_initted == TRUE) {
61 mysqlnd_library_initted = FALSE;
63 }
64}
65/* }}} */
66
67
68/* {{{ mysqlnd_library_init */
70{
71 if (mysqlnd_library_initted == FALSE) {
72 mysqlnd_library_initted = TRUE;
76 /* Should be calloc, as mnd_calloc will reference LOCK_access*/
79 {
80 mysqlnd_plugin_core.plugin_header.plugin_stats.values = mysqlnd_global_stats;
81 mysqlnd_plugin_register_ex((struct st_mysqlnd_plugin_header *) &mysqlnd_plugin_core);
82 }
83#if MYSQLND_DBG_ENABLED == 1
85#endif
88
90
91#if MYSQLND_CHARSETS_SANITY_CHECK == 1
92 void mysqlnd_charsets_sanity_check(void);
93 mysqlnd_charsets_sanity_check();
94#endif
95 }
96}
97/* }}} */
98
99
100/* {{{ mysqlnd_object_factory::get_connection */
101static MYSQLND *
102MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *factory, const bool persistent)
103{
104 const size_t alloc_size_ret = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *);
105 const size_t alloc_size_ret_data = sizeof(MYSQLND_CONN_DATA) + mysqlnd_plugin_count() * sizeof(void *);
106 MYSQLND * new_object;
108
109 DBG_ENTER("mysqlnd_driver::get_connection");
110 DBG_INF_FMT("persistent=%u", persistent);
111 new_object = mnd_pecalloc(1, alloc_size_ret, persistent);
112 if (!new_object) {
114 }
115 new_object->data = mnd_pecalloc(1, alloc_size_ret_data, persistent);
116 if (!new_object->data) {
117 mnd_pefree(new_object, persistent);
119 }
120 new_object->persistent = persistent;
121 new_object->m = mysqlnd_conn_get_methods();
122 data = new_object->data;
123
124 mysqlnd_error_info_init(&data->error_info_impl, persistent);
125 data->error_info = &data->error_info_impl;
126
127 data->options = &(data->options_impl);
128
129 mysqlnd_upsert_status_init(&data->upsert_status_impl);
130 data->upsert_status = &(data->upsert_status_impl);
132
133 data->persistent = persistent;
135 data->object_factory = *factory;
136
138
139 data->m->get_reference(data);
140
142
143 data->protocol_frame_codec = mysqlnd_pfc_init(persistent, factory, data->stats, data->error_info);
144 data->vio = mysqlnd_vio_init(persistent, factory, data->stats, data->error_info);
147
148 if (!data->protocol_frame_codec || !data->vio || !data->payload_decoder_factory || !data->command) {
149 new_object->m->dtor(new_object);
151 }
152
153 DBG_RETURN(new_object);
154}
155/* }}} */
156
157
158/* {{{ mysqlnd_object_factory::clone_connection_object */
159static MYSQLND *
160MYSQLND_METHOD(mysqlnd_object_factory, clone_connection_object)(MYSQLND * to_be_cloned)
161{
162 const size_t alloc_size_ret = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *);
163 MYSQLND * new_object;
164
165 DBG_ENTER("mysqlnd_driver::clone_connection_object");
166 DBG_INF_FMT("persistent=%u", to_be_cloned->persistent);
167 if (!to_be_cloned || !to_be_cloned->data) {
169 }
170 new_object = mnd_pecalloc(1, alloc_size_ret, to_be_cloned->persistent);
171 if (!new_object) {
173 }
174 new_object->persistent = to_be_cloned->persistent;
175 new_object->m = to_be_cloned->m;
176
177 new_object->data = to_be_cloned->data->m->get_reference(to_be_cloned->data);
178 if (!new_object->data) {
179 new_object->m->dtor(new_object);
180 new_object = NULL;
181 }
182 DBG_RETURN(new_object);
183}
184/* }}} */
185
186
187/* {{{ mysqlnd_object_factory::get_prepared_statement */
188static MYSQLND_STMT *
189MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement)(MYSQLND_CONN_DATA * const conn)
190{
191 const size_t alloc_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *);
192 MYSQLND_STMT * ret = mnd_ecalloc(1, alloc_size);
193 MYSQLND_STMT_DATA * stmt = NULL;
194
195 DBG_ENTER("mysqlnd_object_factory::get_prepared_statement");
197
198 stmt = ret->data = mnd_ecalloc(1, sizeof(MYSQLND_STMT_DATA));
199 DBG_INF_FMT("stmt=%p", stmt);
200
202 stmt->error_info = &stmt->error_info_impl;
203
205 stmt->upsert_status = &(stmt->upsert_status_impl);
209
210 /*
211 Mark that we reference the connection, thus it won't be
212 be destructed till there is open statements. The last statement
213 or normal query result will close it then.
214 */
215 stmt->conn = conn->m->get_reference(conn);
216
218}
219/* }}} */
220
221
222/* {{{ mysqlnd_object_factory::get_pfc */
223static MYSQLND_PFC *
224MYSQLND_METHOD(mysqlnd_object_factory, get_pfc)(const bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
225{
226 const size_t pfc_alloc_size = ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_PFC) + mysqlnd_plugin_count() * sizeof(void *));
227 const size_t pfc_data_alloc_size = sizeof(MYSQLND_PFC_DATA) + mysqlnd_plugin_count() * sizeof(void *);
228 MYSQLND_PFC * pfc = mnd_pecalloc(1, pfc_alloc_size + pfc_data_alloc_size, persistent);
229
230 DBG_ENTER("mysqlnd_object_factory::get_pfc");
231 DBG_INF_FMT("persistent=%u", persistent);
232 if (pfc) {
233 pfc->data = (MYSQLND_PFC_DATA*)((char*)pfc + pfc_alloc_size);
234 pfc->persistent = pfc->data->persistent = persistent;
235 pfc->data->m = *mysqlnd_pfc_get_methods();
236
237 pfc->data->m.init(pfc, stats, error_info);
238 }
239 DBG_RETURN(pfc);
240}
241/* }}} */
242
243
244/* {{{ mysqlnd_object_factory::get_vio */
245static MYSQLND_VIO *
246MYSQLND_METHOD(mysqlnd_object_factory, get_vio)(const bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info)
247{
248 const size_t vio_alloc_size = ZEND_MM_ALIGNED_SIZE(sizeof(MYSQLND_VIO) + mysqlnd_plugin_count() * sizeof(void *));
249 const size_t vio_data_alloc_size = sizeof(MYSQLND_VIO_DATA) + mysqlnd_plugin_count() * sizeof(void *);
250 MYSQLND_VIO * vio = mnd_pecalloc(1, vio_alloc_size + vio_data_alloc_size, persistent);
251
252 DBG_ENTER("mysqlnd_object_factory::get_vio");
253 DBG_INF_FMT("persistent=%u", persistent);
254 if (vio) {
255 vio->data = (MYSQLND_VIO_DATA*)((char*)vio + vio_alloc_size);
256 vio->persistent = vio->data->persistent = persistent;
257 vio->data->m = *mysqlnd_vio_get_methods();
258
259 vio->data->m.init(vio, stats, error_info);
260 }
261 DBG_RETURN(vio);
262}
263/* }}} */
264
265
266/* {{{ mysqlnd_object_factory::get_protocol_payload_decoder_factory */
268MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)(MYSQLND_CONN_DATA * conn, const bool persistent)
269{
270 const size_t alloc_size = sizeof(MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY) + mysqlnd_plugin_count() * sizeof(void *);
272
273 DBG_ENTER("mysqlnd_object_factory::get_protocol_payload_decoder_factory");
274 DBG_INF_FMT("persistent=%u", persistent);
275 if (ret) {
276 ret->persistent = persistent;
277 ret->conn = conn;
278 ret->m = MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_protocol_payload_decoder_factory);
279 }
280
282}
283/* }}} */
284
285
286PHPAPI MYSQLND_CLASS_METHODS_START(mysqlnd_object_factory)
287 MYSQLND_METHOD(mysqlnd_object_factory, get_connection),
288 MYSQLND_METHOD(mysqlnd_object_factory, clone_connection_object),
289 MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement),
290 MYSQLND_METHOD(mysqlnd_object_factory, get_pfc),
291 MYSQLND_METHOD(mysqlnd_object_factory, get_vio),
292 MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_payload_decoder_factory)
ffi persistent
Definition ffi.c:3633
const php_stream_filter_factory * factory
Definition filters.c:1900
#define TRUE
Definition gd_gd.c:7
#define FALSE
Definition gd_gd.c:8
#define NULL
Definition gdcache.h:45
PHPAPI MYSQLND_STATS * mysqlnd_global_stats
PHPAPI unsigned int mysqlnd_plugin_count(void)
PHPAPI const MYSQLND_STRING mysqlnd_stats_values_names[]
#define PHP_MYSQLND_VERSION
Definition mysqlnd.h:22
PHPAPI unsigned int mysqlnd_plugin_register_ex(struct st_mysqlnd_plugin_header *plugin)
#define MYSQLND_PLUGIN_API_VERSION
Definition mysqlnd.h:25
#define MYSQLND_VERSION_ID
Definition mysqlnd.h:23
#define MYSQLND_METHOD(class, method)
Definition mysqlnd.h:294
#define mnd_pecalloc(nmemb, size, p)
#define mnd_ecalloc(nmemb, size)
#define mnd_emalloc(size)
#define mnd_pefree(ptr, pers)
void mysqlnd_register_builtin_authentication_plugins(void)
PHPAPI void mysqlnd_connection_state_init(struct st_mysqlnd_connection_state *const state)
PHPAPI void mysqlnd_error_info_init(MYSQLND_ERROR_INFO *const info, const bool persistent)
void mysqlnd_upsert_status_init(MYSQLND_UPSERT_STATUS *const upsert_status)
#define UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(status)
void mysqlnd_debug_trace_plugin_register(void)
#define DBG_RETURN(value)
PHPAPI void mysqlnd_library_init(void)
PHPAPI void mysqlnd_library_end(void)
@ STAT_LAST
@ MYSQLND_STMT_INITTED
#define MYSQLND_NET_CMD_BUFFER_MIN_SIZE
#define mysqlnd_conn_data_get_methods()
#define mysqlnd_stmt_get_methods()
#define mysqlnd_conn_data_set_methods(m)
#define mysqlnd_vio_get_methods()
#define mysqlnd_command_get_methods()
#define mysqlnd_pfc_get_methods()
#define mysqlnd_conn_get_methods()
#define mysqlnd_conn_set_methods(m)
void mysqlnd_plugin_subsystem_init(void)
void mysqlnd_plugin_subsystem_end(void)
void mysqlnd_example_plugin_register(void)
PHPAPI MYSQLND_PFC * mysqlnd_pfc_init(const bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS *stats, MYSQLND_ERROR_INFO *error_info)
void _mysqlnd_init_ps_subsystem(void)
PHPAPI void mysqlnd_reverse_api_end(void)
PHPAPI void mysqlnd_reverse_api_init(void)
PHPAPI void mysqlnd_stats_end(MYSQLND_STATS *stats, const bool persistent)
PHPAPI void mysqlnd_stats_init(MYSQLND_STATS **stats, const size_t statistic_count, const bool persistent)
#define MYSQLND_CLASS_METHODS_END
struct st_mysqlnd_vio MYSQLND_VIO
struct st_mysqlnd_connection_data MYSQLND_CONN_DATA
#define MYSQLND_CLASS_METHODS_TYPE(class)
struct st_mysqlnd_stats MYSQLND_STATS
struct st_mysqlnd_protocol_frame_codec MYSQLND_PFC
struct st_mysqlnd_protocol_frame_codec_data MYSQLND_PFC_DATA
struct st_mysqlnd_protocol_payload_decoder_factory MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY
struct st_mysqlnd_connection MYSQLND
struct st_mysqlnd_vio_data MYSQLND_VIO_DATA
struct st_mysqlnd_stmt_data MYSQLND_STMT_DATA
struct st_mysqlnd_stmt MYSQLND_STMT
#define MYSQLND_CLASS_METHODS_START(class)
struct st_mysqlnd_error_info MYSQLND_ERROR_INFO
#define MYSQLND_CLASS_METHOD_TABLE_NAME(class)
PHPAPI MYSQLND_VIO * mysqlnd_vio_init(bool persistent, MYSQLND_CLASS_METHODS_TYPE(mysqlnd_object_factory) *object_factory, MYSQLND_STATS *stats, MYSQLND_ERROR_INFO *error_info)
PHPAPI MYSQLND_PROTOCOL_PAYLOAD_DECODER_FACTORY * mysqlnd_protocol_payload_decoder_factory_init(MYSQLND_CONN_DATA *conn, const bool persistent)
#define PHPAPI
Definition php.h:71
zend_constant * data
MYSQLND_CONN_DATA * data
struct st_mysqlnd_protocol_frame_codec_data * data
MYSQLND_ERROR_INFO error_info_impl
enum_mysqlnd_stmt_state state
MYSQLND_CMD_BUFFER execute_cmd_buffer
MYSQLND_ERROR_INFO * error_info
MYSQLND_UPSERT_STATUS * upsert_status
MYSQLND_UPSERT_STATUS upsert_status_impl
MYSQLND_CONN_DATA * conn
struct st_mysqlnd_vio_data * data
#define ZEND_MM_ALIGNED_SIZE(size)
Definition zend_alloc.h:35
zval * ret