[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-24 18:27:08
Message-ID: php-mail-95e104c5194b8985e089787deeeeda771014121852 () git ! php ! net
[Download RAW message or body]

Commit:    134a8f816d6b862cb05f0cb0bd6f8ee58ca671dd
Author:    Darek Slusarczyk <dariusz.slusarczyk@oracle.com>         Mon, 24 Aug 2020 \
                18:25:03 +0200
Parents:   ba95641ed9ce0afeb6979736cea09487839fdcfa
Branches:  release/8.0.23

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


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

rename util::param_string => util::arg_string

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

Changed paths:
  M  mysqlx_client.cc
  M  mysqlx_collection.cc
  M  mysqlx_collection__find.cc
  M  mysqlx_collection__modify.cc
  M  mysqlx_expression.cc
  M  mysqlx_schema.cc
  M  mysqlx_session.cc
  M  mysqlx_table__select.cc
  M  mysqlx_table__update.cc
  M  util/arguments.h
  M  util/arguments.inl
  M  util/value.cc
  M  util/value.h


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

diff --git a/mysqlx_client.cc b/mysqlx_client.cc
index f215ad9e..d7f1d63d 100644
--- a/mysqlx_client.cc
+++ b/mysqlx_client.cc
@@ -664,8 +664,8 @@ mysqlx_unregister_client_class(UNUSED_SHUTDOWN_FUNC_ARGS)
 
 MYSQL_XDEVAPI_PHP_FUNCTION(mysql_xdevapi_getClient)
 {
-	util::param_string connection_uri;
-	util::param_string client_options_desc;
+	util::arg_string connection_uri;
+	util::arg_string client_options_desc;
 
 	RETVAL_NULL();
 
diff --git a/mysqlx_collection.cc b/mysqlx_collection.cc
index 0dfc412e..19eb0dc4 100644
--- a/mysqlx_collection.cc
+++ b/mysqlx_collection.cc
@@ -306,7 +306,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, find)
 {
 	DBG_ENTER("mysqlx_collection::find");
 	util::raw_zval* object_zv{nullptr};
-	util::param_string search_expr;
+	util::arg_string search_expr;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "O|s",
 												&object_zv, mysqlx_collection_class_entry,
 												&(search_expr.str), &(search_expr.len)))
@@ -326,7 +326,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, modify)
 {
 	DBG_ENTER("mysqlx_collection::modify");
 	util::raw_zval* object_zv{nullptr};
-	util::param_string search_expr;
+	util::arg_string search_expr;
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Os",
 		&object_zv, mysqlx_collection_class_entry,
@@ -347,7 +347,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, remove)
 {
 	DBG_ENTER("mysqlx_collection::remove");
 	util::raw_zval* object_zv{nullptr};
-	util::param_string search_expr;
+	util::arg_string search_expr;
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Os",
 		&object_zv, mysqlx_collection_class_entry,
@@ -369,7 +369,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, getOne)
 	DBG_ENTER("mysqlx_collection::getOne");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string id;
+	util::arg_string id;
 
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Os",
@@ -401,7 +401,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, replaceOne)
 	DBG_ENTER("mysqlx_collection::replaceOne");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string id;
+	util::arg_string id;
 	util::raw_zval* doc{nullptr};
 
 	if (FAILURE == util::get_method_arguments(
@@ -438,7 +438,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, replaceOne)
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, addOrReplaceOne)
 {
 	util::raw_zval* object_zv{nullptr};
-	util::param_string id;
+	util::arg_string id;
 	util::raw_zval* doc{nullptr};
 
 	DBG_ENTER("mysqlx_collection::addOrReplaceOne");
@@ -466,7 +466,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, addOrReplaceOne)
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, removeOne)
 {
 	util::raw_zval* object_zv{nullptr};
-	util::param_string id;
+	util::arg_string id;
 
 	DBG_ENTER("mysqlx_collection::removeOne");
 
@@ -496,8 +496,8 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, removeOne)
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, createIndex)
 {
 	util::raw_zval* object_zv{nullptr};
-	util::param_string index_name;
-	util::param_string index_desc_json;
+	util::arg_string index_name;
+	util::arg_string index_desc_json;
 
 	DBG_ENTER("mysqlx_collection::createIndex");
 
@@ -521,7 +521,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, createIndex)
 MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection, dropIndex)
 {
 	util::raw_zval* object_zv{nullptr};
-	util::param_string index_name;
+	util::arg_string index_name;
 
 	DBG_ENTER("mysqlx_collection::dropIndex");
 
diff --git a/mysqlx_collection__find.cc b/mysqlx_collection__find.cc
index 44f66b0a..c778a626 100644
--- a/mysqlx_collection__find.cc
+++ b/mysqlx_collection__find.cc
@@ -444,7 +444,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__find, having)
 	DBG_ENTER("mysqlx_collection__find::having");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string search_condition;
+	util::arg_string search_condition;
 
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Os",
 												&object_zv, collection_find_class_entry,
diff --git a/mysqlx_collection__modify.cc b/mysqlx_collection__modify.cc
index 77299e1a..06d471a8 100644
--- a/mysqlx_collection__modify.cc
+++ b/mysqlx_collection__modify.cc
@@ -493,7 +493,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__modify, set)
 	DBG_ENTER("mysqlx_collection__modify::set");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string path;
+	util::arg_string path;
 	util::raw_zval* value{nullptr};
 
 	if (FAILURE == util::get_method_arguments(
@@ -518,7 +518,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__modify, replace)
 	DBG_ENTER("mysqlx_collection__modify::replace");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string path;
+	util::arg_string path;
 	util::raw_zval* value{nullptr};
 
 	if (FAILURE == util::get_method_arguments(
@@ -543,7 +543,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__modify, patch)
 	DBG_ENTER("mysqlx_collection__modify::patch");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string document_contents;
+	util::arg_string document_contents;
 
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Os",
@@ -566,7 +566,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__modify, arrayInsert)
 	DBG_ENTER("mysqlx_collection__modify::arrayInsert");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string path;
+	util::arg_string path;
 	util::raw_zval* value{nullptr};
 
 	if (FAILURE == util::get_method_arguments(
@@ -591,7 +591,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_collection__modify, arrayAppend)
 	DBG_ENTER("mysqlx_collection__modify::arrayAppend");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string path;
+	util::arg_string path;
 	util::raw_zval* value{nullptr};
 
 	if (FAILURE == util::get_method_arguments(
diff --git a/mysqlx_expression.cc b/mysqlx_expression.cc
index 04203c92..b440b45c 100644
--- a/mysqlx_expression.cc
+++ b/mysqlx_expression.cc
@@ -49,7 +49,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_expression, __construct)
 {
 	UNUSED(return_value);
 	util::raw_zval* object_zv{nullptr};
-	util::param_string expression;
+	util::arg_string expression;
 
 	DBG_ENTER("mysqlx_expression::__construct");
 
@@ -75,7 +75,7 @@ static const zend_function_entry mysqlx_expression_methods[] = {
 
 MYSQL_XDEVAPI_PHP_FUNCTION(mysql_xdevapi__expression)
 {
-	util::param_string expression;
+	util::arg_string expression;
 
 	DBG_ENTER("mysql_xdevapi__Expression");
 	if (FAILURE == util::get_function_arguments(execute_data, "s",
diff --git a/mysqlx_schema.cc b/mysqlx_schema.cc
index 81e23ea1..5f6a659f 100644
--- a/mysqlx_schema.cc
+++ b/mysqlx_schema.cc
@@ -226,9 +226,9 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, createCollection)
 	DBG_ENTER("mysqlx_schema::createCollection");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string collection_name;
-	const util::param_string Empty_collection_options = "{}";
-	util::param_string collection_options(Empty_collection_options);
+	util::arg_string collection_name;
+	const util::arg_string Empty_collection_options = "{}";
+	util::arg_string collection_options(Empty_collection_options);
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Os|s",
 		&object_zv, mysqlx_schema_class_entry,
@@ -261,8 +261,8 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, modifyCollection)
 	DBG_ENTER("mysqlx_schema::modifyCollection");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string collection_name;
-	util::param_string collection_options;
+	util::arg_string collection_name;
+	util::arg_string collection_options;
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Oss",
 		&object_zv, mysqlx_schema_class_entry,
@@ -292,7 +292,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, dropCollection)
 	DBG_ENTER("mysqlx_schema::dropCollection");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string collection_name;
+	util::arg_string collection_name;
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Os",
 		&object_zv, mysqlx_schema_class_entry,
@@ -319,7 +319,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, getCollection)
 	DBG_ENTER("mysqlx_schema::getCollection");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string collection_name;
+	util::arg_string collection_name;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Os",
 												&object_zv, mysqlx_schema_class_entry,
 												&(collection_name.str), &(collection_name.len)))
@@ -343,7 +343,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, getTable)
 	DBG_ENTER("mysqlx_schema::getTable");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string table_name;
+	util::arg_string table_name;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Os",
 												&object_zv, mysqlx_schema_class_entry,
 												&(table_name.str), &(table_name.len)))
@@ -365,7 +365,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_schema, getCollectionAsTable)
 	DBG_ENTER("mysqlx_schema::getCollectionAsTable");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string collection_name;
+	util::arg_string collection_name;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Os",
 												&object_zv, mysqlx_schema_class_entry,
 												&(collection_name.str), &(collection_name.len)))
diff --git a/mysqlx_session.cc b/mysqlx_session.cc
index 81a51367..4fe2da51 100644
--- a/mysqlx_session.cc
+++ b/mysqlx_session.cc
@@ -291,7 +291,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, getSchema)
 	DBG_ENTER("mysqlx_session::getSchema");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string schema_name;
+	util::arg_string schema_name;
 	if (util::get_method_arguments(execute_data,
 									 getThis(),
 									 "Os", &object_zv,
@@ -350,7 +350,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, sql)
 
 	util::raw_zval* object_zv{nullptr};
 	XMYSQLND_SESSION session;
-	util::param_string query;
+	util::arg_string query;
 
 	if (util::get_method_arguments(execute_data, getThis(), "Os", &object_zv, mysqlx_session_class_entry,
 																	   &query.str, &query.len) == FAILURE)
@@ -384,7 +384,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, quoteName)
 	DBG_ENTER("mysqlx_session::quoteName");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string name;
+	util::arg_string name;
 	if (util::get_method_arguments(execute_data, getThis(), "Os", &object_zv, mysqlx_session_class_entry,
 																	   &(name.str), &(name.len)) == FAILURE)
 	{
@@ -408,7 +408,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, createSchema)
 	DBG_ENTER("mysqlx_session::createSchema");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string schema_name;
+	util::arg_string schema_name;
 	if (util::get_method_arguments(execute_data, getThis(), "Os", &object_zv, mysqlx_session_class_entry,
 																	   &schema_name.str, &schema_name.len) == FAILURE) {
 		DBG_VOID_RETURN;
@@ -438,7 +438,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, dropSchema)
 	DBG_ENTER("mysqlx_session::dropSchema");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string schema_name;
+	util::arg_string schema_name;
 	if (util::get_method_arguments(
 		execute_data, getThis(), "Os",
 		&object_zv, mysqlx_session_class_entry,
@@ -545,7 +545,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, setSavepoint)
 	DBG_ENTER("mysqlx_session::setSavepoint");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string savepoint_name;
+	util::arg_string savepoint_name;
 	if (util::get_method_arguments(
 		execute_data, getThis(), "O|s",
 		&object_zv, mysqlx_session_class_entry,
@@ -587,7 +587,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, rollbackTo)
 	DBG_ENTER("mysqlx_session::rollbackTo");
 
 	zval* object_zv{ nullptr };
-	util::param_string savepoint_name;
+	util::arg_string savepoint_name;
 	if (util::get_method_arguments(
 		execute_data, getThis(), "Os",
 		&object_zv, mysqlx_session_class_entry,
@@ -620,7 +620,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_session, releaseSavepoint)
 	DBG_ENTER("mysqlx_session::releaseSavepoint");
 
 	zval* object_zv{ nullptr };
-	util::param_string savepoint_name;
+	util::arg_string savepoint_name;
 	if (util::get_method_arguments(
 		execute_data, getThis(), "Os",
 		&object_zv, mysqlx_session_class_entry,
@@ -763,7 +763,7 @@ create_session(drv::XMYSQLND_SESSION session)
 
 MYSQL_XDEVAPI_PHP_FUNCTION(mysql_xdevapi_getSession)
 {
-	util::param_string uri_string;
+	util::arg_string uri_string;
 
 	RETVAL_NULL();
 
diff --git a/mysqlx_table__select.cc b/mysqlx_table__select.cc
index 97e57b1f..2e9f6307 100644
--- a/mysqlx_table__select.cc
+++ b/mysqlx_table__select.cc
@@ -112,7 +112,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_table__select, where)
 	DBG_ENTER("mysqlx_table__select::where");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string where_expr;
+	util::arg_string where_expr;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Os",
 												&object_zv, mysqlx_table__select_class_entry,
 												&where_expr.str, &where_expr.len))
@@ -243,7 +243,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_table__select, having)
 	DBG_ENTER("mysqlx_table__select::having");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string search_condition;
+	util::arg_string search_condition;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Os",
 												&object_zv, mysqlx_table__select_class_entry,
 												&search_condition.str, &search_condition.len))
