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

Reply via email to