[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pecl-cvs
Subject:    [PECL-CVS] com =?UTF-8?Q?pecl/database/mysql=5Fxdevapi=3A=20orabug=20=23=33=30=32=32?= =?UTF-8?Q?=36
From:       hery ramilison <mysqlre () php ! net>
Date:       2019-08-29 15:43:18
Message-ID: php-mail-4fca978440fc98755825c5f10705d6cc991416672 () git ! php ! net
[Download RAW message or body]

Commit:    e6ac29d0bf2f3068b3525792a48bbe620efe7135
Author:    Darek Slusarczyk <dariusz.slusarczyk@oracle.com>         Thu, 29 Aug 2019 \
                14:05:15 +0200
Parents:   88f4fb2a560135655547357df92e5bd2bcc90d9f
Branches:  master

Link:       http://git.php.net/?p=pecl/database/mysql_xdevapi.git;a=commitdiff;h=e6ac29d0bf2f3068b3525792a48bbe620efe7135


Log:
orabug #30226232: incorrect behaviour of chained CRUD ops in webserver mode
- CRUD Collection.Find: fix wrong management of raw zvals which was the main reason \
                of incorrect behaviour (in Collection_modify there was kept zval* \
                object_zv;)
- refactorings + apply util::zvalue

Bugs:
https://bugs.php.net/30226232

Changed paths:
  M  mysqlx_collection.cc
  M  mysqlx_collection__find.cc
  M  mysqlx_collection__find.h
  M  util/value.cc
  M  util/value.inl


["diff_e6ac29d0bf2f3068b3525792a48bbe620efe7135.txt" (text/plain)]

diff --git a/mysqlx_collection.cc b/mysqlx_collection.cc
index d8656a0..cdabec2 100644
--- a/mysqlx_collection.cc
+++ b/mysqlx_collection.cc
@@ -477,18 +477,12 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, getOne)
 		DBG_VOID_RETURN;
 	}
 
