> Nice patches, but could you please provide ones without
> the whitespace changes? Now it's not very clear what you
> have actually changed..
>
> --Jani
Sure. I followed the instructions in README.SUBMITTING_PATCH and only
had "diff -u" in my .cvsrc. Now I have "diff -uw" and hope this is what
you expect.
Massimo
*-----------------*
? twobugs.txt
Index: oci8.c
===================================================================
RCS file: /repository/php4/ext/oci8/oci8.c,v
retrieving revision 1.205
diff -u -w -r1.205 oci8.c
--- oci8.c 18 Mar 2003 12:06:00 -0000 1.205
+++ oci8.c 8 Apr 2003 07:24:46 -0000
@@ -2153,6 +2153,8 @@
oci_session *session = 0, *psession = 0;
OCISvcCtx *svchp = 0;
char *hashed_details;
+ struct timeval tv;
+ int sec, usec;
#ifdef HAVE_OCI9
ub2 charsetid;
#endif
@@ -2164,9 +2166,10 @@
we will reuse authenticated users within a request no matter
if the user requested a persistent
connections or not!
- but only as pesistent requested connections will be kept
between requests!
+ but only as persistent requested connections will be kept
between requests!
*/
+ if (! exclusive) {
hashed_details = (char *) malloc(strlen(SAFE_STRING(username))+
strlen(SAFE_STRING(password))+
strlen(SAFE_STRING(server->dbname))+1);
@@ -2176,7 +2179,6 @@
SAFE_STRING(password),
SAFE_STRING(server->dbname));
- if (! exclusive) {
zend_hash_find(OCI(user), hashed_details,
strlen(hashed_details)+1, (void **) &session);
if (session) {
@@ -2191,6 +2193,14 @@
/* breakthru to open */
}
}
+ } else {
+ gettimeofday((struct timeval *) &tv, (struct timezone *)
NULL);
+ sec = (int) tv.tv_sec;
+ usec = (int) (tv.tv_usec % 1000000);
+ /* The max value usec can have is 0xF423F, so we use
only five hex
+ digits for usec and eigth hex digits for sec. */
+ hashed_details = (char *) malloc(8+5+1); /* always
enough */
+ sprintf(hashed_details, "%08x%05x", tv.tv_sec,
tv.tv_usec);
}
session = calloc(1,sizeof(oci_session));
@@ -2676,7 +2686,7 @@
persistent = 0;
} else {
/* if our server-context is not persistent we can't */
- persistent = server->persistent;
+ persistent = (server->persistent) ? persistent : 0;
}
session =
_oci_open_session(server,username,password,persistent,exclusive,charset)
;
*-----------------*
? fourpatches.txt
Index: oci8.c
===================================================================
RCS file: /repository/php4/ext/oci8/oci8.c,v
retrieving revision 1.205
diff -u -w -r1.205 oci8.c
--- oci8.c 18 Mar 2003 12:06:00 -0000 1.205
+++ oci8.c 8 Apr 2003 07:20:12 -0000
@@ -59,6 +59,7 @@
#endif
#include "php.h"
+#include "php_ini.h"
#include "ext/standard/info.h"
/* #define HAVE_OCI8_TEMP_LOB 1 */
@@ -431,6 +432,15 @@
#endif
/* }}} */
+
+/* {{{ PHP_INI
+ */
+PHP_INI_BEGIN()
+ STD_PHP_INI_ENTRY_EX("oci8.connection_timeout", "-1",
PHP_INI_SYSTEM, OnUpdateInt, connection_timeout, php_oci_globals,
oci_globals, display_link_numbers)
+ STD_PHP_INI_BOOLEAN("oci8.credentials_toupper", "0",
PHP_INI_SYSTEM, OnUpdateBool, credentials_toupper, php_oci_globals,
oci_globals)
+PHP_INI_END()
+/* }}} */
+
/* {{{ startup, shutdown and info functions */
static void php_oci_init_globals(php_oci_globals *oci_globals_p
TSRMLS_DC)
@@ -495,6 +505,8 @@
php_oci_init_globals(&oci_globals TSRMLS_CC);
#endif
+ REGISTER_INI_ENTRIES();
+
le_stmt = zend_register_list_destructors_ex(_oci_stmt_list_dtor,
NULL, "oci8 statement", module_number);
le_conn =
zend_register_list_destructors_ex(php_oci_free_conn_list, NULL, "oci8
connection", module_number);
le_desc =
zend_register_list_destructors_ex(_oci_descriptor_list_dtor, NULL, "oci8
descriptor", module_number);
@@ -566,6 +578,22 @@
/* ----------------------------------------------------------------- */
+static int _session_rcleanup(oci_session *session TSRMLS_DC)
+{
+ if ((OCI(current_timestamp) - OCI(connection_timeout)) >
session->server->timestamp) {
+ _oci_close_session(session);
+ }
+ return 0;
+}
+
+static int _server_rcleanup(oci_server *server TSRMLS_DC)
+{
+ if ((OCI(current_timestamp) - OCI(connection_timeout)) >
server->timestamp) {
+ _oci_close_server(server);
+ }
+ return 0;
+}
+
PHP_RINIT_FUNCTION(oci)
{
/* XXX NYI
@@ -578,6 +606,13 @@
oci_debug("php_rinit_oci");
+ /* close all timed out connections (if check is enabled) */
+ if (-1 != OCI(connection_timeout)) {
+ OCI(current_timestamp) = time(NULL);
+ zend_hash_apply(OCI(user),
(apply_func_t)_session_rcleanup TSRMLS_CC);
+ zend_hash_apply(OCI(server),
(apply_func_t)_server_rcleanup TSRMLS_CC);
+ }
+
return SUCCESS;
}
@@ -597,6 +632,8 @@
PHP_MSHUTDOWN_FUNCTION(oci)
{
+ UNREGISTER_INI_ENTRIES();
+
OCI(shutdown) = 1;
oci_debug("START php_mshutdown_oci");
@@ -649,6 +686,8 @@
#endif
php_info_print_table_end();
+ DISPLAY_INI_ENTRIES();
+
}
/* }}} */
@@ -2153,6 +2192,8 @@
oci_session *session = 0, *psession = 0;
OCISvcCtx *svchp = 0;
char *hashed_details;
+ struct timeval tv;
+ int sec, usec;
#ifdef HAVE_OCI9
ub2 charsetid;
#endif
@@ -2164,9 +2205,10 @@
we will reuse authenticated users within a request no matter
if the user requested a persistent
connections or not!
- but only as pesistent requested connections will be kept
between requests!
+ but only as persistent requested connections will be kept
between requests!
*/
+ if (! exclusive) {
hashed_details = (char *) malloc(strlen(SAFE_STRING(username))+
strlen(SAFE_STRING(password))+
strlen(SAFE_STRING(server->dbname))+1);
@@ -2176,7 +2218,6 @@
SAFE_STRING(password),
SAFE_STRING(server->dbname));
- if (! exclusive) {
zend_hash_find(OCI(user), hashed_details,
strlen(hashed_details)+1, (void **) &session);
if (session) {
@@ -2191,6 +2232,14 @@
/* breakthru to open */
}
}
+ } else {
+ gettimeofday((struct timeval *) &tv, (struct timezone *)
NULL);
+ sec = (int) tv.tv_sec;
+ usec = (int) (tv.tv_usec % 1000000);
+ /* The max value usec can have is 0xF423F, so we use
only five hex
+ digits for usec and eigth hex digits for sec. */
+ hashed_details = (char *) malloc(8+5+1); /* always
enough */
+ sprintf(hashed_details, "%08x%05x", tv.tv_sec,
tv.tv_usec);
}
session = calloc(1,sizeof(oci_session));
@@ -2627,6 +2676,7 @@
oci_server *server = 0;
oci_session *session = 0;
oci_connection *connection = 0;
+ int i, len;
/* if a forth parameter is handed over, it is the charset
identifier (but is only used in Oracle 9i+) */
if (zend_get_parameters_ex(4, &userParam, &passParam, &dbParam,
&charParam) == SUCCESS) {
@@ -2665,18 +2715,34 @@
goto CLEANUP;
}
+ /* if enabled in php.ini, convert credentials to uppercase */
+ if (OCI(credentials_toupper)) {
+ for (i = 0, len = strlen(SAFE_STRING(username)); i <
len; i++) {
+ username[i] = toupper(username[i]);
+ }
+ for (i = 0, len = strlen(SAFE_STRING(password)); i <
len; i++) {
+ password[i] = toupper(password[i]);
+ }
+ for (i = 0, len = strlen(SAFE_STRING(dbname)); i < len;
i++) {
+ dbname[i] = toupper(dbname[i]);
+ }
+ }
+
server = _oci_open_server(dbname,persistent);
if (! server) {
goto CLEANUP;
}
+ /* set/update server handle timestamp */
+ server->timestamp = time(NULL);
+
if (exclusive) {
/* exlusive session can never be persistent!*/
persistent = 0;
} else {
/* if our server-context is not persistent we can't */
- persistent = server->persistent;
+ persistent = (server->persistent) ? persistent : 0;
}
session =
_oci_open_session(server,username,password,persistent,exclusive,charset)
;
Index: php_oci8.h
===================================================================
RCS file: /repository/php4/ext/oci8/php_oci8.h,v
retrieving revision 1.28
diff -u -w -r1.28 php_oci8.h
--- php_oci8.h 18 Mar 2003 12:06:01 -0000 1.28
+++ php_oci8.h 8 Apr 2003 07:20:12 -0000
@@ -55,6 +55,7 @@
int num;
int persistent;
int is_open;
+ time_t timestamp;
char *dbname;
OCIServer *pServer;
#if 0
@@ -182,6 +183,10 @@
long num_links;
*/
+ long connection_timeout; /* from php.ini */
+ int credentials_toupper; /* from php.ini */
+ time_t current_timestamp; /* set by PHP_RINIT_FUNCTION */
+
HashTable *server;
HashTable *user;