[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=31=33?= =?UTF-8?Q?=34
From:       hery ramilison <mysqlre () php ! net>
Date:       2020-08-27 15:29:21
Message-ID: php-mail-fab19b92e2c85012765d071786691a571309384709 () git ! php ! net
[Download RAW message or body]

Commit:    dee08675cc59acc92ba62161b27bc21a98056419
Author:    Darek Slusarczyk <dariusz.slusarczyk@oracle.com>         Thu, 27 Aug 2020 \
                17:29:21 +0200
Parents:   478b595862381d466b75445922919acd60f026a2
Branches:  master

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


Log:
orabug #30134451: mysqlndx replace raw zval with improved zvalue where possible

refactorings in:
- session, statement, sql result iterator
- remove function to_zend_string and all related

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

Changed paths:
  M  mysqlx_session.cc
  M  mysqlx_sql_statement.cc
  M  mysqlx_sql_statement.h
  M  mysqlx_sql_statement_result_iterator.cc
  M  util/string_utils.cc
  M  util/string_utils.h
  M  util/zend_utils.cc
  M  util/zend_utils.h
  M  xmysqlnd/xmysqlnd_session.h
  M  xmysqlnd/xmysqlnd_stmt_execution_state.cc
  M  xmysqlnd/xmysqlnd_stmt_execution_state.h
  M  xmysqlnd/xmysqlnd_wireprotocol.cc


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

diff --git a/mysqlx_session.cc b/mysqlx_session.cc
index 4fe2da51..a7f0f5ec 100644
--- a/mysqlx_session.cc
+++ b/mysqlx_session.cc
@@ -315,33 +315,31 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, getSchema)
 	DBG_VOID_RETURN;
 }
 
-static void
+static util::zvalue
 mysqlx_execute_session_query(XMYSQLND_SESSION  session,
 								  const std::string_view& namespace_,
 								  const util::string_view& query,
 								  const zend_long flags,
-								  zval * const return_value,
-								  const unsigned int argc,
-								  const zval * args)
+								  const util::zvalues& args)
 {
 	DBG_ENTER("mysqlx_execute_session_query");
 	xmysqlnd_stmt* stmt = session->create_statement_object(session);
-	if (stmt) {
-		util::zvalue stmt_obj = create_sql_stmt(stmt, namespace_, query);
-
-		bool found{ false };
-		for (unsigned int i{0}; i < argc; ++i) {
-			if (!mysqlx_sql_statement_bind_one_param(stmt_obj.ptr(), &args[i])) {
-				found = true;
-				break;
-			}
-		}
-		if (!found) {
-			mysqlx_sql_statement_execute(Z_MYSQLX_P(stmt_obj.ptr()), flags, return_value);
+	util::zvalue stmt_obj = create_sql_stmt(stmt, namespace_, query);
+
+	bool found{ false };
+	for (const auto& arg : args) {
+		if (!mysqlx_sql_statement_bind_one_param(stmt_obj.ptr(), arg)) {
+			found = true;
+			break;
 		}
 	}
 
-	DBG_VOID_RETURN;
+	util::zvalue result;
+	if (!found) {
+		result = mysqlx_sql_statement_execute(Z_MYSQLX_P(stmt_obj.ptr()), flags);
+	}
+
+	DBG_RETURN(result);
 }
 
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, sql)
@@ -468,18 +466,21 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, startTransaction)
 
 	util::raw_zval* object_zv{nullptr};
 	constexpr util::string_view query{"START TRANSACTION"};
-	zval* args{nullptr};
-	int argc{0};
 	if (util::get_method_arguments(execute_data, getThis(), "O", &object_zv, \
mysqlx_session_class_entry) == FAILURE)  {
 		DBG_VOID_RETURN;
 	}
 
-	RETVAL_FALSE;
+	RETVAL_NULL();
 
 	auto& data_object{ fetch_session_data(object_zv) };
 	if (data_object.session) {
-		mysqlx_execute_session_query(data_object.session, namespace_sql, query, \
MYSQLX_EXECUTE_FLAG_BUFFERED, return_value, argc, args); \
+		mysqlx_execute_session_query( +			data_object.session,
+			namespace_sql, query,
+			MYSQLX_EXECUTE_FLAG_BUFFERED,
+			util::zvalues()
+			).move_to(return_value);
 	}
 
 	DBG_VOID_RETURN;
