tony2001 Wed Apr 5 14:07:16 2006 UTC Modified files: /php-src/ext/oci8 config.m4 oci8_lob.c php_oci8_int.h Log: fix #36934 (OCILob->read() doesn't move internal pointer when reading 0's) no support for Unicode CLOBs in Oracle < 10, sorry. http://cvs.php.net/viewcvs.cgi/php-src/ext/oci8/config.m4?r1=1.58&r2=1.59&diff_format=u Index: php-src/ext/oci8/config.m4 diff -u php-src/ext/oci8/config.m4:1.58 php-src/ext/oci8/config.m4:1.59 --- php-src/ext/oci8/config.m4:1.58 Fri Jan 20 16:58:33 2006 +++ php-src/ext/oci8/config.m4 Wed Apr 5 14:07:16 2006 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4,v 1.58 2006/01/20 16:58:33 tony2001 Exp $ +dnl $Id: config.m4,v 1.59 2006/04/05 14:07:16 tony2001 Exp $ dnl if test -z "$SED"; then @@ -232,6 +232,13 @@ ], [], [ -L$OCI8_DIR/$OCI8_LIB_DIR $OCI8_SHARED_LIBADD ]) + + PHP_CHECK_LIBRARY(clntsh, OCILobRead2, + [ + AC_DEFINE(HAVE_OCI_LOB_READ2,1,[ ]) + ], [], [ + -L$OCI8_DIR/$OCI8_LIB_DIR $OCI8_SHARED_LIBADD + ]) ;; @@ -242,6 +249,7 @@ AC_DEFINE(HAVE_OCI_ENV_NLS_CREATE,1,[ ]) AC_DEFINE(HAVE_OCI_ENV_CREATE,1,[ ]) AC_DEFINE(HAVE_OCI_STMT_PREPARE2,1,[ ]) + AC_DEFINE(HAVE_OCI_LOB_READ2,1,[ ]) AC_DEFINE(HAVE_OCI8_TEMP_LOB,1,[ ]) AC_DEFINE(PHP_OCI8_HAVE_COLLECTIONS,1,[ ]) ;; @@ -354,6 +362,7 @@ AC_DEFINE(HAVE_OCI_ENV_NLS_CREATE,1,[ ]) AC_DEFINE(HAVE_OCI_ENV_CREATE,1,[ ]) AC_DEFINE(HAVE_OCI_STMT_PREPARE2,1,[ ]) + AC_DEFINE(HAVE_OCI_LOB_READ2,1,[ ]) AC_DEFINE(HAVE_OCI8_TEMP_LOB,1,[ ]) AC_DEFINE(PHP_OCI8_HAVE_COLLECTIONS,1,[ ]) http://cvs.php.net/viewcvs.cgi/php-src/ext/oci8/oci8_lob.c?r1=1.11&r2=1.12&diff_format=u Index: php-src/ext/oci8/oci8_lob.c diff -u php-src/ext/oci8/oci8_lob.c:1.11 php-src/ext/oci8/oci8_lob.c:1.12 --- php-src/ext/oci8/oci8_lob.c:1.11 Tue Mar 21 15:07:14 2006 +++ php-src/ext/oci8/oci8_lob.c Wed Apr 5 14:07:16 2006 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_lob.c,v 1.11 2006/03/21 15:07:14 tony2001 Exp $ */ +/* $Id: oci8_lob.c,v 1.12 2006/04/05 14:07:16 tony2001 Exp $ */ @@ -150,8 +150,11 @@ { php_oci_connection *connection = descriptor->connection; ub4 length = 0; - int bytes_read, bytes_total = 0, offset = 0, data_len_chars = 0; + int bytes_read, bytes_total = 0, offset = 0; int requested_len = read_length; /* this is by default */ +#if defined(HAVE_OCI_LOB_READ2) + int chars_read = 0, is_clob = 0; +#endif *data_len = 0; *data = NULL; @@ -190,6 +193,23 @@ return 1; } } +#ifdef HAVE_OCI_LOB_READ2 + else { + ub2 charset_id = 0; + + connection->errcode = PHP_OCI_CALL(OCILobCharSetId, (connection->env, connection->err, descriptor->descriptor, &charset_id)); + + if (connection->errcode != OCI_SUCCESS) { + php_oci_error(connection->err, connection->errcode TSRMLS_CC); + PHP_OCI_HANDLE_ERROR(connection, connection->errcode); + return 1; + } + + if (charset_id > 0) { /* charset_id is always > 0 for [N]CLOBs */ + is_clob = 1; + } + } +#endif *data = (char *)emalloc(requested_len + 1); bytes_read = requested_len; @@ -198,7 +218,46 @@ /* TODO * We need to make sure this function works with Unicode LOBs * */ - + +#if defined(HAVE_OCI_LOB_READ2) + + do { + chars_read = 0; + connection->errcode = PHP_OCI_CALL(OCILobRead2, + ( + connection->svc, + connection->err, + descriptor->descriptor, + (oraub8 *)&bytes_read, /* IN/OUT bytes toread/read */ + (oraub8 *)&chars_read, + (oraub8) offset + 1, /* offset (starts with 1) */ + (dvoid *) ((char *) *data + *data_len), + (oraub8) requested_len, /* size of buffer */ + 0, + NULL, + (OCICallbackLobRead2) 0, /* callback... */ + (ub2) connection->charset, /* The character set ID of the buffer data. */ + (ub1) SQLCS_IMPLICIT /* The character set form of the buffer data. */ + ) + ); + + bytes_total += bytes_read; + if (is_clob) { + offset += chars_read; + } else { + offset += bytes_read; + } + + *data_len += bytes_read; + + if (connection->errcode != OCI_NEED_DATA) { + break; + } + *data = erealloc(*data, *data_len + PHP_OCI_LOB_BUFFER_SIZE + 1); + } while (connection->errcode == OCI_NEED_DATA); + +#else + do { connection->errcode = PHP_OCI_CALL(OCILobRead, ( @@ -217,11 +276,7 @@ ); bytes_total += bytes_read; - /* - * Oracle doesn't tell use how many CHARS were read, - * so we have to count them to get the correct offset for CLOBS */ - data_len_chars = OCIMultiByteStrnDisplayLength(connection->env, *data, bytes_total); - offset = initial_offset + data_len_chars; + offset += bytes_read; *data_len += bytes_read; @@ -231,6 +286,8 @@ *data = erealloc(*data, *data_len + PHP_OCI_LOB_BUFFER_SIZE + 1); } while (connection->errcode == OCI_NEED_DATA); +#endif + if (connection->errcode != OCI_SUCCESS) { php_oci_error(connection->err, connection->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(connection, connection->errcode); @@ -239,7 +296,7 @@ return 1; } - descriptor->lob_current_position += data_len_chars; + descriptor->lob_current_position = offset; if (descriptor->type == OCI_DTYPE_FILE) { connection->errcode = PHP_OCI_CALL(OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); http://cvs.php.net/viewcvs.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.14&r2=1.15&diff_format=u Index: php-src/ext/oci8/php_oci8_int.h diff -u php-src/ext/oci8/php_oci8_int.h:1.14 php-src/ext/oci8/php_oci8_int.h:1.15 --- php-src/ext/oci8/php_oci8_int.h:1.14 Tue Jan 31 18:36:59 2006 +++ php-src/ext/oci8/php_oci8_int.h Wed Apr 5 14:07:16 2006 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_oci8_int.h,v 1.14 2006/01/31 18:36:59 tony2001 Exp $ */ +/* $Id: php_oci8_int.h,v 1.15 2006/04/05 14:07:16 tony2001 Exp $ */ #if HAVE_OCI8 # ifndef PHP_OCI8_INT_H @@ -78,7 +78,7 @@ #define PHP_OCI_MAX_NAME_LEN 64 #define PHP_OCI_MAX_DATA_SIZE INT_MAX #define PHP_OCI_PIECE_SIZE (64*1024)-1 -#define PHP_OCI_LOB_BUFFER_SIZE 1048576l +#define PHP_OCI_LOB_BUFFER_SIZE 32768 #define PHP_OCI_ASSOC 1<<0 #define PHP_OCI_NUM 1<<1
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php