[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