Skip to content

Commit 35494bb

Browse files
committed
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.
1 parent ce5e317 commit 35494bb

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

Diff for: ext/pdo_odbc/odbc_driver.c

+11
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,17 @@ static int pdo_odbc_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_D
300300
odbc_handle_closer(dbh TSRMLS_CC);
301301
return 0;
302302
}
303+
304+
#ifdef SQL_ATTR_CONNECTION_POOLING
305+
if (pdo_odbc_pool_on != SQL_CP_OFF) {
306+
rc = SQLSetEnvAttr(H->env, SQL_ATTR_CP_MATCH, (void*)pdo_odbc_pool_mode, 0);
307+
if (rc != SQL_SUCCESS) {
308+
pdo_odbc_drv_error("SQLSetEnvAttr: SQL_ATTR_CP_MATCH");
309+
odbc_handle_closer(dbh TSRMLS_CC);
310+
return 0;
311+
}
312+
}
313+
#endif
303314

304315
rc = SQLAllocHandle(SQL_HANDLE_DBC, H->env, &H->dbc);
305316
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {

Diff for: ext/pdo_odbc/pdo_odbc.c

+45-1
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,51 @@ zend_module_entry pdo_odbc_module_entry = {
6464
ZEND_GET_MODULE(pdo_odbc)
6565
#endif
6666

67+
#ifdef SQL_ATTR_CONNECTION_POOLING
68+
SQLUINTEGER pdo_odbc_pool_on = SQL_CP_OFF;
69+
SQLUINTEGER pdo_odbc_pool_mode = SQL_CP_ONE_PER_HENV;
70+
#endif
71+
6772
/* {{{ PHP_MINIT_FUNCTION */
6873
PHP_MINIT_FUNCTION(pdo_odbc)
6974
{
70-
php_pdo_register_driver(&pdo_odbc_driver);
75+
#ifdef SQL_ATTR_CONNECTION_POOLING
76+
char *pooling_val = NULL;
77+
#endif
78+
79+
if (FAILURE == php_pdo_register_driver(&pdo_odbc_driver)) {
80+
return FAILURE;
81+
}
82+
7183
pdo_odbc_init_error_table();
84+
85+
#ifdef SQL_ATTR_CONNECTION_POOLING
86+
/* ugh, we don't really .ini stuff in PDO, but since ODBC connection
87+
* pooling is process wide, we can't set it from within the scope of a
88+
* request without affecting others, which goes against our isolated request
89+
* policy. So, we use cfg_get_string here to check it this once.
90+
* */
91+
if (FAILURE == cfg_get_string("pdo_odbc.connection_pooling", &pooling_val) || pooling_val == NULL) {
92+
pooling_val = "strict";
93+
}
94+
if (strcasecmp(pooling_val, "strict") == 0 || strcmp(pooling_val, "1") == 0) {
95+
pdo_odbc_pool_on = SQL_CP_ONE_PER_HENV;
96+
pdo_odbc_pool_mode = SQL_CP_STRICT_MATCH;
97+
} else if (strcasecmp(pooling_val, "relaxed") == 0) {
98+
pdo_odbc_pool_on = SQL_CP_ONE_PER_HENV;
99+
pdo_odbc_pool_mode = SQL_CP_RELAXED_MATCH;
100+
} else if (*pooling_val == '\0' || strcasecmp(pooling_val, "off") == 0) {
101+
pdo_odbc_pool_on = SQL_CP_OFF;
102+
} else {
103+
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error in pdo_odbc.connection_pooling configuration. Value MUST be one of 'strict', 'relaxed' or 'off'");
104+
return FAILURE;
105+
}
106+
107+
if (pdo_odbc_pool_on != SQL_CP_OFF) {
108+
SQLSetEnvAttr(SQL_NULL_HANDLE, SQL_ATTR_CONNECTION_POOLING, (void*)pdo_odbc_pool_on, 0);
109+
}
110+
#endif
111+
72112
return SUCCESS;
73113
}
74114
/* }}} */
@@ -89,6 +129,10 @@ PHP_MINFO_FUNCTION(pdo_odbc)
89129
{
90130
php_info_print_table_start();
91131
php_info_print_table_header(2, "PDO Driver for ODBC (" PDO_ODBC_TYPE ")" , "enabled");
132+
#ifdef SQL_ATTR_CONNECTION_POOLING
133+
php_info_print_table_row(2, "ODBC Connection Pooling", pdo_odbc_pool_on == SQL_CP_OFF ?
134+
"Disabled" : (pdo_odbc_pool_mode == SQL_CP_STRICT_MATCH ? "Enabled, strict matching" : "Enabled, relaxed matching"));
135+
#endif
92136
php_info_print_table_end();
93137

94138
}

Diff for: ext/pdo_odbc/php_pdo_odbc_int.h

+5
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ void pdo_odbc_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, PDO_ODBC_HSTMT statement,
144144
void pdo_odbc_init_error_table(void);
145145
void pdo_odbc_fini_error_table(void);
146146

147+
#ifdef SQL_ATTR_CONNECTION_POOLING
148+
extern SQLUINTEGER pdo_odbc_pool_on;
149+
extern SQLUINTEGER pdo_odbc_pool_mode;
150+
#endif
151+
147152
/*
148153
* Local variables:
149154
* tab-width: 4

0 commit comments

Comments
 (0)