sixd Mon Feb 25 23:52:10 2008 UTC
Added files: (Branch: PHP_5_2)
/php-src/ext/oci8/tests bug43492_2.phpt bug44008.phpt bug44206.phpt
Modified files:
/php-src/ext/oci8 oci8_interface.c oci8_lob.c oci8_statement.c
php_oci8_int.h
/php-src/ext/oci8/tests lob_014.phpt lob_021.phpt
Log:
OCI8: fix bug #44008 (OCI-Lob->close) & bug #44206 (ref cursor leak)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_interface.c?r1=1.8.2.7.2.14&r2=1.8.2.7.2.15&diff_format=u
Index: php-src/ext/oci8/oci8_interface.c
diff -u php-src/ext/oci8/oci8_interface.c:1.8.2.7.2.14
php-src/ext/oci8/oci8_interface.c:1.8.2.7.2.15
--- php-src/ext/oci8/oci8_interface.c:1.8.2.7.2.14 Mon Dec 31 07:20:09 2007
+++ php-src/ext/oci8/oci8_interface.c Mon Feb 25 23:52:10 2008
@@ -25,7 +25,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8_interface.c,v 1.8.2.7.2.14 2007/12/31 07:20:09 sebastian Exp $ */
+/* $Id: oci8_interface.c,v 1.8.2.7.2.15 2008/02/25 23:52:10 sixd Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1509,10 +1509,11 @@
}
PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement);
- if (!statement->nested) {
- /* nested cursors cannot be freed, they are allocated once and
used during the fetch */
- zend_list_delete(statement->id);
- }
+
+ zend_list_delete(statement->id);
+ if (statement->parent_stmtid) {
+ zend_list_delete(statement->parent_stmtid);
+ }
RETURN_TRUE;
}
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_lob.c?r1=1.7.2.6.2.17&r2=1.7.2.6.2.18&diff_format=u
Index: php-src/ext/oci8/oci8_lob.c
diff -u php-src/ext/oci8/oci8_lob.c:1.7.2.6.2.17
php-src/ext/oci8/oci8_lob.c:1.7.2.6.2.18
--- php-src/ext/oci8/oci8_lob.c:1.7.2.6.2.17 Thu Jan 24 14:10:21 2008
+++ php-src/ext/oci8/oci8_lob.c Mon Feb 25 23:52:10 2008
@@ -25,7 +25,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8_lob.c,v 1.7.2.6.2.17 2008/01/24 14:10:21 rrichards Exp $ */
+/* $Id: oci8_lob.c,v 1.7.2.6.2.18 2008/02/25 23:52:10 sixd Exp $ */
@@ -88,6 +88,7 @@
descriptor->buffering = PHP_OCI_LOB_BUFFER_DISABLED;
/* buffering is off by default */
descriptor->charset_form = SQLCS_IMPLICIT; /* default value */
descriptor->charset_id = connection->charset;
+ descriptor->is_open = 0;
if (descriptor->type == OCI_DTYPE_LOB || descriptor->type ==
OCI_DTYPE_FILE) {
/* add Lobs & Files to hash. we'll flush them at the end */
@@ -571,7 +572,9 @@
{
php_oci_connection *connection = descriptor->connection;
- PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose, (connection->svc,
connection->err, descriptor->descriptor));
+ if (descriptor->is_open) {
+ PHP_OCI_CALL_RETURN(connection->errcode, OCILobClose,
(connection->svc, connection->err, descriptor->descriptor));
+ }
if (connection->errcode != OCI_SUCCESS) {
php_oci_error(connection->err, connection->errcode TSRMLS_CC);
@@ -908,6 +911,8 @@
return 1;
}
+ descriptor->is_open = 1;
+
return php_oci_lob_write(descriptor, 0, data, data_len, &bytes_written
TSRMLS_CC);
} /* }}} */
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.7.2.14.2.31&r2=1.7.2.14.2.32&diff_format=u
Index: php-src/ext/oci8/oci8_statement.c
diff -u php-src/ext/oci8/oci8_statement.c:1.7.2.14.2.31
php-src/ext/oci8/oci8_statement.c:1.7.2.14.2.32
--- php-src/ext/oci8/oci8_statement.c:1.7.2.14.2.31 Thu Jan 31 00:26:43 2008
+++ php-src/ext/oci8/oci8_statement.c Mon Feb 25 23:52:10 2008
@@ -25,7 +25,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8_statement.c,v 1.7.2.14.2.31 2008/01/31 00:26:43 sixd Exp $ */
+/* $Id: oci8_statement.c,v 1.7.2.14.2.32 2008/02/25 23:52:10 sixd Exp $ */
#ifdef HAVE_CONFIG_H
@@ -106,7 +106,7 @@
statement->connection = connection;
statement->has_data = 0;
- statement->nested = 0;
+ statement->parent_stmtid = 0;
zend_list_addref(statement->connection->rsrc_id);
if (OCI_G(default_prefetch) > 0) {
@@ -336,6 +336,7 @@
if (!nested_stmt) {
return OCI_ERROR;
}
+ nested_stmt->parent_stmtid =
outcol->statement->id;
zend_list_addref(outcol->statement->id);
outcol->nested_statement = nested_stmt;
outcol->stmtid = nested_stmt->id;
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.11.2.6.2.23&r2=1.11.2.6.2.24&diff_format=u
Index: php-src/ext/oci8/php_oci8_int.h
diff -u php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.23
php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.24
--- php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.23 Tue Jan 15 20:42:13 2008
+++ php-src/ext/oci8/php_oci8_int.h Mon Feb 25 23:52:10 2008
@@ -25,7 +25,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_oci8_int.h,v 1.11.2.6.2.23 2008/01/15 20:42:13 sixd Exp $ */
+/* $Id: php_oci8_int.h,v 1.11.2.6.2.24 2008/02/25 23:52:10 sixd Exp $ */
#if HAVE_OCI8
# ifndef PHP_OCI8_INT_H
@@ -130,6 +130,7 @@
ub4 chunk_size; /* chunk size of the
LOB. 0 - unknown */
ub1 charset_form; /* charset form,
required for NCLOBs */
ub2 charset_id; /* charset ID */
+ unsigned is_open:1; /* helps to determine
if LOB is open or not */
} php_oci_descriptor; /* }}} */
typedef struct { /* php_oci_lob_ctx {{{ */
@@ -158,6 +159,7 @@
typedef struct { /* php_oci_statement {{{ */
int id;
+ int parent_stmtid; /* parent statement id
*/
php_oci_connection *connection; /* parent connection handle */
sword errcode; /* last errcode*/
OCIError *err; /* private error handle
*/
@@ -170,7 +172,6 @@
int ncolumns; /* number of columns in
the result */
unsigned executed:1; /* statement executed flag */
unsigned has_data:1; /* statement has more data flag
*/
- unsigned nested:1; /* statement handle is valid */
ub2 stmttype; /* statement type */
} php_oci_statement; /* }}} */
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/lob_014.phpt?r1=1.1.2.3&r2=1.1.2.3.2.1&diff_format=u
Index: php-src/ext/oci8/tests/lob_014.phpt
diff -u php-src/ext/oci8/tests/lob_014.phpt:1.1.2.3
php-src/ext/oci8/tests/lob_014.phpt:1.1.2.3.2.1
--- php-src/ext/oci8/tests/lob_014.phpt:1.1.2.3 Tue Dec 6 19:28:25 2005
+++ php-src/ext/oci8/tests/lob_014.phpt Mon Feb 25 23:52:10 2008
@@ -43,9 +43,7 @@
?>
--EXPECTF--
int(4)
-
-Warning: OCI-Lob::close(): ORA-22289: cannot perform operation on an unopened
file or LOB in %slob_014.php on line %d
-bool(false)
+bool(true)
int(4)
bool(true)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/lob_021.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u
Index: php-src/ext/oci8/tests/lob_021.phpt
diff -u php-src/ext/oci8/tests/lob_021.phpt:1.1.2.2
php-src/ext/oci8/tests/lob_021.phpt:1.1.2.3
--- php-src/ext/oci8/tests/lob_021.phpt:1.1.2.2 Tue Sep 12 20:32:38 2006
+++ php-src/ext/oci8/tests/lob_021.phpt Mon Feb 25 23:52:10 2008
@@ -20,8 +20,6 @@
oci_bind_by_name($statement,":v_blob", $blob,-1,OCI_B_BLOB);
oci_execute($statement, OCI_DEFAULT);
-$blob;
-
var_dump($blob->write("test"));
var_dump($blob->close());
var_dump($blob->write("test"));
@@ -50,9 +48,7 @@
?>
--EXPECTF--
int(4)
-
-Warning: OCI-Lob::close(): ORA-22289: cannot perform operation on an unopened
file or LOB in %s on line %d
-bool(false)
+bool(true)
int(4)
bool(true)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug43492_2.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/bug43492_2.phpt
+++ php-src/ext/oci8/tests/bug43492_2.phpt
--TEST--
Bug #43492 (Nested cursor leaks after related bug #44206 fixed)
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php
// This test is similar to bug43492.phpt without the explict free.
// Now that bug 44206 is fixed an automatic clean up will occur -
// though it is still recommended in practice.
require dirname(__FILE__).'/connect.inc';
$stmtarray = array(
"DROP table bug43492_tab",
"CREATE TABLE bug43492_tab(col1 VARCHAR2(1))",
"INSERT INTO bug43492_tab VALUES ('A')",
"INSERT INTO bug43492_tab VALUES ('B')",
"INSERT INTO bug43492_tab VALUES ('C')",
"INSERT INTO bug43492_tab VALUES ('D')",
"INSERT INTO bug43492_tab VALUES ('E')",
"INSERT INTO bug43492_tab VALUES ('F')",
"INSERT INTO bug43492_tab VALUES ('G')",
"INSERT INTO bug43492_tab VALUES ('H')",
"INSERT INTO bug43492_tab VALUES ('I')",
"INSERT INTO bug43492_tab VALUES ('J')"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
function fetch($c, $i) {
$s = ociparse($c, 'select cursor(select * from bug43492_tab) c from
bug43492_tab');
ociexecute($s, OCI_DEFAULT);
ocifetchinto($s, $result, OCI_ASSOC);
ociexecute($result['C'], OCI_DEFAULT);
return $result['C'];
}
for($i = 0; $i < 300; $i++) {
$cur = fetch($c, $i);
for($j = 0; $j < 10; $j++) {
ocifetchinto($cur, $row, OCI_NUM);
echo "$row[0] ";
}
echo "\n";
ocifreestatement($cur);
}
echo "Done\n";
// Cleanup
$stmtarray = array(
"DROP table bug43492_tab"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
oci_close($c);
?>
--EXPECT--
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
A B C D E F G H I J
Done
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug44008.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/bug44008.phpt
+++ php-src/ext/oci8/tests/bug44008.phpt
--TEST--
Bug #44008 (Incorrect usage of OCI-Lob->close doesn't crash PHP)
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php
require dirname(__FILE__).'/connect.inc';
// Initialization
$stmtarray = array(
"create or replace procedure bug44008_proc (p in out clob)
as begin p := 'A';
end;"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
// Run Test
$s = oci_parse($c, 'begin bug44008_proc(:data); end;');
$textLob = oci_new_descriptor($c, OCI_D_LOB);
oci_bind_by_name($s, ":data", $textLob, -1, OCI_B_CLOB);
oci_execute($s, OCI_DEFAULT);
$r = $textLob->load();
echo "$r\n";
// Incorrectly closing the lob doesn't cause a crash.
// OCI-LOB->close() is documented for use only with OCI-Lob->writeTemporary()
$textLob->close();
// Cleanup
$stmtarray = array(
"drop procedure bug44008_proc"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
oci_execute($s);
}
oci_close($c);
echo "Done\n";
?>
--EXPECT--
A
Done
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug44206.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/bug44206.phpt
+++ php-src/ext/oci8/tests/bug44206.phpt
--TEST--
Bug #44206 (Test if selecting ref cursors leads to ORA-1000 maximum open
cursors reached)
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php
require dirname(__FILE__).'/connect.inc';
// Run Test
for ($x = 0; $x < 400; $x++)
{
$stmt = "select cursor (select $x from dual) a,
cursor (select $x from dual) b
from dual";
$s = oci_parse($c, $stmt);
$r = oci_execute($s);
if (!$r) {
echo "Exiting $x\n";
exit;
}
$mode = OCI_ASSOC | OCI_RETURN_NULLS;
$result = oci_fetch_array($s, $mode);
oci_execute($result['A']);
oci_execute($result['B']);
oci_fetch_array($result['A'], $mode);
oci_fetch_array($result['B'], $mode);
oci_free_statement($result['A']);
oci_free_statement($result['B']);
oci_free_statement($s);
}
echo "Completed $x\n";
oci_close($c);
echo "Done\n";
?>
--EXPECT--
Completed 400
Done
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php