php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #55768
Patch make_resuming_pdo_oci_sessions revision 2011-09-27 08:15 UTC by mikhail dot v dot gavrilov at gmail dot com
revision 2011-09-27 06:01 UTC by mikhail dot v dot gavrilov at gmail dot com
revision 2011-09-26 08:33 UTC by mikhail dot v dot gavrilov at gmail dot com
revision 2011-09-26 08:31 UTC by mikhail dot v dot gavrilov at gmail dot com
revision 2011-09-23 13:30 UTC by mikhail dot v dot gavrilov at gmail dot com

Patch make_resuming_pdo_oci_sessions for Oracle related Bug #55768

Patch version 2011-09-27 08:15 UTC

Return to Bug #55768 | Download this patch
This patch renders other patches obsolete

Obsolete patches:

Patch Revisions:

Developer: mikhail.v.gavrilov@gmail.com

Index: oci_driver.c
===================================================================
--- oci_driver.c	(revision 317201)
+++ oci_driver.c	(working copy)
@@ -141,12 +141,27 @@
 				case 12154:	/* ORA-12154: TNS:could not resolve service name */
 					strcpy(*pdo_err, "42S02");
 					break;
-
-				case 22:	/* ORA-00022: invalid session id */
-				case 1012:	/* ORA-01012: */
-				case 3113:	/* ORA-03133: end of file on communication channel */
-				case 604:
-				case 1041:
+				
+				case	22:	/* ORA-00022: invalid session id */
+				case   378:
+				case   602:
+				case   603:
+				case   604:
+				case   609:
+				case  1012:	/* ORA-01012: */
+				case  1033:
+				case  1041:
+				case  1043:
+				case  1089:
+				case  1090:
+				case  1092:
+				case  3113:	/* ORA-03133: end of file on communication channel */
+				case  3114:
+				case  3122:
+				case  3135:
+				case 12153:
+				case 27146:
+				case 28511:
 					/* consider the connection closed */
 					dbh->is_closed = 1;
 					H->attached = 0;
@@ -515,7 +530,34 @@
 
 }
 /* }}} */
+static int pdo_oci_check_liveness(pdo_dbh_t *dbh TSRMLS_DC)
+{
+	pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data;
+	/* TODO move attached check to PDO level */
+	if (H->attached == 0) return FAILURE;
+	/* TODO add persistent_timeout check at PDO level */
 
+
+	/* 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 */
+	H->last_err = OCIPing (H->svc, H->err, OCI_DEFAULT);
+#else
+	char version[256];
+	/* use good old OCIServerVersion() */
+	H->last_err = OCIServerVersion (H->svc, H->err, (text *)version, sizeof(version), OCI_HTYPE_SVCCTX);
+#endif
+	if (H->last_err == OCI_SUCCESS) return SUCCESS;
+	sb4 error_code = 0;
+	OCIErrorGet (H->err, (ub4)1, NULL, &error_code, NULL, 0, OCI_HTYPE_ERROR);
+	if (error_code == 1010) return SUCCESS;
+	return FAILURE;
+}
+/* }}} */
+
 static struct pdo_dbh_methods oci_methods = {
 	oci_handle_closer,
 	oci_handle_preparer,
@@ -528,7 +570,7 @@
 	NULL,
 	pdo_oci_fetch_error_func,
 	oci_handle_get_attribute,
-	NULL,	/* check_liveness */
+	pdo_oci_check_liveness,	/* check_liveness */
 	NULL	/* get_driver_methods */
 };
 
@@ -675,6 +717,7 @@
 }
 /* }}} */
 
+
 /*
  * Local variables:
  * tab-width: 4
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Thu Apr 24 19:01:53 2014 UTC