[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