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

Reply via email to