@@ -491,18 +492,22 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, commit)
 
 	util::raw_zval* object_zv{nullptr};
 	constexpr util::string_view query{"COMMIT"};
-	zval* args{nullptr};
-	int argc{0};
 	if (util::get_method_arguments(execute_data, getThis(), "O", &object_zv, \
mysqlx_session_class_entry) == FAILURE)  {
 		DBG_VOID_RETURN;
 	}
 
-	RETVAL_FALSE;
+	RETVAL_NULL();
 
 	auto& data_object{ fetch_session_data(object_zv) };
 	if (data_object.session) {
-		mysqlx_execute_session_query(data_object.session, namespace_sql, query, \
MYSQLX_EXECUTE_FLAG_BUFFERED, return_value, argc, args); \
+		mysqlx_execute_session_query( +			data_object.session,
+			namespace_sql,
+			query,
+			MYSQLX_EXECUTE_FLAG_BUFFERED,
+			util::zvalues()
+			).move_to(return_value);
 	}
 
 	DBG_VOID_RETURN;
@@ -514,18 +519,22 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, rollback)
 
 	util::raw_zval* object_zv{nullptr};
 	constexpr util::string_view query{"ROLLBACK"};
-	zval* args{nullptr};
-	int argc{0};
 	if (util::get_method_arguments(execute_data, getThis(), "O", &object_zv, \
mysqlx_session_class_entry) == FAILURE)  {
 		DBG_VOID_RETURN;
 	}
 
-	RETVAL_FALSE;
+	RETVAL_NULL();
 
 	auto& data_object{ fetch_session_data(object_zv) };
 	if (data_object.session) {
-		mysqlx_execute_session_query(data_object.session, namespace_sql, query, \
MYSQLX_EXECUTE_FLAG_BUFFERED, return_value, argc, args); \
+		mysqlx_execute_session_query( +			data_object.session,
+			namespace_sql,
+			query,
+			MYSQLX_EXECUTE_FLAG_BUFFERED,
+			util::zvalues()
+			).move_to(return_value);
 	}
 
 	DBG_VOID_RETURN;
@@ -557,27 +566,25 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, setSavepoint)
 
 	auto& data_object = fetch_session_data(object_zv);
 	util::string query{ "SAVEPOINT " };
-	util::string name;
+	util::zvalue name;
 	if( savepoint_name.empty() ) {
 		//Generate a valid savepoint name
 		name = generate_savepoint_name( data_object.session->data->savepoint_name_seed++ \
);  } else {
-		name = savepoint_name.to_string();
+		name = savepoint_name;
 	}
 
-	query += escape_identifier( name );
+	query += util::escape_identifier( name.to_string_view() );
 
 	if (data_object.session) {
-		zval * args{ nullptr };
-		int argc = 0;
 		mysqlx_execute_session_query(
-					data_object.session,
-					namespace_sql,
-					{query.c_str(), query.size()} ,
-					MYSQLX_EXECUTE_FLAG_BUFFERED,
-					return_value, argc, args);
+			data_object.session,
+			namespace_sql,
+			{query.c_str(), query.size()} ,
+			MYSQLX_EXECUTE_FLAG_BUFFERED,
+			util::zvalues());
 	}
-	RETVAL_STRINGL( name.c_str(), name.size() );
+	name.move_to(return_value);
 
 	DBG_VOID_RETURN;
 }