-	//util::zvalue bind_variables{{"id", id}};
-	util::Hash_table bind_variables;
-	bind_variables.insert("id", id);
-	coll_find.bind(bind_variables.ptr(), return_value);
-	if (Z_TYPE_P(return_value) == IS_FALSE) {
-		DBG_VOID_RETURN;
+	util::zvalue bind_variables{{"id", id}};
+	if (coll_find.bind(bind_variables.ptr()) {
+		coll_find.execute(return_value);
+		fetch_one_from_doc_result(return_value);
 	}
 
-	coll_find.execute(return_value);
-
-	fetch_one_from_doc_result(return_value);
-
 	DBG_VOID_RETURN;
 }
 /* }}} */
diff --git a/mysqlx_collection__find.cc b/mysqlx_collection__find.cc
index 54e21c2..4d0d12d 100644
--- a/mysqlx_collection__find.cc
+++ b/mysqlx_collection__find.cc
@@ -135,9 +135,7 @@ Collection_find::~Collection_find()
 
 
 /* {{{ mysqlx_collection__find::fields */
-void Collection_find::fields(
-	const zval* fields,
-	zval* return_value)
+bool Collection_find::fields(const zval* fields)
 {
 	DBG_ENTER("Collection_find::fields");
 
@@ -158,8 +156,6 @@ void Collection_find::fields(
 			DBG_VOID_RETURN;
 	}
 
-	RETVAL_FALSE;
-
 	enum_func_status ret{PASS};
 	if (Z_TYPE_P(fields) == IS_STRING) {
 		const MYSQLND_CSTRING field_str = { Z_STRVAL_P(fields), Z_STRLEN_P(fields) };
@@ -197,11 +193,10 @@ void Collection_find::fields(
 
 
 /* {{{ Collection_find::add_operation */
-void Collection_find::add_operation(
+bool Collection_find::add_operation(
 	Collection_find::Operation operation,
 	zval* sort_expr,
-	int num_of_expr,
-	zval* return_value)
+	int num_of_expr)
 {
 	DBG_ENTER("Collection_find::add_operation");
 
@@ -215,8 +210,6 @@ void Collection_find::add_operation(
 		}
 	}
 
-	RETVAL_FALSE;
-
 	for( int i{0}; i < num_of_expr ; ++i ) {
 		switch (Z_TYPE(sort_expr[i])) {
 		case IS_STRING:
@@ -267,40 +260,32 @@ void Collection_find::add_operation(
 
 
 /* {{{ proto mixed mysqlx_collection__find::sort() */
-void Collection_find::sort(
+bool Collection_find::sort(
 	zval* sort_expr,
-	int num_of_expr,
-	zval* return_value)
+	int num_of_expr)
 {
 	DBG_ENTER("mysqlx_collection__find::sort");
-	add_operation(Operation::Sort, sort_expr, num_of_expr, return_value);
-	DBG_VOID_RETURN;
+	DBG_RETURN(add_operation(Operation::Sort, sort_expr, num_of_expr));
 }
 /* }}} */
 
 
 /* {{{ proto mixed mysqlx_collection__find::group_by() */
-void Collection_find::group_by(
+bool Collection_find::group_by(
 	zval* sort_expr,
-	int num_of_expr,
-	zval* return_value)
+	int num_of_expr)
 {
 	DBG_ENTER("mysqlx_collection__find::group_by");
-	add_operation(Operation::Group_by, sort_expr, num_of_expr, return_value);
-	DBG_VOID_RETURN;
+	DBG_RETURN(add_operation(Operation::Group_by, sort_expr, num_of_expr));
 }
 /* }}} */
 
 
 /* {{{ proto mixed mysqlx_collection__find::having() */
-void Collection_find::having(
-	const MYSQLND_CSTRING& search_condition,
-	zval* return_value)
+bool Collection_find::having(const util::string_view& search_condition)
 {
 	DBG_ENTER("mysqlx_collection__find::having");
 
-	RETVAL_FALSE;
-
 	if (PASS == xmysqlnd_crud_collection_find__set_having(find_op, search_condition)) {
 		ZVAL_COPY(return_value, object_zv);
 	}
@@ -311,9 +296,7 @@ void Collection_find::having(
 
 
 /* {{{ proto mixed mysqlx_collection__find::limit() */
-void Collection_find::limit(
-	zend_long rows,
-	zval* return_value)
+bool Collection_find::limit(zend_long rows)
 {
 	DBG_ENTER("mysqlx_collection__find::limit");
 
@@ -322,8 +305,6 @@ void Collection_find::limit(
 		DBG_VOID_RETURN;
 	}
 
-	RETVAL_FALSE;
-
 	if (PASS == xmysqlnd_crud_collection_find__set_limit(find_op, rows)) {
 		ZVAL_COPY(return_value, object_zv);
 	}
@@ -334,9 +315,7 @@ void Collection_find::limit(
 
 
 /* {{{ proto mixed mysqlx_collection__find::offset() */
-void Collection_find::offset(
-	zend_long position,
-	zval* return_value)
+bool Collection_find::offset(zend_long position)
 {
 	DBG_ENTER("mysqlx_collection__find::offset");
 
@@ -345,8 +324,6 @@ void Collection_find::offset(
 		DBG_VOID_RETURN;
 	}
 
-	RETVAL_FALSE;
-
 	if (PASS == xmysqlnd_crud_collection_find__set_offset(find_op, position)) {
 		ZVAL_COPY(return_value, object_zv);
 	}
@@ -357,14 +334,10 @@ void Collection_find::offset(
 
 
 /* {{{ proto mixed mysqlx_collection__find::bind() */
-void Collection_find::bind(
-	HashTable* bind_variables,
-	zval* return_value)
+bool Collection_find::bind(const util::zvalue& bind_variables)
 {
 	DBG_ENTER("mysqlx_collection__find::bind");
 
-	RETVAL_FALSE;
-
 	zend_string* key{nullptr};
 	zval* val{nullptr};
 	MYSQLX_HASH_FOREACH_STR_KEY_VAL(bind_variables, key, val) {
@@ -388,8 +361,6 @@ void Collection_find::lock_shared(zval* return_value, int \
lock_waiting_option)  {
 	DBG_ENTER("mysqlx_collection__find::lock_shared");
 
-	RETVAL_FALSE;
-
 	if ((xmysqlnd_crud_collection_find__enable_lock_shared(find_op) == PASS)
 		&& (xmysqlnd_crud_collection_find_set_lock_waiting_option(find_op, \
lock_waiting_option) == PASS))  {
@@ -406,8 +377,6 @@ void Collection_find::lock_exclusive(zval* return_value, int \
lock_waiting_option  {
 	DBG_ENTER("mysqlx_collection__find::lock_exclusive");
 
-	RETVAL_FALSE;
-
 	if ((xmysqlnd_crud_collection_find__enable_lock_exclusive(find_op) == PASS)
 		&& (xmysqlnd_crud_collection_find_set_lock_waiting_option(find_op, \
lock_waiting_option) == PASS))  {
@@ -434,8 +403,6 @@ void Collection_find::execute(
 {
 	DBG_ENTER("mysqlx_collection__find::execute");
 
-	RETVAL_FALSE;
-
 	xmysqlnd_crud_collection_find_verify_is_initialized(find_op);
 
 	xmysqlnd_stmt* stmt{ collection->find(find_op) };
@@ -504,7 +471,9 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, fields)
 	}
 
 	Collection_find& coll_find = util::fetch_data_object<Collection_find>(object_zv);
-	coll_find.fields(fields, return_value);
+	if (coll_find.coll_find.fields(fields)) {
+		util::zvalue::copy_to(object_zv, return_value);
+	}
 
 	DBG_VOID_RETURN;
 }
@@ -533,7 +502,9 @@ mysqlx_collection__find__add_sort_or_grouping(
 	}
 
 	Collection_find& coll_find = util::fetch_data_object<Collection_find>(object_zv);
-	coll_find.add_operation(op_type, sort_expr, num_of_expr, return_value);
+	if (coll_find.add_operation(op_type, sort_expr, num_of_expr)) {
+		util::zvalue::copy_to(object_zv, return_value);
+	}
 
 	DBG_VOID_RETURN;
 }
@@ -569,20 +540,22 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, groupBy)
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, having)
 {
 	zval* object_zv{nullptr};
-	MYSQLND_CSTRING search_condition = {nullptr, 0};
+	util::string_view search_condition;
 
 	DBG_ENTER("mysqlx_collection__find::having");
 	php_error_docref(nullptr, E_WARNING, "find.having is a deprecated function since \
MySQL 8.0.16");  
 	if (FAILURE == util::zend::parse_method_parameters(execute_data, getThis(), "Os",
 												&object_zv, collection_find_class_entry,
-												&(search_condition.s), &(search_condition.l)))
+												&(search_condition.str), &(search_condition.len)))
 	{
 		DBG_VOID_RETURN;
 	}
 
 	Collection_find& coll_find = util::fetch_data_object<Collection_find>(object_zv);
-	coll_find.having(search_condition, return_value);
+	if (coll_find.having(search_condition)) {
+		util::zvalue::copy_to(object_zv, return_value);
+	}
 
 	DBG_VOID_RETURN;
 }
@@ -605,7 +578,9 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, limit)
 	}
 
 	Collection_find& coll_find = util::fetch_data_object<Collection_find>(object_zv);
-	coll_find.limit(rows, return_value);
+	if (coll_find.limit(rows)) {
+		util::zvalue::copy_to(object_zv, return_value);
+	}
 
 	DBG_VOID_RETURN;
 }
@@ -633,7 +608,9 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, offset)
 	}
 
 	Collection_find& coll_find = util::fetch_data_object<Collection_find>(object_zv);
-	coll_find.offset(position, return_value);
+	if (coll_find.offset(position)) {
+		util::zvalue::copy_to(object_zv, return_value);
+	}
 
 	DBG_VOID_RETURN;
 }
@@ -644,11 +621,11 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, offset)
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, bind)
 {
 	zval* object_zv{nullptr};
-	HashTable* bind_variables{nullptr};
+	zval* bind_vars{nullptr};
 
 	DBG_ENTER("mysqlx_collection__find::bind");
 
-	if (FAILURE == util::zend::parse_method_parameters(execute_data, getThis(), "Oh",
+	if (FAILURE == util::zend::parse_method_parameters(execute_data, getThis(), "Oz",
 												&object_zv, collection_find_class_entry,
 												&bind_variables))
 	{
@@ -656,7 +633,10 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, bind)
 	}
 
 	Collection_find& coll_find = util::fetch_data_object<Collection_find>(object_zv);
-	coll_find.bind(bind_variables, return_value);
+	util::zvalue bind_variables(bind_vars);
+	if (coll_find.bind(bind_variables)) {
+		util::zvalue::copy_to(object_zv, return_value);
+	}
 
 	DBG_VOID_RETURN;
 }
@@ -823,7 +803,7 @@ mysqlx_new_collection__find(
 	if (SUCCESS == object_init_ex(return_value, collection_find_class_entry) && \
IS_OBJECT == Z_TYPE_P(return_value)) {  const st_mysqlx_object* const mysqlx_object = \
Z_MYSQLX_P(return_value);  Collection_find* const coll_find = \
                static_cast<Collection_find*>(mysqlx_object->ptr);
-		if (!coll_find || !coll_find->init(return_value, collection, search_expression)) {
+		if (!coll_find || !coll_find->init(collection, search_expression)) {
 			DBG_ERR("Error");
 			php_error_docref(nullptr, E_WARNING, "invalid coll_find of class %s", \
ZSTR_VAL(mysqlx_object->zo.ce->name));  zval_ptr_dtor(return_value);
diff --git a/mysqlx_collection__find.h b/mysqlx_collection__find.h
index a04f9d1..04fae19 100644
--- a/mysqlx_collection__find.h
+++ b/mysqlx_collection__find.h
@@ -43,51 +43,37 @@ public:
 	~Collection_find();
 
 	bool init(
-		zval* object_zv,
 		drv::xmysqlnd_collection* collection,
 		const util::string_view& search_expression);
 
 public:
-	void fields(
-		const zval* fields,
-		zval* return_value);
+	bool fields(const zval* fields);
 
 	enum class Operation {
 		Sort,
 		Group_by
 	};
 
-	void add_operation(
+	bool add_operation(
 		Operation op,
 		zval* sort_expr,
-		int num_of_expr,
-		zval* return_value);
+		int num_of_expr);
 
-	void group_by(
+	bool group_by(
 		zval* sort_expr,
-		int num_of_expr,
-		zval* return_value);
+		int num_of_expr);
 
-	void having(
-		const MYSQLND_CSTRING& search_condition,
-		zval* return_value);
+	bool having(const util::string_view& search_condition);
 
-	void sort(
+	bool sort(
 		zval* sort_expr,
-		int num_of_expr,
-		zval* return_value);
+		int num_of_expr);
 
-	void limit(
-		zend_long rows,
-		zval* return_value);
+	bool limit(zend_long rows);
 
-	void offset(
-		zend_long position,
-		zval* return_value);
+	bool offset(zend_long position);
 
-	void bind(
-		HashTable* bind_variables,
-		zval* return_value);
+	bool bind(const util::zvalue& bind_variables);
 
 	void lock_shared(zval* return_value, int lock_waiting_option);
 	void lock_exclusive(zval* return_value, int lock_waiting_option);
@@ -100,7 +86,6 @@ public:
 	Mysqlx::Crud::Find* get_stmt();
 
 private:
-	zval*                                      object_zv{nullptr};
 	drv::xmysqlnd_collection*                  collection{nullptr};
 	drv::st_xmysqlnd_crud_collection_op__find* find_op{nullptr};
 };
diff --git a/util/value.cc b/util/value.cc
index 3281cb4..73f661b 100644
--- a/util/value.cc
+++ b/util/value.cc
@@ -507,7 +507,10 @@ void zvalue::clear()
 void zvalue::reserve(std::size_t size)
 {
 	if (is_array()) {
-		zend_hash_extend(Z_ARRVAL(zv), size, (Z_ARRVAL(zv)->u.flags & HASH_FLAG_PACKED));
+		zend_hash_extend(
+			Z_ARRVAL(zv),
+			static_cast<uint32_t>(size),
+			(Z_ARRVAL(zv)->u.flags & HASH_FLAG_PACKED));
 	} else {
 		zval_ptr_dtor(&zv);
 		array_init_size(&zv, static_cast<uint32_t>(size));
diff --git a/util/value.inl b/util/value.inl
index 7d173b6..9eaa232 100644
--- a/util/value.inl
+++ b/util/value.inl
@@ -537,7 +537,7 @@ void zvalue::append(std::initializer_list<std::pair<Key, Value>> \
values)  for_each(
 		values.begin(),
 		values.end(),
-		[this](const auto& key_value) { insert(key_value); }
+		[](const auto& key_value) { insert(key_value); }
 		);
 }



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