[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=5Fhooks.c_mysqlnd=5Fuh=5Fhooks=5Fre
From:       Ulf_Wendel <uw () php ! net>
Date:       2013-12-20 16:49:52
Message-ID: svn-uw-1387558192-332492-121977498 () svn ! php ! net
[Download RAW message or body]

uw                                       Fri, 20 Dec 2013 16:49:52 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=332492

Log:
Plumbing one of many issues related to the result class

Changed paths:
    U   pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks.c
    U   pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_result.c
    A   pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_res_m_fetch_into.phpt

Modified: pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks.c
===================================================================
--- pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks.c	2013-12-20 10:43:04 UTC (rev 332491)
+++ pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks.c	2013-12-20 16:49:52 UTC (rev 332492)
@@ -427,6 +427,7 @@

 	DBG_ENTER("mysqlnd_uh_get_plugin_result_data");
 	DBG_INF_FMT("result %p", res);
+
 	res_data = (MYSQLND_UH_RESULT_DATA **) mysqlnd_plugin_get_plugin_result_data(res, \
mysqlnd_uh_plugin_id);

 	if (res_data && *res_data) {
@@ -500,7 +501,6 @@
 				zval_ptr_dtor(&((*res_data)->user_resource));
 				(*res_data)->user_resource = NULL;
 			}
-
 			DBG_INF_FMT("free res_data %p", *res_data);
 			mnd_pefree(*res_data, 0);
 			*res_data = NULL;

Modified: pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_result.c
===================================================================
--- pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_result.c	2013-12-20 10:43:04 UTC (rev \
                332491)
+++ pecl/mysqlnd_uh/trunk/mysqlnd_uh_hooks_result.c	2013-12-20 16:49:52 UTC (rev \
332492) @@ -99,12 +99,21 @@
 		MYSQLND_UH_HOOK_ARG_RESOURCE(res_resource, result_data);
 		MYSQLND_UH_HOOK_ARG_BOOL(implicit);

-		mysqlnd_uh_conn_free_plugin_result_data(result, TRUE TSRMLS_CC);
+		/* NOTE: we have to handle the resource.
+		Plugin data, which contains the resource zval, can be free'd but we need the \
resource until +		the end of the call.
+		*/
+		Z_ADDREF_P(res_resource);

+		mysqlnd_uh_conn_free_plugin_result_data(result, FALSE TSRMLS_CC);
+
 		zval *retval = NULL;
 		mysqlnd_uh_call_method_with_2_params(result_obj, NULL, "freeresult", &retval, \
res_resource, zv_implicit);  zval_ptr_dtor(&zv_implicit);

+		/* NOTE: free resource zval */
+		zval_ptr_dtor(&res_resource);
+
 		RETVAL_BOOL_CHECK_TYPE(retval, "freeResult");
 		MYSQLND_UH_HOOK_RETVAL_BOOL_TO_FUNC_STATUS(retval, ret);

@@ -135,9 +144,37 @@
 	memcpy(&org_mysqlnd_res_methods, my_mysqlnd_res_methods, sizeof(struct \
st_mysqlnd_res_methods));

 	/* Replace selected methods */
+
 	my_mysqlnd_res_methods->fetch_into						= MYSQLND_METHOD(mysqlnd_uh_result, \
fetch_into);  my_mysqlnd_res_methods->free_result						= \
MYSQLND_METHOD(mysqlnd_uh_result, free_result);

+	/*
+	func_mysqlnd_res__use_result use_result;
+	func_mysqlnd_res__store_result store_result;
+	func_mysqlnd_res__fetch_into fetch_into;
+	func_mysqlnd_res__fetch_row_c fetch_row_c;
+	func_mysqlnd_res__fetch_all fetch_all;
+	func_mysqlnd_res__fetch_field_data fetch_field_data;
+	func_mysqlnd_res__num_rows num_rows;
+	func_mysqlnd_res__num_fields num_fields;
+	func_mysqlnd_res__skip_result skip_result;
+	func_mysqlnd_res__seek_data seek_data;
+	func_mysqlnd_res__seek_field seek_field;
+	func_mysqlnd_res__field_tell field_tell;
+	func_mysqlnd_res__fetch_field fetch_field;
+	func_mysqlnd_res__fetch_field_direct fetch_field_direct;
+	func_mysqlnd_res__fetch_fields fetch_fields;
+	func_mysqlnd_res__read_result_metadata read_result_metadata;
+	func_mysqlnd_res__fetch_lengths fetch_lengths;
+	func_mysqlnd_res__store_result_fetch_data store_result_fetch_data;
+	func_mysqlnd_res__initialize_result_set_rest initialize_result_set_rest;
+	func_mysqlnd_res__free_result_buffers free_result_buffers;
+	func_mysqlnd_res__free_result free_result;
+	func_mysqlnd_res__free_result_internal free_result_internal;
+	func_mysqlnd_res__free_result_contents free_result_contents;
+	func_mysqlnd_res__free_buffered_data free_buffered_data;
+	func_mysqlnd_res__unbuffered_free_last_data unbuffered_free_last_data;
+	 */
 }
 /* }}} */


Added: pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_res_m_fetch_into.phpt
===================================================================
--- pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_res_m_fetch_into.phpt	               \
                (rev 0)
+++ pecl/mysqlnd_uh/trunk/tests/mysqlnd_uh_class_res_m_fetch_into.phpt	2013-12-20 \
16:49:52 UTC (rev 332492) @@ -0,0 +1,34 @@
+--TEST--
+bool MysqlndUhResult::fetchInto()
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once("skipifconnectfailure.inc");
+?>
+--FILE--
+<?php
+	require_once('config.inc');
+
+	class proxy extends MysqlndUhResult {
+		public function fetchInto($res, &$rows, $flags, $extension) {
+			printf("%s(%s)\n", __METHOD__, var_export(func_get_args(), true));
+			$ret = parent::fetchInto($res, $rows, $flags, $extension);
+			var_dump($ret);
+			return $ret;
+		}
+	}
+	mysqlnd_uh_set_result_proxy(new proxy());
+
+	$conn = mysqlnd_uh_test\connect::mysqli();
+	mysqlnd_uh_test\query_test::mysqli($conn);
+	if (true != ($res = $conn->query("SELECT 1 as 'one' FROM DUAL")))
+		printf("[001] Expecting true got %s\n", var_export($res));
+
+	while ($row = $res->fetch_assoc()) {
+		var_dump($row);
+	}
+
+	print "done!";
+?>
+--EXPECTF--
+done!
\ No newline at end of file



-- 
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