summaryrefslogtreecommitdiff
path: root/ext/mysqlnd/mysqlnd_driver.c
diff options
context:
space:
mode:
authorAndrey Hristov <andrey@php.net>2011-10-31 14:33:56 +0000
committerAndrey Hristov <andrey@php.net>2011-10-31 14:33:56 +0000
commit92ec40d8e4a5fbeb9fdc3d3edf8991a55e1389db (patch)
tree0051f6b32b38bfdb0b4b2469f263d205cdafa2e7 /ext/mysqlnd/mysqlnd_driver.c
parent8fb6bdd5b82fbfeb295f9a3d181a29606f7f670d (diff)
downloadphp-git-92ec40d8e4a5fbeb9fdc3d3edf8991a55e1389db.tar.gz
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.
Diffstat (limited to 'ext/mysqlnd/mysqlnd_driver.c')
-rw-r--r--ext/mysqlnd/mysqlnd_driver.c39
1 files changed, 35 insertions, 4 deletions
diff --git a/ext/mysqlnd/mysqlnd_driver.c b/ext/mysqlnd/mysqlnd_driver.c
index 1f33df1768..3a61621ac5 100644
--- a/ext/mysqlnd/mysqlnd_driver.c
+++ b/ext/mysqlnd/mysqlnd_driver.c
@@ -72,6 +72,7 @@ PHPAPI void mysqlnd_library_init(TSRMLS_D)
if (mysqlnd_library_initted == FALSE) {
mysqlnd_library_initted = TRUE;
mysqlnd_conn_set_methods(&MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn));
+ mysqlnd_conn_data_set_methods(&MYSQLND_CLASS_METHOD_TABLE_NAME(mysqlnd_conn_data));
_mysqlnd_init_ps_subsystem();
/* Should be calloc, as mnd_calloc will reference LOCK_access*/
mysqlnd_stats_init(&mysqlnd_global_stats, STAT_LAST);
@@ -126,7 +127,7 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent TSRM
DBG_RETURN(NULL);
}
new_object->persistent = persistent;
-
+ new_object->m = mysqlnd_conn_get_methods();
data = new_object->data;
data->error_info = &(data->error_info_impl);
@@ -134,18 +135,18 @@ MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent TSRM
data->upsert_status = &(data->upsert_status_impl);
data->persistent = persistent;
- data->m = mysqlnd_conn_get_methods();
+ data->m = mysqlnd_conn_data_get_methods();
CONN_SET_STATE(data, CONN_ALLOCED);
data->m->get_reference(data TSRMLS_CC);
if (PASS != data->m->init(data TSRMLS_CC)) {
- data->m->outter_dtor(new_object TSRMLS_CC);
+ new_object->m->dtor(new_object TSRMLS_CC);
DBG_RETURN(NULL);
}
data->error_info->error_list = mnd_pecalloc(1, sizeof(zend_llist), persistent);
if (!data->error_info->error_list) {
- data->m->outter_dtor(new_object TSRMLS_CC);
+ new_object->m->dtor(new_object TSRMLS_CC);
DBG_RETURN(NULL);
} else {
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
/* }}} */
+/* {{{ mysqlnd_object_factory::clone_connection_object */
+static MYSQLND *
+MYSQLND_METHOD(mysqlnd_object_factory, clone_connection_object)(MYSQLND * to_be_cloned TSRMLS_DC)
+{
+ size_t alloc_size_ret = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *);
+ MYSQLND * new_object;
+
+ DBG_ENTER("mysqlnd_driver::clone_connection_object");
+ DBG_INF_FMT("persistent=%u", to_be_cloned->persistent);
+ if (!to_be_cloned || !to_be_cloned->data) {
+ DBG_RETURN(NULL);
+ }
+ new_object = mnd_pecalloc(1, alloc_size_ret, to_be_cloned->persistent);
+ if (!new_object) {
+ DBG_RETURN(NULL);
+ }
+ new_object->persistent = to_be_cloned->persistent;
+ new_object->m = mysqlnd_conn_get_methods();
+
+ new_object->data = to_be_cloned->data->m->get_reference(to_be_cloned->data TSRMLS_CC);
+ if (!new_object->data) {
+ new_object->m->dtor(new_object TSRMLS_CC);
+ new_object = NULL;
+ }
+ DBG_RETURN(new_object);
+}
+/* }}} */
+
+
/* {{{ mysqlnd_object_factory::get_prepared_statement */
static MYSQLND_STMT *
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
MYSQLND_CLASS_METHODS_START(mysqlnd_object_factory)
MYSQLND_METHOD(mysqlnd_object_factory, get_connection),
+ MYSQLND_METHOD(mysqlnd_object_factory, clone_connection_object),
MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement),
MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel),
MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_decoder)