[prev in list] [next in list] [prev in thread] [next in thread]
List: pecl-cvs
Subject: [PECL-CVS] =?utf-8?q?svn:_/pecl/mysqlnd=5Fuh/trunk/_mysqlnd=5Fuh=5Fclass=5Fconn=5Fdata.c_mysqlnd=5Fu
From: Ulf_Wendel <uw () php ! net>
Date: 2013-12-19 19:58:17
Message-ID: svn-uw-1387483097-332476-1181228807 () svn ! php ! net
[Download RAW message or body]
uw Thu, 19 Dec 2013 19:58:17 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=332476
Log:
New ConnData::txBegin()
Changed paths:
U pecl/mysqlnd_uh/trunk/mysqlnd_uh_class_conn_data.c
U pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_conn_data.c
U pecl/mysqlnd_uh/trunk/php_mysqlnd_uh.c
A pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_conn_data_m_tx_begin.phpt
U pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_connection_data_interface.phpt
["svn-diffs-332476.txt" (text/x-diff)]
Modified: pecl/mysqlnd_uh/trunk/mysqlnd_uh_class_conn_data.c
===================================================================
--- pecl/mysqlnd_uh/trunk/mysqlnd_uh_class_conn_data.c 2013-12-19 18:59:05 UTC (rev \
332475)
+++ pecl/mysqlnd_uh/trunk/mysqlnd_uh_class_conn_data.c 2013-12-19 19:58:17 UTC (rev \
332476) @@ -577,7 +577,6 @@
}
/* }}} */
-
/* {{{ */
PHP_METHOD(MYSQLND_UH_CLASS_CONN_DATA_NAME, setClientOption)
{
@@ -777,6 +776,32 @@
CLASS_CONN_PHP_METHOD_ONE_ARG_CONN_RET_BOOL(tx_rollback, txRollback, PASS, \
MYSQLND_CONN_DATA *)
/* {{{ */
+PHP_METHOD(MYSQLND_UH_CLASS_CONN_DATA_NAME, txBegin)
+{
+ zval* mysqlnd_rsrc;
+ MYSQLND_UH_RES_CONN* res_conn;
+ MYSQLND_CONN_DATA *conn_data;
+ long mode;
+ const char *name;
+ unsigned int name_len;
+
+ CHECK_ENABLED();
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rls", &mysqlnd_rsrc, &mode, \
&name, &name_len) == FAILURE) { + RETURN_NULL();
+ }
+ ZEND_FETCH_RESOURCE(res_conn, MYSQLND_UH_RES_CONN*, &mysqlnd_rsrc, -1, \
MYSQLND_UH_RES_MYSQLND_CONN_DATA_NAME, le_mysqlnd_uh_mysqlnd_conn_data); + conn_data \
= res_conn->mysqlnd_conn_data; +
+ if (PASS == org_mysqlnd_conn_data_methods.tx_begin(conn_data, (const unsigned \
int)mode, (const char* const)name TSRMLS_CC)) { + RETVAL_TRUE;
+ } else {
+ RETVAL_FALSE;
+ }
+}
+/* }}} */
+
+
+/* {{{ */
PHP_METHOD(MYSQLND_UH_CLASS_CONN_DATA_NAME, __construct)
{
if (!MYSQLND_UH_G(enabled)) {
@@ -922,6 +947,11 @@
METHOD_ARG_INFO_CONN_ONLY_ARG(txCommit_arginfo)
METHOD_ARG_INFO_CONN_ONLY_ARG(txRollback_arginfo)
+METHOD_ARG_INFO_BEGIN_W_CONN(txBegin_arginfo)
+ ZEND_ARG_INFO(0, "mode")
+ ZEND_ARG_INFO(0, "name")
+METHOD_ARG_INFO_END()
+
static zend_function_entry php_mysqlnd_uh_class_conn_data_functions[] = {
PHP_ME(MYSQLND_UH_CLASS_CONN_DATA_NAME, __construct, NULL, \
ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(MYSQLND_UH_CLASS_CONN_DATA_NAME, query, \
query_arginfo, ZEND_ACC_PUBLIC) @@ -974,6 +1004,7 @@
PHP_ME(MYSQLND_UH_CLASS_CONN_DATA_NAME, setAutocommit, setAutocommit_arginfo, \
ZEND_ACC_PUBLIC) PHP_ME(MYSQLND_UH_CLASS_CONN_DATA_NAME, txCommit, txCommit_arginfo, \
ZEND_ACC_PUBLIC) PHP_ME(MYSQLND_UH_CLASS_CONN_DATA_NAME, txRollback, \
txRollback_arginfo, ZEND_ACC_PUBLIC) + PHP_ME(MYSQLND_UH_CLASS_CONN_DATA_NAME, \
txBegin, txBegin_arginfo, ZEND_ACC_PUBLIC) { NULL, NULL, NULL }
};
Modified: pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_conn_data.c
===================================================================
--- pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_conn_data.c 2013-12-19 18:59:05 UTC (rev \
332475)
+++ pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_conn_data.c 2013-12-19 19:58:17 UTC (rev \
332476) @@ -1036,7 +1036,7 @@
void MYSQLND_METHOD(mysqlnd_uh_conn_data, free_contents)(MYSQLND_CONN_DATA *conn \
TSRMLS_DC) {
DBG_ENTER("mysqlnd_uh_conn_data.free_contents");
- DBG_INF_FMT("conn_data %p", conn);
+ DBG_INF_FMT("conn_data %p", conn);
mysqlnd_uh_free_plugin_connection_data_data(conn, FALSE TSRMLS_CC);
/*
@@ -1049,13 +1049,11 @@
zval_ptr_dtor(&retval);
} else {
*/
- org_mysqlnd_conn_data_methods.free_contents(conn TSRMLS_CC);
+ org_mysqlnd_conn_data_methods.free_contents(conn TSRMLS_CC);
/*
}
*/
-
-
DBG_VOID_RETURN;
}
/* }}} */
@@ -1078,7 +1076,7 @@
enum_func_status ret = FAIL;
DBG_ENTER("mysqlnd_uh_conn_data.set_autocommit");
- DBG_INF_FMT("conn_data %p", conn);
+ DBG_INF_FMT("conn_data %p", conn);
EXTRACT_DATA_AND_USER_OBJ(conn, conn_data, conn_obj);
if (conn_obj) {
@@ -1101,6 +1099,34 @@
MYSQLND_CONN_DATA_METHOD_ONE_ARG_CONN_RET_FUNC_STATUS(tx_rollback, txrollback, \
txRollback, MYSQLND_CONN_DATA * conn)
/* {{{ */
+enum_func_status MYSQLND_METHOD(mysqlnd_uh_conn_data, tx_begin)(MYSQLND_CONN_DATA * \
conn, const unsigned int mode, const char * const name TSRMLS_DC) { \
+ enum_func_status ret = FAIL; +
+ DBG_ENTER("mysqlnd_uh_conn_data.tx_begin");
+ DBG_INF_FMT("conn_data %p", conn);
+
+ EXTRACT_DATA_AND_USER_OBJ(conn, conn_data, conn_obj);
+ if (conn_obj) {
+ zval *retval = NULL;
+ MYSQLND_UH_HOOK_ARG_RESOURCE(conn_resource, conn_data);
+ MYSQLND_UH_HOOK_ARG_LONG(mode);
+ MYSQLND_UH_HOOK_ARG_STRING(name);
+
+ mysqlnd_uh_call_method_with_3_params(conn_obj, NULL, "txbegin", &retval, \
conn_resource, zv_mode, zv_name); + zval_ptr_dtor(&zv_mode);
+ zval_ptr_dtor(&zv_name);
+ RETVAL_BOOL_CHECK_TYPE(retval, "txBegin");
+ RETVAL_BOOL_TO_FUNC_STATUS(retval, ret);
+ } else {
+ ret = org_mysqlnd_conn_data_methods.tx_begin(conn, mode, name TSRMLS_CC);
+ }
+
+ DBG_RETURN(ret);
+}
+/* }}} */
+
+
+/* {{{ */
void MYSQLND_METHOD(mysqlnd_uh_conn_data, dtor)(MYSQLND_CONN_DATA * conn TSRMLS_DC) \
{ DBG_ENTER("mysqlnd_uh_conn_data.dtor (private)");
DBG_INF_FMT("conn_data %p", conn);
@@ -1130,28 +1156,6 @@
/* Backup originial function pointers in org_mysqlnd_conn_data_methods */
memcpy(&org_mysqlnd_conn_data_methods, my_mysqlnd_conn_data_methods, sizeof(struct \
st_mysqlnd_conn_data_methods)); /*
-
- func_mysqlnd_conn_data__get_server_status get_server_status;
-
- func_mysqlnd_conn_data__free_options free_options;
- func_mysqlnd_conn_data__dtor dtor;
-
- func_mysqlnd_conn_data__get_reference get_reference;
- func_mysqlnd_conn_data__free_reference free_reference;
- func_mysqlnd_conn_data__get_state get_state;
- func_mysqlnd_conn_data__set_state set_state;
-
- func_mysqlnd_conn_data__result_init result_init;
-
- func_mysqlnd_conn_data__tx_begin tx_begin;
- func_mysqlnd_conn_data__tx_commit_or_rollback tx_commit_or_rollback;
- func_mysqlnd_conn_data__tx_cor_options_to_string tx_cor_options_to_string;
- func_mysqlnd_conn_data__tx_savepoint tx_savepoint;
- func_mysqlnd_conn_data__tx_savepoint_release tx_savepoint_release;
-
- func_mysqlnd_conn_data__local_tx_start local_tx_start;
- func_mysqlnd_conn_data__local_tx_end local_tx_end;
-
func_mysqlnd_conn_data__execute_init_commands execute_init_commands;
func_mysqlnd_conn_data__get_updated_connect_flags get_updated_connect_flags;
func_mysqlnd_conn_data__connect_handshake connect_handshake;
@@ -1202,13 +1206,41 @@
my_mysqlnd_conn_data_methods->get_server_status = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, get_server_status); \
my_mysqlnd_conn_data_methods->set_server_option = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, set_server_option); \
my_mysqlnd_conn_data_methods->set_client_option = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, set_client_option); + /*
+ TODO
+
+ free_options() is called in the dtor. If free_options goes through the userland,
+ it will allocate new plugin data which we have just free'd! Then, it may be
+ impossible to ever free the newly allocated plugin data.
+
+ typedef void (*func_mysqlnd_conn_data__free_options)(MYSQLND_CONN_DATA * conn \
TSRMLS_DC); + my_mysqlnd_conn_data_methods->free_options = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, free_options); + */
my_mysqlnd_conn_data_methods->query_read_result_set_header = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, query_read_result_set_header); + /*
+ TODO
+ Those four cry for trouble if exported to the userspace. At best one may
+ call the userspace function but not allow it to overwrite the return value.
+ As there is other more useful stuff to do...
+
+ func_mysqlnd_conn_data__get_reference get_reference;
+ func_mysqlnd_conn_data__free_reference free_reference;
+ func_mysqlnd_conn_data__get_state get_state;
+ func_mysqlnd_conn_data__set_state set_state;
+ */
my_mysqlnd_conn_data_methods->simple_command = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, simple_command); \
my_mysqlnd_conn_data_methods->simple_command_handle_response = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, simple_command_handle_response); \
my_mysqlnd_conn_data_methods->restart_psession = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, restart_psession); \
my_mysqlnd_conn_data_methods->send_close = MYSQLND_METHOD(mysqlnd_uh_conn_data, \
send_close); my_mysqlnd_conn_data_methods->ssl_set = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, ssl_set); /*
+ TODO
+ Makes little sense to export prior to exporting the result class.
+ First the result class, then this one.
+
+ func_mysqlnd_conn_data__result_init result_init;
+ */
+ /*
end_psession() and free_contents() will be called if a connection gets destroyed.
We must intercept them to free plugin data associated with the connection!
*/
@@ -1218,7 +1250,19 @@
my_mysqlnd_conn_data_methods->set_autocommit = MYSQLND_METHOD(mysqlnd_uh_conn_data, \
set_autocommit); my_mysqlnd_conn_data_methods->tx_commit = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, tx_commit); \
my_mysqlnd_conn_data_methods->tx_rollback = MYSQLND_METHOD(mysqlnd_uh_conn_data, \
tx_rollback); + my_mysqlnd_conn_data_methods->tx_begin = \
MYSQLND_METHOD(mysqlnd_uh_conn_data, tx_begin); + /*
+ func_mysqlnd_conn_data__tx_begin tx_begin
+ typedef enum_func_status (*func_mysqlnd_conn_data__tx_begin)(MYSQLND_CONN_DATA * \
conn, const unsigned int mode, const char * const name TSRMLS_DC);; \
+ func_mysqlnd_conn_data__tx_commit_or_rollback tx_commit_or_rollback; \
+ func_mysqlnd_conn_data__tx_cor_options_to_string tx_cor_options_to_string; \
+ func_mysqlnd_conn_data__tx_savepoint tx_savepoint; \
+ func_mysqlnd_conn_data__tx_savepoint_release tx_savepoint_release;
+ func_mysqlnd_conn_data__local_tx_start local_tx_start;
+ func_mysqlnd_conn_data__local_tx_end local_tx_end;
+ */
+
}
/* }}} */
Modified: pecl/mysqlnd_uh/trunk/php_mysqlnd_uh.c
===================================================================
--- pecl/mysqlnd_uh/trunk/php_mysqlnd_uh.c 2013-12-19 18:59:05 UTC (rev 332475)
+++ pecl/mysqlnd_uh/trunk/php_mysqlnd_uh.c 2013-12-19 19:58:17 UTC (rev 332476)
@@ -210,6 +210,12 @@
REGISTER_LONG_CONSTANT("MYSQLND_UH_MYSQLND_CHG_USER_RESP_PACKET", \
PROT_CHG_USER_RESP_PACKET, CONST_CS | CONST_PERSISTENT); \
REGISTER_LONG_CONSTANT("MYSQLND_UH_MYSQLND_PROT_LAST", PROT_LAST, CONST_CS | \
CONST_PERSISTENT);
+ /* tx related */
+ REGISTER_LONG_CONSTANT("MYSQLND_UH_MYSQLND_TRANS_START_NO_OPT", TRANS_START_NO_OPT, \
CONST_CS | CONST_PERSISTENT); \
+ REGISTER_LONG_CONSTANT("MYSQLND_UH_MYSQLND_TRANS_START_WITH_CONSISTENT_SNAPSHOT", \
TRANS_START_WITH_CONSISTENT_SNAPSHOT, CONST_CS | CONST_PERSISTENT); \
+ REGISTER_LONG_CONSTANT("MYSQLND_UH_MYSQLND_TRANS_START_READ_WRITE", \
TRANS_START_READ_WRITE, CONST_CS | CONST_PERSISTENT); \
+ REGISTER_LONG_CONSTANT("MYSQLND_UH_MYSQLND_TRANS_START_READ_ONLY", \
TRANS_START_READ_ONLY, CONST_CS | CONST_PERSISTENT); +
/*
We do not need to set a destructor here. Our resource is bound to a mysqlnd \
connection. If the mysqlnd connection, which itself is a resource, is to be \
destroyed, we will be told
Added: pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_conn_data_m_tx_begin.phpt
===================================================================
--- pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_conn_data_m_tx_begin.phpt \
(rev 0)
+++ pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_conn_data_m_tx_begin.phpt 2013-12-19 \
19:58:17 UTC (rev 332476) @@ -0,0 +1,89 @@
+--TEST--
+bool MysqlndUhConnectionData::txBegin(resource $connection)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifconnectfailure.inc');
+if (version_compare(PHP_VERSION, '5.3.99-dev', '<'))
+ die(sprintf("SKIP PHP 5.4.0 or later, you are using %s\n", PHP_VERSION));
+?>
+--FILE--
+<?php
+ require_once('config.inc');
+
+ class proxy extends MysqlndUhConnectionData {
+ public function txBegin($res, $mode, $name) {
+ printf("%s(%s)\n", __METHOD__, var_export(func_get_args(), true));
+
+ if ($mode == MYSQLND_UH_MYSQLND_TRANS_START_NO_OPT) {
+ printf("mode = MYSQLND_UH_MYSQLND_TRANS_START_NO_OPT\n");
+ }
+ if ($mode & MYSQLND_UH_MYSQLND_TRANS_START_WITH_CONSISTENT_SNAPSHOT) {
+ printf("mode & MYSQLND_UH_MYSQLND_TRANS_START_WITH_CONSISTENT_SNAPSHOT\n");
+ }
+ if ($mode & MYSQLND_UH_MYSQLND_TRANS_START_READ_WRITE) {
+ printf("mode & MYSQLND_UH_MYSQLND_TRANS_START_READ_WRITE\n");
+ }
+ if ($mode & MYSQLND_UH_MYSQLND_TRANS_START_READ_ONLY) {
+ printf("mode & MYSQLND_UH_MYSQLND_TRANS_START_READ_ONLY\n");
+ }
+
+ $ret = parent::txBegin($res, $mode, $name);
+ printf("ret = %s\n", var_export($ret, true));
+ return $ret;
+ }
+ }
+
+ class proxy2 extends MysqlndUhConnectionData {
+ public function txBegin($res, $mode, $name) {
+ var_dump(func_get_args());
+ return -1;
+ }
+ }
+
+ class proxy3 extends MysqlndUhConnectionData {
+ public function txBegin($res, $mode, $name) {
+ var_dump(func_get_args());
+ return false;
+ }
+ }
+
+ $mysqli = mysqlnd_uh_test\connect::mysqli();
+ mysqlnd_uh_set_connection_data_proxy(new proxy());
+ $mysqli->begin_transaction();
+
+ mysqlnd_uh_set_connection_data_proxy(new proxy2());
+ $mysqli->begin_transaction();
+
+ mysqlnd_uh_set_connection_data_proxy(new proxy3());
+ $mysqli->begin_transaction();
+
+ print "done!";
+?>
+--EXPECTF--
+proxy::txBegin(array (
+ 0 => NULL,
+ 1 => 0,
+ 2 => '',
+))
+mode = MYSQLND_UH_MYSQLND_TRANS_START_NO_OPT
+ret = true
+array(3) {
+ [0]=>
+ resource(%d) of type (Mysqlnd Connection Data)
+ [1]=>
+ int(0)
+ [2]=>
+ string(0) ""
+}
+
+Warning: mysqli::begin_transaction(): (Mysqlnd User Handler) The method \
MysqlndUhConnectionData::txBegin() did not return a boolean value as it should in %s \
on line %d +array(3) {
+ [0]=>
+ resource(%d) of type (Mysqlnd Connection Data)
+ [1]=>
+ int(0)
+ [2]=>
+ string(0) ""
+}
+done!
\ No newline at end of file
Modified: pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_connection_data_interface.phpt
===================================================================
--- pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_connection_data_interface.phpt 2013-12-19 \
18:59:05 UTC (rev 332475)
+++ pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_connection_data_interface.phpt 2013-12-19 \
19:58:17 UTC (rev 332476) @@ -63,13 +63,13 @@
'endPSession' => 'endPSession',
'sendClose' => 'sendClose',
'sslSet' => 'sslSet',
+ 'getServerStatus' => 'getServerStatus',
+ 'setAutocommit' => 'setAutocommit',
+ 'txCommit' => 'txCommit',
+ 'txRollback' => 'txRollback',
+ 'txBegin' => 'txBegin',
);
-
- $expected['setAutocommit'] = 'setAutocommit';
- $expected['txCommit'] = 'txCommit';
- $expected['txRollback'] = 'txRollback';
-
$unexpected = array();
foreach ($methods as $method) {
if (isset($expected[$method])) {
--
PECL CVS Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic