]> granicus.if.org Git - php/commitdiff
Added support for ATTR_TIMEOUT inside pdo_pgsql driver.
authorIlia Alshanetsky <iliaa@php.net>
Thu, 28 Jun 2007 03:13:29 +0000 (03:13 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 28 Jun 2007 03:13:29 +0000 (03:13 +0000)
Fixed a bug inside PDO's "use persistent" connection detection mechanism
that would trigger connections on "" and "0" values

NEWS
ext/pdo/pdo_dbh.c
ext/pdo_pgsql/pgsql_driver.c

diff --git a/NEWS b/NEWS
index 3a92f5854c09a11cd361b75fb2e17b37b292c740..76a4e6692d1659aab3261c337a9e465a26762b07 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,7 @@ PHP                                                                        NEWS
 
 - Added persistent connection status checker to pdo_pgsql (Elvis
   Pranskevichus, Ilia)
+- Added support for ATTR_TIMEOUT inside pdo_pgsql driver. (Ilia)
 - Added php_ini_loaded_file() function which returns the path to the actual
   php.ini in use. (Jani)
 - Added GD version constants GD_MAJOR_VERSION, GD_MINOR_VERSION
index 70d1c13d52a90ab7511a27474eb1282a688b9aa6..6550b060fa158697b847d802271995dea2e37f19 100755 (executable)
@@ -280,7 +280,7 @@ static PHP_METHOD(PDO, dbh_constructor)
                pdo_dbh_t *pdbh = NULL;
 
                if (SUCCESS == zend_hash_index_find(Z_ARRVAL_P(options), PDO_ATTR_PERSISTENT, (void**)&v)) {
-                       if (Z_TYPE_PP(v) == IS_STRING) {
+                       if (Z_TYPE_PP(v) == IS_STRING && !is_numeric_string(Z_STRVAL_PP(v), Z_STRLEN_PP(v), NULL, NULL, 0) && Z_STRLEN_PP(v) > 0) {
                                /* user specified key */
                                plen = spprintf(&hashkey, 0, "PDO:DBH:DSN=%s:%s:%s:%s", data_source,
                                                username ? username : "",
index 6727c6b8de35b8878f4cfd410871d191c0d7c3a2..c134a2eb1dd03419f3ff214d6b1ce982692d870c 100644 (file)
@@ -670,6 +670,7 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
        pdo_pgsql_db_handle *H;
        int ret = 0;
        char *conn_str, *p, *e;
+       long connect_timeout = 30;
 
        H = pecalloc(1, sizeof(pdo_pgsql_db_handle), dbh->is_persistent);
        dbh->driver_data = H;
@@ -686,23 +687,25 @@ static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
                *p = ' ';
        }
 
+       if (driver_options) {
+               connect_timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, 30 TSRMLS_CC);
+       }
+
        /* support both full connection string & connection string + login and/or password */
        if (!dbh->username || !dbh->password) {
-               conn_str = (char *) dbh->data_source;
+               spprintf(&conn_str, 0, "%s connect_timeout=%ld", (char *) dbh->data_source, connect_timeout);
        } else if (dbh->username && dbh->password) {
-               spprintf(&conn_str, 0, "%s user=%s password=%s", dbh->data_source, dbh->username, dbh->password);
+               spprintf(&conn_str, 0, "%s user=%s password=%s connect_timeout=%ld", dbh->data_source, dbh->username, dbh->password, connect_timeout);
        } else if (dbh->username) {
-               spprintf(&conn_str, 0, "%s user=%s", dbh->data_source, dbh->username);
+               spprintf(&conn_str, 0, "%s user=%s connect_timeout=%ld", dbh->data_source, dbh->username, connect_timeout);
        } else {
-               spprintf(&conn_str, 0, "%s password=%s", dbh->data_source, dbh->password);
+               spprintf(&conn_str, 0, "%s password=%s connect_timeout=%ld", dbh->data_source, dbh->password, connect_timeout);
        }
 
        H->server = PQconnectdb(conn_str);
-       
-       if (conn_str != dbh->data_source) {
-               efree(conn_str);
-       }
-       
+
+       efree(conn_str);
+
        if (PQstatus(H->server) != CONNECTION_OK) {
                pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, PHP_PDO_PGSQL_CONNECTION_FAILURE_SQLSTATE);
                goto cleanup;