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
commitba1f65faa1e8671b217ad3e2ec18ce7cb42c2a43 (patch)
tree9106c603f6397ccf36d7bfa0f935d285533b87ea /ext/mysqlnd/mysqlnd_driver.c
parent6a9feb730f0024da06c455ed58fbc633b0a167ea (diff)
downloadphp-git-ba1f65faa1e8671b217ad3e2ec18ce7cb42c2a43.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 35c65f79c5..adcd17d5ca 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);
@@ -127,7 +128,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);
@@ -135,18 +136,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);
@@ -157,6 +158,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)
@@ -259,6 +289,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)