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;
