From: Christopher Jones Date: Fri, 18 Apr 2008 00:05:27 +0000 (+0000) Subject: MFH X-Git-Tag: BEFORE_NEW_PARAMETER_PARSE~354 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=08eaa56798fba86a72a34e0919d2ce3511c544cb;p=php MFH Code: - Do scope-end release for oci_pconnect (oci8.old_oci_close_semantics=1 gives old behavior) - Fix session reuse with 10.2 client libs - Fix the Ping macro version check for 10.2 - Add type check associated with zend_list_find - Code connection re-organized for reuse - Format comments - WS changes - Prepare for new PECL release Tests: - Add new tests - Rationalize password tests - Revert use of __DIR__ so tests will work with PHP 5.2 - Update some skipifs to make tests more portable --- diff --git a/ext/oci8/CREDITS b/ext/oci8/CREDITS index 18cad81c3e..4c1e0d05b7 100644 --- a/ext/oci8/CREDITS +++ b/ext/oci8/CREDITS @@ -1,2 +1,2 @@ OCI8 -Stig Bakken, Thies C. Arntzen, Andy Sautins, David Benson, Maxim Maletsky, Harald Radi, Antony Dovgal, Andi Gutmans, Wez Furlong +Stig Bakken, Thies C. Arntzen, Andy Sautins, David Benson, Maxim Maletsky, Harald Radi, Antony Dovgal, Andi Gutmans, Wez Furlong, Christopher Jones, Oracle Corporation diff --git a/ext/oci8/README b/ext/oci8/README index 871a4501fb..cca3c40a97 100644 --- a/ext/oci8/README +++ b/ext/oci8/README @@ -207,10 +207,9 @@ these steps: 6.2.0 Important: if Oracle Database 11.1.0.6 with DRCP connections is used, then the Oracle database patch for bug 6474441 must be - applied (see section 6.5) or a workaround below used. Without - this patch, "ORA-01000: maximum open cursors exceeded", "ORA-01001 - invalid cursor" or "ORA-01002 fetch out of sequence" errors may - occur. + applied (see section 6.5). Without this patch, "ORA-01000: + maximum open cursors exceeded", "ORA-01001 invalid cursor" or + "ORA-01002 fetch out of sequence" errors may occur. If the Oracle 11.1.0.6 database patch cannot be applied, one of the following three workarounds can be used to disable statement @@ -325,7 +324,20 @@ Changing a password over DRCP connections will fail with the error "ORA-56609: Usage not supported with DRCP". This is an documented restriction of Oracle Database 11g. -6.4.2 LOGON Triggers can be used to set session properties +6.4.2 Closing Connections + +With the PHP 5.3 OCI8 Beta extension, persistent connections can now +be closed by the user, allowing greater control over connection +resource usage. Persistent connections will now also be closed +automatically when there is no PHP variable referencing them, such as +at the end of scope of a PHP user function. This will rollback any +uncommitted transaction. These changes to persistent connections make +them behave similarly to non-persistent connections, simplifying the +interface, allowing for greater application consistency and +predictability. Use oci8.old_oci_close_semantics=1 to retain the +historical behavior. + +6.4.3 LOGON Triggers can be used to set session properties The patch for Oracle Database 11.1.0.6 bug 6474441 (see section 6.5) allows PHP applications with DRCP connection to use a database LOGON diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 171e70c3a8..e9c13f7d27 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -27,13 +27,6 @@ */ /* $Id$ */ -/* TODO - * - * file://localhost/www/docs/oci10/ociaahan.htm#423823 - implement lob_empty() with OCI_ATTR_LOBEMPTY - * - * get OCI_ATTR_CHARSET_ID attr of column to detect UTF string and multiply buffer in 4 times - * - */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -441,8 +434,9 @@ PHP_INI_END() */ /* {{{ php_oci_init_global_handles() - Initialize global handles only when they are needed -*/ + * + * Initialize global handles only when they are needed + */ static void php_oci_init_global_handles(TSRMLS_D) { sword errcode; @@ -488,8 +482,9 @@ oci_error: } /* }}} */ /* {{{ php_oci_cleanup_global_handles() - Free global handles (if they were initialized before) -*/ + * + * Free global handles (if they were initialized before) + */ static void php_oci_cleanup_global_handles(TSRMLS_D) { if (OCI_G(err)) { @@ -504,8 +499,9 @@ static void php_oci_cleanup_global_handles(TSRMLS_D) } /* }}} */ /* {{{ PHP_GINIT_FUNCTION - Zerofill globals during module init -*/ + * + * Zerofill globals during module init + */ #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 5) /* This check allows PECL builds from this file to be portable to older PHP releases */ static PHP_GINIT_FUNCTION(oci) @@ -661,7 +657,6 @@ PHP_RINIT_FUNCTION(oci) OCI_G(debug_mode) = 0; /* start "fresh" */ OCI_G(num_links) = OCI_G(num_persistent); OCI_G(errcode) = 0; - OCI_G(request_shutdown) = 0; return SUCCESS; } @@ -686,7 +681,6 @@ PHP_MSHUTDOWN_FUNCTION(oci) PHP_RSHUTDOWN_FUNCTION(oci) { /* Set this to indicate request shutdown for all further processing */ - OCI_G(request_shutdown) = 1; #ifdef ZTS zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) php_oci_list_helper, (void *)le_descriptor TSRMLS_CC); @@ -698,7 +692,10 @@ PHP_RSHUTDOWN_FUNCTION(oci) } #endif - /* check persistent connections and do the necessary actions if needed. If persistent_helper is unable to process a pconnection because of a refcount, the processing would happen from np-destructor which is called when refcount goes to zero - php_oci_pconnection_list_np_dtor*/ + /* Check persistent connections and do the necessary actions if needed. If persistent_helper is + * unable to process a pconnection because of a refcount, the processing would happen from + * np-destructor which is called when refcount goes to zero - php_oci_pconnection_list_np_dtor + */ zend_hash_apply(&EG(persistent_list), (apply_func_t) php_oci_persistent_helper TSRMLS_CC); #ifdef ZTS @@ -725,27 +722,31 @@ PHP_MINFO_FUNCTION(oci) #if !defined(PHP_WIN32) && !defined(HAVE_OCI_INSTANT_CLIENT) #ifdef PHP_OCI8_ORACLE_VERSION - php_info_print_table_row(2, "Oracle Version", PHP_OCI8_ORACLE_VERSION ); + php_info_print_table_row(2, "Oracle Version", PHP_OCI8_ORACLE_VERSION); +#endif +#ifdef PHP_OCI8_DIR + php_info_print_table_row(2, "Compile-time ORACLE_HOME", PHP_OCI8_DIR); +#endif +#ifdef PHP_OCI8_SHARED_LIBADD + php_info_print_table_row(2, "Libraries Used", PHP_OCI8_SHARED_LIBADD); #endif - php_info_print_table_row(2, "Compile-time ORACLE_HOME", PHP_OCI8_DIR ); - php_info_print_table_row(2, "Libraries Used", PHP_OCI8_SHARED_LIBADD ); #else -# if defined(HAVE_OCI_INSTANT_CLIENT) && defined(OCI_MAJOR_VERSION) && defined(OCI_MINOR_VERSION) +#if defined(HAVE_OCI_INSTANT_CLIENT) && defined(OCI_MAJOR_VERSION) && defined(OCI_MINOR_VERSION) snprintf(buf, sizeof(buf), "%d.%d", OCI_MAJOR_VERSION, OCI_MINOR_VERSION); php_info_print_table_row(2, "Oracle Instant Client Version", buf); -# endif +#endif #endif #ifdef HAVE_OCI8_TEMP_LOB - php_info_print_table_row(2, "Temporary Lob support", "enabled" ); + php_info_print_table_row(2, "Temporary Lob support", "enabled"); #else - php_info_print_table_row(2, "Temporary Lob support", "disabled" ); + php_info_print_table_row(2, "Temporary Lob support", "disabled"); #endif #ifdef PHP_OCI8_HAVE_COLLECTIONS - php_info_print_table_row(2, "Collections support", "enabled" ); + php_info_print_table_row(2, "Collections support", "enabled"); #else - php_info_print_table_row(2, "Collections support", "disabled" ); + php_info_print_table_row(2, "Collections support", "disabled"); #endif php_info_print_table_end(); @@ -757,7 +758,9 @@ PHP_MINFO_FUNCTION(oci) /* list destructors {{{ */ /* {{{ php_oci_connection_list_dtor() - Non-persistent connection destructor */ + * + * Non-persistent connection destructor + */ static void php_oci_connection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_connection *connection = (php_oci_connection *)entry->ptr; @@ -769,7 +772,9 @@ static void php_oci_connection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) } /* }}} */ /* {{{ php_oci_pconnection_list_dtor() - Persistent connection destructor */ + * + * Persistent connection destructor + */ static void php_oci_pconnection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_connection *connection = (php_oci_connection *)entry->ptr; @@ -781,48 +786,67 @@ static void php_oci_pconnection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) } /* }}} */ /* {{{ php_oci_pconnection_list_np_dtor() - Non-Persistent destructor for persistent connection - This gets invoked when - the refcount of this goes to zero in the regular list */ + * + * Non-Persistent destructor for persistent connection - This gets invoked when + * the refcount of this goes to zero in the regular list + */ static void php_oci_pconnection_list_np_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_connection *connection = (php_oci_connection *)entry->ptr; + zend_rsrc_list_entry *le; - /* We currently handle only session-pool using connections. TODO: Handle non-sessionpool connections as well */ - if (connection && connection->using_spool && !connection->is_stub) { - zend_rsrc_list_entry *le; + /* + * We cannot get connection as NULL or as a stub in this function. This is the function that + * turns a pconnection to a stub + * + * If oci_password_change() changed the password of a persistent connection, close the + * connection and remove it from the persistent connection cache. This means subsequent scripts + * will be prevented from being able to present the old (now invalid) password to a usable + * connection to the database; they must use the new password. + * + * Check for conditions that warrant removal of the hash entry + */ - if (!connection->is_open) { - /* Remove the hash entry if present */ - if ((zend_hash_find(&EG(persistent_list), connection->hash_key, strlen(connection->hash_key)+1, (void **) &le)== SUCCESS) && (le->type == le_pconnection) && (le->ptr == connection)) { - zend_hash_del(&EG(persistent_list), connection->hash_key, strlen(connection->hash_key)+1); - } - else { - php_oci_connection_close(connection TSRMLS_CC); - } + if (!connection->is_open || + connection->passwd_changed || + (PG(connection_status) & PHP_CONNECTION_TIMEOUT) || + OCI_G(in_call)) { + + /* Remove the hash entry if present */ + if ((zend_hash_find(&EG(persistent_list), connection->hash_key, strlen(connection->hash_key)+1, (void **) &le)== SUCCESS) && (le->type == le_pconnection) && (le->ptr == connection)) { + zend_hash_del(&EG(persistent_list), connection->hash_key, strlen(connection->hash_key)+1); + } + else { + php_oci_connection_close(connection TSRMLS_CC); OCI_G(num_persistent)--; + } - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: np_dtor cleaning up: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); - } + if (OCI_G(debug_mode)) { + php_printf ("OCI8 DEBUG L1: np_dtor cleaning up: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); } - else if (OCI_G(request_shutdown)){ - /* Release the connection to underlying pool - same steps - * as the persistent helper. If we do this - * unconditionally, we would change existing behavior - * regarding out-of-scope pconnects. In future, we can - * enable this through a new flag - */ - php_oci_connection_release(connection TSRMLS_CC); + } + else { + /* + * Release the connection to underlying pool. We do this unconditionally so that + * out-of-scope pconnects are now consistent with oci_close and out-of-scope new connect + * semantics. With the PECL OCI 1.3.x extensions, we release pconnections when oci_close + * takes the refcount to zero. + * + * If oci_old_close_semantics is set, we artifically bump up the refcount and decremented + * only at request shutdown. + */ + php_oci_connection_release(connection TSRMLS_CC); - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: np_dtor releasing: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); - } + if (OCI_G(debug_mode)) { + php_printf ("OCI8 DEBUG L1: np_dtor releasing: (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); } } } /* }}} */ /* {{{ php_oci_statement_list_dtor() - Statement destructor */ + * + * Statement destructor + */ static void php_oci_statement_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_statement *statement = (php_oci_statement *)entry->ptr; @@ -830,7 +854,9 @@ static void php_oci_statement_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) } /* }}} */ /* {{{ php_oci_descriptor_list_dtor() - Descriptor destructor */ + * + * Descriptor destructor + */ static void php_oci_descriptor_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_descriptor *descriptor = (php_oci_descriptor *)entry->ptr; @@ -839,7 +865,9 @@ static void php_oci_descriptor_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) #ifdef PHP_OCI8_HAVE_COLLECTIONS /* {{{ php_oci_collection_list_dtor() - Collection destructor */ + * + * Collection destructor + */ static void php_oci_collection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_collection *collection = (php_oci_collection *)entry->ptr; @@ -849,10 +877,12 @@ static void php_oci_collection_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) /* }}} */ -/* hash destructors {{{ */ +/* Hash Destructors {{{ */ /* {{{ php_oci_define_hash_dtor() - Define hash destructor */ + * + * Define hash destructor + */ void php_oci_define_hash_dtor(void *data) { php_oci_define *define = (php_oci_define *) data; @@ -867,7 +897,9 @@ void php_oci_define_hash_dtor(void *data) /* }}} */ /* {{{ php_oci_bind_hash_dtor() - Bind hash destructor */ + * + * Bind hash destructor + */ void php_oci_bind_hash_dtor(void *data) { php_oci_bind *bind = (php_oci_bind *) data; @@ -889,7 +921,9 @@ void php_oci_bind_hash_dtor(void *data) /* }}} */ /* {{{ php_oci_column_hash_dtor() - Column hash destructor */ + * + * Column hash destructor + */ void php_oci_column_hash_dtor(void *data) { php_oci_out_column *column = (php_oci_out_column *) data; @@ -914,7 +948,9 @@ void php_oci_column_hash_dtor(void *data) /* }}} */ /* {{{ php_oci_descriptor_flush_hash_dtor() - Flush descriptors on commit */ + * + * Flush descriptors on commit + */ void php_oci_descriptor_flush_hash_dtor(void *data) { php_oci_descriptor *descriptor = *(php_oci_descriptor **)data; @@ -929,7 +965,9 @@ void php_oci_descriptor_flush_hash_dtor(void *data) /* }}} */ /* {{{ php_oci_descriptor_delete_from_hash() - Delete descriptor from the hash */ + * + * Delete descriptor from the hash + */ int php_oci_descriptor_delete_from_hash(void *data, void *id TSRMLS_DC) { php_oci_descriptor *descriptor = *(php_oci_descriptor **)data; @@ -945,7 +983,9 @@ int php_oci_descriptor_delete_from_hash(void *data, void *id TSRMLS_DC) /* }}} */ /* {{{ php_oci_error() - Fetch & print out error message if we get an error */ + * + * Fetch & print out error message if we get an error + */ sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC) { text *errbuf = (text *)NULL; @@ -996,7 +1036,9 @@ sb4 php_oci_error(OCIError *err_p, sword status TSRMLS_DC) /* }}} */ /* {{{ php_oci_fetch_errmsg() - Fetch error message into the buffer from the error handle provided */ + * + * Fetch error message into the buffer from the error handle provided + */ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC) { sb4 error_code = 0; @@ -1022,7 +1064,9 @@ sb4 php_oci_fetch_errmsg(OCIError *error_handle, text **error_buf TSRMLS_DC) } /* }}} */ /* {{{ php_oci_fetch_sqltext_offset() - Compute offset in the SQL statement */ + * + * Compute offset in the SQL statement + */ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, ub2 *error_offset TSRMLS_DC) { *sqltext = NULL; @@ -1047,7 +1091,9 @@ int php_oci_fetch_sqltext_offset(php_oci_statement *statement, text **sqltext, u } /* }}} */ /* {{{ php_oci_do_connect() - Connect wrapper */ + * + * Connect wrapper + */ void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclusive) { php_oci_connection *connection; @@ -1076,7 +1122,10 @@ void php_oci_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent, int exclus } /* }}} */ /* {{{ php_oci_do_connect_ex() - * The real connect function. Allocates all the resources needed, establishes the connection and returns the result handle (or NULL) */ + * + * The real connect function. Allocates all the resources needed, establishes the connection and + * returns the result handle (or NULL) + */ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char *password, int password_len, char *new_password, int new_password_len, char *dbname, int dbname_len, char *charset, long session_mode, int persistent, int exclusive TSRMLS_DC) { zend_rsrc_list_entry *le; @@ -1102,14 +1151,16 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char php_error_docref(NULL TSRMLS_CC, E_WARNING, "Privileged connect is disabled. Enable oci8.privileged_connect to be able to connect as SYSOPER or SYSDBA"); return NULL; } - /* Disable privileged connections in Safe Mode (N.b. safe mode has been removed in PHP 6 anyway) */ + /* Disable privileged connections in Safe Mode (N.b. safe mode has been removed in PHP + * 6 anyway) + */ if (PG(safe_mode)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Privileged connect is disabled in Safe Mode"); return NULL; } - /* Increase security by not caching privileged - * oci_pconnect() connections. The connection becomes - * equivalent to oci_connect() or oci_new_connect(). + + /* Increase security by not caching privileged oci_pconnect() connections. The + * connection becomes equivalent to oci_connect() or oci_new_connect(). */ persistent = 0; break; @@ -1119,9 +1170,8 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char break; } - /* We cannot use the new session create logic (OCISessionGet from - * client-side session pool) when privileged connect or password - * change is attempted. TODO: Remove this once OCI provides + /* We cannot use the new session create logic (OCISessionGet from client-side session pool) when + * privileged connect or password change is attempted. TODO: Remove this once OCI provides * capability */ if ((session_mode == OCI_SYSOPER) || (session_mode == OCI_SYSDBA) || (new_password_len)) { @@ -1224,11 +1274,10 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } } /* }}} */ - /* If we got a pconnection stub, then 'load'(OCISessionGet) the - * real connection from its private spool - * A connection is a stub if it is only a cached structure and the - * real connection is released to its underlying private session pool. - * We currently do not have stub support for non-persistent conns. + /* If we got a pconnection stub, then 'load'(OCISessionGet) the real connection from its + * private spool A connection is a stub if it is only a cached structure and the real + * connection is released to its underlying private session pool. We currently do not have + * stub support for non-persistent conns. * * TODO: put in negative code for non-persistent stubs */ @@ -1249,17 +1298,20 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char if (connection->is_persistent) { int rsrc_type; - /* check connection liveness in the following order: + /* Check connection liveness in the following order: * 1) always check OCI_ATTR_SERVER_STATUS * 2) see if it's time to ping it * 3) ping it if needed */ if (php_oci_connection_status(connection TSRMLS_CC)) { - /* only ping if: + /* Only ping if: + * * 1) next_ping > 0, which means that ping_interval is not -1 (aka "Off") - * 2) current_timestamp > next_ping, which means "it's time to check if it's still alive" + * + * 2) current_timestamp > next_ping, which means "it's time to check if it's + * still alive" */ - if ( !ping_done && (*(connection->next_pingp) > 0) && (timestamp >= *(connection->next_pingp)) && !php_oci_connection_ping(connection TSRMLS_CC) ) { + if (!ping_done && (*(connection->next_pingp) > 0) && (timestamp >= *(connection->next_pingp)) && !php_oci_connection_ping(connection TSRMLS_CC)) { /* server died */ } else { php_oci_connection *tmp; @@ -1273,6 +1325,14 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char /* do nothing */ } else { connection->rsrc_id = zend_list_insert(connection, le_pconnection); + /* Persistent connections: For old close semantics we artificially + * bump up the refcount to prevent the non-persistent destructor + * from getting called until request shutdown. The refcount is + * decremented in the persistent helper + */ + if (OCI_G(old_oci_close_semantics)) { + zend_list_addref(connection->rsrc_id); + } } smart_str_free_ex(&hashed_details, 0); return connection; @@ -1287,20 +1347,27 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } } /* is_open is true? */ - /* Server died - connection not usable. The is_open=true can also fall through to here, if ping fails */ + /* Server died - connection not usable. The is_open=true can also fall through to here, + * if ping fails + */ if (persistent){ int rsrc_type; connection->is_open = 0; connection->used_this_request = 1; - /* We have to do a hash_del but need to preserve the resource if there is a positive refcount. Set the data pointer in the list entry to NULL */ - if (connection == zend_list_find(connection->rsrc_id, &rsrc_type)) { + /* We have to do a hash_del but need to preserve the resource if there is a positive + * refcount. Set the data pointer in the list entry to NULL + */ + if (connection == zend_list_find(connection->rsrc_id, &rsrc_type) && rsrc_type == le_pconnection) { le->ptr = NULL; } zend_hash_del(&EG(persistent_list), hashed_details.c, hashed_details.len+1); } else { + /* We only remove the hash entry. The resource and the list entry with its pointer + * to the resource are still intact + */ zend_hash_del(&EG(regular_list), hashed_details.c, hashed_details.len+1); } @@ -1315,8 +1382,8 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } } - /* Check if we have reached max_persistent. If so, try to remove a few - * timed-out connections. As a last resort, return a non-persistent connection. + /* Check if we have reached max_persistent. If so, try to remove a few timed-out connections. As + * a last resort, return a non-persistent connection. */ if (persistent) { zend_bool alloc_non_persistent = 0; @@ -1347,13 +1414,14 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char connection->is_persistent = 0; } - /* {{{ Get the session pool that suits this connection request from the - * persistent list. This step is only for non-persistent connections as - * persistent connections have private session pools. Non-persistent conns - * use shared session pool to allow for optimizations such as caching the - * physical connection (for DRCP) even when the non-persistent php connection - * is destroyed. - * TODO: Unconditionally do this once OCI provides extended OCISessionGet capability */ + /* {{{ Get the session pool that suits this connection request from the persistent list. This + * step is only for non-persistent connections as persistent connections have private session + * pools. Non-persistent conns use shared session pool to allow for optimizations such as + * caching the physical connection (for DRCP) even when the non-persistent php connection is + * destroyed. + * + * TODO: Unconditionally do this once OCI provides extended OCISessionGet capability + */ if (use_spool && !connection->is_persistent) { if ((session_pool = php_oci_get_spool(username, username_len, password, password_len, dbname, dbname_len, charsetid ? charsetid:charsetid_nls_lang TSRMLS_CC))==NULL) { @@ -1365,7 +1433,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char connection->idle_expiry = (OCI_G(persistent_timeout) > 0) ? (timestamp + OCI_G(persistent_timeout)) : 0; - /* mark password as unchanged by PHP during the duration of the database session */ + /* Mark password as unchanged by PHP during the duration of the database session */ connection->passwd_changed = 0; smart_str_free_ex(&hashed_details, 0); @@ -1378,8 +1446,10 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } #endif - /* Old session creation semantics when session pool cannot be used Eg: privileged connect/password change */ - if ( !use_spool) { + /* Old session creation semantics when session pool cannot be used Eg: privileged + * connect/password change + */ + if (!use_spool) { if (php_oci_old_create_session(connection, dbname, dbname_len, username, username_len, password, password_len, new_password, new_password_len, session_mode TSRMLS_CC)) { php_oci_connection_close(connection TSRMLS_CC); return NULL; @@ -1392,7 +1462,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } } - /* mark it as open */ + /* Mark it as open */ connection->is_open = 1; /* add to the appropriate hash */ @@ -1401,6 +1471,14 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char new_le.type = le_pconnection; connection->used_this_request = 1; connection->rsrc_id = zend_list_insert(connection, le_pconnection); + + /* Persistent connections: For old close semantics we artificially bump up the refcount to + * prevent the non-persistent destructor from getting called until request shutdown. The + * refcount is decremented in the persistent helper + */ + if (OCI_G(old_oci_close_semantics)) { + zend_list_addref(connection->rsrc_id); + } zend_hash_update(&EG(persistent_list), connection->hash_key, strlen(connection->hash_key)+1, (void *)&new_le, sizeof(zend_rsrc_list_entry), NULL); OCI_G(num_persistent)++; } else if (!exclusive) { @@ -1429,16 +1507,17 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char /* }}} */ /* {{{ php_oci_connection_ping() - * Ping connection. Uses OCIPing() or OCIServerVersion() depending on the Oracle Client version */ + * + * Ping connection. Uses OCIPing() or OCIServerVersion() depending on the Oracle Client version + */ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) { - /* Use OCIPing instead of OCIServerVersion. If OCIPing returns - * ORA-1010 (invalid OCI operation) such as from Pre-10.1 servers, - * the error is still from the server and we would have - * successfully performed a roundtrip and validated the - * connection. Use OCIServerVersion for Pre-10.2 clients + /* Use OCIPing instead of OCIServerVersion. If OCIPing returns ORA-1010 (invalid OCI operation) + * such as from Pre-10.1 servers, the error is still from the server and we would have + * successfully performed a roundtrip and validated the connection. Use OCIServerVersion for + * Pre-10.2 clients */ -#if ( (OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)) ) /* OCIPing available 10.2 onwards */ +#if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIPing available 10.2 onwards */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIPing, (connection->svc, OCI_G(err), OCI_DEFAULT)); #else char version[256]; @@ -1466,7 +1545,9 @@ static int php_oci_connection_ping(php_oci_connection *connection TSRMLS_DC) /* }}} */ /* {{{ php_oci_connection_status() - Check connection status (pre-ping check) */ + * + * Check connection status (pre-ping check) + */ static int php_oci_connection_status(php_oci_connection *connection TSRMLS_DC) { ub4 ss = 0; @@ -1485,7 +1566,9 @@ static int php_oci_connection_status(php_oci_connection *connection TSRMLS_DC) /* }}} */ /* {{{ php_oci_connection_rollback() - Rollback connection */ + * + * Rollback connection + */ int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC) { PHP_OCI_CALL_RETURN(connection->errcode, OCITransRollback, (connection->svc, connection->err, (ub4) 0)); @@ -1500,7 +1583,9 @@ int php_oci_connection_rollback(php_oci_connection *connection TSRMLS_DC) } /* }}} */ /* {{{ php_oci_connection_commit() - Commit connection */ + * + * Commit connection + */ int php_oci_connection_commit(php_oci_connection *connection TSRMLS_DC) { PHP_OCI_CALL_RETURN(connection->errcode, OCITransCommit, (connection->svc, connection->err, (ub4) 0)); @@ -1515,42 +1600,21 @@ int php_oci_connection_commit(php_oci_connection *connection TSRMLS_DC) } /* }}} */ /* {{{ php_oci_connection_close() - Close the connection and free all its resources */ + * + * Close the connection and free all its resources + */ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) { int result = 0; zend_bool in_call_save = OCI_G(in_call); - if (connection->descriptors) { - zend_hash_destroy(connection->descriptors); - efree(connection->descriptors); - } - - if (connection->svc) { - /* rollback outstanding transactions */ - if (connection->needs_commit) { - if (php_oci_connection_rollback(connection TSRMLS_CC)) { - /* rollback failed */ - result = 1; - } - } + if (!connection->is_stub) { + /* Release resources associated with connection */ + php_oci_connection_release(connection TSRMLS_CC); } - if (!connection->is_stub && connection->svc && connection->is_open) { - /* Update the next_ping in the connection. Needed also for non-peristent because non-persistent DRCP caches connection underneath */ - if (OCI_G(ping_interval) >= 0) { - *(connection->next_pingp) = time(NULL) + OCI_G(ping_interval); - } else { - /* ping_interval is -1 */ - *(connection->next_pingp) = 0; - } - - /* Use OCISessionRelease for session pool connections */ - if (connection->using_spool) { - PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL,0, (ub4) 0)); - } else { + if (!connection->using_spool && connection->svc) { PHP_OCI_CALL(OCISessionEnd, (connection->svc, connection->err, connection->session, (ub4) 0)); - } } if (connection->err) { @@ -1605,14 +1669,19 @@ static int php_oci_connection_close(php_oci_connection *connection TSRMLS_DC) } /* }}} */ /* {{{ php_oci_connection_release() - Release the connection to its session pool. This looks similar to php_oci_connection_close, but the latter is used for connections that are to be terminated. The latter was not overloaded for "release" because of too many callers */ + * + * Release the connection's resources. This involves freeing descriptors and rolling back + * transactions, setting timeout-related parameters etc. For session-pool using connections, the + * underlying connection is released to its session pool. + */ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) { int result = 0; zend_bool in_call_save = OCI_G(in_call); + time_t timestamp = time(NULL); - if (connection->is_stub || !connection->using_spool) { - return 0; /* Not our concern */ + if (connection->is_stub) { + return 0; } if (connection->descriptors) { @@ -1631,32 +1700,56 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) } } - /* Release the session */ - if (connection->svc) { + if (OCI_G(persistent_timeout) > 0) { + connection->idle_expiry = timestamp + OCI_G(persistent_timeout); + } + + /* We may have half-cooked connections to clean up */ + if (connection->next_pingp) { if (OCI_G(ping_interval) >= 0) { - *(connection->next_pingp) = time(NULL) + OCI_G(ping_interval); + *(connection->next_pingp) = timestamp + OCI_G(ping_interval); } else { /* ping_interval is -1 */ *(connection->next_pingp) = 0; } - - PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL, - 0, result ? OCI_SESSRLS_DROPSESS : OCI_DEFAULT)); } - /* It no longer has relation with the database session. However authinfo and env are cached */ - connection->svc = NULL; - connection->server = NULL; - connection->session = NULL; + /* Release the session (stubs are filtered out at the beginning)*/ + if (connection->using_spool) { + ub4 rlsMode = OCI_DEFAULT; - connection->is_attached = connection->is_open = connection->needs_commit = 0; - connection->is_stub = 1; + if (result) { + rlsMode |= OCI_SESSRLS_DROPSESS; + } - /* Cut the link between the connection structure and the time_t structure allocated within the OCI session */ - connection->next_pingp = NULL; + /* Sessions for non-persistent connections should be dropped. For 11 and above, the session + * pool has its own mechanism for doing so for purity NEW connections. We need to do so + * explicitly for 10.2 and earlier. + */ +#if (!(OCI_MAJOR_VERSION >= 11)) + if (!connection->is_persistent) { + rlsMode |= OCI_SESSRLS_DROPSESS; + } +#endif + + if (connection->svc) { + PHP_OCI_CALL(OCISessionRelease, (connection->svc, connection->err, NULL, + 0, rlsMode)); + } + /* It no longer has relation with the database session. However authinfo and env are + * cached + */ + connection->svc = NULL; + connection->server = NULL; + connection->session = NULL; - if (!connection->is_persistent) { - OCI_G(num_links)--; /* Support for "connection" stubs - future use */ + connection->is_attached = connection->is_open = connection->needs_commit = connection->used_this_request = 0; + connection->is_stub = 1; + + /* Cut the link between the connection structure and the time_t structure allocated within + * the OCI session + */ + connection->next_pingp = NULL; } OCI_G(in_call) = in_call_save; @@ -1664,7 +1757,9 @@ int php_oci_connection_release(php_oci_connection *connection TSRMLS_DC) } /* }}} */ /* {{{ php_oci_password_change() - Change password for the user with the username given */ + * + * Change password for the user with the username given + */ int php_oci_password_change(php_oci_connection *connection, char *user, int user_len, char *pass_old, int pass_old_len, char *pass_new, int pass_new_len TSRMLS_DC) { PHP_OCI_CALL_RETURN(connection->errcode, OCIPasswordChange, (connection->svc, connection->err, (text *)user, user_len, (text *)pass_old, pass_old_len, (text *)pass_new, pass_new_len, OCI_DEFAULT)); @@ -1679,7 +1774,9 @@ int php_oci_password_change(php_oci_connection *connection, char *user, int user } /* }}} */ /* {{{ php_oci_server_get_version() - Get Oracle server version */ + * + * Get Oracle server version + */ int php_oci_server_get_version(php_oci_connection *connection, char **version TSRMLS_DC) { char version_buff[256]; @@ -1697,7 +1794,9 @@ int php_oci_server_get_version(php_oci_connection *connection, char **version TS } /* }}} */ /* {{{ php_oci_column_to_zval() - Convert php_oci_out_column struct into zval */ + * + * Convert php_oci_out_column struct into zval + */ int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode TSRMLS_DC) { php_oci_descriptor *descriptor; @@ -1779,7 +1878,9 @@ int php_oci_column_to_zval(php_oci_out_column *column, zval *value, int mode TSR /* }}} */ /* {{{ php_oci_fetch_row() - Fetch the next row from the given statement */ + * + * Fetch the next row from the given statement + */ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_args) { zval *z_statement, *array; @@ -1875,9 +1976,7 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg } if (expected_args > 2) { - /* only for ocifetchinto BC - * in all other cases we return array, not long - */ + /* Only for ocifetchinto BC. In all other cases we return array, not long */ REPLACE_ZVAL_VALUE(&array, return_value, 1); /* copy return_value to given reference */ zval_dtor(return_value); RETURN_LONG(statement->ncolumns); @@ -1886,81 +1985,25 @@ void php_oci_fetch_row (INTERNAL_FUNCTION_PARAMETERS, int mode, int expected_arg /* }}} */ /* {{{ php_oci_persistent_helper() - Helper function to close/rollback persistent connections at the end of request. A return value of 1 indicates that the connection is to be destroyed */ + * + * Helper function to close/rollback persistent connections at the end of request. A return value of + * 1 indicates that the connection is to be destroyed + */ static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC) { time_t timestamp; php_oci_connection *connection; - int rsrc_type; timestamp = time(NULL); - /* pconnection stubs are also counted as they have private session pools */ + /* Persistent connection stubs are also counted as they have private session pools */ if (le->type == le_pconnection) { connection = (php_oci_connection *)le->ptr; - if (connection->using_spool && (connection == zend_list_find(connection->rsrc_id, &rsrc_type)) && rsrc_type == le_pconnection){ - /* Do nothing - keep the connection as some one is referring to it. TODO: We should ideally have this for non-session_pool connections as well */ + if (!connection->used_this_request && OCI_G(persistent_timeout) != -1) { if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: persistent_helper skipping : (%p) at (%s:%d) \n", connection, __FILE__, __LINE__); + php_printf ("OCI8 DEBUG L1: persistent_helper processing for timeout: (%p stub=%d) at (%s:%d) \n", connection, connection->is_stub, __FILE__, __LINE__); } - } - else if (connection->used_this_request) { - if (OCI_G(debug_mode)) { - php_printf ("OCI8 DEBUG L1: persistent_helper processing : (%p stub=%d) at (%s:%d) \n", connection, connection->is_stub, __FILE__, __LINE__); - } - - if ((PG(connection_status) & PHP_CONNECTION_TIMEOUT) || OCI_G(in_call)) { - return ZEND_HASH_APPLY_REMOVE; - } - - /* Helps remove bad connections from the persistent list */ - if (!connection->is_open && !connection->is_stub) { - return ZEND_HASH_APPLY_REMOVE; - } - - if (connection->descriptors) { - zend_hash_destroy(connection->descriptors); - efree(connection->descriptors); - connection->descriptors = NULL; - } - - if (connection->needs_commit) { - php_oci_connection_rollback(connection TSRMLS_CC); - } - - /* If oci_password_change() changed the password of a - * persistent connection, close the connection and remove - * it from the persistent connection cache. This means - * subsequent scripts will be prevented from being able to - * present the old (now invalid) password to a usable - * connection to the database; they must use the new - * password. - */ - if (connection->passwd_changed) { - return ZEND_HASH_APPLY_REMOVE; - } - - if (OCI_G(persistent_timeout) > 0) { - connection->idle_expiry = timestamp + OCI_G(persistent_timeout); - } - - if (!connection->is_stub) { - if (OCI_G(ping_interval) >= 0) { - *(connection->next_pingp) = timestamp + OCI_G(ping_interval); - } else { - /* ping_interval is -1 */ - *(connection->next_pingp) = 0; - } - - /* Release all session pool-using persistent connections at the end of the request */ - if (connection->using_spool && php_oci_connection_release(connection TSRMLS_CC)) { - return ZEND_HASH_APPLY_REMOVE; - } - } - - connection->used_this_request = 0; - } else if (OCI_G(persistent_timeout) != -1) { if (connection->idle_expiry < timestamp) { /* connection has timed out */ return ZEND_HASH_APPLY_REMOVE; @@ -1971,7 +2014,9 @@ static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC) } /* }}} */ /* {{{ php_oci_create_spool() - Create(alloc + Init) Session pool for the given dbname and charsetid */ + * + * Create(alloc + Init) Session pool for the given dbname and charsetid + */ static php_oci_spool *php_oci_create_spool(char *username, int username_len, char *password, int password_len, char *dbname, int dbname_len, char *hash_key, int hash_key_len, int charsetid TSRMLS_DC) { php_oci_spool *session_pool = NULL; @@ -1982,8 +2027,9 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha session_pool = (php_oci_spool *) calloc(1, sizeof(php_oci_spool)); /* Populate key if passed */ - if (hash_key_len) + if (hash_key_len) { session_pool->spool_hash_key = zend_strndup(hash_key, hash_key_len); + } /* Create the session pool's env */ if (!(session_pool->env = php_oci_create_env(charsetid TSRMLS_CC))) { @@ -2000,10 +2046,9 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha goto exit_create_spool; } - /* allocate the session pool error handle - This only for use in the - * destructor, as there is a generic bug which can free up the OCI_G(err) - * variable before destroying connections. We cannot use this for other - * roundtrip calls as there is no way the user can access this error + /* Allocate the session pool error handle - This only for use in the destructor, as there is a + * generic bug which can free up the OCI_G(err) variable before destroying connections. We + * cannot use this for other roundtrip calls as there is no way the user can access this error */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, ((dvoid *) session_pool->env, (dvoid **)&(session_pool->err), (ub4) OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0)); @@ -2013,15 +2058,15 @@ static php_oci_spool *php_oci_create_spool(char *username, int username_len, cha goto exit_create_spool; } -/* Disable RLB as we'd mostly have single-connection pools */ -#if (OCI_MAJOR_VERSION > 10 ) +/* Disable RLB as we mostly have single-connection pools */ +#if (OCI_MAJOR_VERSION > 10) poolmode = OCI_SPC_NO_RLB | OCI_SPC_HOMOGENEOUS; #else poolmode = OCI_SPC_HOMOGENEOUS; #endif - /* Create the homogeneous session pool - We have different session pools - * for every different username, password, charset and dbname. + /* Create the homogeneous session pool - We have different session pools for every different + * username, password, charset and dbname. */ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCISessionPoolCreate,(session_pool->env, OCI_G(err), session_pool->poolh, (OraText **)&session_pool->poolname, &session_pool->poolname_len, (OraText *)dbname, (ub4)dbname_len, 0, UB4MAXVAL, 1,(OraText *)username, (ub4)username_len, (OraText *)password,(ub4)password_len, poolmode)); @@ -2058,9 +2103,10 @@ exit_create_spool: } /* }}} */ /* {{{ php_oci_get_spool() - Get Session pool for the given dbname and charsetid from the persistent - list. Function called for non-persistent connections. -*/ + * + * Get Session pool for the given dbname and charsetid from the persistent list. Function called for + * non-persistent connections. + */ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char *password, int password_len, char *dbname, int dbname_len, int charsetid TSRMLS_DC) { smart_str spool_hashed_details = {0}; @@ -2080,7 +2126,9 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * } smart_str_appendl_ex(&spool_hashed_details, "**", sizeof("**") - 1, 0); - smart_str_appendl_ex(&spool_hashed_details, dbname, dbname_len, 0); + if (dbname_len) { + smart_str_appendl_ex(&spool_hashed_details, dbname, dbname_len, 0); + } smart_str_appendl_ex(&spool_hashed_details, "**", sizeof("**") - 1, 0); smart_str_append_unsigned_ex(&spool_hashed_details, charsetid, 0); @@ -2091,7 +2139,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * php_strtolower(spool_hashed_details.c, spool_hashed_details.len); /* }}} */ - if (zend_hash_find(&EG(persistent_list),spool_hashed_details.c, spool_hashed_details.len+1, (void **)&spool_out_le) == FAILURE ) { + if (zend_hash_find(&EG(persistent_list),spool_hashed_details.c, spool_hashed_details.len+1, (void **)&spool_out_le) == FAILURE) { session_pool = php_oci_create_spool(username, username_len, password, password_len, dbname, dbname_len, spool_hashed_details.c, spool_hashed_details.len, charsetid TSRMLS_CC); @@ -2105,7 +2153,7 @@ static php_oci_spool *php_oci_get_spool(char *username, int username_len, char * zend_hash_update(&EG(persistent_list), session_pool->spool_hash_key, strlen(session_pool->spool_hash_key)+1,(void *)&spool_le, sizeof(zend_rsrc_list_entry),NULL); } else if (spool_out_le->type == le_psessionpool && strlen(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key) == spool_hashed_details.len && - memcmp(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key, spool_hashed_details.c, spool_hashed_details.len) == 0 ) { + memcmp(((php_oci_spool *)(spool_out_le->ptr))->spool_hash_key, spool_hashed_details.c, spool_hashed_details.len) == 0) { /* retrieve the cached session pool */ session_pool = (php_oci_spool *)(spool_out_le->ptr); } @@ -2122,7 +2170,9 @@ exit_get_spool: } /* }}} */ /* {{{ php_oci_create_env() -Create the OCI environment choosing the correct function for the OCI version */ + * + * Create the OCI environment choosing the correct function for the OCI version + */ static OCIEnv *php_oci_create_env(ub2 charsetid TSRMLS_DC) { OCIEnv *retenv = NULL; @@ -2162,7 +2212,10 @@ static OCIEnv *php_oci_create_env(ub2 charsetid TSRMLS_DC) }/* }}} */ /* {{{ php_oci_old_create_session() - This function is to be deprecated in future in favour of OCISessionGet which is used in php_oci_do_connect_ex */ + * + * This function is to be deprecated in future in favour of OCISessionGet which is used in + * php_oci_do_connect_ex + */ static int php_oci_old_create_session(php_oci_connection *connection, char *dbname, int dbname_len, char *username, int username_len, char *password, int password_len, char *new_password, int new_password_len, int session_mode TSRMLS_DC) { if (OCI_G(debug_mode)) { @@ -2324,11 +2377,13 @@ static int php_oci_old_create_session(php_oci_connection *connection, char *dbna } /* }}} */ /* {{{ php_oci_create_session() - Create session using client-side session pool - new norm */ + * + * Create session using client-side session pool - new norm + */ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool *session_pool, char *dbname, int dbname_len, char *username, int username_len, char *password, int password_len, char *new_password, int new_password_len, int session_mode TSRMLS_DC) { php_oci_spool *actual_spool = NULL; -#if (OCI_MAJOR_VERSION > 10 ) +#if (OCI_MAJOR_VERSION > 10) ub4 purity = -2; /* Illegal value to initialize */ #endif time_t timestamp = time(NULL); @@ -2342,9 +2397,9 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool connection->env = actual_spool->env; - /* Do this upfront so that connection close on an error would know - * that this is a session pool connection. Failure to do this - * would result in crashes in error scenarios */ + /* Do this upfront so that connection close on an error would know that this is a session pool + * connection. Failure to do this would result in crashes in error scenarios + */ if (!connection->using_spool) { connection->using_spool = 1; } @@ -2357,9 +2412,9 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool } } - /* The passed in "connection" can be a cached stub from plist or - * freshly created. In the former case, we do not have to allocate - * any handles */ + /* The passed in "connection" can be a cached stub from plist or freshly created. In the former + * case, we do not have to allocate any handles + */ if (!connection->err) { PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIHandleAlloc, (connection->env, (dvoid **)&(connection->err), OCI_HTYPE_ERROR, 0, NULL)); @@ -2380,7 +2435,7 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool } /* Set the Connection class and purity if OCI client version >= 11g */ -#if (OCI_MAJOR_VERSION > 10 ) +#if (OCI_MAJOR_VERSION > 10) PHP_OCI_CALL_RETURN(OCI_G(errcode),OCIAttrSet, ((dvoid *) connection->authinfo,(ub4) OCI_HTYPE_SESSION, (dvoid *) OCI_G(connection_class), (ub4)(strlen(OCI_G(connection_class))), (ub4)OCI_ATTR_CONNECTION_CLASS, OCI_G(err))); if (OCI_G(errcode) != OCI_SUCCESS) { @@ -2411,14 +2466,11 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool php_printf ("OCI8 DEBUG L1: (numopen=%d)(numbusy=%d) at (%s:%d) \n", numopen, numbusy, __FILE__, __LINE__); } /* }}} */ - /* Ping loop: Ping and loop till we get a good - * connection. When a database instance goes down, it can - * leave several bad connections that need to be flushed out - * before getting a good one. In non-RAC, we always get a - * brand new connection at the end of the loop and in RAC, we - * can get a good connection from a different instance before - * flushing out all bad ones. We do not need to ping brand new - * connections. + /* Ping loop: Ping and loop till we get a good connection. When a database instance goes + * down, it can leave several bad connections that need to be flushed out before getting a + * good one. In non-RAC, we always get a brand new connection at the end of the loop and in + * RAC, we can get a good connection from a different instance before flushing out all bad + * ones. We do not need to ping brand new connections. */ do { /* Continue to use the global error handle as the connection is closed when an error occurs */ @@ -2427,8 +2479,8 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool if (OCI_G(errcode) != OCI_SUCCESS) { php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); - /* Session creation returns OCI_SUCCESS_WITH_INFO when - * user's password has expired, but is still usable. + /* Session creation returns OCI_SUCCESS_WITH_INFO when user's password has expired, but + * is still usable. */ if (OCI_G(errcode) != OCI_SUCCESS_WITH_INFO) { @@ -2488,7 +2540,9 @@ static int php_oci_create_session(php_oci_connection *connection, php_oci_spool } /* }}} */ /* {{{ php_oci_spool_list_dtor() - Session pool destructor function */ + * + * Session pool destructor function + */ static void php_oci_spool_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) { php_oci_spool *session_pool = (php_oci_spool *)entry->ptr; @@ -2501,7 +2555,9 @@ static void php_oci_spool_list_dtor(zend_rsrc_list_entry *entry TSRMLS_DC) } /* }}} */ /* {{{ php_oci_spool_close() - Destroys the OCI Session Pool */ + * + * Destroys the OCI Session Pool + */ static void php_oci_spool_close(php_oci_spool *session_pool TSRMLS_DC) { if (session_pool->poolname_len) { @@ -2529,10 +2585,11 @@ static void php_oci_spool_close(php_oci_spool *session_pool TSRMLS_DC) } /* }}} */ /* {{{ php_oci_ping_init() - Initializes the next_ping time as a context value in the - connection. We now use OCIContext{Get,Set}Value to store the - next_ping because we need to support ping for non-persistent DRCP - connections */ + * + * Initializes the next_ping time as a context value in the connection. We now use + * OCIContext{Get,Set}Value to store the next_ping because we need to support ping for + * non-persistent DRCP connections + */ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TSRMLS_DC) { time_t *next_pingp = NULL; @@ -2572,7 +2629,9 @@ static sword php_oci_ping_init(php_oci_connection *connection, OCIError *errh TS #ifdef ZTS /* {{{ php_oci_list_helper() - Helper function to destroy data on thread shutdown in ZTS mode */ + * + * Helper function to destroy data on thread shutdown in ZTS mode + */ static int php_oci_list_helper(zend_rsrc_list_entry *le, void *le_type TSRMLS_DC) { int type = (int) le_type; diff --git a/ext/oci8/oci8_collection.c b/ext/oci8/oci8_collection.c index 0475bd2136..7308ddd4ce 100644 --- a/ext/oci8/oci8_collection.c +++ b/ext/oci8/oci8_collection.c @@ -42,7 +42,7 @@ #include "php_oci8.h" #include "php_oci8_int.h" -/* {{{ php_oci_collection_create() +/* {{{ php_oci_collection_create() Create and return connection handle */ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, char *tdo, int tdo_len, char *schema, int schema_len TSRMLS_DC) { @@ -87,7 +87,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* describe TDO */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIDescribeAny, + PHP_OCI_CALL_RETURN(connection->errcode, OCIDescribeAny, ( connection->svc, connection->err, @@ -112,7 +112,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get the collection type code of the attribute */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp1, (ub4) OCI_DTYPE_PARAM, @@ -131,7 +131,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c case OCI_TYPECODE_TABLE: case OCI_TYPECODE_VARRAY: /* get collection element handle */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp1, (ub4) OCI_DTYPE_PARAM, @@ -147,7 +147,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get REF of the TDO for the type */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp2, (ub4) OCI_DTYPE_PARAM, @@ -163,7 +163,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get the TDO (only header) */ - PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByRef, + PHP_OCI_CALL_RETURN(connection->errcode, OCITypeByRef, ( connection->env, connection->err, @@ -179,7 +179,7 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* get typecode */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, + PHP_OCI_CALL_RETURN(connection->errcode, OCIAttrGet, ( (dvoid*) parmp2, (ub4) OCI_DTYPE_PARAM, @@ -201,16 +201,16 @@ php_oci_collection * php_oci_collection_create(php_oci_connection *connection, c } /* Create object to hold return table */ - PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectNew, + PHP_OCI_CALL_RETURN(connection->errcode, OCIObjectNew, ( - connection->env, - connection->err, - connection->svc, - OCI_TYPECODE_TABLE, - collection->tdo, - (dvoid *)0, - OCI_DURATION_DEFAULT, - TRUE, + connection->env, + connection->err, + connection->svc, + OCI_TYPECODE_TABLE, + collection->tdo, + (dvoid *)0, + OCI_DURATION_DEFAULT, + TRUE, (dvoid **) &(collection->collection) ) ); @@ -236,7 +236,7 @@ CLEANUP: return NULL; } /* }}} */ -/* {{{ php_oci_collection_size() +/* {{{ php_oci_collection_size() Return size of the collection */ int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC) { @@ -252,7 +252,7 @@ int php_oci_collection_size(php_oci_collection *collection, sb4 *size TSRMLS_DC) return 0; } /* }}} */ -/* {{{ php_oci_collection_max() +/* {{{ php_oci_collection_max() Return max number of elements in the collection */ int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC) { @@ -264,7 +264,7 @@ int php_oci_collection_max(php_oci_collection *collection, long *max TSRMLS_DC) return 0; } /* }}} */ -/* {{{ php_oci_collection_trim() +/* {{{ php_oci_collection_trim() Trim collection to the given number of elements */ int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRMLS_DC) { @@ -280,7 +280,7 @@ int php_oci_collection_trim(php_oci_collection *collection, long trim_size TSRML return 0; } /* }}} */ -/* {{{ php_oci_collection_append_null() +/* {{{ php_oci_collection_append_null() Append NULL element to the end of the collection */ int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC) { @@ -298,7 +298,7 @@ int php_oci_collection_append_null(php_oci_collection *collection TSRMLS_DC) return 0; } /* }}} */ -/* {{{ php_oci_collection_append_date() +/* {{{ php_oci_collection_append_date() Append DATE element to the end of the collection (use "DD-MON-YY" format) */ int php_oci_collection_append_date(php_oci_collection *collection, char *date, int date_len TSRMLS_DC) { @@ -316,7 +316,7 @@ int php_oci_collection_append_date(php_oci_collection *collection, char *date, i return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, ( connection->env, connection->err, @@ -345,7 +345,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe php_oci_connection *connection = collection->connection; #if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10) - /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ + /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ element_double = strtod(number, NULL); #else /* zend_strtod was introduced in PHP 4.3.10 */ @@ -360,7 +360,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, ( connection->env, connection->err, @@ -379,7 +379,7 @@ int php_oci_collection_append_number(php_oci_collection *collection, char *numbe return 0; } /* }}} */ -/* {{{ php_oci_collection_append_string() +/* {{{ php_oci_collection_append_string() Append STRING to the end of the collection */ int php_oci_collection_append_string(php_oci_collection *collection, char *element, int element_len TSRMLS_DC) { @@ -395,7 +395,7 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAppend, ( connection->env, connection->err, @@ -414,7 +414,7 @@ int php_oci_collection_append_string(php_oci_collection *collection, char *eleme return 0; } /* }}} */ -/* {{{ php_oci_collection_append() +/* {{{ php_oci_collection_append() Append wrapper. Appends any supported element to the end of the collection */ int php_oci_collection_append(php_oci_collection *collection, char *element, int element_len TSRMLS_DC) { @@ -431,17 +431,17 @@ int php_oci_collection_append(php_oci_collection *collection, char *element, int return php_oci_collection_append_string(collection, element, element_len TSRMLS_CC); break; - case OCI_TYPECODE_UNSIGNED16 : /* UNSIGNED SHORT */ - case OCI_TYPECODE_UNSIGNED32 : /* UNSIGNED LONG */ - case OCI_TYPECODE_REAL : /* REAL */ - case OCI_TYPECODE_DOUBLE : /* DOUBLE */ - case OCI_TYPECODE_INTEGER : /* INT */ - case OCI_TYPECODE_SIGNED16 : /* SHORT */ - case OCI_TYPECODE_SIGNED32 : /* LONG */ - case OCI_TYPECODE_DECIMAL : /* DECIMAL */ - case OCI_TYPECODE_FLOAT : /* FLOAT */ - case OCI_TYPECODE_NUMBER : /* NUMBER */ - case OCI_TYPECODE_SMALLINT : /* SMALLINT */ + case OCI_TYPECODE_UNSIGNED16 : /* UNSIGNED SHORT */ + case OCI_TYPECODE_UNSIGNED32 : /* UNSIGNED LONG */ + case OCI_TYPECODE_REAL : /* REAL */ + case OCI_TYPECODE_DOUBLE : /* DOUBLE */ + case OCI_TYPECODE_INTEGER : /* INT */ + case OCI_TYPECODE_SIGNED16 : /* SHORT */ + case OCI_TYPECODE_SIGNED32 : /* LONG */ + case OCI_TYPECODE_DECIMAL : /* DECIMAL */ + case OCI_TYPECODE_FLOAT : /* FLOAT */ + case OCI_TYPECODE_NUMBER : /* NUMBER */ + case OCI_TYPECODE_SMALLINT : /* SMALLINT */ return php_oci_collection_append_number(collection, element, element_len TSRMLS_CC); break; @@ -454,7 +454,7 @@ int php_oci_collection_append(php_oci_collection *collection, char *element, int return 1; } /* }}} */ -/* {{{ php_oci_collection_element_get() +/* {{{ php_oci_collection_element_get() Get the element with the given index */ int php_oci_collection_element_get(php_oci_collection *collection, long index, zval **result_element TSRMLS_DC) { @@ -468,7 +468,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z MAKE_STD_ZVAL(*result_element); ZVAL_NULL(*result_element); - PHP_OCI_CALL_RETURN(connection->errcode, OCICollGetElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollGetElem, ( connection->env, connection->err, @@ -529,17 +529,17 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z } break; - case OCI_TYPECODE_UNSIGNED16: /* UNSIGNED SHORT */ - case OCI_TYPECODE_UNSIGNED32: /* UNSIGNED LONG */ - case OCI_TYPECODE_REAL: /* REAL */ - case OCI_TYPECODE_DOUBLE: /* DOUBLE */ - case OCI_TYPECODE_INTEGER: /* INT */ - case OCI_TYPECODE_SIGNED16: /* SHORT */ - case OCI_TYPECODE_SIGNED32: /* LONG */ - case OCI_TYPECODE_DECIMAL: /* DECIMAL */ - case OCI_TYPECODE_FLOAT: /* FLOAT */ - case OCI_TYPECODE_NUMBER: /* NUMBER */ - case OCI_TYPECODE_SMALLINT: /* SMALLINT */ + case OCI_TYPECODE_UNSIGNED16: /* UNSIGNED SHORT */ + case OCI_TYPECODE_UNSIGNED32: /* UNSIGNED LONG */ + case OCI_TYPECODE_REAL: /* REAL */ + case OCI_TYPECODE_DOUBLE: /* DOUBLE */ + case OCI_TYPECODE_INTEGER: /* INT */ + case OCI_TYPECODE_SIGNED16: /* SHORT */ + case OCI_TYPECODE_SIGNED32: /* LONG */ + case OCI_TYPECODE_DECIMAL: /* DECIMAL */ + case OCI_TYPECODE_FLOAT: /* FLOAT */ + case OCI_TYPECODE_NUMBER: /* NUMBER */ + case OCI_TYPECODE_SMALLINT: /* SMALLINT */ { double double_number; @@ -567,7 +567,7 @@ int php_oci_collection_element_get(php_oci_collection *collection, long index, z return 1; } /* }}} */ -/* {{{ php_oci_collection_element_set_null() +/* {{{ php_oci_collection_element_set_null() Set the element with the given index to NULL */ int php_oci_collection_element_set_null(php_oci_collection *collection, long index TSRMLS_DC) { @@ -585,7 +585,7 @@ int php_oci_collection_element_set_null(php_oci_collection *collection, long ind return 0; } /* }}} */ -/* {{{ php_oci_collection_element_set_date() +/* {{{ php_oci_collection_element_set_date() Change element's value to the given DATE */ int php_oci_collection_element_set_date(php_oci_collection *collection, long index, char *date, int date_len TSRMLS_DC) { @@ -603,7 +603,7 @@ int php_oci_collection_element_set_date(php_oci_collection *collection, long ind return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, ( connection->env, connection->err, @@ -633,7 +633,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i php_oci_connection *connection = collection->connection; #if (PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10) - /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ + /* minimum PHP version ext/oci8/config.m4 accepts is 4.3.9 */ element_double = strtod(number, NULL); #else /* zend_strtod was introduced in PHP 4.3.10 */ @@ -648,7 +648,7 @@ int php_oci_collection_element_set_number(php_oci_collection *collection, long i return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, ( connection->env, connection->err, @@ -684,7 +684,7 @@ int php_oci_collection_element_set_string(php_oci_collection *collection, long i return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, + PHP_OCI_CALL_RETURN(connection->errcode, OCICollAssignElem, ( connection->env, connection->err, @@ -721,17 +721,17 @@ int php_oci_collection_element_set(php_oci_collection *collection, long index, c return php_oci_collection_element_set_string(collection, index, value, value_len TSRMLS_CC); break; - case OCI_TYPECODE_UNSIGNED16 : /* UNSIGNED SHORT */ - case OCI_TYPECODE_UNSIGNED32 : /* UNSIGNED LONG */ - case OCI_TYPECODE_REAL : /* REAL */ - case OCI_TYPECODE_DOUBLE : /* DOUBLE */ - case OCI_TYPECODE_INTEGER : /* INT */ - case OCI_TYPECODE_SIGNED16 : /* SHORT */ - case OCI_TYPECODE_SIGNED32 : /* LONG */ - case OCI_TYPECODE_DECIMAL : /* DECIMAL */ - case OCI_TYPECODE_FLOAT : /* FLOAT */ - case OCI_TYPECODE_NUMBER : /* NUMBER */ - case OCI_TYPECODE_SMALLINT : /* SMALLINT */ + case OCI_TYPECODE_UNSIGNED16 : /* UNSIGNED SHORT */ + case OCI_TYPECODE_UNSIGNED32 : /* UNSIGNED LONG */ + case OCI_TYPECODE_REAL : /* REAL */ + case OCI_TYPECODE_DOUBLE : /* DOUBLE */ + case OCI_TYPECODE_INTEGER : /* INT */ + case OCI_TYPECODE_SIGNED16 : /* SHORT */ + case OCI_TYPECODE_SIGNED32 : /* LONG */ + case OCI_TYPECODE_DECIMAL : /* DECIMAL */ + case OCI_TYPECODE_FLOAT : /* FLOAT */ + case OCI_TYPECODE_NUMBER : /* NUMBER */ + case OCI_TYPECODE_SMALLINT : /* SMALLINT */ return php_oci_collection_element_set_number(collection, index, value, value_len TSRMLS_CC); break; @@ -744,7 +744,7 @@ int php_oci_collection_element_set(php_oci_collection *collection, long index, c return 1; } /* }}} */ -/* {{{ php_oci_collection_assign() +/* {{{ php_oci_collection_assign() Assigns a value to the collection from another collection */ int php_oci_collection_assign(php_oci_collection *collection_dest, php_oci_collection *collection_from TSRMLS_DC) { diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 22de0f3a10..dd3a8e30bd 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -442,8 +442,7 @@ PHP_FUNCTION(oci_lob_seek) } PHP_OCI_ZVAL_TO_DESCRIPTOR(*tmp, descriptor); - - + if (php_oci_lob_get_length(descriptor, &lob_length TSRMLS_CC)) { RETURN_FALSE; } @@ -453,9 +452,9 @@ PHP_FUNCTION(oci_lob_seek) descriptor->lob_current_position += offset; break; case PHP_OCI_SEEK_END: - if (descriptor->lob_size + offset >= 0) { + if ((descriptor->lob_size + offset) >= 0) { descriptor->lob_current_position = descriptor->lob_size + offset; - } + } else { descriptor->lob_current_position = 0; } @@ -464,8 +463,7 @@ PHP_FUNCTION(oci_lob_seek) default: descriptor->lob_current_position = (offset > 0) ? offset : 0; break; - } - + } RETURN_TRUE; } /* }}} */ @@ -505,7 +503,7 @@ PHP_FUNCTION(oci_lob_write) zval **tmp, *z_descriptor = getThis(); php_oci_descriptor *descriptor; int data_len; - long write_len = 0; + long write_len = 0; ub4 bytes_written; char *data; @@ -861,7 +859,8 @@ PHP_FUNCTION(oci_lob_export) { zval **tmp, *z_descriptor = getThis(); php_oci_descriptor *descriptor; - char *filename, *buffer; + char *filename; + char *buffer; int filename_len; long start = -1, length = -1, block_length; php_stream *stream; @@ -1026,7 +1025,7 @@ PHP_FUNCTION(oci_lob_close) RETURN_TRUE; } /* }}} */ -#endif +#endif /* {{{ proto object oci_new_descriptor(resource connection [, int type]) Initialize a new empty descriptor LOB/FILE (LOB is default) */ @@ -1249,7 +1248,7 @@ PHP_FUNCTION(oci_field_type_raw) { php_oci_out_column *column; - column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); + column = php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); if (column) { RETURN_LONG(column->data_type); } @@ -1455,7 +1454,7 @@ PHP_FUNCTION(oci_fetch_all) efree(columns); efree(outarrs); - } + } RETURN_LONG(rows); } @@ -1519,17 +1518,15 @@ PHP_FUNCTION(oci_free_statement) Disconnect from database */ PHP_FUNCTION(oci_close) { - /* oci_close for pconnect (if old_oci_close_semantics not set) would - * release the connection back to the client-side session pool (and to the + /* oci_close for pconnect (if old_oci_close_semantics not set) would + * release the connection back to the client-side session pool (and to the * server-side pool if Database Resident Connection Pool is being used). * Subsequent pconnects in the same script are not guaranteed to get the - * same database session. When a persistent connection goes out-of-scope, - * the connection is not released to the session pool and is kept in the Plist + * same database session. */ zval *z_connection; php_oci_connection *connection; - int dummy_type = -1; if (OCI_G(old_oci_close_semantics)) { /* do nothing to keep BC */ @@ -1543,16 +1540,6 @@ PHP_FUNCTION(oci_close) PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); zend_list_delete(connection->rsrc_id); - /* If refcount has fallen to zero(resource id removed from the list), - * Release the OCI session associated with this connection structure back - * to the underlying pool. The connection would be cached in the plist as a - * stub - */ - if(connection->is_persistent && connection->using_spool && !zend_list_find(connection->rsrc_id, &dummy_type)) { - - php_oci_connection_release(connection TSRMLS_CC); - } - ZVAL_NULL(z_connection); RETURN_TRUE; @@ -1728,7 +1715,7 @@ PHP_FUNCTION(oci_password_change) int user_len, pass_old_len, pass_new_len, dbname_len; php_oci_connection *connection; - /* Disable in Safe Mode */ + /* Disable in Safe Mode */ if (PG(safe_mode)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "is disabled in Safe Mode"); RETURN_FALSE; @@ -2188,7 +2175,7 @@ PHP_FUNCTION(oci_new_collection) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|s", &z_connection, &tdo, &tdo_len, &schema, &schema_len) == FAILURE) { return; } - + PHP_OCI_ZVAL_TO_CONNECTION(z_connection, connection); if ( (collection = php_oci_collection_create(connection, tdo, tdo_len, schema, schema_len TSRMLS_CC)) ) { diff --git a/ext/oci8/oci8_lob.c b/ext/oci8/oci8_lob.c index 1b1aff8148..7002d2cf6e 100644 --- a/ext/oci8/oci8_lob.c +++ b/ext/oci8/oci8_lob.c @@ -75,8 +75,8 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ PHP_OCI_CALL_RETURN(OCI_G(errcode), OCIDescriptorAlloc, (connection->env, (dvoid*)&(descriptor->descriptor), descriptor->type, (size_t) 0, (dvoid **) 0)); if (OCI_G(errcode) != OCI_SUCCESS) { - connection->errcode = php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); - PHP_OCI_HANDLE_ERROR(connection, connection->errcode); + OCI_G(errcode) = php_oci_error(OCI_G(err), OCI_G(errcode) TSRMLS_CC); + PHP_OCI_HANDLE_ERROR(connection, OCI_G(errcode)); efree(descriptor); return NULL; } @@ -103,7 +103,7 @@ php_oci_descriptor *php_oci_lob_create (php_oci_connection *connection, long typ } /* }}} */ -/* {{{ php_oci_lob_get_length() +/* {{{ php_oci_lob_get_length() Get length of the LOB. The length is cached so we don't need to ask Oracle every time */ int php_oci_lob_get_length (php_oci_descriptor *descriptor, ub4 *length TSRMLS_DC) { @@ -223,7 +223,7 @@ static inline int php_oci_lob_calculate_buffer(php_oci_descriptor *descriptor, l } /* }}} */ -/* {{{ php_oci_lob_read() +/* {{{ php_oci_lob_read() Read specified portion of the LOB into the buffer */ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long initial_offset, char **data, ub4 *data_len TSRMLS_DC) { @@ -257,7 +257,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini if (length <= 0) { return 0; } - + if (initial_offset > length) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset must be less than size of the LOB"); return 1; @@ -334,16 +334,16 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini connection->svc, connection->err, descriptor->descriptor, - (oraub8 *)&bytes_read, /* IN/OUT bytes toread/read */ - (oraub8 *)&chars_read, /* IN/OUT chars toread/read */ - (oraub8) offset + 1, /* offset (starts with 1) */ + (oraub8 *)&bytes_read, /* IN/OUT bytes toread/read */ + (oraub8 *)&chars_read, /* IN/OUT chars toread/read */ + (oraub8) offset + 1, /* offset (starts with 1) */ (dvoid *) bufp, - (oraub8) buffer_size, /* size of buffer */ + (oraub8) buffer_size, /* size of buffer */ OCI_FIRST_PIECE, (dvoid *)&ctx, - (OCICallbackLobRead2) php_oci_lob_callback, /* callback... */ - (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ - (ub1) descriptor->charset_form /* The character set form of the buffer data. */ + (OCICallbackLobRead2) php_oci_lob_callback, /* callback... */ + (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ + (ub1) descriptor->charset_form /* The character set form of the buffer data. */ ) ); @@ -367,14 +367,14 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini connection->svc, connection->err, descriptor->descriptor, - &bytes_read, /* IN/OUT bytes toread/read */ - offset + 1, /* offset (starts with 1) */ + &bytes_read, /* IN/OUT bytes toread/read */ + offset + 1, /* offset (starts with 1) */ (dvoid *) bufp, - (ub4) buffer_size, /* size of buffer */ + (ub4) buffer_size, /* size of buffer */ (dvoid *)&ctx, - (OCICallbackLobRead) php_oci_lob_callback, /* callback... */ - (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ - (ub1) descriptor->charset_form /* The character set form of the buffer data. */ + (OCICallbackLobRead) php_oci_lob_callback, /* callback... */ + (ub2) descriptor->charset_id, /* The character set ID of the buffer data. */ + (ub1) descriptor->charset_form /* The character set form of the buffer data. */ ) ); @@ -394,7 +394,7 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini return 1; } - descriptor->lob_current_position = (int)offset; + descriptor->lob_current_position = (int)offset; if (descriptor->type == OCI_DTYPE_FILE) { PHP_OCI_CALL_RETURN(connection->errcode, OCILobFileClose, (connection->svc, connection->err, descriptor->descriptor)); @@ -414,11 +414,11 @@ int php_oci_lob_read (php_oci_descriptor *descriptor, long read_length, long ini return 0; } /* }}} */ -/* {{{ php_oci_lob_write() +/* {{{ php_oci_lob_write() Write data to the LOB */ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, int data_len, ub4 *bytes_written TSRMLS_DC) { - OCILobLocator *lob = (OCILobLocator *) descriptor->descriptor; + OCILobLocator *lob = (OCILobLocator *) descriptor->descriptor; php_oci_connection *connection = (php_oci_connection *) descriptor->connection; ub4 lob_length; @@ -439,19 +439,19 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i offset = descriptor->lob_current_position; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobWrite, + PHP_OCI_CALL_RETURN(connection->errcode, 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, + 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 ) ); @@ -477,7 +477,7 @@ int php_oci_lob_write (php_oci_descriptor *descriptor, ub4 offset, char *data, i return 0; } /* }}} */ -/* {{{ php_oci_lob_set_buffering() +/* {{{ php_oci_lob_set_buffering() Turn buffering off/onn for this particular LOB */ int php_oci_lob_set_buffering (php_oci_descriptor *descriptor, int on_off TSRMLS_DC) { @@ -545,7 +545,7 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobCopy, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobCopy, ( connection->svc, connection->err, @@ -566,7 +566,7 @@ int php_oci_lob_copy (php_oci_descriptor *descriptor_dest, php_oci_descriptor *d return 0; } /* }}} */ -/* {{{ php_oci_lob_close() +/* {{{ php_oci_lob_close() Close LOB */ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) { @@ -589,7 +589,7 @@ int php_oci_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) return 0; } /* }}} */ -/* {{{ php_oci_temp_lob_close() +/* {{{ php_oci_temp_lob_close() Close Temporary LOB */ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) { @@ -617,7 +617,7 @@ int php_oci_temp_lob_close (php_oci_descriptor *descriptor TSRMLS_DC) } /* }}} */ -/* {{{ php_oci_lob_flush() +/* {{{ php_oci_lob_flush() Flush buffers for the LOB (only if they have been used) */ int php_oci_lob_flush(php_oci_descriptor *descriptor, long flush_flag TSRMLS_DC) { @@ -710,20 +710,20 @@ int php_oci_lob_import (php_oci_descriptor *descriptor, char *filename TSRMLS_DC } while ((loblen = read(fp, &buf, sizeof(buf))) > 0) { - PHP_OCI_CALL_RETURN(connection->errcode, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobWrite, ( - connection->svc, - connection->err, - lob, - &loblen, - offset, - (dvoid *) &buf, - loblen, - OCI_ONE_PIECE, - (dvoid *)0, - (OCICallbackLobWrite) 0, - (ub2) descriptor->charset_id, + connection->svc, + connection->err, + lob, + &loblen, + offset, + (dvoid *) &buf, + loblen, + OCI_ONE_PIECE, + (dvoid *)0, + (OCICallbackLobWrite) 0, + (ub2) descriptor->charset_id, (ub1) descriptor->charset_form ) ); @@ -844,7 +844,7 @@ int php_oci_lob_erase (php_oci_descriptor *descriptor, long offset, ub4 length, return 0; } /* }}} */ -/* {{{ php_oci_lob_is_equal() +/* {{{ php_oci_lob_is_equal() Compare two LOB descriptors and figure out if they are pointing to the same LOB */ int php_oci_lob_is_equal (php_oci_descriptor *descriptor_first, php_oci_descriptor *descriptor_second, boolean *result TSRMLS_DC) { @@ -862,12 +862,12 @@ int php_oci_lob_is_equal (php_oci_descriptor *descriptor_first, php_oci_descript return 0; } /* }}} */ -/* {{{ php_oci_lob_write_tmp() +/* {{{ php_oci_lob_write_tmp() Create temporary LOB and write data to it */ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, ub1 type, char *data, int data_len TSRMLS_DC) { php_oci_connection *connection = descriptor->connection; - OCILobLocator *lob = descriptor->descriptor; + OCILobLocator *lob = descriptor->descriptor; ub4 bytes_written = 0; switch (type) { @@ -885,7 +885,7 @@ int php_oci_lob_write_tmp (php_oci_descriptor *descriptor, ub1 type, char *data, return 1; } - PHP_OCI_CALL_RETURN(connection->errcode, OCILobCreateTemporary, + PHP_OCI_CALL_RETURN(connection->errcode, OCILobCreateTemporary, ( connection->svc, connection->err, diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 4d4004a44b..91533f6aa7 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -41,7 +41,7 @@ #include "php_oci8.h" #include "php_oci8_int.h" -/* {{{ php_oci_statement_create() +/* {{{ php_oci_statement_create() Create statemend handle and allocate necessary resources */ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, char *query, int query_len TSRMLS_DC) { @@ -62,7 +62,7 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha if (query_len > 0) { #if HAVE_OCI_STMT_PREPARE2 - PHP_OCI_CALL_RETURN(connection->errcode, OCIStmtPrepare2, + PHP_OCI_CALL_RETURN(connection->errcode, OCIStmtPrepare2, ( connection->svc, &(statement->stmt), @@ -124,7 +124,7 @@ php_oci_statement *php_oci_statement_create (php_oci_connection *connection, cha /* {{{ php_oci_statement_set_prefetch() Set prefetch buffer size for the statement (we're assuming that one row is ~1K sized) */ int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRMLS_DC) -{ +{ ub4 prefetch = size; if (size < 1) { @@ -144,7 +144,7 @@ int php_oci_statement_set_prefetch(php_oci_statement *statement, long size TSRML } /* }}} */ -/* {{{ php_oci_statement_fetch() +/* {{{ php_oci_statement_fetch() Fetch a row from the statement */ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) { @@ -192,7 +192,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) while (statement->errcode == OCI_NEED_DATA) { if (piecewisecols) { PHP_OCI_CALL_RETURN(statement->errcode, - OCIStmtGetPieceInfo, + OCIStmtGetPieceInfo, ( statement->stmt, statement->err, @@ -233,7 +233,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) } } - PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); + PHP_OCI_CALL_RETURN(statement->errcode, OCIStmtFetch, (statement->stmt, statement->err, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); if (piecewisecols) { for (i = 0; i < statement->ncolumns; i++) { @@ -275,7 +275,7 @@ int php_oci_statement_fetch(php_oci_statement *statement, ub4 nrows TSRMLS_DC) } /* }}} */ -/* {{{ php_oci_statement_get_column() +/* {{{ php_oci_statement_get_column() Get column from the result set */ php_oci_out_column *php_oci_statement_get_column(php_oci_statement *statement, long column_index, char *column_name, int column_name_len TSRMLS_DC) { @@ -323,7 +323,7 @@ sb4 php_oci_define_callback(dvoid *ctx, OCIDefine *define, ub4 iter, dvoid **buf php_oci_statement *nested_stmt; TSRMLS_FETCH(); - nested_stmt = php_oci_statement_create(outcol->statement->connection, NULL, 0 TSRMLS_CC); + nested_stmt = php_oci_statement_create(outcol->statement->connection, NULL, 0 TSRMLS_CC); if (!nested_stmt) { return OCI_ERROR; } @@ -341,7 +341,7 @@ sb4 php_oci_define_callback(dvoid *ctx, OCIDefine *define, ub4 iter, dvoid **buf } break; case SQLT_RDD: - case SQLT_BLOB: + case SQLT_BLOB: case SQLT_CLOB: case SQLT_BFILE: { php_oci_descriptor *descr; @@ -377,7 +377,7 @@ sb4 php_oci_define_callback(dvoid *ctx, OCIDefine *define, ub4 iter, dvoid **buf } /* }}} */ -/* {{{ php_oci_statement_execute() +/* {{{ php_oci_statement_execute() Execute statement */ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) { @@ -421,8 +421,8 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) iters = 1; } - if (statement->last_query) { - /* if we execute refcursors we don't have a query and + if (statement->last_query) { + /* if we execute refcursors we don't have a query and we don't want to execute!!! */ if (statement->binds) { @@ -464,7 +464,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) if (statement->errcode != OCI_SUCCESS) { statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); - return 1; + return 1; } statement->ncolumns = colcount; @@ -476,7 +476,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) efree(statement->columns); /* out of memory */ return 1; - } + } /* get column */ PHP_OCI_CALL_RETURN(statement->errcode, OCIParamGet, ((dvoid *)statement->stmt, OCI_HTYPE_STMT, statement->err, (dvoid**)¶m, counter)); @@ -507,7 +507,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) return 1; } - /* get character set id */ + /* get character set id */ PHP_OCI_CALL_RETURN(statement->errcode, OCIAttrGet, ((dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->charset_id, (ub4 *)0, OCI_ATTR_CHARSET_ID, statement->err)); if (statement->errcode != OCI_SUCCESS) { @@ -524,7 +524,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) PHP_OCI_CALL(OCIDescriptorFree, (param, OCI_DTYPE_PARAM)); statement->errcode = php_oci_error(statement->err, statement->errcode TSRMLS_CC); PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); - return 1; + return 1; } outcol->storage_size4 = outcol->data_size; @@ -584,9 +584,9 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) dynamic = OCI_DYNAMIC_FETCH; break; - case SQLT_RDD: /* ROWID */ - case SQLT_BLOB: /* binary LOB */ - case SQLT_CLOB: /* character LOB */ + case SQLT_RDD: /* ROWID */ + case SQLT_BLOB: /* binary LOB */ + case SQLT_CLOB: /* character LOB */ case SQLT_BFILE: /* binary file LOB */ outcol->statement = statement; /* parent handle */ @@ -649,7 +649,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } if (dynamic == OCI_DYNAMIC_FETCH) { - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIDefineByPos, ( statement->stmt, /* IN/OUT handle to the requested SQL query */ @@ -667,10 +667,10 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) ); } else { - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIDefineByPos, ( - statement->stmt, /* IN/OUT handle to the requested SQL query */ + statement->stmt, /* IN/OUT handle to the requested SQL query */ (OCIDefine **)&outcol->oci_define, /* IN/OUT pointer to a pointer to a define handle */ statement->err, /* IN/OUT An error handle */ counter, /* IN position in the select list */ @@ -695,11 +695,11 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) /* additional OCIDefineDynamic() call */ switch (outcol->data_type) { case SQLT_RSET: - case SQLT_RDD: - case SQLT_BLOB: + case SQLT_RDD: + case SQLT_BLOB: case SQLT_CLOB: case SQLT_BFILE: - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIDefineDynamic, ( outcol->oci_define, @@ -718,7 +718,7 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode TSRMLS_DC) } /* }}} */ -/* {{{ php_oci_statement_cancel() +/* {{{ php_oci_statement_cancel() Cancel statement */ int php_oci_statement_cancel(php_oci_statement *statement TSRMLS_DC) { @@ -727,11 +727,11 @@ int php_oci_statement_cancel(php_oci_statement *statement TSRMLS_DC) } /* }}} */ -/* {{{ php_oci_statement_free() +/* {{{ php_oci_statement_free() Destroy statement handle and free associated resources */ void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC) { - if (statement->stmt) { + if (statement->stmt) { #if HAVE_OCI_STMT_PREPARE2 if (statement->last_query_len) { /* FIXME: magical */ PHP_OCI_CALL(OCIStmtRelease, (statement->stmt, statement->err, NULL, 0, statement->errcode ? OCI_STRLS_CACHE_DELETE : OCI_DEFAULT)); @@ -778,7 +778,7 @@ void php_oci_statement_free(php_oci_statement *statement TSRMLS_DC) OCI_G(num_statements)--; } /* }}} */ -/* {{{ php_oci_bind_pre_exec() +/* {{{ php_oci_bind_pre_exec() Helper function */ int php_oci_bind_pre_exec(void *data TSRMLS_DC) { @@ -786,13 +786,13 @@ int php_oci_bind_pre_exec(void *data TSRMLS_DC) /* reset all bind stuff to a normal state..-. */ - bind->indicator = 0; + bind->indicator = 0; return 0; } /* }}} */ -/* {{{ php_oci_bind_post_exec() +/* {{{ php_oci_bind_post_exec() Helper function */ int php_oci_bind_post_exec(void *data TSRMLS_DC) { @@ -898,19 +898,19 @@ int php_oci_bind_post_exec(void *data TSRMLS_DC) } /* }}} */ -/* {{{ php_oci_bind_by_name() +/* {{{ php_oci_bind_by_name() Bind zval to the given placeholder */ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, zval* var, long maxlength, long type TSRMLS_DC) { -#ifdef PHP_OCI8_HAVE_COLLECTIONS +#ifdef PHP_OCI8_HAVE_COLLECTIONS php_oci_collection *bind_collection = NULL; #endif php_oci_descriptor *bind_descriptor = NULL; - php_oci_statement *bind_statement = NULL; - dvoid *oci_desc = NULL; - /* dvoid *php_oci_collection = NULL; */ - OCIStmt *oci_stmt = NULL; - dvoid *bind_data = NULL; + php_oci_statement *bind_statement = NULL; + dvoid *oci_desc = NULL; + /* dvoid *php_oci_collection = NULL; */ + OCIStmt *oci_stmt = NULL; + dvoid *bind_data = NULL; php_oci_bind bind, *old_bind, *bindp; int mode = OCI_DATA_AT_EXEC; sb4 value_sz = -1; @@ -1001,7 +1001,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, break; } - if (value_sz == 0) { + if (value_sz == 0) { value_sz = 1; } @@ -1024,25 +1024,25 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, bindp->statement = oci_stmt; bindp->parent_statement = statement; bindp->zval = var; - zval_add_ref(&var); + zval_add_ref(&var); - PHP_OCI_CALL_RETURN(statement->errcode, + PHP_OCI_CALL_RETURN(statement->errcode, OCIBindByName, ( - statement->stmt, /* statement handle */ - (OCIBind **)&bindp->bind, /* bind hdl (will alloc) */ - statement->err, /* error handle */ - (text*) name, /* placeholder name */ - name_len, /* placeholder length */ - (dvoid *)bind_data, /* in/out data */ + statement->stmt, /* statement handle */ + (OCIBind **)&bindp->bind, /* bind hdl (will alloc) */ + statement->err, /* error handle */ + (text*) name, /* placeholder name */ + name_len, /* placeholder length */ + (dvoid *)bind_data, /* in/out data */ value_sz, /* PHP_OCI_MAX_DATA_SIZE, */ /* max size of input/output data */ - (ub2)type, /* in/out data type */ - (dvoid *)&bindp->indicator, /* indicator (ignored) */ - (ub2 *)0, /* size array (ignored) */ - (ub2 *)&bindp->retcode, /* return code (ignored) */ - (ub4)0, /* maxarr_len (PL/SQL only?) */ - (ub4 *)0, /* actual array size (PL/SQL only?) */ - mode /* mode */ + (ub2)type, /* in/out data type */ + (dvoid *)&bindp->indicator, /* indicator (ignored) */ + (ub2 *)0, /* size array (ignored) */ + (ub2 *)&bindp->retcode, /* return code (ignored) */ + (ub4)0, /* maxarr_len (PL/SQL only?) */ + (ub4 *)0, /* actual array size (PL/SQL only?) */ + mode /* mode */ ) ); @@ -1053,7 +1053,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, } if (mode == OCI_DATA_AT_EXEC) { - PHP_OCI_CALL_RETURN(statement->errcode, OCIBindDynamic, + PHP_OCI_CALL_RETURN(statement->errcode, OCIBindDynamic, ( bindp->bind, statement->err, @@ -1074,7 +1074,7 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, #ifdef PHP_OCI8_HAVE_COLLECTIONS if (type == SQLT_NTY) { /* Bind object */ - PHP_OCI_CALL_RETURN(statement->errcode, OCIBindObject, + PHP_OCI_CALL_RETURN(statement->errcode, OCIBindObject, ( bindp->bind, statement->err, @@ -1097,17 +1097,17 @@ int php_oci_bind_by_name(php_oci_statement *statement, char *name, int name_len, return 0; } /* }}} */ -/* {{{ php_oci_bind_in_callback() +/* {{{ php_oci_bind_in_callback() Callback used when binding LOBs and VARCHARs */ sb4 php_oci_bind_in_callback( - dvoid *ictxp, /* context pointer */ - OCIBind *bindp, /* bind handle */ - ub4 iter, /* 0-based execute iteration value */ - ub4 index, /* index of current array for PL/SQL or row index for SQL */ - dvoid **bufpp, /* pointer to data */ - ub4 *alenp, /* size after value/piece has been read */ - ub1 *piecep, /* which piece */ - dvoid **indpp) /* indicator value */ + dvoid *ictxp, /* context pointer */ + OCIBind *bindp, /* bind handle */ + ub4 iter, /* 0-based execute iteration value */ + ub4 index, /* index of current array for PL/SQL or row index for SQL */ + dvoid **bufpp, /* pointer to data */ + ub4 *alenp, /* size after value/piece has been read */ + ub1 *piecep, /* which piece */ + dvoid **indpp) /* indicator value */ { php_oci_bind *phpbind; zval *val; @@ -1124,9 +1124,9 @@ sb4 php_oci_bind_in_callback( *bufpp = 0; *alenp = -1; *indpp = (dvoid *)&phpbind->indicator; - } else if ((phpbind->descriptor == 0) && (phpbind->statement == 0)) { + } else if ((phpbind->descriptor == 0) && (phpbind->statement == 0)) { /* "normal string bind */ - convert_to_string(val); + convert_to_string(val); *bufpp = Z_STRVAL_P(val); *alenp = Z_STRLEN_P(val); @@ -1136,7 +1136,7 @@ sb4 php_oci_bind_in_callback( *bufpp = phpbind->statement; *alenp = -1; /* seems to be allright */ *indpp = (dvoid *)&phpbind->indicator; - } else { + } else { /* descriptor bind */ *bufpp = phpbind->descriptor; *alenp = -1; /* seems to be allright */ @@ -1151,15 +1151,15 @@ sb4 php_oci_bind_in_callback( /* {{{ php_oci_bind_out_callback() Callback used when binding LOBs and VARCHARs */ sb4 php_oci_bind_out_callback( - dvoid *octxp, /* context pointer */ - OCIBind *bindp, /* bind handle */ - ub4 iter, /* 0-based execute iteration value */ - ub4 index, /* index of current array for PL/SQL or row index for SQL */ - dvoid **bufpp, /* pointer to data */ - ub4 **alenpp, /* size after value/piece has been read */ - ub1 *piecep, /* which piece */ - dvoid **indpp, /* indicator value */ - ub2 **rcodepp) /* return code */ + dvoid *octxp, /* context pointer */ + OCIBind *bindp, /* bind handle */ + ub4 iter, /* 0-based execute iteration value */ + ub4 index, /* index of current array for PL/SQL or row index for SQL */ + dvoid **bufpp, /* pointer to data */ + ub4 **alenpp, /* size after value/piece has been read */ + ub1 *piecep, /* which piece */ + dvoid **indpp, /* indicator value */ + ub2 **rcodepp) /* return code */ { php_oci_bind *phpbind; zval *val; @@ -1199,7 +1199,7 @@ sb4 php_oci_bind_out_callback( Z_STRVAL_P(val) = ecalloc(1, Z_STRLEN_P(phpbind->zval) + 1); /* XXX we assume that zend-zval len has 4 bytes */ - *alenpp = (ub4*) &Z_STRLEN_P(phpbind->zval); + *alenpp = (ub4*) &Z_STRLEN_P(phpbind->zval); *bufpp = Z_STRVAL_P(phpbind->zval); *piecep = OCI_ONE_PIECE; *rcodepp = &phpbind->retcode; @@ -1211,7 +1211,7 @@ sb4 php_oci_bind_out_callback( } /* }}} */ -/* {{{ php_oci_statement_get_column_helper() +/* {{{ php_oci_statement_get_column_helper() Helper function to get column by name and index */ php_oci_out_column *php_oci_statement_get_column_helper(INTERNAL_FUNCTION_PARAMETERS, int need_data) { @@ -1277,7 +1277,7 @@ int php_oci_statement_get_type(php_oci_statement *statement, ub2 *type TSRMLS_DC return 0; } /* }}} */ -/* {{{ php_oci_statement_get_numrows() +/* {{{ php_oci_statement_get_numrows() Get the number of rows fetched to the clientside (NOT the number of rows in the result set) */ int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSRMLS_DC) { @@ -1298,7 +1298,7 @@ int php_oci_statement_get_numrows(php_oci_statement *statement, ub4 *numrows TSR return 0; } /* }}} */ -/* {{{ php_oci_bind_array_by_name() +/* {{{ php_oci_bind_array_by_name() Bind arrays to PL/SQL types */ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int name_len, zval* var, long max_table_length, long maxlength, long type TSRMLS_DC) { @@ -1363,15 +1363,15 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam bindp->array.type = type; zval_add_ref(&var); - PHP_OCI_CALL_RETURN(statement->errcode, - OCIBindByName, + PHP_OCI_CALL_RETURN(statement->errcode, + OCIBindByName, ( statement->stmt, (OCIBind **)&bindp->bind, statement->err, (text *)name, name_len, - (dvoid *) bindp->array.elements, + (dvoid *) bindp->array.elements, (sb4) bind->array.max_length, type, (dvoid *)bindp->array.indicators, @@ -1394,7 +1394,7 @@ int php_oci_bind_array_by_name(php_oci_statement *statement, char *name, int nam return 0; } /* }}} */ -/* {{{ php_oci_bind_array_helper_string() +/* {{{ php_oci_bind_array_helper_string() Bind arrays to PL/SQL types */ php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, long maxlength TSRMLS_DC) { @@ -1432,7 +1432,7 @@ php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, for (i = 0; i < bind->array.current_length; i++) { if (zend_hash_get_current_data(hash, (void **) &entry) != FAILURE) { convert_to_string_ex(entry); - bind->array.element_lengths[i] = Z_STRLEN_PP(entry); + bind->array.element_lengths[i] = Z_STRLEN_PP(entry); if (Z_STRLEN_PP(entry) == 0) { bind->array.indicators[i] = -1; } @@ -1445,7 +1445,7 @@ php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, zend_hash_internal_pointer_reset(hash); for (i = 0; i < max_table_length; i++) { if ((i < bind->array.current_length) && (zend_hash_get_current_data(hash, (void **) &entry) != FAILURE)) { - int element_length; + int element_length; convert_to_string_ex(entry); element_length = (maxlength > Z_STRLEN_PP(entry)) ? Z_STRLEN_PP(entry) : maxlength; @@ -1463,7 +1463,7 @@ php_oci_bind *php_oci_bind_array_helper_string(zval* var, long max_table_length, return bind; } /* }}} */ -/* {{{ php_oci_bind_array_helper_number() +/* {{{ php_oci_bind_array_helper_number() Bind arrays to PL/SQL types */ php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length TSRMLS_DC) { @@ -1501,7 +1501,7 @@ php_oci_bind *php_oci_bind_array_helper_number(zval* var, long max_table_length return bind; } /* }}} */ -/* {{{ php_oci_bind_array_helper_double() +/* {{{ php_oci_bind_array_helper_double() Bind arrays to PL/SQL types */ php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length TSRMLS_DC) { @@ -1539,7 +1539,7 @@ php_oci_bind *php_oci_bind_array_helper_double(zval* var, long max_table_length return bind; } /* }}} */ -/* {{{ php_oci_bind_array_helper_date() +/* {{{ php_oci_bind_array_helper_date() Bind arrays to PL/SQL types */ php_oci_bind *php_oci_bind_array_helper_date(zval* var, long max_table_length, php_oci_connection *connection TSRMLS_DC) { diff --git a/ext/oci8/package2.xml b/ext/oci8/package2.xml index b38924a49f..9ac8b494c2 100644 --- a/ext/oci8/package2.xml +++ b/ext/oci8/package2.xml @@ -6,8 +6,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> oci8 pecl.php.net OCI8 functions - These functions allow you to access Oracle database servers using -the Oracle Call Interface (OCI8). + These functions allow you to access Oracle database servers using the Oracle Call Interface (OCI8). Antony Dovgal @@ -19,13 +18,13 @@ the Oracle Call Interface (OCI8). Wez Furlong wez wez@php.net - yes + no Andi Gutmans andi andi@zend.com - yes + no Christopher Jones @@ -33,26 +32,25 @@ the Oracle Call Interface (OCI8). sixd@php.net yes - 2007-10-05 - + + 2008-04-17 + - 1.3.1 - 1.3.1 + 1.3.2 + 1.3.2 beta beta PHP - Fixed bug #44113 (New collection creation can fail with OCI-22303) -Fixed bug #42841 (Crash with REF CURSORS when statement caching enabled) -Fixed bug #42496 (Cursor leak selecting LOBs -Fixed bug #43497 (Temporary LOB leak) -Fixed PECL bug #12431 (ping functionality is broken) -Allow compilation with 64bit Instant Client RPMs -Allow -with-oci8=instantclient with no directory specified look for RPM install + Refine DRCP connection pooling functionality +Do scope-end release for oci_pconnect (oci8.old_oci_close_semantics=1 gives old behavior) +Fixed bug #44372 (compilation with Oracle 10gR1 libraries) +Fixed PECL bug #12431 (PEAR install using x86_64 RPM builds) +Allow builds with PHP 4.3.9 onwards @@ -79,6 +77,10 @@ Refine DRCP connection pooling functionality + + + + @@ -98,14 +100,20 @@ Refine DRCP connection pooling functionality + + + + + + @@ -168,6 +176,7 @@ Refine DRCP connection pooling functionality + @@ -180,6 +189,9 @@ Refine DRCP connection pooling functionality + + + @@ -192,6 +204,7 @@ Refine DRCP connection pooling functionality + @@ -261,6 +274,7 @@ Refine DRCP connection pooling functionality + @@ -277,6 +291,7 @@ Refine DRCP connection pooling functionality + diff --git a/ext/oci8/php_oci8.h b/ext/oci8/php_oci8.h index 2b4ca2b44d..9646f96b44 100644 --- a/ext/oci8/php_oci8.h +++ b/ext/oci8/php_oci8.h @@ -36,16 +36,17 @@ #endif -/* +/* * The version of the OCI8 extension. */ #ifdef PHP_OCI8_VERSION /* The definition of PHP_OCI8_VERSION changed in PHP 5.3 and building - * this code with PHP 5.2 and earlier (i.e. from PECL) might conflict + * this code with PHP 5.2 and earlier (e.g. when using OCI8 from PECL) + * will conflict. */ #undef PHP_OCI8_VERSION #endif -#define PHP_OCI8_VERSION "1.3.1 Beta" +#define PHP_OCI8_VERSION "1.3.2 Beta" extern zend_module_entry oci8_module_entry; #define phpext_oci8_ptr &oci8_module_entry @@ -70,5 +71,3 @@ PHP_MINFO_FUNCTION(oci); * c-basic-offset: 4 * End: */ - - diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index 2331f08fa9..13e3149c4f 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -257,13 +257,22 @@ typedef struct { /* php_oci_out_column {{{ */ OCI_G(in_call) = 0; \ } while (0) +/* Check for errors that indicate the connection to the DB is no + * longer valid. If it isn't, then the PHP connection is marked to be + * reopened by the next PHP OCI8 connect command. This is most useful + * for persistent connections. The error number list is not + * exclusive. The error number comparisons and the + * OCI_ATTR_SERVER_STATUS check are done for maximum cross-version + * compatibility. In the far future, only the attribute check will be + * needed. + */ #define PHP_OCI_HANDLE_ERROR(connection, errcode) \ do { \ switch (errcode) { \ case 1013: \ zend_bailout(); \ break; \ - case 22: \ + case 22: \ case 378: \ case 602: \ case 603: \ @@ -286,7 +295,7 @@ typedef struct { /* php_oci_out_column {{{ */ (connection)->is_open = 0; \ break; \ default: \ - { /* do both numeric checks (above) and the status check for maximum version compatibility */ \ + { \ ub4 serverStatus = OCI_SERVER_NORMAL; \ PHP_OCI_CALL(OCIAttrGet, ((dvoid *)(connection)->server, OCI_HTYPE_SERVER, (dvoid *)&serverStatus, \ (ub4 *)0, OCI_ATTR_SERVER_STATUS, (connection)->err)); \ @@ -461,7 +470,6 @@ ZEND_BEGIN_MODULE_GLOBALS(oci) /* {{{ */ zend_bool old_oci_close_semantics; /* old_oci_close_semantics flag (to determine the way oci_close() should behave) */ int shutdown; /* in shutdown flag */ - int request_shutdown; /* in request shutdown flag */ OCIEnv *env; /* global environment handle */ diff --git a/ext/oci8/tests/bug43497.phpt b/ext/oci8/tests/bug43497.phpt index 908fe58972..0fc6a97b35 100644 --- a/ext/oci8/tests/bug43497.phpt +++ b/ext/oci8/tests/bug43497.phpt @@ -1,7 +1,16 @@ --TEST-- Bug #43497 (OCI8 XML/getClobVal aka temporary LOBs leak UGA memory) --SKIPIF-- - + 9/', $phpinfo); +if ($ov === 1) { + die ("skip expected output only valid for Oracle clients from 10g onwards"); +} +?> --FILE-- 9.2/', $phpinfo); +if ($ov !== 1) { + die ("skip expected output only valid for Oracle 9.2 clients"); +} +?> +--FILE-- +free(); // cleanup properly + ++$cntchk; + } + } + echo "Loop count check = $cntchk\n"; +} + +// Read all XML data using explicit LOB locator but without freeing the temp lobs +function readxmltab_ex_nofree($c) +{ + $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab"); + + $cntchk = 0; + if (oci_execute($stmt)) { + while ($result = oci_fetch_array($stmt, OCI_NUM)) { + ++$cntchk; + } + } + echo "Loop count check = $cntchk\n"; +} + +// Read all XML data using implicit LOB locator +function readxmltab_im($c) +{ + $stmt = oci_parse($c, "select extract(xml, '/').getclobval() from bug43497_tab"); + + $cntchk = 0; + if (oci_execute($stmt)) { + while ($result = oci_fetch_array($stmt, OCI_NUM+OCI_RETURN_LOBS)) { + ++$cntchk; + } + } + echo "Loop count check = $cntchk\n"; +} + +function createxmltab($c) // create table w/ field of XML type +{ + @dropxmltab($c); + $stmt = oci_parse($c, "create table bug43497_tab (id number primary key, xml xmltype)"); + oci_execute($stmt); +} + +function dropxmltab($c) // delete table +{ + $stmt = oci_parse($c, "drop table bug43497_tab"); + oci_execute($stmt); +} + + +function fillxmltab($c) +{ + for ($id = 1; $id <= 100; $id++) { + + // create an XML element string with random data + $s = ""; + for ($j = 0; $j < 128; $j++) { + $s .= rand(); + } + $s .= "\n"; + for ($j = 0; $j < 4; $j++) { + $s .= $s; + } + $data = "" . $s . ""; + + // insert XML data into database + + $stmt = oci_parse($c, "insert into bug43497_tab(id, xml) values (:id, sys.xmltype.createxml(:xml))"); + oci_bind_by_name($stmt, ":id", $id); + $clob = oci_new_descriptor($c, OCI_D_LOB); + oci_bind_by_name($stmt, ":xml", $clob, -1, OCI_B_CLOB); + $clob->writetemporary($data); + oci_execute($stmt); + + $clob->close(); + $clob->free(); + } +} + + +// Initialize + +createxmltab($c); +fillxmltab($c); + +// Run Test + +$sid = sessionid($c); + +echo "Explicit LOB use\n"; +for ($i = 1; $i <= 10; $i++) { + echo "\nRun = " . $i . "\n"; + echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; + readxmltab_ex($c); +} + +echo "\nImplicit LOB use\n"; +for ($i = 1; $i <= 10; $i++) { + echo "\nRun = " . $i . "\n"; + echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; + readxmltab_im($c); +} + +echo "\nExplicit LOB with no free (i.e. a temp lob leak)\n"; +for ($i = 1; $i <= 10; $i++) { + echo "\nRun = " . $i . "\n"; + echo "Temporary LOBs = " . templobs($c, $sid) . "\n"; + readxmltab_ex_nofree($c); +} + + + +// Cleanup + +dropxmltab($c); + +oci_close($c); + +echo "Done\n"; +?> +--EXPECT-- +Explicit LOB use + +Run = 1 +Temporary LOBs = 0 +Loop count check = 100 + +Run = 2 +Temporary LOBs = 100 +Loop count check = 100 + +Run = 3 +Temporary LOBs = 200 +Loop count check = 100 + +Run = 4 +Temporary LOBs = 300 +Loop count check = 100 + +Run = 5 +Temporary LOBs = 400 +Loop count check = 100 + +Run = 6 +Temporary LOBs = 500 +Loop count check = 100 + +Run = 7 +Temporary LOBs = 600 +Loop count check = 100 + +Run = 8 +Temporary LOBs = 700 +Loop count check = 100 + +Run = 9 +Temporary LOBs = 800 +Loop count check = 100 + +Run = 10 +Temporary LOBs = 900 +Loop count check = 100 + +Implicit LOB use + +Run = 1 +Temporary LOBs = 1000 +Loop count check = 100 + +Run = 2 +Temporary LOBs = 1100 +Loop count check = 100 + +Run = 3 +Temporary LOBs = 1200 +Loop count check = 100 + +Run = 4 +Temporary LOBs = 1300 +Loop count check = 100 + +Run = 5 +Temporary LOBs = 1400 +Loop count check = 100 + +Run = 6 +Temporary LOBs = 1500 +Loop count check = 100 + +Run = 7 +Temporary LOBs = 1600 +Loop count check = 100 + +Run = 8 +Temporary LOBs = 1700 +Loop count check = 100 + +Run = 9 +Temporary LOBs = 1800 +Loop count check = 100 + +Run = 10 +Temporary LOBs = 1900 +Loop count check = 100 + +Explicit LOB with no free (i.e. a temp lob leak) + +Run = 1 +Temporary LOBs = 2000 +Loop count check = 100 + +Run = 2 +Temporary LOBs = 2100 +Loop count check = 100 + +Run = 3 +Temporary LOBs = 2200 +Loop count check = 100 + +Run = 4 +Temporary LOBs = 2300 +Loop count check = 100 + +Run = 5 +Temporary LOBs = 2400 +Loop count check = 100 + +Run = 6 +Temporary LOBs = 2500 +Loop count check = 100 + +Run = 7 +Temporary LOBs = 2600 +Loop count check = 100 + +Run = 8 +Temporary LOBs = 2700 +Loop count check = 100 + +Run = 9 +Temporary LOBs = 2800 +Loop count check = 100 + +Run = 10 +Temporary LOBs = 2900 +Loop count check = 100 +Done \ No newline at end of file diff --git a/ext/oci8/tests/bug44113.phpt b/ext/oci8/tests/bug44113.phpt index 646f09b7c7..d6c2978635 100644 --- a/ext/oci8/tests/bug44113.phpt +++ b/ext/oci8/tests/bug44113.phpt @@ -5,7 +5,7 @@ Bug #44113 (New collection creation can fail with OCI-22303) --FILE-- --FILE-- + --INI-- oci8.connection_class=test oci8.old_oci_close_semantics=0 diff --git a/ext/oci8/tests/drcp_scope1.phpt b/ext/oci8/tests/drcp_scope1.phpt index 01b0a4271e..57f1abe327 100644 --- a/ext/oci8/tests/drcp_scope1.phpt +++ b/ext/oci8/tests/drcp_scope1.phpt @@ -19,6 +19,7 @@ require dirname(__FILE__)."/details.inc"; // Create the table $c = oci_new_connect($user,$password,$dbase); +@drcp_drop_table($c); drcp_create_table($c); // OCI_NEW_CONNECT diff --git a/ext/oci8/tests/drcp_scope2.phpt b/ext/oci8/tests/drcp_scope2.phpt index cb5dcd1ac1..b72e00dbb0 100644 --- a/ext/oci8/tests/drcp_scope2.phpt +++ b/ext/oci8/tests/drcp_scope2.phpt @@ -19,6 +19,7 @@ require dirname(__FILE__)."/details.inc"; // Create the table $c = oci_new_connect($user,$password,$dbase); +@drcp_drop_table($c); drcp_create_table($c); // OCI_NEW_CONNECT diff --git a/ext/oci8/tests/drcp_scope3.phpt b/ext/oci8/tests/drcp_scope3.phpt new file mode 100644 index 0000000000..b448a518ad --- /dev/null +++ b/ext/oci8/tests/drcp_scope3.phpt @@ -0,0 +1,61 @@ +--TEST-- +DRCP: oci_pconnect() with scope end when oci8.old_oci_close_semantics ON +--SKIPIF-- + +--INI-- +oci8.old_oci_close_semantics=1 +--FILE-- + +--EXPECTF-- +This is with a OCI_PCONNECT +resource(%d) of type (oci8 persistent connection) +Update done-- DEPT value has been set to NEWDEPT +resource(%d) of type (oci8 persistent connection) +The value of DEPT for id 105 is NEWDEPT + +Warning: oci_execute(): ORA-00054: %s +Done \ No newline at end of file diff --git a/ext/oci8/tests/drcp_scope4.phpt b/ext/oci8/tests/drcp_scope4.phpt new file mode 100644 index 0000000000..07110bca0e --- /dev/null +++ b/ext/oci8/tests/drcp_scope4.phpt @@ -0,0 +1,57 @@ +--TEST-- +DRCP: oci_pconnect() with scope end when oci8.old_oci_close_semantics OFF +--SKIPIF-- + +--INI-- +oci8.old_oci_close_semantics=0 +--FILE-- + +--EXPECTF-- +This is with a OCI_PCONNECT +resource(%d) of type (oci8 persistent connection) +Update done-- DEPT value has been set to NEWDEPT +resource(%d) of type (oci8 persistent connection) +The value of DEPT for id 105 is HR +Done diff --git a/ext/oci8/tests/drcp_scope5.phpt b/ext/oci8/tests/drcp_scope5.phpt new file mode 100644 index 0000000000..832e6aa8cb --- /dev/null +++ b/ext/oci8/tests/drcp_scope5.phpt @@ -0,0 +1,63 @@ +--TEST-- +DRCP: oci_pconnect() with scope end when oci8.old_oci_close_semantics ON +--SKIPIF-- + +--INI-- +oci8.old_oci_close_semantics=1 +--FILE-- + +--EXPECTF-- +This is with a OCI_PCONNECT +resource(%d) of type (oci8 persistent connection) +Update done-- DEPT value has been set to NEWDEPT +resource(%d) of type (oci8 persistent connection) +The value of DEPT for id 105 is NEWDEPT +Done \ No newline at end of file diff --git a/ext/oci8/tests/password.phpt b/ext/oci8/tests/password.phpt index c9ef4c5387..7133d8bae8 100644 --- a/ext/oci8/tests/password.phpt +++ b/ext/oci8/tests/password.phpt @@ -1,28 +1,75 @@ --TEST-- -oci_password_change() +oci_password_change() for non-persistent connections --SKIPIF-- - --FILE-- @@ -28,34 +29,19 @@ foreach ($stmts as $sql) { // Connect (persistent) and change the password $c1 = oci_pconnect("testuser", "testuserpwd", $dbase); var_dump($c1); - -ob_start(); -var_dump($c1); -$r1 = ob_get_clean(); -preg_match("/resource\(([0-9]*)\) of.*/", $r1, $matches); -$rn1 = $matches[0]; /* resource number */ +$rn1 = (int)$c1; oci_password_change($c1, "testuser", "testuserpwd", "testuserpwd2"); // Second connect should return a new resource because the hash string will be different from $c1 $c2 = oci_pconnect("testuser", "testuserpwd2", $dbase); var_dump($c2); - -ob_start(); -var_dump($c2); -$r2 = ob_get_clean(); -preg_match("/resource\(([0-9]*)\) of.*/", $r2, $matches); -$rn2 = $matches[0]; /* resource number */ +$rn2 = (int)$c2; // Despite using the old password this connect should succeed and return the original resource $c3 = oci_pconnect("testuser", "testuserpwd", $dbase); var_dump($c3); - -ob_start(); -var_dump($c3); -$r3 = ob_get_clean(); -preg_match("/resource\(([0-9]*)\) of.*/", $r3, $matches); -$rn3 = $matches[0]; /* resource number */ +$rn3 = (int)$c3; // Connections should differ if ($rn1 == $rn2) { @@ -77,10 +63,12 @@ else { } // Clean up -// Can't drop a user that is connected and can't close a persistent -// connection. So this test will leave the dummy user around, but the -// schema will not be usable.. -$s = oci_parse($c0, "revoke connect, create session from testuser"); +oci_close($c1); +oci_close($c2); +oci_close($c3); + +// Clean up +$s = oci_parse($c0, "drop user cascade testuser"); @oci_execute($s); echo "Done\n"; diff --git a/ext/oci8/tests/password_new.phpt b/ext/oci8/tests/password_new.phpt index 1de3cb4c96..e8642abca7 100644 --- a/ext/oci8/tests/password_new.phpt +++ b/ext/oci8/tests/password_new.phpt @@ -3,8 +3,23 @@ oci_password_change() --SKIPIF-- 10/', $phpinfo); + if ($iv === 1) { + die ("skip test known to fail using Oracle 10gR2 client libs connecting to Oracle 11.1 (6277160)"); + } +} ?> --FILE-- 10/', $phpinfo); + if ($iv === 1) { + die ("skip test known to fail using Oracle 10gR2 client libs connecting to Oracle 11.1 (6277160)"); + } +} ?> --FILE-- --EXPECTF-- -bool(true) resource(%d) of type (oci8 connection) -bool(true) +resource(%d) of type (oci8 connection) +resource(%d) of type (oci8 connection) Done diff --git a/ext/oci8/tests/pecl_bug10194_blob.phpt b/ext/oci8/tests/pecl_bug10194_blob.phpt index 092f7d085b..4c6aa4f1c9 100644 --- a/ext/oci8/tests/pecl_bug10194_blob.phpt +++ b/ext/oci8/tests/pecl_bug10194_blob.phpt @@ -3,7 +3,7 @@ PECL Bug #10194 (segfault in Instant Client when memory_limit is reached inside --SKIPIF-- --INI-- memory_limit=3M diff --git a/ext/oci8/tests/pecl_bug10194_blob_64.phpt b/ext/oci8/tests/pecl_bug10194_blob_64.phpt index 9b98989f38..433d586a4e 100644 --- a/ext/oci8/tests/pecl_bug10194_blob_64.phpt +++ b/ext/oci8/tests/pecl_bug10194_blob_64.phpt @@ -3,7 +3,7 @@ PECL Bug #10194 (segfault in Instant Client when memory_limit is reached inside --SKIPIF-- --INI-- memory_limit=6M diff --git a/ext/oci8/tests/testping.phpt b/ext/oci8/tests/testping.phpt index 1556d81d1e..a0d65a30c3 100644 --- a/ext/oci8/tests/testping.phpt +++ b/ext/oci8/tests/testping.phpt @@ -7,7 +7,7 @@ oci8.ping_interval=0 --FILE--