diff options
author | Antony Dovgal <tony2001@php.net> | 2006-08-10 12:15:58 +0000 |
---|---|---|
committer | Antony Dovgal <tony2001@php.net> | 2006-08-10 12:15:58 +0000 |
commit | ae61bb7bb872e81d86afcda68b7a1324b33ef30f (patch) | |
tree | fa68196c4de5812cdf9005e99abb9840ebb63ce9 | |
parent | e43dc5c95bcf36ad7bef5f9b309e5e22e4fdb48b (diff) | |
download | php-git-ae61bb7bb872e81d86afcda68b7a1324b33ef30f.tar.gz |
improve connection character set detection:
* output a warning if invalid character set was passed to the function
* use NLS_LANG by default
-rw-r--r-- | ext/oci8/oci8.c | 41 | ||||
-rw-r--r-- | ext/oci8/tests/connect_with_charset_001.phpt | 37 |
2 files changed, 62 insertions, 16 deletions
diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 25465637b4..feea76b7bb 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -966,6 +966,7 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char time_t timestamp; #if HAVE_OCI_ENV_NLS_CREATE ub2 charsetid = 0; + ub2 charsetid_nls_lang = 0; #endif switch (session_mode) { @@ -999,15 +1000,31 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char } smart_str_appendl_ex(&hashed_details, "__", sizeof("__") - 1, 0); + /* Initialize global handles if the weren't initialized before */ + if (OCI_G(env) == NULL) { + php_oci_init_global_handles(TSRMLS_C); + } + #if HAVE_OCI_ENV_NLS_CREATE if (charset && *charset) { - smart_str_appends_ex(&hashed_details, charset, 0); + charsetid = PHP_OCI_CALL(OCINlsCharSetNameToId, (OCI_G(env), charset)); + if (!charsetid) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid character set name: %s", charset); + } else { + smart_str_append_unsigned_ex(&hashed_details, charsetid, 0); + } } - else { + + /* use NLS_LANG if no or invalid charset specified */ + if (!charsetid) { size_t rsize = 0; + sword result; - PHP_OCI_CALL(OCINlsEnvironmentVariableGet, (&charsetid, 2, OCI_NLS_CHARSET_ID, 0, &rsize)); - smart_str_append_unsigned_ex(&hashed_details, charsetid, 0); + result = PHP_OCI_CALL(OCINlsEnvironmentVariableGet, (&charsetid_nls_lang, 0, OCI_NLS_CHARSET_ID, 0, &rsize)) + if (result != OCI_SUCCESS) { + charsetid_nls_lang = 0; + } + smart_str_append_unsigned_ex(&hashed_details, charsetid_nls_lang, 0); } #else if (charset && *charset) { @@ -1023,12 +1040,6 @@ php_oci_connection *php_oci_do_connect_ex(char *username, int username_len, char /* make it lowercase */ php_strtolower(hashed_details.c, hashed_details.len); - /* Initialize global handles if the weren't initialized before */ - - if (OCI_G(env) == NULL) { - php_oci_init_global_handles(TSRMLS_C); - } - if (!exclusive && !new_password) { zend_bool found = 0; @@ -1158,16 +1169,14 @@ open: #if HAVE_OCI_ENV_NLS_CREATE #define PHP_OCI_INIT_FUNC_NAME "OCIEnvNlsCreate" - if (charset && *charset) { - charsetid = PHP_OCI_CALL(OCINlsCharSetNameToId, (OCI_G(env), charset)); - connection->charset = charsetid; - } - else if (charsetid) { + if (charsetid) { connection->charset = charsetid; + } else { + connection->charset = charsetid_nls_lang; } /* create an environment using the character set id, Oracle 9i+ ONLY */ - OCI_G(errcode) = PHP_OCI_CALL(OCIEnvNlsCreate, (&(connection->env), PHP_OCI_INIT_MODE, 0, NULL, NULL, NULL, 0, NULL, charsetid, charsetid)); + OCI_G(errcode) = PHP_OCI_CALL(OCIEnvNlsCreate, (&(connection->env), PHP_OCI_INIT_MODE, 0, NULL, NULL, NULL, 0, NULL, connection->charset, connection->charset)); #elif HAVE_OCI_ENV_CREATE #define PHP_OCI_INIT_FUNC_NAME "OCIEnvCreate" diff --git a/ext/oci8/tests/connect_with_charset_001.phpt b/ext/oci8/tests/connect_with_charset_001.phpt new file mode 100644 index 0000000000..9149747cdb --- /dev/null +++ b/ext/oci8/tests/connect_with_charset_001.phpt @@ -0,0 +1,37 @@ +--TEST-- +oci_connect() with invalid character set +--SKIPIF-- +<?php if (!extension_loaded("oci8")) print "skip"; ?> +--FILE-- +<?php + +require dirname(__FILE__)."/connect.inc"; + +var_dump($c1 = oci_connect($user, $password, $dbase)); +var_dump($c2 = oci_connect($user, $password, $dbase, "")); +var_dump($c3 = oci_connect($user, $password, $dbase, "blah")); +var_dump($c4 = oci_connect($user, $password, $dbase, "obviously wrong")); + +var_dump($c3 == $c4); + +var_dump($c5 = oci_connect($user, $password, $dbase, "US7ASCII")); +var_dump($c6 = oci_connect($user, $password, $dbase, "UTF8")); + +var_dump($c5 == $c6); + +echo "Done\n"; +?> +--EXPECTF-- +resource(%d) of type (oci8 connection) +resource(%d) of type (oci8 connection) + +Warning: oci_connect(): Invalid character set name: blah in %s on line %d +resource(%d) of type (oci8 connection) + +Warning: oci_connect(): Invalid character set name: obviously wrong in %s on line %d +resource(%d) of type (oci8 connection) +bool(true) +resource(%d) of type (oci8 connection) +resource(%d) of type (oci8 connection) +bool(false) +Done |