diff -dPNur php-5.2.9/ext/pdo_odbc/odbc_driver.c php-5.2.9-new/ext/pdo_odbc/odbc_driver.c --- php-5.2.9/ext/pdo_odbc/odbc_driver.c 2008-12-31 12:17:42.000000000 +0100 +++ php-5.2.9-new/ext/pdo_odbc/odbc_driver.c 2009-06-15 01:43:38.000000000 +0200 @@ -353,6 +353,21 @@ return 0; } +static int odbc_handle_set_attr(pdo_dbh_t *dbh, long attr, zval *val TSRMLS_DC) { + SQLRETURN ret; + pdo_odbc_db_handle *H = (pdo_odbc_db_handle *)dbh->driver_data; + + switch (attr) { + case PDO_ATTR_TIMEOUT: + convert_to_long(val); + ret = SQLSetConnectAttr(H->dbc, SQL_ATTR_CONNECTION_TIMEOUT, (SQLPOINTER)Z_LVAL_P(val), SQL_IS_UINTEGER); + if ((ret == SQL_SUCCESS)||(ret == SQL_SUCCESS_WITH_INFO)) return 1; + return 0; + + } + return 0; +} + static struct pdo_dbh_methods odbc_methods = { odbc_handle_closer, odbc_handle_preparer, @@ -361,7 +376,7 @@ odbc_handle_begin, odbc_handle_commit, odbc_handle_rollback, - NULL, /* set attr */ + odbc_handle_set_attr, /* set attr */ NULL, /* last id */ pdo_odbc_fetch_error_func, odbc_handle_get_attr, /* get attr */ @@ -374,6 +389,7 @@ RETCODE rc; int use_direct = 0; SQLUINTEGER cursor_lib; + SQLUINTEGER timeout; H = pecalloc(1, sizeof(*H), dbh->is_persistent); @@ -418,6 +434,12 @@ goto fail; } + timeout = pdo_attr_lval(driver_options, PDO_ATTR_TIMEOUT, -1 TSRMLS_CC); + if (timeout != (SQLUINTEGER)-1) { + SQLSetConnectAttr(H->dbc, SQL_ATTR_CONNECTION_TIMEOUT, (SQLPOINTER)timeout, SQL_IS_UINTEGER); + SQLSetConnectAttr(H->dbc, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER)timeout, SQL_IS_UINTEGER); + } + if (strchr(dbh->data_source, ';')) { char dsnbuf[1024]; short dsnbuflen;