diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/pdo_odbc/pdo_odbc.c | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/pdo_odbc/pdo_odbc.c')
-rw-r--r-- | ext/pdo_odbc/pdo_odbc.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/ext/pdo_odbc/pdo_odbc.c b/ext/pdo_odbc/pdo_odbc.c new file mode 100644 index 0000000..f481c07 --- /dev/null +++ b/ext/pdo_odbc/pdo_odbc.c @@ -0,0 +1,188 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2013 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Wez Furlong <wez@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" +#include "pdo/php_pdo.h" +#include "pdo/php_pdo_driver.h" +#include "php_pdo_odbc.h" +#include "php_pdo_odbc_int.h" + +/* {{{ pdo_odbc_functions[] */ +const zend_function_entry pdo_odbc_functions[] = { + PHP_FE_END +}; +/* }}} */ + +/* {{{ pdo_odbc_deps[] */ +#if ZEND_MODULE_API_NO >= 20050922 +static const zend_module_dep pdo_odbc_deps[] = { + ZEND_MOD_REQUIRED("pdo") + ZEND_MOD_END +}; +#endif +/* }}} */ + +/* {{{ pdo_odbc_module_entry */ +zend_module_entry pdo_odbc_module_entry = { +#if ZEND_MODULE_API_NO >= 20050922 + STANDARD_MODULE_HEADER_EX, NULL, + pdo_odbc_deps, +#else + STANDARD_MODULE_HEADER, +#endif + "PDO_ODBC", + pdo_odbc_functions, + PHP_MINIT(pdo_odbc), + PHP_MSHUTDOWN(pdo_odbc), + NULL, + NULL, + PHP_MINFO(pdo_odbc), + "1.0.1", + STANDARD_MODULE_PROPERTIES +}; +/* }}} */ + +#ifdef COMPILE_DL_PDO_ODBC +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 + +#if defined(DB2CLI_VER) && !defined(PHP_WIN32) +PHP_INI_BEGIN() + PHP_INI_ENTRY("pdo_odbc.db2_instance_name", NULL, PHP_INI_SYSTEM, NULL) +PHP_INI_END() + +#endif + +/* {{{ PHP_MINIT_FUNCTION */ +PHP_MINIT_FUNCTION(pdo_odbc) +{ +#ifdef SQL_ATTR_CONNECTION_POOLING + char *pooling_val = NULL; +#endif + + if (FAILURE == php_pdo_register_driver(&pdo_odbc_driver)) { + return FAILURE; + } + +#if defined(DB2CLI_VER) && !defined(PHP_WIN32) + REGISTER_INI_ENTRIES(); + { + char *instance = INI_STR("pdo_odbc.db2_instance_name"); + if (instance) { + char *env = malloc(sizeof("DB2INSTANCE=") + strlen(instance)); + if (!env) { + return FAILURE; + } + strcpy(env, "DB2INSTANCE="); + strcat(env, instance); + putenv(env); + /* after this point, we can't free env without breaking the environment */ + } + } +#endif + +#ifdef SQL_ATTR_CONNECTION_POOLING + /* ugh, we don't really like .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 + + REGISTER_PDO_CLASS_CONST_LONG("ODBC_ATTR_USE_CURSOR_LIBRARY", PDO_ODBC_ATTR_USE_CURSOR_LIBRARY); + REGISTER_PDO_CLASS_CONST_LONG("ODBC_ATTR_ASSUME_UTF8", PDO_ODBC_ATTR_ASSUME_UTF8); + REGISTER_PDO_CLASS_CONST_LONG("ODBC_SQL_USE_IF_NEEDED", SQL_CUR_USE_IF_NEEDED); + REGISTER_PDO_CLASS_CONST_LONG("ODBC_SQL_USE_DRIVER", SQL_CUR_USE_DRIVER); + REGISTER_PDO_CLASS_CONST_LONG("ODBC_SQL_USE_ODBC", SQL_CUR_USE_ODBC); + + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_MSHUTDOWN_FUNCTION + */ +PHP_MSHUTDOWN_FUNCTION(pdo_odbc) +{ +#if defined(DB2CLI_VER) && !defined(PHP_WIN32) + UNREGISTER_INI_ENTRIES(); +#endif + php_pdo_unregister_driver(&pdo_odbc_driver); + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_MINFO_FUNCTION + */ +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")); +#else + php_info_print_table_row(2, "ODBC Connection Pooling", "Not supported in this build"); +#endif + php_info_print_table_end(); + +#if defined(DB2CLI_VER) && !defined(PHP_WIN32) + DISPLAY_INI_ENTRIES(); +#endif +} +/* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ |