sixd Wed Mar 11 16:46:38 2009 UTC
Added files:
/php-src/ext/oci8/tests bug46994.phpt
Modified files:
/php-src/ext/oci8 oci8_statement.c
Log:
Bug #46994 (CLOB size does not update when using CLOB IN OUT param in stored
procedure)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.61&r2=1.62&diff_format=u
Index: php-src/ext/oci8/oci8_statement.c
diff -u php-src/ext/oci8/oci8_statement.c:1.61
php-src/ext/oci8/oci8_statement.c:1.62
--- php-src/ext/oci8/oci8_statement.c:1.61 Mon Mar 9 20:58:13 2009
+++ php-src/ext/oci8/oci8_statement.c Wed Mar 11 16:46:37 2009
@@ -25,7 +25,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8_statement.c,v 1.61 2009/03/09 20:58:13 sixd Exp $ */
+/* $Id: oci8_statement.c,v 1.62 2009/03/11 16:46:37 sixd Exp $ */
#ifdef HAVE_CONFIG_H
@@ -1211,9 +1211,24 @@
}
retval = OCI_CONTINUE;
} else if (Z_TYPE_P(val) == IS_OBJECT) {
+ zval **tmp;
+ php_oci_descriptor *desc;
+
if (!phpbind->descriptor) {
return OCI_ERROR;
}
+
+ /* Do not use the cached lob size if the descriptor is an
+ * out-bind as the contents would have been changed for in/out
+ * binds (Bug #46994).
+ */
+ if (zend_hash_find(Z_OBJPROP_P(val), "descriptor",
sizeof("descriptor"), (void **)&tmp) == FAILURE) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to
find object outbind descriptor property");
+ return OCI_ERROR;
+ }
+ PHP_OCI_ZVAL_TO_DESCRIPTOR_EX(*tmp, desc);
+ desc->lob_size = -1; /* force OCI8 to update cached size */
+
*alenpp = &phpbind->dummy_len;
*bufpp = phpbind->descriptor;
*piecep = OCI_ONE_PIECE;
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug46994.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/bug46994.phpt
+++ php-src/ext/oci8/tests/bug46994.phpt
--TEST--
Bug #46994 (CLOB size does not update when using CLOB IN OUT param in stored
procedure)
--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 bug46994_proc1(p1 in out nocopy clob) is
begin
dbms_lob.trim(p1, 0);
dbms_lob.writeappend(p1, 26, 'This should be the
output.');
end bug46994_proc1;",
"create or replace procedure bug46994_proc2(p1 in out nocopy clob) is
begin
dbms_lob.trim(p1, 0);
dbms_lob.writeappend(p1, 37, 'The output should be
even longer now.');
end bug46994_proc2;"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
@oci_execute($s);
}
// Run Test
$myclob = oci_new_descriptor($c, OCI_D_LOB);
$myclob->writeTemporary("some data", OCI_TEMP_CLOB);
echo "Test 1\n";
$s = oci_parse($c, "begin bug46994_proc1(:myclob); end;");
oci_bind_by_name($s, ":myclob", $myclob, -1, SQLT_CLOB);
oci_execute($s, OCI_DEFAULT);
var_dump($myclob->load());
echo "Test 2\n";
$s = oci_parse($c, "begin bug46994_proc2(:myclob); end;");
oci_bind_by_name($s, ":myclob", $myclob, -1, SQLT_CLOB);
oci_execute($s, OCI_DEFAULT);
var_dump($myclob->load());
echo "Test 3\n";
$s = oci_parse($c, "begin bug46994_proc1(:myclob); end;");
oci_bind_by_name($s, ":myclob", $myclob, -1, SQLT_CLOB);
oci_execute($s, OCI_DEFAULT);
var_dump($myclob->load());
echo "Test 4\n";
var_dump($myclob->load()); // Use cached size code path
// Cleanup
$stmtarray = array(
"drop procedure bug46994_proc1",
"drop procedure bug46994_proc2"
);
foreach ($stmtarray as $stmt) {
$s = oci_parse($c, $stmt);
oci_execute($s);
}
oci_close($c);
?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
Test 1
unicode(26) "This should be the output."
Test 2
unicode(37) "The output should be even longer now."
Test 3
unicode(26) "This should be the output."
Test 4
unicode(26) "This should be the output."
===DONE===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php