Skip to content

Commit 92ec40d

Browse files
committed
Now really split the method tables and have different
methods for the handle and the data object. Add auxiliary functions to work with the new methods. Add possibility to clone a connection object - shadow copy.
1 parent 8fb6bdd commit 92ec40d

File tree

7 files changed

+533
-456
lines changed

7 files changed

+533
-456
lines changed

ext/mysqlnd/mysqlnd.c

Lines changed: 324 additions & 308 deletions
Large diffs are not rendered by default.

ext/mysqlnd/mysqlnd.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ PHPAPI void _mysqlnd_debug(const char *mode TSRMLS_DC);
110110
#define mysqlnd_get_connection_stats(conn, values) ((conn)->data)->m->get_statistics((conn)->data, (values) TSRMLS_CC ZEND_FILE_LINE_CC)
111111
#define mysqlnd_get_client_stats(values) _mysqlnd_get_client_stats((values) TSRMLS_CC ZEND_FILE_LINE_CC)
112112

113-
#define mysqlnd_close(conn,is_forced) ((conn)->data)->m->close((conn), (is_forced) TSRMLS_CC)
113+
#define mysqlnd_close(conn,is_forced) (conn)->m->close((conn), (is_forced) TSRMLS_CC)
114114
#define mysqlnd_query(conn, query_str, query_len) ((conn)->data)->m->query((conn)->data, (query_str), (query_len) TSRMLS_CC)
115115
#define mysqlnd_async_query(conn, query_str, query_len) ((conn)->data)->m->send_query((conn)->data, (query_str), (query_len) TSRMLS_CC)
116116
#define mysqlnd_poll(r, err, d_pull,sec,usec,desc_num) _mysqlnd_poll((r), (err), (d_pull), (sec), (usec), (desc_num) TSRMLS_CC)
@@ -211,7 +211,7 @@ PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND_CONN_DATA * const conn, con
211211

212212
/* Escaping */
213213
#define mysqlnd_real_escape_string(conn, newstr, escapestr, escapestr_len) \
214-
((conn)->data)->m->escape_string((conn), (newstr), (escapestr), (escapestr_len) TSRMLS_CC)
214+
((conn)->data)->m->escape_string((conn)->data, (newstr), (escapestr), (escapestr_len) TSRMLS_CC)
215215
#define mysqlnd_escape_string(newstr, escapestr, escapestr_len) \
216216
mysqlnd_old_escape_string((newstr), (escapestr), (escapestr_len) TSRMLS_CC)
217217

ext/mysqlnd/mysqlnd_driver.c

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ PHPAPI void mysqlnd_library_init(TSRMLS_D)
7272
if (mysqlnd_library_initted == FALSE) {
7373
mysqlnd_library_initted = TRUE;
7474
mysqlnd_conn_set_methods(&MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn));
75+
mysqlnd_conn_data_set_methods(&MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn_data));
7576
_mysqlnd_init_ps_subsystem();
7677
/* Should be calloc, as mnd_calloc will reference LOCK_access*/
7778
mysqlnd_stats_init(&mysqlnd_global_stats, STAT_LAST);
@@ -126,26 +127,26 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent TSRM
126127
DBG_RETURN(NULL);
127128
}
128129
new_object->persistent = persistent;
129-
130+
new_object->m = mysqlnd_conn_get_methods();
130131
data = new_object->data;
131132

132133
data->error_info = &(data->error_info_impl);
133134
data->options = &(data->options_impl);
134135
data->upsert_status = &(data->upsert_status_impl);
135136

136137
data->persistent = persistent;
137-
data->m = mysqlnd_conn_get_methods();
138+
data->m = mysqlnd_conn_data_get_methods();
138139
CONN_SET_STATE(data, CONN_ALLOCED);
139140
data->m->get_reference(data TSRMLS_CC);
140141

141142
if (PASS != data->m->init(data TSRMLS_CC)) {
142-
data->m->outter_dtor(new_object TSRMLS_CC);
143+
new_object->m->dtor(new_object TSRMLS_CC);
143144
DBG_RETURN(NULL);
144145
}
145146

146147
data->error_info->error_list = mnd_pecalloc(1, sizeof(zend_llist), persistent);
147148
if (!data->error_info->error_list) {
148-
data->m->outter_dtor(new_object TSRMLS_CC);
149+
new_object->m->dtor(new_object TSRMLS_CC);
149150
DBG_RETURN(NULL);
150151
} else {
151152
zend_llist_init(data->error_info->error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t)mysqlnd_error_list_pdtor, persistent);
@@ -156,6 +157,35 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent TSRM
156157
/* }}} */
157158

158159

