tony2001 Wed Aug 9 15:24:27 2006 UTC Added files: (Branch: PHP_5_2) /php-src/ext/oci8/tests bug35973.phpt
Modified files: /php-src/ext/oci8 oci8_lob.c oci8_statement.c php_oci8_int.h Log: add support for NCLOBs fix #35973 (Error ORA-24806 occurs when trying to fetch a NCLOB field)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_lob.c?r1=1.7.2.6.2.2&r2=1.7.2.6.2.3&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.2 php-src/ext/oci8/oci8_lob.c:1.7.2.6.2.3 --- php-src/ext/oci8/oci8_lob.c:1.7.2.6.2.2 Wed Jun 7 13:36:51 2006 +++ php-src/ext/oci8/oci8_lob.c Wed Aug 9 15:24:27 2006 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_lob.c,v 1.7.2.6.2.2 2006/06/07 13:36:51 tony2001 Exp $ */ +/* $Id: oci8_lob.c,v 1.7.2.6.2.3 2006/08/09 15:24:27 tony2001 Exp $ */ @@ -86,6 +86,8 @@ descriptor->lob_current_position = 0; descriptor->lob_size = -1; /* we should set it to -1 to know, that it's just not initialized */ descriptor->buffering = PHP_OCI_LOB_BUFFER_DISABLED; /* buffering is off by default */ + descriptor->charset_form = SQLCS_IMPLICIT; /* default value */ + descriptor->charset_id = connection->charset; if (descriptor->type == OCI_DTYPE_LOB || descriptor->type == OCI_DTYPE_FILE) { /* add Lobs & Files to hash. we'll flush them at the end */ @@ -309,8 +311,8 @@ OCI_FIRST_PIECE, (dvoid *)&ctx, (OCICallbackLobRead2) php_oci_lob_callback, /* callback... */ - (ub2) connection->charset, /* The character set ID of the buffer data. */ - (ub1) SQLCS_IMPLICIT /* The character set form of the buffer data. */ + (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ + (ub1) descriptor->charset_form /* The character set form of the buffer data. */ ) ); @@ -340,8 +342,8 @@ (ub4) buffer_size, /* size of buffer */ (dvoid *)&ctx, (OCICallbackLobRead) php_oci_lob_callback, /* callback... */ - (ub2) connection->charset, /* The character set ID of the buffer data. */ - (ub1) SQLCS_IMPLICIT /* The character set form of the buffer data. */ + (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ + (ub1) descriptor->charset_form /* The character set form of the buffer data. */ ) ); @@ -353,8 +355,10 @@ if (connection->errcode != OCI_SUCCESS) { php_oci_error(connection->err, connection->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); - efree(*data); - *data = NULL; + if (*data) { + efree(*data); + *data = NULL; + } *data_len = 0; return 1; } @@ -367,8 +371,10 @@ if (connection->errcode != OCI_SUCCESS) { php_oci_error(connection->err, connection->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); - efree(*data); - *data = NULL; + if (*data) { + efree(*data); + *data = NULL; + } *data_len = 0; return 1; } @@ -402,7 +408,22 @@ offset = descriptor->lob_current_position; } - connection->errcode = PHP_OCI_CALL(OCILobWrite, (connection->svc, connection->err, lob, (ub4 *)&data_len, (ub4) offset + 1, (dvoid *) data, (ub4) data_len, OCI_ONE_PIECE, (dvoid *)0, (OCICallbackLobWrite) 0, (ub2) 0, (ub1) SQLCS_IMPLICIT)); + connection->errcode = PHP_OCI_CALL(OCILobWrite, + ( + connection->svc, + connection->err, + lob, + (ub4 *)&data_len, + (ub4) offset + 1, + (dvoid *) data, + (ub4) data_len, + OCI_ONE_PIECE, + (dvoid *)0, + (OCICallbackLobWrite) 0, + (ub2) descriptor->charset_id, + (ub1) descriptor->charset_form + ) + ); if (connection->errcode) { php_oci_error(connection->err, connection->errcode TSRMLS_CC); @@ -643,8 +664,8 @@ OCI_ONE_PIECE, (dvoid *)0, (OCICallbackLobWrite) 0, - (ub2) 0, - (ub1) SQLCS_IMPLICIT + (ub2) descriptor->charset_id, + (ub1) descriptor->charset_form ) ); http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.7.2.14.2.4&r2=1.7.2.14.2.5&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.4 php-src/ext/oci8/oci8_statement.c:1.7.2.14.2.5 --- php-src/ext/oci8/oci8_statement.c:1.7.2.14.2.4 Wed Aug 9 12:15:42 2006 +++ php-src/ext/oci8/oci8_statement.c Wed Aug 9 15:24:27 2006 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_statement.c,v 1.7.2.14.2.4 2006/08/09 12:15:42 tony2001 Exp $ */ +/* $Id: oci8_statement.c,v 1.7.2.14.2.5 2006/08/09 15:24:27 tony2001 Exp $ */ #ifdef HAVE_CONFIG_H @@ -388,6 +388,26 @@ return 1; } + /* get character set form */ + statement->errcode = PHP_OCI_CALL(OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_form, (ub4 *)0, OCI_ATTR_CHARSET_FORM, statement->err)); + + if (statement->errcode != OCI_SUCCESS) { + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + php_oci_error(statement->err, statement->errcode TSRMLS_CC); + PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + return 1; + } + + /* get character set id */ + statement->errcode = PHP_OCI_CALL(OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err)); + + if (statement->errcode != OCI_SUCCESS) { + PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); + php_oci_error(statement->err, statement->errcode TSRMLS_CC); + PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + return 1; + } + /* get size of the column */ statement->errcode = PHP_OCI_CALL(OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->err)); @@ -478,6 +498,8 @@ } outcol->descid = descr->id; buf = &(descr->descriptor); + descr->charset_form = outcol->charset_form; + descr->charset_id = outcol->charset_id; break; case SQLT_LNG: http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.11.2.6.2.4&r2=1.11.2.6.2.5&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.4 php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.5 --- php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.4 Wed Aug 9 12:15:42 2006 +++ php-src/ext/oci8/php_oci8_int.h Wed Aug 9 15:24:27 2006 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_oci8_int.h,v 1.11.2.6.2.4 2006/08/09 12:15:42 tony2001 Exp $ */ +/* $Id: php_oci8_int.h,v 1.11.2.6.2.5 2006/08/09 15:24:27 tony2001 Exp $ */ #if HAVE_OCI8 # ifndef PHP_OCI8_INT_H @@ -127,6 +127,8 @@ int lob_size; /* cached LOB size. -1 = Lob wasn't initialized yet */ int buffering; /* cached buffering flag. 0 - off, 1 - on, 2 - on and buffer was used */ ub4 chunk_size; /* chunk size of the LOB. 0 - unknown */ + ub1 charset_form; /* charset form, required for NCLOBs */ + ub2 charset_id; /* charset ID */ } php_oci_descriptor; /* }}} */ typedef struct { /* php_oci_lob_ctx {{{ */ @@ -212,6 +214,8 @@ ub4 cb_retlen; /* */ ub2 scale; /* column scale */ ub2 precision; /* column precision */ + ub1 charset_form; /* charset form, required for NCLOBs */ + ub2 charset_id; /* charset ID */ } php_oci_out_column; /* }}} */ /* {{{ macros */ http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/bug35973.phpt?view=markup&rev=1.1 Index: php-src/ext/oci8/tests/bug35973.phpt +++ php-src/ext/oci8/tests/bug35973.phpt --TEST-- bug #35973 (Error ORA-24806 occurs when trying to fetch a NCLOB field) --SKIPIF-- <?php if (!extension_loaded("oci8")) print "skip"; ?> --FILE-- <?php require dirname(__FILE__).'/connect.inc'; $s1 = oci_parse($c, "drop table test_nclob"); @oci_execute($s1); $s2 = oci_parse($c, "create table test_nclob (nc NCLOB)"); oci_execute($s2); $s3 = oci_parse($c, "insert into test_nclob (nc) values ('12345data')"); oci_execute($s3); $s3 = oci_parse($c, "select * from test_nclob"); oci_execute($s3); var_dump($data = oci_fetch_assoc($s3)); $d = $data['NC']; var_dump($d->read(5)); var_dump($d->read(4)); $s1 = oci_parse($c, "drop table test_nclob"); @oci_execute($s1); echo "Done\n"; ?> --EXPECTF-- array(1) { ["NC"]=> object(OCI-Lob)#%d (1) { ["descriptor"]=> resource(%d) of type (oci8 descriptor) } } string(%d) "%s5" string(%d) "%sa" Done
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php