abonamous Fri Dec 6 08:44:35 2002 EDT
Modified files:
/php4/ext/oci8 config.m4 oci8.c php_oci8.h
Log:
added support for multiple character sets.
OCILogon now has a forth optional parameter, which is the character set requested by
the string (i.e. we8iso8859p1). when left blank, NLS_LANG or default is used.
config.m4 was changed to identify Oracle 9+ which is needed for this feature. all
other oracle versions (lesser) fall back to the old behaviour.
Index: php4/ext/oci8/config.m4
diff -u php4/ext/oci8/config.m4:1.37 php4/ext/oci8/config.m4:1.38
--- php4/ext/oci8/config.m4:1.37 Mon Sep 9 15:03:51 2002
+++ php4/ext/oci8/config.m4 Fri Dec 6 08:44:35 2002
@@ -1,5 +1,5 @@
dnl
-dnl $Id: config.m4,v 1.37 2002/09/09 19:03:51 kalowsky Exp $
+dnl $Id: config.m4,v 1.38 2002/12/06 13:44:35 abonamous Exp $
dnl
AC_DEFUN(AC_OCI8_VERSION,[
@@ -66,7 +66,7 @@
PHP_ADD_LIBRARY_WITH_PATH(clntsh, $OCI8_DIR/lib, OCI8_SHARED_LIBADD)
;;
- 8.1|9.0)
+ 8.1)
PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD)
if test -f $OCI8_DIR/lib/libocijdbc8.so ; then
PHP_ADD_LIBRARY(ocijdbc8, 1, OCI8_SHARED_LIBADD)
@@ -74,6 +74,17 @@
PHP_ADD_LIBPATH($OCI8_DIR/lib, OCI8_SHARED_LIBADD)
AC_DEFINE(HAVE_OCI8_TEMP_LOB,1,[ ])
AC_DEFINE(HAVE_OCI8_ATTR_STATEMENT,1,[ ])
+ ;;
+
+ 9.0)
+ PHP_ADD_LIBRARY(clntsh, 1, OCI8_SHARED_LIBADD)
+ if test -f $OCI8_DIR/lib/libocijdbc8.so ; then
+ PHP_ADD_LIBRARY(ocijdbc8, 1, OCI8_SHARED_LIBADD)
+ fi
+ PHP_ADD_LIBPATH($OCI8_DIR/lib, OCI8_SHARED_LIBADD)
+ AC_DEFINE(HAVE_OCI8_TEMP_LOB,1,[ ])
+ AC_DEFINE(HAVE_OCI8_ATTR_STATEMENT,1,[ ])
+ AC_DEFINE(HAVE_OCI9,1,[])
;;
*)
Index: php4/ext/oci8/oci8.c
diff -u php4/ext/oci8/oci8.c:1.193 php4/ext/oci8/oci8.c:1.194
--- php4/ext/oci8/oci8.c:1.193 Mon Nov 25 13:14:45 2002
+++ php4/ext/oci8/oci8.c Fri Dec 6 08:44:35 2002
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8.c,v 1.193 2002/11/25 18:14:45 maxim Exp $ */
+/* $Id: oci8.c,v 1.194 2002/12/06 13:44:35 abonamous Exp $ */
/* TODO list:
*
@@ -194,7 +194,7 @@
static oci_server *_oci_open_server(char *dbname,int persistent);
static void _oci_close_server(oci_server *server);
-static oci_session *_oci_open_session(oci_server* server,char *username,char
*password,int persistent,int exclusive);
+static oci_session *_oci_open_session(oci_server* server,char *username,char
+*password,int persistent,int exclusive, char *charset);
static void _oci_close_session(oci_session *session);
static sb4 oci_bind_in_callback(dvoid *, OCIBind *, ub4, ub4, dvoid **, ub4 *, ub1 *,
dvoid **);
@@ -628,7 +628,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "OCI8 Support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.193 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.194 $");
#ifndef PHP_WIN32
php_info_print_table_row(2, "Oracle Version", PHP_OCI8_VERSION );
php_info_print_table_row(2, "Compile-time ORACLE_HOME", PHP_OCI8_DIR );
@@ -1157,7 +1157,7 @@
}
CALL_OCI_RETURN(OCI(error), OCIDescriptorAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid*)&(descr->ocidescr),
Z_TYPE_P(descr),
(size_t) 0,
@@ -1348,14 +1348,14 @@
statement = ecalloc(1,sizeof(oci_statement));
CALL_OCI(OCIHandleAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid **)&statement->pStmt,
OCI_HTYPE_STMT,
0,
NULL));
CALL_OCI(OCIHandleAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid **)&statement->pError,
OCI_HTYPE_ERROR,
0,
@@ -1902,7 +1902,7 @@
readlen,
/* size of buffer */
(dvoid *)0,
(OCICallbackLobRead) 0, /* callback...
*/
- (ub2) 0,
/* The character set ID of the buffer data. */
+ (ub2) connection->session->charsetId,
+ /* The character set ID of the buffer data. */
(ub1) SQLCS_IMPLICIT)); /* The
character set form of the buffer data. */
siz += readlen;
@@ -2123,11 +2123,12 @@
*/
-static oci_session *_oci_open_session(oci_server* server,char *username,char
*password,int persistent,int exclusive)
+static oci_session *_oci_open_session(oci_server* server,char *username,char
+*password,int persistent,int exclusive,char *charset)
{
oci_session *session = 0, *psession = 0;
OCISvcCtx *svchp = 0;
char *hashed_details;
+ ub2 charsetid;
TSRMLS_FETCH();
/*
@@ -2176,9 +2177,44 @@
session->server = server;
session->exclusive = exclusive;
+ #ifdef HAVE_OCI9
+ //following chunk is Oracle 9i+ ONLY
+ if (charset[0] != "\0") {
+ //get ub2 charset id based on charset
+ //this is pretty secure, since if we don't have a valid character set
+name,
+ //0 comes back and we can still use the 0 in all further statements ->
+OCI uses NLS_LANG
+ //setting in that case
+ CALL_OCI_RETURN(charsetid, OCINlsCharSetNameToId(
+ OCI(pEnv),
+ charset));
+
+ session->charsetId = charsetid;
+ oci_debug("oci_do_connect: using charset id=%d",charsetid);
+ }
+
+ //create an environment using the character set id, Oracle 9i+ ONLY
+ CALL_OCI(OCIEnvNlsCreate(
+ &session->pEnv,
+ OCI_DEFAULT,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ NULL,
+ charsetid,
+ charsetid));
+
+ #else
+ //fallback solution (simply use global env and charset, same behaviour as
+always been)
+ session->pEnv = OCI(pEnv);
+ session->charsetId = 0;
+
+ #endif /*HAVE_OCI9*/
+
/* allocate temporary Service Context */
CALL_OCI_RETURN(OCI(error), OCIHandleAlloc(
- OCI(pEnv),
+ session->pEnv,
(dvoid **)&svchp,
OCI_HTYPE_SVCCTX,
0,
@@ -2191,7 +2227,7 @@
/* allocate private session-handle */
CALL_OCI_RETURN(OCI(error), OCIHandleAlloc(
- OCI(pEnv),
+ session->pEnv,
(dvoid **)&session->pSession,
OCI_HTYPE_SESSION,
0,
@@ -2309,7 +2345,7 @@
if (session->is_open) {
/* Temporary Service Context */
CALL_OCI_RETURN(OCI(error), OCIHandleAlloc(
- OCI(pEnv),
+ session->pEnv,
(dvoid **) &svchp,
(ub4) OCI_HTYPE_SVCCTX,
(size_t) 0,
@@ -2555,13 +2591,25 @@
*/
static void oci_do_connect(INTERNAL_FUNCTION_PARAMETERS,int persistent,int exclusive)
{
- char *username, *password, *dbname;
- zval **userParam, **passParam, **dbParam;
+ char *username, *password, *dbname, *charset;
+ zval **userParam, **passParam, **dbParam, **charParam;
oci_server *server = 0;
oci_session *session = 0;
oci_connection *connection = 0;
- if (zend_get_parameters_ex(3, &userParam, &passParam, &dbParam) == SUCCESS) {
+ //if a forth parameter is handed over, it is the charset identifier (but is only
+used in Oracle 9i+)
+ if (zend_get_parameters_ex(4, &userParam, &passParam, &dbParam, &charParam) ==
+SUCCESS) {
+ convert_to_string_ex(userParam);
+ convert_to_string_ex(passParam);
+ convert_to_string_ex(dbParam);
+ convert_to_string_ex(charParam);
+
+ username = Z_STRVAL_PP(userParam);
+ password = Z_STRVAL_PP(passParam);
+ dbname = Z_STRVAL_PP(dbParam);
+ charset = Z_STRVAL_PP(charParam);
+ oci_debug("oci_do_connect: using charset=%s",charset);
+ } else if (zend_get_parameters_ex(3, &userParam, &passParam, &dbParam) ==
+SUCCESS) {
convert_to_string_ex(userParam);
convert_to_string_ex(passParam);
convert_to_string_ex(dbParam);
@@ -2600,7 +2648,7 @@
persistent = server->persistent;
}
- session = _oci_open_session(server,username,password,persistent,exclusive);
+ session =
+_oci_open_session(server,username,password,persistent,exclusive,charset);
if (! session) {
goto CLEANUP;
@@ -2611,7 +2659,7 @@
/* allocate our private error-handle */
CALL_OCI_RETURN(OCI(error), OCIHandleAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid **)&connection->pError,
OCI_HTYPE_ERROR,
0,
@@ -2624,7 +2672,7 @@
/* allocate our service-context */
CALL_OCI_RETURN(OCI(error), OCIHandleAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid **)&connection->pServiceContext,
OCI_HTYPE_SVCCTX,
0,
@@ -3480,7 +3528,7 @@
}
connection->error =
- OCILobIsTemporary(OCI(pEnv),
+ OCILobIsTemporary(connection->session->pEnv,
connection->pError,
mylob,
&is_temporary);
@@ -4667,7 +4715,7 @@
oci_debug("OCIfreecollection: coll=%d",inx);
CALL_OCI_RETURN(connection->error, OCIObjectFree(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dvoid *)coll->coll,
(ub2)(OCI_OBJECTFREE_FORCE)));
@@ -4719,7 +4767,7 @@
convert_to_string_ex(arg);
if(Z_STRLEN_PP(arg) == 0) {
CALL_OCI_RETURN(connection->error, OCICollAppend(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dword *)0,
&null_ind,
@@ -4752,7 +4800,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAppend(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dvoid *) &dt,
(dvoid *) &new_ind,
@@ -4768,7 +4816,7 @@
convert_to_string_ex(arg);
CALL_OCI_RETURN(connection->error, OCIStringAssignText(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
Z_STRVAL_PP(arg),
Z_STRLEN_PP(arg),
@@ -4780,7 +4828,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAppend(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dvoid *) ocistr,
(dvoid *) &new_ind,
@@ -4817,7 +4865,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAppend(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dvoid *) &num,
(dvoid *) &new_ind,
@@ -4865,7 +4913,7 @@
connection = coll->conn;
CALL_OCI_RETURN(connection->error, OCICollGetElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
coll->coll,
ndx,
@@ -4905,7 +4953,7 @@
RETURN_STRINGL(buff,len,1);
case OCI_TYPECODE_VARCHAR2 :
ocistr = *(OCIString **)elem;
- str = OCIStringPtr(OCI(pEnv),ocistr); /* XXX not
protected against recursion! */
+ str = OCIStringPtr(connection->session->pEnv,ocistr);
+/* XXX not protected against recursion! */
RETURN_STRINGL(str,strlen(str),1);
break;
case OCI_TYPECODE_UNSIGNED16 : /*
UNSIGNED SHORT */
@@ -4964,7 +5012,7 @@
connection = coll->conn;
CALL_OCI_RETURN(connection->error, OCICollAssign(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
from_coll->coll,
coll->coll));
@@ -5024,7 +5072,7 @@
if(Z_STRLEN_PP(val) == 0) {
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)0,
@@ -5057,7 +5105,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)&dt,
@@ -5073,7 +5121,7 @@
convert_to_string_ex(val);
CALL_OCI_RETURN(connection->error, OCIStringAssignText(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
Z_STRVAL_PP(val),
Z_STRLEN_PP(val),
@@ -5085,7 +5133,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)ocistr,
@@ -5124,7 +5172,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)&num,
@@ -5161,7 +5209,7 @@
connection = coll->conn;
CALL_OCI_RETURN(connection->error, OCICollSize(
- OCI(pEnv),
+ connection->session->pEnv,
coll->conn->pError,
coll->coll,
&sz));
@@ -5265,7 +5313,7 @@
zend_list_addref(connection->id);
CALL_OCI_RETURN(connection->error, OCITypeByName(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
connection->pServiceContext,
ac==3?(text *)Z_STRVAL_PP(schema):(text *)0,
@@ -5284,7 +5332,7 @@
}
CALL_OCI_RETURN(connection->error, OCIHandleAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid **) &dschp1,
(ub4) OCI_HTYPE_DESCRIBE,
(size_t) 0,
@@ -5368,7 +5416,7 @@
}
CALL_OCI_RETURN(connection->error, OCITypeByRef(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
coll->elem_ref,
OCI_DURATION_SESSION,
@@ -5400,7 +5448,7 @@
/* Create object to hold return table */
CALL_OCI_RETURN(connection->error, OCIObjectNew(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
connection->pServiceContext,
OCI_TYPECODE_TABLE,
Index: php4/ext/oci8/php_oci8.h
diff -u php4/ext/oci8/php_oci8.h:1.24 php4/ext/oci8/php_oci8.h:1.25
--- php4/ext/oci8/php_oci8.h:1.24 Thu Sep 12 05:48:03 2002
+++ php4/ext/oci8/php_oci8.h Fri Dec 6 08:44:35 2002
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_oci8.h,v 1.24 2002/09/12 09:48:03 thies Exp $ */
+/* $Id: php_oci8.h,v 1.25 2002/12/06 13:44:35 abonamous Exp $ */
#if HAVE_OCI8
# ifndef PHP_OCI8_H
@@ -70,6 +70,8 @@
char *hashed_details;
oci_server *server;
OCISession *pSession;
+ OCIEnv *pEnv; //sessions own environment
+ ub2 charsetId; //sessions used character set (mostly
+this will be 0, so NLS_LANG will be used.
} oci_session;
typedef struct {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php