160+
/* {{{ mysqlnd_object_factory::clone_connection_object */
161+
static MYSQLND *
162+
MYSQLND_METHOD(mysqlnd_object_factory, clone_connection_object)(MYSQLND * to_be_cloned TSRMLS_DC)
163+
{
164+
size_t alloc_size_ret = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *);
165+
MYSQLND * new_object;
166+
167+
DBG_ENTER("mysqlnd_driver::clone_connection_object");
168+
DBG_INF_FMT("persistent=%u", to_be_cloned->persistent);
169+
if (!to_be_cloned || !to_be_cloned->data) {
170+
DBG_RETURN(NULL);
171+
}
172+
new_object = mnd_pecalloc(1, alloc_size_ret, to_be_cloned->persistent);
173+
if (!new_object) {
174+
DBG_RETURN(NULL);
175+
}
176+
new_object->persistent = to_be_cloned->persistent;
177+
new_object->m = mysqlnd_conn_get_methods();
178+
179+
new_object->data = to_be_cloned->data->m->get_reference(to_be_cloned->data TSRMLS_CC);
180+
if (!new_object->data) {
181+
new_object->m->dtor(new_object TSRMLS_CC);
182+
new_object = NULL;
183+
}
184+
DBG_RETURN(new_object);
185+
}
186+
/* }}} */
187+
188+
159189
/* {{{ mysqlnd_object_factory::get_prepared_statement */
160190
static MYSQLND_STMT *
161191
MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement)(MYSQLND_CONN_DATA * const conn TSRMLS_DC)
@@ -258,6 +288,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_decoder)(zend_bool persisten
258288

259289
MYSQLND_CLASS_METHODS_START(mysqlnd_object_factory)
260290
MYSQLND_METHOD(mysqlnd_object_factory, get_connection),
291+
MYSQLND_METHOD(mysqlnd_object_factory, clone_connection_object),
261292
MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement),
262293
MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel),
263294
MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_decoder)

ext/mysqlnd/mysqlnd_ext_plugin.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "mysqlnd_debug.h"
2727

2828
static struct st_mysqlnd_conn_methods * mysqlnd_conn_methods;
29+
static struct st_mysqlnd_conn_data_methods * mysqlnd_conn_data_methods;
2930
static struct st_mysqlnd_stmt_methods * mysqlnd_stmt_methods;
3031

3132
/* {{{ _mysqlnd_plugin_get_plugin_connection_data */
@@ -126,6 +127,22 @@ PHPAPI void mysqlnd_conn_set_methods(struct st_mysqlnd_conn_methods *methods)
126127
/* }}} */
127128

128129

130+
/* {{{ mysqlnd_conn_get_methods */
131+
PHPAPI struct st_mysqlnd_conn_data_methods *
132+
mysqlnd_conn_data_get_methods()
133+
{
134+
return mysqlnd_conn_data_methods;
135+
}
136+
/* }}} */
137+
138+
/* {{{ mysqlnd_conn_set_methods */
139+
PHPAPI void mysqlnd_conn_data_set_methods(struct st_mysqlnd_conn_data_methods * methods)
140+
{
141+
mysqlnd_conn_data_methods = methods;
142+
}
143+
/* }}} */
144+
145+
129146
/* {{{ mysqlnd_result_get_methods */
130147
PHPAPI struct st_mysqlnd_res_methods *
131148
mysqlnd_result_get_methods()

ext/mysqlnd/mysqlnd_ext_plugin.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ PHPAPI void ** _mysqlnd_plugin_get_plugin_net_data(const MYSQLND_NET * net, unsi
4444
PHPAPI struct st_mysqlnd_conn_methods * mysqlnd_conn_get_methods();
4545
PHPAPI void mysqlnd_conn_set_methods(struct st_mysqlnd_conn_methods * methods);
4646

47+
PHPAPI struct st_mysqlnd_conn_data_methods * mysqlnd_conn_data_get_methods();
48+
PHPAPI void mysqlnd_conn_data_set_methods(struct st_mysqlnd_conn_data_methods * methods);
49+
4750
PHPAPI struct st_mysqlnd_res_methods * mysqlnd_result_get_methods();
4851
PHPAPI void mysqlnd_result_set_methods(struct st_mysqlnd_res_methods * methods);
4952

ext/mysqlnd/mysqlnd_priv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ PHPAPI extern const char * const mysqlnd_out_of_memory;
202202

203203
extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_object_factory);
204204
extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_conn);
205+
extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_conn_data);
205206
extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_res);
206207
extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_protocol);
207208
extern MYSQLND_CLASS_METHOD_TABLE_NAME_FORWARD(mysqlnd_net);

0 commit comments

Comments
 (0)