@@ -586,7 +593,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, rollbackTo)
 {
 	DBG_ENTER("mysqlx_session::rollbackTo");
 
-	zval* object_zv{ nullptr };
+	util::raw_zval* object_zv{ nullptr };
 	util::arg_string savepoint_name;
 	if (util::get_method_arguments(
 		execute_data, getThis(), "Os",
@@ -597,19 +604,18 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, rollbackTo)
 
 	RETVAL_FALSE;
 
-	util::string name = escape_identifier( savepoint_name.to_string() );
+	util::string name = util::escape_identifier( savepoint_name.to_view() );
 	auto& data_object{ fetch_session_data( object_zv) };
 	const util::string query{ "ROLLBACK TO " + name };
 
 	if (data_object.session) {
-		zval * args{ nullptr };
-		int argc = 0;
 		mysqlx_execute_session_query(
-					data_object.session,
-					namespace_sql,
-					{query.c_str(), query.size()} ,
-					MYSQLX_EXECUTE_FLAG_BUFFERED,
-					return_value, argc, args);
+			data_object.session,
+			namespace_sql,
+			{query.c_str(), query.size()} ,
+			MYSQLX_EXECUTE_FLAG_BUFFERED,
+			util::zvalues()
+			).move_to(return_value);
 	}
 
 	DBG_VOID_RETURN;
@@ -619,7 +625,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, releaseSavepoint)
 {
 	DBG_ENTER("mysqlx_session::releaseSavepoint");
 
-	zval* object_zv{ nullptr };
+	util::raw_zval* object_zv{ nullptr };
 	util::arg_string savepoint_name;
 	if (util::get_method_arguments(
 		execute_data, getThis(), "Os",
@@ -630,19 +636,18 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, releaseSavepoint)
 
 	RETVAL_FALSE;
 
-	util::string name = escape_identifier( savepoint_name.to_string() );
+	util::string name = util::escape_identifier( savepoint_name.to_view() );
 	auto& data_object{ fetch_session_data( object_zv) };
 	const util::string query{ "RELEASE SAVEPOINT " + name };
 
 	if (data_object.session) {
-		zval * args{ nullptr };
-		int argc = 0;
 		mysqlx_execute_session_query(
-					data_object.session,
-					namespace_sql,
-					{query.c_str(), query.size()} ,
-					MYSQLX_EXECUTE_FLAG_BUFFERED,
-					return_value, argc, args);
+			data_object.session,
+			namespace_sql,
+			{query.c_str(), query.size()} ,
+			MYSQLX_EXECUTE_FLAG_BUFFERED,
+			util::zvalues()
+			).move_to(return_value);
 	}
 
 	DBG_VOID_RETURN;
diff --git a/mysqlx_sql_statement.cc b/mysqlx_sql_statement.cc
index 97c31b70..46db8640 100644
--- a/mysqlx_sql_statement.cc
+++ b/mysqlx_sql_statement.cc
@@ -396,7 +396,7 @@ mysqlx_fetch_data_with_callback(st_mysqlx_statement* object, \
st_xmysqlnd_exec_wi  }
 
 bool
-mysqlx_sql_statement_bind_one_param(zval* object_zv, const util::zvalue& param)
+mysqlx_sql_statement_bind_one_param(util::raw_zval* object_zv, const util::zvalue& \
param)  {
 	DBG_ENTER("mysqlx_sql_statement_bind_one_param");
 
@@ -457,34 +457,32 @@ mysqlx_sql_stmt_on_error(
 	DBG_RETURN(HND_PASS_RETURN_FAIL);
 }
 
-void
-mysqlx_sql_statement_get_results(
-		st_mysqlx_statement* object,
-		zval* return_value
-)
+util::zvalue
+mysqlx_sql_statement_get_results(st_mysqlx_statement* object)
 {
 	DBG_ENTER("mysqlx_sql_statement_get_results");
+	util::zvalue result;
 	xmysqlnd_stmt * stmt = object->stmt;
 	if (PASS == object->send_query_status) {
 		if (object->execute_flags & MYSQLX_EXECUTE_FLAG_ASYNC) {
 			DBG_INF("ASYNC");
-			RETVAL_BOOL(PASS == object->send_query_status);
+			result = (PASS == object->send_query_status);
 		} else {
 			const st_xmysqlnd_stmt_on_warning_bind on_warning = { mysqlx_sql_stmt_on_warning, \
nullptr };  const st_xmysqlnd_stmt_on_error_bind on_error = { \
                mysqlx_sql_stmt_on_error, nullptr };
-			XMYSQLND_STMT_RESULT * result;
+			XMYSQLND_STMT_RESULT* stmt_result;
 			if (object->execute_flags & MYSQLX_EXECUTE_FLAG_BUFFERED) {
-				result = stmt->get_buffered_result(stmt, &object->has_more_results, on_warning, \
on_error, nullptr, nullptr); +				stmt_result = stmt->get_buffered_result(stmt, \
&object->has_more_results, on_warning, on_error, nullptr, nullptr);  } else {
-				result = stmt->get_fwd_result(stmt, MYSQLX_EXECUTE_FWD_PREFETCH_COUNT, \
&object->has_more_rows_in_set, &object->has_more_results, on_warning, on_error, \
nullptr, nullptr); +				stmt_result = stmt->get_fwd_result(stmt, \
MYSQLX_EXECUTE_FWD_PREFETCH_COUNT, &object->has_more_rows_in_set, \
&object->has_more_results, on_warning, on_error, nullptr, nullptr);  }
 
 			DBG_INF_FMT("has_more_results=%s   has_more_rows_in_set=%s",
 						object->has_more_results? "TRUE":"FALSE",
 						object->has_more_rows_in_set? "TRUE":"FALSE");
 
-			if (result) {
-				create_sql_stmt_result(result, object).move_to(return_value);
+			if (stmt_result) {
+				result = create_sql_stmt_result(stmt_result, object);
 			} else {
 				RAISE_EXCEPTION_FETCH_FAIL();
 				/* Or we should close the connection, rendering it unusable at this point ?*/
@@ -492,32 +490,30 @@ mysqlx_sql_statement_get_results(
 			}
 		}
 	}
-	DBG_VOID_RETURN;
+	DBG_RETURN(result);
 }
 
-void
+util::zvalue
 mysqlx_sql_statement_execute(
-		const st_mysqlx_object* const mysqlx_object,
-		const zend_long flags,
-		zval* return_value
-)
+	const st_mysqlx_object* const mysqlx_object,
+	const zend_long flags)
 {
 	st_mysqlx_statement* object = (st_mysqlx_statement*) mysqlx_object->ptr;
 	DBG_ENTER("mysqlx_sql_statement_execute");
 
+	util::zvalue result;
+
 	if (!object || !object->stmt_execute) {
 		php_error_docref(nullptr, E_WARNING, "invalid object of class %s", \
ZSTR_VAL(mysqlx_object->zo.ce->name));  DBG_ERR_FMT("invalid object of class %s on \
                %s::%d", ZSTR_VAL(mysqlx_object->zo.ce->name), __FILE__, __LINE__);
-		DBG_VOID_RETURN;
+		DBG_RETURN(result);
 	}
 
-	RETVAL_FALSE;
-
 	if ((flags | MYSQLX_EXECUTE_ALL_FLAGS) != MYSQLX_EXECUTE_ALL_FLAGS) {
 		util::ostringstream os;
 		os << "Invalid flags. Unknown " << (flags - (flags | MYSQLX_EXECUTE_ALL_FLAGS));
 		php_error_docref(nullptr, E_WARNING, "%s", os.str().c_str());
-		DBG_VOID_RETURN;
+		DBG_RETURN(result);
 	}
 	DBG_INF_FMT("flags=%lu", flags);
 	DBG_INF_FMT("%sSYNC", (flags & MYSQLX_EXECUTE_FLAG_ASYNC)? "A":"");
@@ -533,10 +529,10 @@ mysqlx_sql_statement_execute(
 			object->has_more_results = FALSE;
 			object->send_query_status = stmt->send_raw_message(stmt, \
xmysqlnd_stmt_execute__get_protobuf_message(object->stmt_execute), nullptr, nullptr); \
                
-			mysqlx_sql_statement_get_results(object, return_value);
+			result = mysqlx_sql_statement_get_results(object);
         }
 	}
-	DBG_VOID_RETURN;
+	DBG_RETURN(result);
 }
 
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_sql_statement, execute)
@@ -552,7 +548,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_sql_statement, execute)
 		DBG_VOID_RETURN;
 	}
 