diff --git a/mysqlx_table__update.cc b/mysqlx_table__update.cc
index 017a0f8d..1c5840c4 100644
--- a/mysqlx_table__update.cc
+++ b/mysqlx_table__update.cc
@@ -100,7 +100,7 @@ mysqlx_table__update__2_param_op(INTERNAL_FUNCTION_PARAMETERS, const unsigned in
 
 	util::raw_zval* object_zv{nullptr};
 	util::raw_zval* raw_value{nullptr};
-	util::param_string table_field;
+	util::arg_string table_field;
 	zend_bool is_expression{FALSE};
 	const zend_bool is_document = FALSE;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Osz",
@@ -172,7 +172,7 @@ MYSQL_XDEVAPI_PHP_METHOD(mysqlx_table__update, where)
 	DBG_ENTER("mysqlx_table__update::where");
 
 	util::raw_zval* object_zv{nullptr};
-	util::param_string where_expr;
+	util::arg_string where_expr;
 	if (FAILURE == util::get_method_arguments(execute_data, getThis(), "Os",
 												&object_zv, mysqlx_table__update_class_entry,
 												&where_expr.str, &where_expr.len))
diff --git a/util/arguments.h b/util/arguments.h
index 01f258d2..97916fd3 100644
--- a/util/arguments.h
+++ b/util/arguments.h
@@ -32,7 +32,7 @@ namespace mysqlx::util {
 	common scenario:
 
 	0)
-	util::param_string index_name;
+	util::arg_string index_name;
 	[...]
 	if (FAILURE == util::get_method_arguments(
 		execute_data, getThis(), "Os+",
@@ -42,10 +42,10 @@ namespace mysqlx::util {
 	1) then optionally make some checks (whether is empty or make some comparison
 	like == ), or immediately get proper util::string via to_string() member routine
 */
-struct param_string
+struct arg_string
 {
-	param_string() = default;
-	param_string(const char* cstr);
+	arg_string() = default;
+	arg_string(const char* cstr);
 
 	bool empty() const;
 
diff --git a/util/arguments.inl b/util/arguments.inl
index 1962e9c6..fda6084e 100644
--- a/util/arguments.inl
+++ b/util/arguments.inl
@@ -18,53 +18,53 @@
 
 namespace mysqlx::util {
 
-inline param_string::param_string(const char* cstr)
+inline arg_string::arg_string(const char* cstr)
 	: str(cstr)
 	, len(std::strlen(cstr))
 {
 }
 
-inline bool param_string::empty() const
+inline bool arg_string::empty() const
 {
 	return (str == nullptr) || (*str == '\0');
 }
 
-inline string_view param_string::to_view() const
+inline string_view arg_string::to_view() const
 {
 	return string_view(str, len);
 }
 
-inline std::string_view param_string::to_std_view() const
+inline std::string_view arg_string::to_std_view() const
 {
 	return std::string_view(str, len);
 }
 
-inline string param_string::to_string() const
+inline string arg_string::to_string() const
 {
 	return string(str, len);
 }
 
-inline std::string param_string::to_std_string() const
+inline std::string arg_string::to_std_string() const
 {
 	return std::string(str, len);
 }
 
-inline const char* param_string::c_str() const
+inline const char* arg_string::c_str() const
 {
 	return str;
 }
 
-inline const char* param_string::data() const
+inline const char* arg_string::data() const
 {
 	return str;
 }
 
-inline size_t param_string::length() const
+inline size_t arg_string::length() const
 {
 	return len;
 }
 
-inline size_t param_string::size() const
+inline size_t arg_string::size() const
 {
 	return len;
 }
diff --git a/util/value.cc b/util/value.cc
index e4e3d4cf..57175aea 100644
--- a/util/value.cc
+++ b/util/value.cc
@@ -182,7 +182,7 @@ zvalue::zvalue(const char* value)
 {
 }
 
-zvalue::zvalue(const param_string& value)
+zvalue::zvalue(const arg_string& value)
 	: zvalue(value.c_str(), value.length())
 {
 }
@@ -349,7 +349,7 @@ zvalue& zvalue::operator=(const char* value)
 }
 
 
-zvalue& zvalue::operator=(const param_string& value)
+zvalue& zvalue::operator=(const arg_string& value)
 {
 	assign(value.c_str(), value.length());
 	return *this;
diff --git a/util/value.h b/util/value.h
index e544b272..34cde5f9 100644
--- a/util/value.h
+++ b/util/value.h
@@ -24,7 +24,7 @@
 
 namespace mysqlx::util {
 
-class param_string;
+struct arg_string;
 
 class zvalue
 {
@@ -69,7 +69,7 @@ class zvalue
 		zvalue(const string_view& value);
 		zvalue(const std::string& value);
 		zvalue(const char* value);
-		zvalue(const param_string& value);
+		zvalue(const arg_string& value);
 		zvalue(const char* value, std::size_t length);
 
 		zvalue(std::initializer_list<std::pair<const char*, zvalue>> values);
@@ -115,7 +115,7 @@ class zvalue
 		zvalue& operator=(const string_view& value);
 		zvalue& operator=(const std::string& value);
 		zvalue& operator=(const char* value);
-		zvalue& operator=(const param_string& value);
+		zvalue& operator=(const arg_string& value);
 
 		void assign(const char* value, std::size_t length);
 
@@ -465,6 +465,8 @@ class zvalue
 		zval zv;
 };
 
+using zvalues = vector<zvalue>;
+
 } // namespace mysqlx::util
 
 #include "value.inl"

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