mirror of
https://github.com/php/php-src.git
synced 2024-11-28 12:26:37 +08:00
Added support for ATTR_TIMEOUT inside pdo_pgsql driver.
Fixed a bug inside PDO's "use persistent" connection detection mechanism that would trigger connections on "" and "0" values
This commit is contained in:
parent
4b2c457288
commit
37d1bfed25
1
NEWS
1
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
|
||||
|
@ -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 : "",
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user