-	mysqlx_sql_statement_execute(Z_MYSQLX_P(object_zv), flags, return_value);
+	mysqlx_sql_statement_execute(Z_MYSQLX_P(object_zv), flags).move_to(return_value);
 
 	DBG_VOID_RETURN;
 }
diff --git a/mysqlx_sql_statement.h b/mysqlx_sql_statement.h
index 8a775991..7c059428 100644
--- a/mysqlx_sql_statement.h
+++ b/mysqlx_sql_statement.h
@@ -76,8 +76,8 @@ void mysqlx_register_sql_statement_class(INIT_FUNC_ARGS, \
zend_object_handlers* m  void \
mysqlx_unregister_sql_statement_class(SHUTDOWN_FUNC_ARGS);  
 util::zvalue create_sql_stmt(drv::xmysqlnd_stmt* stmt, const std::string_view& \
                namespace_, const util::string_view& query);
-bool mysqlx_sql_statement_bind_one_param(zval * object_zv, const util::zvalue& \
                param);
-void mysqlx_sql_statement_execute(const st_mysqlx_object* const mysqlx_object, const \
zend_long flags, zval* return_value); +bool \
mysqlx_sql_statement_bind_one_param(util::raw_zval* object_zv, const util::zvalue& \
param); +util::zvalue mysqlx_sql_statement_execute(const st_mysqlx_object* const \
mysqlx_object, const zend_long flags);  
 } // namespace devapi
 
diff --git a/mysqlx_sql_statement_result_iterator.cc \
b/mysqlx_sql_statement_result_iterator.cc index 0b5bf09c..5cd36b2d 100644
--- a/mysqlx_sql_statement_result_iterator.cc
+++ b/mysqlx_sql_statement_result_iterator.cc
@@ -35,18 +35,18 @@ using namespace drv;
 
 struct st_mysqlx_sql_result_iterator : util::custom_allocable
 {
-	zend_object_iterator  intern;
-	XMYSQLND_STMT_RESULT * result;
-	zval current_row;
+	zend_object_iterator intern;
+	XMYSQLND_STMT_RESULT* result;
+	util::zvalue current_row;
 	size_t row_num;
-	zend_bool started;
-	zend_bool usable;
+	bool started;
+	bool usable;
 };
 
 static void
 XMYSQLND_METHOD(mysqlx_sql_result_iterator, dtor)(zend_object_iterator * iter)
 {
-	st_mysqlx_sql_result_iterator* iterator = (st_mysqlx_sql_result_iterator*) iter;
+	st_mysqlx_sql_result_iterator* iterator = \
reinterpret_cast<st_mysqlx_sql_result_iterator*>(iter);  \
DBG_ENTER("mysqlx_sql_result_iterator::dtor");  if (iterator->result) {
 		iterator->result->m.free_reference(iterator->result, nullptr, nullptr);
@@ -54,7 +54,6 @@ XMYSQLND_METHOD(mysqlx_sql_result_iterator, \
dtor)(zend_object_iterator * iter)  
 	/* cleanup handled in sxe_object_dtor as we dont always have an iterator wrapper */
 	zval_ptr_dtor(&iterator->intern.data);
-	zval_ptr_dtor(&iterator->current_row);
 	DBG_VOID_RETURN;
 }
 
@@ -75,7 +74,7 @@ XMYSQLND_METHOD(mysqlx_sql_result_iterator, \
current_data)(zend_object_iterator *  st_mysqlx_sql_result_iterator* iterator = \
(st_mysqlx_sql_result_iterator*) iter;  \
DBG_ENTER("mysqlx_sql_result_iterator::current_data");  DBG_INF_FMT("usable=%s  \
started=%s  row_num=%u", iterator->usable? "TRUE":"FALSE", iterator->started? \
                "TRUE":"FALSE", iterator->row_num);
-	DBG_RETURN((iterator->result && iterator->usable)? &iterator->current_row : \
nullptr); +	DBG_RETURN((iterator->result && iterator->usable)? \
iterator->current_row.ptr() : nullptr);  }
 
 static enum_func_status
@@ -85,11 +84,10 @@ XMYSQLND_METHOD(mysqlx_sql_result_iterator, \
fetch_current_data)(zend_object_iter  \
DBG_ENTER("mysqlx_sql_result_iterator::fetch_current_data");  DBG_INF_FMT("usable=%s  \
started=%s  row_num=%u", iterator->usable? "TRUE":"FALSE", iterator->started? \
"TRUE":"FALSE", iterator->row_num);  if (iterator->result && iterator->usable) {
-		zval_ptr_dtor(&iterator->current_row);
-		ZVAL_UNDEF(&iterator->current_row);
+		iterator->current_row.reset();
 
-		if (PASS == iterator->result->m.fetch_current(iterator->result, \
                &iterator->current_row, nullptr, nullptr) &&
-			IS_ARRAY == Z_TYPE(iterator->current_row))
+		if (PASS == iterator->result->m.fetch_current(iterator->result, \
iterator->current_row.ptr(), nullptr, nullptr) && \
+			iterator->current_row.is_array())  {
 			DBG_RETURN(PASS);
 		} else {
@@ -111,7 +109,7 @@ XMYSQLND_METHOD(mysqlx_sql_result_iterator, \
next)(zend_object_iterator * iter)  {
 			iterator->row_num++;
 		} else {
-			iterator->usable = FALSE;
+			iterator->usable = false;
 		}
 	}
 	DBG_VOID_RETURN;
@@ -123,15 +121,15 @@ XMYSQLND_METHOD(mysqlx_sql_result_iterator, \
rewind)(zend_object_iterator * iter)  st_mysqlx_sql_result_iterator* iterator = \
(st_mysqlx_sql_result_iterator*) iter;  \
DBG_ENTER("mysqlx_sql_result_iterator::rewind");  if (iterator->result && \
                iterator->usable) {
-		iterator->started = FALSE;
+		iterator->started = false;
 		iterator->row_num = 0;
 		if (PASS == iterator->result->m.rewind(iterator->result) &&
 			PASS == XMYSQLND_METHOD(mysqlx_sql_result_iterator, fetch_current_data)(iter))
 		{
-			iterator->usable = TRUE;
-			iterator->started = TRUE;
+			iterator->usable = true;
+			iterator->started = true;
 		} else {
-			iterator->usable = FALSE;
+			iterator->usable = false;
 		}
 //			XMYSQLND_METHOD(mysqlx_sql_result_iterator, next)(iter);
 		DBG_INF_FMT("usable=%s  started=%s  row_num=%u", iterator->usable? "TRUE":"FALSE", \
                iterator->started? "TRUE":"FALSE", iterator->row_num);
diff --git a/util/string_utils.cc b/util/string_utils.cc
index 7f2e2c81..d6e8cc3a 100644
--- a/util/string_utils.cc
+++ b/util/string_utils.cc
@@ -58,24 +58,8 @@ strings to_strings(zval* zvals, int count)
 	return strings;
 }
 
-zend_string* to_zend_string(const char* str)
-{
-	return zend_string_init(str, strlen(str), 0);
-}
-
-zend_string* to_zend_string(const string& str)
-{
-	return zend_string_init(str.c_str(), str.length(), 0);
-}
-
-zend_string* to_zend_string(formatter& fmt)
-{
-	const string& str{ fmt.str() };
-	return to_zend_string(str);
-}
-
 string
-escape_identifier( const string& identifier ) {
+escape_identifier( const string_view& identifier ) {
 	util::stringstream result;
 	result << '`';
 	for( const auto& ch : identifier ) {
diff --git a/util/string_utils.h b/util/string_utils.h
index 14e355b5..94c98f3a 100644
--- a/util/string_utils.h
+++ b/util/string_utils.h
@@ -125,16 +125,12 @@ strings to_strings(zval* zvals, int count, Pred pred)
 	return strings;
 }
 
-zend_string* to_zend_string(const char* str);
-zend_string* to_zend_string(const string& str);
-zend_string* to_zend_string(formatter& fmt);
-
 //------------------------------------------------------------------------------
 
 /*
  * Escape an identifier name adding '`' everywhere needed
  */
-string escape_identifier( const string& identifier );
+string escape_identifier( const string_view& identifier );
 
 template<size_t Length>
 st_mysqlnd_string literal_to_mysqlnd_str(const char (&literal)[Length])
diff --git a/util/zend_utils.cc b/util/zend_utils.cc
index e7e671fd..9aaf4626 100644
--- a/util/zend_utils.cc
+++ b/util/zend_utils.cc
@@ -19,6 +19,7 @@
 #include "mysqlnd_api.h"
 #include "zend_utils.h"
 #include "string_utils.h"
+#include "value.h"
 
 namespace mysqlx {
 
@@ -64,17 +65,15 @@ void free_error_info_list(
 
 // -----------------------------------------------------------------
 
-bool is_module_loaded(const char* module_name)
+bool is_module_loaded(const string_view& module_name)
 {
-	zend_string* module_zname{ to_zend_string(module_name) };
-	const bool is_loaded{ zend_hash_exists(&module_registry, module_zname) ? true : \
                false };
-	zend_string_release(module_zname);
-	return is_loaded;
+	zvalue modules(&module_registry);
+	return modules.contains(module_name);
 }
 
 bool is_openssl_loaded()
 {
-	const char* Openssl_module_name{ "openssl" };
+	constexpr string_view Openssl_module_name{ "openssl" };
 	return is_module_loaded(Openssl_module_name);
 }
 
diff --git a/util/zend_utils.h b/util/zend_utils.h
index dd767e1d..5994f952 100644
--- a/util/zend_utils.h
+++ b/util/zend_utils.h
@@ -19,6 +19,7 @@
 #define MYSQL_XDEVAPI_UTIL_ZEND_UTILS_H
 
 #include <utility>
+#include "strings.h"
 
 namespace mysqlx::util::zend {
 
@@ -30,7 +31,7 @@ void free_error_info_list(
 
 // ----------------
 
-bool is_module_loaded(const char* module_name);
+bool is_module_loaded(const string_view& module_name);
 bool is_openssl_loaded();
 
 } // namespace mysqlx::util::zend
diff --git a/xmysqlnd/xmysqlnd_session.h b/xmysqlnd/xmysqlnd_session.h
index ddbfcbb6..745bf47d 100644
--- a/xmysqlnd/xmysqlnd_session.h
+++ b/xmysqlnd/xmysqlnd_session.h
@@ -481,7 +481,7 @@ public:
 	/* Used only in case of non network transports */
 	std::string                        socket_path;
 	std::string                        server_host_info;
-	size_t			                   client_id;
+	uint64_t		                   client_id;
 	const MYSQLND_CHARSET*             charset;
 	/* If error packet, we use these */
 	MYSQLND_ERROR_INFO*                error_info{nullptr};
diff --git a/xmysqlnd/xmysqlnd_stmt_execution_state.cc \
b/xmysqlnd/xmysqlnd_stmt_execution_state.cc index 73b85e91..050ba962 100644
--- a/xmysqlnd/xmysqlnd_stmt_execution_state.cc
+++ b/xmysqlnd/xmysqlnd_stmt_execution_state.cc
@@ -74,7 +74,7 @@ XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
get_generated_ids)(const XMYSQLND  }
 
 static void
-XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_affected_items_count)(XMYSQLND_STMT_EXECUTION_STATE * const state, const size_t \
value) +XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_affected_items_count)(XMYSQLND_STMT_EXECUTION_STATE * const state, const uint64_t \
value)  {
 	DBG_ENTER("xmysqlnd_stmt_execution_state::set_affected_items_count");
 	DBG_INF_FMT("value=" MYSQLX_LLU_SPEC, value);
@@ -83,7 +83,7 @@ XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_affected_items_count)(XMYSQLN  }
 
 static void
-XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_matched_items_count)(XMYSQLND_STMT_EXECUTION_STATE * const state, const size_t \
value) +XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_matched_items_count)(XMYSQLND_STMT_EXECUTION_STATE * const state, const uint64_t \
value)  {
 	DBG_ENTER("xmysqlnd_stmt_execution_state::set_matched_items_count");
 	DBG_INF_FMT("value=" MYSQLX_LLU_SPEC, value);
@@ -92,7 +92,7 @@ XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_matched_items_count)(XMYSQLND  }
 
 static void
-XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_found_items_count)(XMYSQLND_STMT_EXECUTION_STATE * const state, const size_t \
value) +XMYSQLND_METHOD(xmysqlnd_stmt_execution_state, \
set_found_items_count)(XMYSQLND_STMT_EXECUTION_STATE * const state, const uint64_t \
value)  {
 	DBG_ENTER("xmysqlnd_stmt_execution_state::set_found_items_count");
 	DBG_INF_FMT("value=" MYSQLX_LLU_SPEC, value);
diff --git a/xmysqlnd/xmysqlnd_stmt_execution_state.h \
b/xmysqlnd/xmysqlnd_stmt_execution_state.h index cc2f3f61..b5b12e3e 100644
--- a/xmysqlnd/xmysqlnd_stmt_execution_state.h
+++ b/xmysqlnd/xmysqlnd_stmt_execution_state.h
@@ -36,9 +36,9 @@ typedef \
size_t		(*func_xmysqlnd_stmt_execution_state__get_found_items_count)(con  typedef \
uint64_t	(*func_xmysqlnd_stmt_execution_state__get_last_insert_id)(const \
XMYSQLND_STMT_EXECUTION_STATE * const state);  typedef const util::vector< \
util::string>* (*func_xmysqlnd_stmt_execution_state__get_generated_ids)(const \
XMYSQLND_STMT_EXECUTION_STATE * const state);  
-typedef void		(*func_xmysqlnd_stmt_execution_state__set_affected_items_count)(XMYSQLND_STMT_EXECUTION_STATE \
                * const state, const size_t value);
-typedef void		(*func_xmysqlnd_stmt_execution_state__set_matched_items_count)(XMYSQLND_STMT_EXECUTION_STATE \
                * const state, const size_t value);
-typedef void		(*func_xmysqlnd_stmt_execution_state__set_found_items_count)(XMYSQLND_STMT_EXECUTION_STATE \
* const state, const size_t value); +typedef \
void		(*func_xmysqlnd_stmt_execution_state__set_affected_items_count)(XMYSQLND_STMT_EXECUTION_STATE \
* const state, const uint64_t value); +typedef \
void		(*func_xmysqlnd_stmt_execution_state__set_matched_items_count)(XMYSQLND_STMT_EXECUTION_STATE \
* const state, const uint64_t value); +typedef \
void		(*func_xmysqlnd_stmt_execution_state__set_found_items_count)(XMYSQLND_STMT_EXECUTION_STATE \
* const state, const uint64_t value);  typedef \
void		(*func_xmysqlnd_stmt_execution_state__set_last_insert_id)(XMYSQLND_STMT_EXECUTION_STATE \
* const state, const uint64_t value);  typedef \
void		(*func_xmysqlnd_stmt_execution_state__set_add_generated_doc_id)(XMYSQLND_STMT_EXECUTION_STATE \
* const state, const util::string& id);  
diff --git a/xmysqlnd/xmysqlnd_wireprotocol.cc b/xmysqlnd/xmysqlnd_wireprotocol.cc
index 6eeeab2c..5c4590a5 100644
--- a/xmysqlnd/xmysqlnd_wireprotocol.cc
+++ b/xmysqlnd/xmysqlnd_wireprotocol.cc
@@ -1270,13 +1270,14 @@ enum_func_status xmysqlnd_row_time_field_to_zval( zval* zv,
 				DBG_INF_FMT("usecs   =" MYSQLX_LLU_SPEC, useconds);
 			} while (0);
 
-			auto str = util::formatter("%s%02u:%02u:%02u.%08u")
+			auto time_formatter = util::formatter("%s%02u:%02u:%02u.%08u")
 				% (neg ? "-" : "")
 				% hours
 				% minutes
 				% seconds
 				% useconds;
-			ZVAL_NEW_STR(zv, util::to_zend_string(str));
+			util::zvalue formatted_time = time_formatter.str();
+			formatted_time.move_to(zv);
 		}
 	}
 	DBG_RETURN( ret );
@@ -1319,14 +1320,15 @@ enum_func_status xmysqlnd_row_datetime_field_to_zval( zval* \
zv,  DBG_INF_FMT("usecs   =" MYSQLX_LLU_SPEC, useconds);
 			} while (0);
 
-			auto str = util::formatter("%04u-%02u-%02u %02u:%02u:%02u")
+			auto datetime_formatter = util::formatter("%04u-%02u-%02u %02u:%02u:%02u")
 				% year
 				% month
 				% day
 				% hours
 				% minutes
 				% seconds;
-			ZVAL_NEW_STR(zv, util::to_zend_string(str));
+			util::zvalue formatted_datetime = datetime_formatter.str();
+			formatted_datetime.move_to(zv);
 		}
 	}
 	DBG_RETURN( ret );
@@ -1363,11 +1365,12 @@ enum_func_status xmysqlnd_row_date_field_to_zval(
 				DBG_INF_FMT("day   =" MYSQLX_LLU_SPEC, day);
 			} while (0);
 
-			auto str = util::formatter("%04u-%02u-%02u")
+			auto date_formatter = util::formatter("%04u-%02u-%02u")
 				% year
 				% month
 				% day;
-			ZVAL_NEW_STR(zv, util::to_zend_string(str));
+			util::zvalue formatted_date = date_formatter.str();
+			formatted_date.move_to(zv);
 			ret = PASS;
 		}
 	}



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