summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWez Furlong <wez@php.net>2004-05-22 14:51:26 +0000
committerWez Furlong <wez@php.net>2004-05-22 14:51:26 +0000
commit35494bb569aa83c26550a8863f681d0fd641940c (patch)
tree0b5b11167670a355335969022e37f6bbd632da62
parentce5e317cc5f26aa01bc0d04a8c133fc5a3001262 (diff)
downloadphp-git-35494bb569aa83c26550a8863f681d0fd641940c.tar.gz
Enable ODBC Connection Pooling.
Theoretically better than PHP persistent connections, since ODBC itself takes care of resetting the connections back to a "ground" state. Connection pooling defaults to ON, since this is generally useful. You can turn it off by using: pdo_odbc.connection_pooling=off in your php.ini file. You may configure how ODBC matches connection details to existing connections by setting this value to "strict" (the default) or "relaxed". You are encouraged to read the ODBC specs before changing this value.
-rwxr-xr-xext/pdo_odbc/odbc_driver.c11
-rwxr-xr-xext/pdo_odbc/pdo_odbc.c46
-rwxr-xr-xext/pdo_odbc/php_pdo_odbc_int.h5
3 files changed, 61 insertions, 1 deletions
diff --git a/ext/pdo_odbc/odbc_driver.c b/ext/pdo_odbc/odbc_driver.c
index f9d001fbb6..d12459229d 100755
--- a/ext/pdo_odbc/odbc_driver.c
+++ b/ext/pdo_odbc/odbc_driver.c
@@ -300,6 +300,17 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_D
odbc_handle_closer(dbh TSRMLS_CC);
return 0;
}
+
+#ifdef SQL_ATTR_CONNECTION_POOLING
+ if (pdo_odbc_pool_on != SQL_CP_OFF) {
+ rc = SQLSetEnvAttr(H->env, SQL_ATTR_CP_MATCH, (void*)pdo_odbc_pool_mode, 0);
+ if (rc != SQL_SUCCESS) {
+ pdo_odbc_drv_error("SQLSetEnvAttr: SQL_ATTR_CP_MATCH");
+ odbc_handle_closer(dbh TSRMLS_CC);
+ return 0;
+ }
+ }
+#endif
rc = SQLAllocHandle(SQL_HANDLE_DBC, H->env, &H->dbc);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
diff --git a/ext/pdo_odbc/pdo_odbc.c b/ext/pdo_odbc/pdo_odbc.c
index 546c45ed04..a9067d52f3 100755
--- a/ext/pdo_odbc/pdo_odbc.c
+++ b/ext/pdo_odbc/pdo_odbc.c
@@ -64,11 +64,51 @@ zend_module_entry pdo_odbc_module_entry = {
ZEND_GET_MODULE(pdo_odbc)
#endif
+#ifdef SQL_ATTR_CONNECTION_POOLING
+SQLUINTEGER pdo_odbc_pool_on = SQL_CP_OFF;
+SQLUINTEGER pdo_odbc_pool_mode = SQL_CP_ONE_PER_HENV;
+#endif
+
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(pdo_odbc)
{
- php_pdo_register_driver(&pdo_odbc_driver);
+#ifdef SQL_ATTR_CONNECTION_POOLING
+ char *pooling_val = NULL;
+#endif
+
+ if (FAILURE == php_pdo_register_driver(&pdo_odbc_driver)) {
+ return FAILURE;
+ }
+
pdo_odbc_init_error_table();
+
+#ifdef SQL_ATTR_CONNECTION_POOLING
+ /* ugh, we don't really .ini stuff in PDO, but since ODBC connection
+ * pooling is process wide, we can't set it from within the scope of a
+ * request without affecting others, which goes against our isolated request
+ * policy. So, we use cfg_get_string here to check it this once.
+ * */
+ if (FAILURE == cfg_get_string("pdo_odbc.connection_pooling", &pooling_val) || pooling_val == NULL) {
+ pooling_val = "strict";
+ }
+ if (strcasecmp(pooling_val, "strict") == 0 || strcmp(pooling_val, "1") == 0) {
+ pdo_odbc_pool_on = SQL_CP_ONE_PER_HENV;
+ pdo_odbc_pool_mode = SQL_CP_STRICT_MATCH;
+ } else if (strcasecmp(pooling_val, "relaxed") == 0) {
+ pdo_odbc_pool_on = SQL_CP_ONE_PER_HENV;
+ pdo_odbc_pool_mode = SQL_CP_RELAXED_MATCH;
+ } else if (*pooling_val == '\0' || strcasecmp(pooling_val, "off") == 0) {
+ pdo_odbc_pool_on = SQL_CP_OFF;
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error in pdo_odbc.connection_pooling configuration. Value MUST be one of 'strict', 'relaxed' or 'off'");
+ return FAILURE;
+ }
+
+ if (pdo_odbc_pool_on != SQL_CP_OFF) {
+ SQLSetEnvAttr(SQL_NULL_HANDLE, SQL_ATTR_CONNECTION_POOLING, (void*)pdo_odbc_pool_on, 0);
+ }
+#endif
+
return SUCCESS;
}
/* }}} */
@@ -89,6 +129,10 @@ PHP_MINFO_FUNCTION(pdo_odbc)
{
php_info_print_table_start();
php_info_print_table_header(2, "PDO Driver for ODBC (" PDO_ODBC_TYPE ")" , "enabled");
+#ifdef SQL_ATTR_CONNECTION_POOLING
+ php_info_print_table_row(2, "ODBC Connection Pooling", pdo_odbc_pool_on == SQL_CP_OFF ?
+ "Disabled" : (pdo_odbc_pool_mode == SQL_CP_STRICT_MATCH ? "Enabled, strict matching" : "Enabled, relaxed matching"));
+#endif
php_info_print_table_end();
}
diff --git a/ext/pdo_odbc/php_pdo_odbc_int.h b/ext/pdo_odbc/php_pdo_odbc_int.h
index ff7798c9aa..424b3dbdca 100755
--- a/ext/pdo_odbc/php_pdo_odbc_int.h
+++ b/ext/pdo_odbc/php_pdo_odbc_int.h
@@ -144,6 +144,11 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement,
void pdo_odbc_init_error_table(void);
void pdo_odbc_fini_error_table(void);
+#ifdef SQL_ATTR_CONNECTION_POOLING
+extern SQLUINTEGER pdo_odbc_pool_on;
+extern SQLUINTEGER pdo_odbc_pool_mode;
+#endif
+
/*
* Local variables:
* tab-width: 4