diff options
author | Andrey Hristov <andrey@php.net> | 2011-10-31 14:33:56 +0000 |
---|---|---|
committer | Andrey Hristov <andrey@php.net> | 2011-10-31 14:33:56 +0000 |
commit | ba1f65faa1e8671b217ad3e2ec18ce7cb42c2a43 (patch) | |
tree | 9106c603f6397ccf36d7bfa0f935d285533b87ea /ext/mysqlnd/mysqlnd_driver.c | |
parent | 6a9feb730f0024da06c455ed58fbc633b0a167ea (diff) | |
download | php-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.c | 39 |
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) |