php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | |
Patch make_resuming_pdo_oci_sessions for PDO OCI Bug #55768Patch version 2011-09-27 08:15 UTC Return to Bug #55768 | Download this patchThis patch renders other patches obsolete Obsolete patches: Patch Revisions: 2011-09-27 08:15 UTC | 2011-09-27 06:01 UTC | 2011-09-26 08:33 UTC | 2011-09-26 08:31 UTC | 2011-09-23 13:30 UTCDeveloper: mikhail.v.gavrilov@gmail.comIndex: oci_driver.c =================================================================== --- oci_driver.c (revision 317201) +++ oci_driver.c (working copy) @@ -515,6 +515,22 @@ @@ -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; + } + 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, @@ -528,7 +544,7 @@ 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 |
Copyright © 2001-2024 The PHP Group All rights reserved. |
Last updated: Mon Sep 09 17:01:27 2024 UTC |