com php-src: Imprement FR #25854 Return value for pg_insert should be resource instead of bool: ext/pgsql/pgsql.c ext/pgsql/php_pgsql.h ext
/pgsql/tests/12pg_insert_9.phpt ext/pgsql/tests/ 13pg_select_9.phpt
| From: | Yasuo Ohgaki | Date: | Sun, 16 Feb 2014 21:36:54 +0000 |
| Subject: | com php-src: Imprement FR #25854 Return value for pg_insert should be resource instead of bool: ext/pgsql/pgsql.c ext/pgsql/php_pgsql.h ext /pgsql/tests/12pg_insert_9.phpt ext/pgsql/tests/ 13pg_select_9.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-76029@lists.php.net to get a copy of this message | ||
Commit: d8aa13029675c6651243f144c328411c9f9c38d5
Author: Yasuo Ohgaki <yohgaki@php.net> Mon, 17 Feb 2014 06:36:54 +0900
Parents: 5fd6365c7751dc3dcc37765bf39c559ae8454ca9
Branches: PHP-5.6 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=d8aa13029675c6651243f144c328411c9f9c38d5
Log:
Imprement FR #25854 Return value for pg_insert should be resource instead of bool
Bugs:
https://bugs.php.net/25854
Changed paths:
M ext/pgsql/pgsql.c
M ext/pgsql/php_pgsql.h
M ext/pgsql/tests/12pg_insert_9.phpt
M ext/pgsql/tests/13pg_select_9.phpt
Diff:
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index f8e15a3..822dae8 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -6382,8 +6382,11 @@ PHP_FUNCTION(pg_insert)
zval *pgsql_link, *values;
char *table, *sql = NULL;
int table_len;
- ulong option = PGSQL_DML_EXEC;
+ ulong option = PGSQL_DML_EXEC, return_sql;
PGconn *pg_link;
+ PGresult *pg_result;
+ ExecStatusType status;
+ pgsql_result_handle *pgsql_handle;
int id = -1, argc = ZEND_NUM_ARGS();
if (zend_parse_parameters(argc TSRMLS_CC, "rsa|l",
@@ -6400,10 +6403,55 @@ PHP_FUNCTION(pg_insert)
if (php_pgsql_flush_query(pg_link TSRMLS_CC)) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Detected unhandled result(s) in
connection");
}
- if (php_pgsql_insert(pg_link, table, values, option, &sql TSRMLS_CC) == FAILURE) {
+ return_sql = option & PGSQL_DML_STRING;
+ if (option & PGSQL_DML_EXEC) {
+ /* return resource when executed */
+ option = option & ~PGSQL_DML_EXEC;
+ if (php_pgsql_insert(pg_link, table, values, option|PGSQL_DML_STRING, &sql TSRMLS_CC) ==
FAILURE) {
+ RETURN_FALSE;
+ }
+ pg_result = PQexec(pg_link, sql);
+ if ((PGG(auto_reset_persistent) & 2) && PQstatus(pg_link) != CONNECTION_OK) {
+ PQclear(pg_result);
+ PQreset(pg_link);
+ pg_result = PQexec(pg_link, sql);
+ }
+ efree(sql);
+
+ if (pg_result) {
+ status = PQresultStatus(pg_result);
+ } else {
+ status = (ExecStatusType) PQstatus(pg_link);
+ }
+
+ switch (status) {
+ case PGRES_EMPTY_QUERY:
+ case PGRES_BAD_RESPONSE:
+ case PGRES_NONFATAL_ERROR:
+ case PGRES_FATAL_ERROR:
+ PHP_PQ_ERROR("Query failed: %s", pg_link);
+ PQclear(pg_result);
+ RETURN_FALSE;
+ break;
+ case PGRES_COMMAND_OK: /* successful command that did not return rows */
+ default:
+ if (pg_result) {
+ pgsql_handle = (pgsql_result_handle *) emalloc(sizeof(pgsql_result_handle));
+ pgsql_handle->conn = pg_link;
+ pgsql_handle->result = pg_result;
+ pgsql_handle->row = 0;
+ ZEND_REGISTER_RESOURCE(return_value, pgsql_handle, le_result);
+ return;
+ } else {
+ PQclear(pg_result);
+ RETURN_FALSE;
+ }
+ break;
+ }
+ } else if (php_pgsql_insert(pg_link, table, values, option, &sql TSRMLS_CC) == FAILURE) {
RETURN_FALSE;
}
- if (option & PGSQL_DML_STRING) {
+ if (return_sql) {
RETURN_STRING(sql, 0);
}
RETURN_TRUE;
diff --git a/ext/pgsql/php_pgsql.h b/ext/pgsql/php_pgsql.h
index 9aa3883..b6caf9d 100644
--- a/ext/pgsql/php_pgsql.h
+++ b/ext/pgsql/php_pgsql.h
@@ -24,6 +24,8 @@
#if HAVE_PGSQL
+#define PHP_PGSQL_API_VERSION 20140217
+
extern zend_module_entry pgsql_module_entry;
#define pgsql_module_ptr &pgsql_module_entry
@@ -201,6 +203,7 @@ PHP_FUNCTION(pg_select);
#define PGSQL_DML_STRING (1<<11) /* Return query string */
#define PGSQL_DML_ESCAPE (1<<12) /* No convert, but escape only */
+
/* exported functions */
PHP_PGSQL_API int php_pgsql_meta_data(PGconn *pg_link, const char *table_name, zval *meta,
zend_bool extended TSRMLS_DC);
PHP_PGSQL_API int php_pgsql_convert(PGconn *pg_link, const char *table_name, const zval *values,
zval *result, ulong opt TSRMLS_DC);
diff --git a/ext/pgsql/tests/12pg_insert_9.phpt b/ext/pgsql/tests/12pg_insert_9.phpt
index bedf3e2..b84e25b 100644
--- a/ext/pgsql/tests/12pg_insert_9.phpt
+++ b/ext/pgsql/tests/12pg_insert_9.phpt
@@ -19,10 +19,12 @@ $fields = array('num'=>'1234',
'str'=>'AAA', 'bin'=>'BBB');
pg_insert($db, $table_name, $fields) or print "Error in test 1\n";
echo pg_insert($db, $table_name, $fields, PGSQL_DML_STRING)."\n";
echo pg_insert($db, $table_name, $fields, PGSQL_DML_STRING|PGSQL_DML_ESCAPE)."\n";
+var_dump( pg_insert($db, $table_name, $fields, PGSQL_DML_EXEC) ); // Return resource
echo "Ok\n";
?>
---EXPECT--
+--EXPECTF--
INSERT INTO "php_pgsql_test" ("num","str","bin") VALUES
(1234,E'AAA',E'\\x424242');
INSERT INTO "php_pgsql_test" ("num","str","bin") VALUES
('1234','AAA','BBB');
+resource(%d) of type (pgsql result)
Ok
\ No newline at end of file
diff --git a/ext/pgsql/tests/13pg_select_9.phpt b/ext/pgsql/tests/13pg_select_9.phpt
index 73582b6..3b3ccb7 100644
--- a/ext/pgsql/tests/13pg_select_9.phpt
+++ b/ext/pgsql/tests/13pg_select_9.phpt
@@ -25,7 +25,7 @@ echo "Ok\n";
?>
--EXPECT--
-array(1) {
+array(2) {
[0]=>
array(3) {
["num"]=>
@@ -35,6 +35,15 @@ array(1) {
["bin"]=>
string(8) "\x424242"
}
+ [1]=>
+ array(3) {
+ ["num"]=>
+ string(4) "1234"
+ ["str"]=>
+ string(3) "AAA"
+ ["bin"]=>
+ string(8) "\x424242"
+ }
}
SELECT * FROM "php_pgsql_test" WHERE "num"=1234;
SELECT * FROM "php_pgsql_test" WHERE "num"='1234';