diff options
author | Andrey Hristov <andrey@php.net> | 2011-10-24 12:34:44 +0000 |
---|---|---|
committer | Andrey Hristov <andrey@php.net> | 2011-10-24 12:34:44 +0000 |
commit | 4321da0388bf55bfa4be8d8c865ef771b08ba953 (patch) | |
tree | 9f90e70350946db77e749837c9271021879ea178 /ext/mysqlnd/mysqlnd_driver.c | |
parent | 20422c265309993d97fc36e0e8ff0126318cc1da (diff) | |
download | php-git-4321da0388bf55bfa4be8d8c865ef771b08ba953.tar.gz |
move plugin specific stuff to one file. create object factory
for similar objects
Diffstat (limited to 'ext/mysqlnd/mysqlnd_driver.c')
-rw-r--r-- | ext/mysqlnd/mysqlnd_driver.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/ext/mysqlnd/mysqlnd_driver.c b/ext/mysqlnd/mysqlnd_driver.c index d83461a345..4eeb0c237a 100644 --- a/ext/mysqlnd/mysqlnd_driver.c +++ b/ext/mysqlnd/mysqlnd_driver.c @@ -89,6 +89,163 @@ PHPAPI void mysqlnd_library_init(TSRMLS_D) } /* }}} */ + +/* {{{ mysqlnd_error_list_pdtor */ +static void +mysqlnd_error_list_pdtor(void * pDest) +{ + MYSQLND_ERROR_LIST_ELEMENT * element = (MYSQLND_ERROR_LIST_ELEMENT *) pDest; + TSRMLS_FETCH(); + DBG_ENTER("mysqlnd_error_list_pdtor"); + if (element->error) { + mnd_pefree(element->error, TRUE); + } + DBG_VOID_RETURN; +} +/* }}} */ + + +/* {{{ mysqlnd_object_factory::get_connection */ +static MYSQLND * +MYSQLND_METHOD(mysqlnd_object_factory, get_connection)(zend_bool persistent TSRMLS_DC) +{ + size_t alloc_size = sizeof(MYSQLND) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND *ret; + + DBG_ENTER("mysqlnd_driver::get_connection"); + DBG_INF_FMT("persistent=%u", persistent); + ret = mnd_pecalloc(1, alloc_size, persistent); + if (!ret) { + DBG_RETURN(NULL); + } + + ret->persistent = persistent; + ret->m = mysqlnd_conn_get_methods(); + CONN_SET_STATE(ret, CONN_ALLOCED); + ret->m->get_reference(ret TSRMLS_CC); + + if (PASS != ret->m->init(ret TSRMLS_CC)) { + ret->m->dtor(ret TSRMLS_CC); + ret = NULL; + } + + ret->error_info.error_list = mnd_pecalloc(1, sizeof(zend_llist), persistent); + if (!ret->error_info.error_list) { + ret->m->dtor(ret TSRMLS_CC); + ret = NULL; + } else { + zend_llist_init(ret->error_info.error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t)mysqlnd_error_list_pdtor, persistent); + } + + DBG_RETURN(ret); +} +/* }}} */ + + +/* {{{ mysqlnd_object_factory::get_prepared_statement */ +static MYSQLND_STMT * +MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement)(MYSQLND * const conn TSRMLS_DC) +{ + size_t alloc_size = sizeof(MYSQLND_STMT) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_STMT * ret = mnd_pecalloc(1, alloc_size, conn->persistent); + MYSQLND_STMT_DATA * stmt = NULL; + + DBG_ENTER("mysqlnd_object_factory::get_prepared_statement"); + do { + if (!ret) { + break; + } + ret->m = mysqlnd_stmt_get_methods(); + ret->persistent = conn->persistent; + + stmt = ret->data = mnd_pecalloc(1, sizeof(MYSQLND_STMT_DATA), conn->persistent); + DBG_INF_FMT("stmt=%p", stmt); + if (!stmt) { + break; + } + stmt->persistent = conn->persistent; + stmt->state = MYSQLND_STMT_INITTED; + stmt->execute_cmd_buffer.length = 4096; + stmt->execute_cmd_buffer.buffer = mnd_pemalloc(stmt->execute_cmd_buffer.length, stmt->persistent); + if (!stmt->execute_cmd_buffer.buffer) { + break; + } + + stmt->prefetch_rows = MYSQLND_DEFAULT_PREFETCH_ROWS; + /* + Mark that we reference the connection, thus it won't be + be destructed till there is open statements. The last statement + or normal query result will close it then. + */ + stmt->conn = conn->m->get_reference(conn TSRMLS_CC); + stmt->error_info.error_list = mnd_pecalloc(1, sizeof(zend_llist), ret->persistent); + if (!stmt->error_info.error_list) { + break; + } + zend_llist_init(stmt->error_info.error_list, sizeof(MYSQLND_ERROR_LIST_ELEMENT), (llist_dtor_func_t) mysqlnd_error_list_pdtor, conn->persistent); + + DBG_RETURN(ret); + } while (0); + + SET_OOM_ERROR(conn->error_info); + if (ret) { + ret->m->dtor(ret, TRUE TSRMLS_CC); + ret = NULL; + } + DBG_RETURN(NULL); +} +/* }}} */ + + +/* {{{ mysqlnd_object_factory::get_io_channel */ +PHPAPI MYSQLND_NET * +MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel)(zend_bool persistent, MYSQLND_STATS * stats, MYSQLND_ERROR_INFO * error_info TSRMLS_DC) +{ + size_t alloc_size = sizeof(MYSQLND_NET) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_NET * net = mnd_pecalloc(1, alloc_size, persistent); + + DBG_ENTER("mysqlnd_object_factory::get_io_channel"); + DBG_INF_FMT("persistent=%u", persistent); + if (net) { + net->persistent = persistent; + net->m = *mysqlnd_net_get_methods(); + + if (PASS != net->m.init(net, stats, error_info TSRMLS_CC)) { + net->m.dtor(net, stats, error_info TSRMLS_CC); + net = NULL; + } + } + DBG_RETURN(net); +} +/* }}} */ + + +/* {{{ mysqlnd_object_factory::get_protocol_decoder */ +PHPAPI MYSQLND_PROTOCOL * +MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_decoder)(zend_bool persistent TSRMLS_DC) +{ + size_t alloc_size = sizeof(MYSQLND_PROTOCOL) + mysqlnd_plugin_count() * sizeof(void *); + MYSQLND_PROTOCOL *ret = mnd_pecalloc(1, alloc_size, persistent); + + DBG_ENTER("mysqlnd_object_factory::get_protocol_decoder"); + DBG_INF_FMT("persistent=%u", persistent); + if (ret) { + ret->persistent = persistent; + ret->m = mysqlnd_mysqlnd_protocol_methods; + } + + DBG_RETURN(ret); +} +/* }}} */ + + +MYSQLND_CLASS_METHODS_START(mysqlnd_object_factory) + MYSQLND_METHOD(mysqlnd_object_factory, get_connection), + MYSQLND_METHOD(mysqlnd_object_factory, get_prepared_statement), + MYSQLND_METHOD(mysqlnd_object_factory, get_io_channel), + MYSQLND_METHOD(mysqlnd_object_factory, get_protocol_decoder) +MYSQLND_CLASS_METHODS_END; + /* * Local variables: * tab-width: 4 |