Ok, I've attached a pretty ok version. I had to update the config.m4 to inculde a
HAVE_OCI9 define, but since I'm not really good in this kind of thing, buildconf now
reports a warning
autoheader: No template for symbol `HAVE_OCI9'
don't know what to do about it. otherwise everything compiles and runs smoothly, so I
hope you'll enjoy :-).
Abdul
Maxim Maletsky <[EMAIL PROTECTED]> schrieb am 17.10.02 12:45:57:
> OK, then.
>
>
> --
> Maxim Maletsky
> [EMAIL PROTECTED]
>
>
>
> <[EMAIL PROTECTED]> wrote... :
>
> >
> > Thies, Maxim, if you could hang on for a few hours I'll be back with a few ideas
>and a cleaned up version of the patches + a switch for oracle 9+ to enable the new
>nls functions.
> >
> > Abdul
> >
>
--- oci8.c Wed Oct 9 16:55:16 2002
+++ oci8.c Thu Oct 17 13:32:09 2002
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8.c,v 1.176 2002/09/12 09:48:02 thies Exp $ */
+/* $Id: oci8.c,v 1.175 2002/08/20 07:26:50 edink Exp $ */
/* TODO list:
*
@@ -199,7 +199,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 **);
@@ -451,7 +451,7 @@
OCI_DEFAULT,
0,
NULL));
-
+
CALL_OCI(OCIHandleAlloc(
OCI(pEnv),
(dvoid **)&OCI(pError),
@@ -631,7 +631,7 @@
php_info_print_table_start();
php_info_print_table_row(2, "OCI8 Support", "enabled");
- php_info_print_table_row(2, "Revision", "$Revision: 1.176 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.175 $");
#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 );
@@ -1158,9 +1158,9 @@
php_error(E_WARNING, "Unknown descriptor type
%d.",Z_TYPE_P(descr));
return 0;
}
-
+
CALL_OCI_RETURN(OCI(error), OCIDescriptorAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid*)&(descr->ocidescr),
Z_TYPE_P(descr),
(size_t) 0,
@@ -1244,7 +1244,7 @@
oci_debug("_oci_make_zval: %16s,retlen = %4d,retlen4 =
%d,storage_size4 = %4d,indicator %4d, retcode = %4d",
column->name,column->retlen,column->retlen4,column->storage_size4,column->indicator,column->retcode);
- if ((! statement->has_data) || (column->indicator == -1)) { /* column is NULL
or statment has no current data */
+ if (column->indicator == -1) { /* column is NULL */
ZVAL_NULL(value);
return 0;
}
@@ -1351,14 +1351,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,
@@ -1392,9 +1392,7 @@
if (query) {
statement->last_query = estrdup(query);
}
-
statement->conn = connection;
- statement->has_data = 0;
statement->id = zend_list_insert(statement,le_stmt);
@@ -1771,7 +1769,6 @@
}
statement->error = 0; /* OCI_NO_DATA is NO error for us!!! */
- statement->has_data = 0;
return 0;
}
@@ -1831,16 +1828,12 @@
_oci_make_zval(column->define->zval,statement,column,"OCIFetch",0 TSRMLS_CC);
}
- statement->has_data = 1;
-
return 1;
}
oci_error(statement->pError, func, statement->error);
oci_handle_error(statement->conn, statement->error);
- statement->has_data = 0;
-
return 0;
}
@@ -1855,8 +1848,8 @@
ub4 siz = 0;
ub4 readlen = 0;
char *buf;
+
TSRMLS_FETCH();
-
*loblen = 0;
if (Z_TYPE_P(mydescr) == OCI_DTYPE_FILE) {
@@ -1888,17 +1881,17 @@
buf = emalloc(readlen + 1);
while (readlen > 0) { /* thies loop should not be entered on readlen == 0 */
- CALL_OCI_RETURN(connection->error, OCILobRead(
+ CALL_OCI_RETURN(connection->error, OCILobRead(
connection->pServiceContext,
connection->pError,
mydescr->ocidescr,
- &readlen,
/* IN/OUT bytes toread/read */
+ &readlen,
+ /* IN/OUT bytes toread/read */
siz + 1,
/* offset (starts with 1) */
(dvoid *) ((char *) buf + siz),
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;
@@ -1911,7 +1904,7 @@
break;
}
}
-
+
if (connection->error) {
oci_error(connection->pError, "OCILobRead", connection->error);
oci_handle_error(connection, connection->error);
@@ -1936,11 +1929,11 @@
buf = erealloc(buf,siz+1);
buf[ siz ] = 0;
+ oci_debug("OCIloadlob: size=%d",siz);
+
*buffer = buf;
*loblen = siz;
- oci_debug("OCIloadlob: size=%d",siz);
-
return 0;
}
/* }}} */
@@ -2119,11 +2112,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();
/*
@@ -2172,22 +2166,56 @@
session->server = server;
session->exclusive = exclusive;
+ #ifdef HAVE_OCI9
+ //following chunk is Oracle 9i+ ONLY
+ if (charset != "\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)
+ 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,
- NULL));
+ NULL));
if (OCI(error) != OCI_SUCCESS) {
oci_error(OCI(pError), "_oci_open_session: OCIHandleAlloc
OCI_HTYPE_SVCCTX", OCI(error));
goto CLEANUP;
}
- /* allocate private session-handle */
CALL_OCI_RETURN(OCI(error), OCIHandleAlloc(
- OCI(pEnv),
+ session->pEnv,
(dvoid **)&session->pSession,
OCI_HTYPE_SESSION,
0,
@@ -2305,7 +2333,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,
@@ -2365,6 +2393,10 @@
(ub4) OCI_HTYPE_SESSION));
}
+ CALL_OCI(OCIHandleFree(
+ (dvoid *)session->pEnv,
+ OCI_HTYPE_ENV));
+
hashed_details = session->hashed_details;
if (! OCI(shutdown)) {
@@ -2551,13 +2583,26 @@
*/
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) {
+
+ charset = "\0";
+ //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);
@@ -2577,7 +2622,7 @@
}
connection = (oci_connection *) ecalloc(1,sizeof(oci_connection));
-
+
if (! connection) {
goto CLEANUP;
}
@@ -2596,7 +2641,8 @@
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;
@@ -3476,7 +3522,7 @@
}
connection->error =
- OCILobIsTemporary(OCI(pEnv),
+ OCILobIsTemporary(connection->session->pEnv,
connection->pError,
mylob,
&is_temporary);
@@ -4601,7 +4647,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)));
@@ -4653,7 +4699,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,
@@ -4686,7 +4732,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAppend(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dvoid *) &dt,
(dvoid *) &new_ind,
@@ -4702,7 +4748,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),
@@ -4714,7 +4760,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAppend(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dvoid *) ocistr,
(dvoid *) &new_ind,
@@ -4751,7 +4797,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAppend(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
(dvoid *) &num,
(dvoid *) &new_ind,
@@ -4799,7 +4845,7 @@
connection = coll->conn;
CALL_OCI_RETURN(connection->error, OCICollGetElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
coll->coll,
ndx,
@@ -4839,7 +4885,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 */
@@ -4898,7 +4944,7 @@
connection = coll->conn;
CALL_OCI_RETURN(connection->error, OCICollAssign(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
from_coll->coll,
coll->coll));
@@ -4958,7 +5004,7 @@
if(Z_STRLEN_PP(val) == 0) {
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)0,
@@ -4991,7 +5037,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)&dt,
@@ -5007,7 +5053,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),
@@ -5019,7 +5065,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)ocistr,
@@ -5058,7 +5104,7 @@
}
CALL_OCI_RETURN(connection->error, OCICollAssignElem(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
ndx,
(dword *)&num,
@@ -5095,7 +5141,7 @@
connection = coll->conn;
CALL_OCI_RETURN(connection->error, OCICollSize(
- OCI(pEnv),
+ connection->session->pEnv,
coll->conn->pError,
coll->coll,
&sz));
@@ -5198,7 +5244,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,
@@ -5217,7 +5263,7 @@
}
CALL_OCI_RETURN(connection->error, OCIHandleAlloc(
- OCI(pEnv),
+ connection->session->pEnv,
(dvoid **) &dschp1,
(ub4) OCI_HTYPE_DESCRIBE,
(size_t) 0,
@@ -5301,7 +5347,7 @@
}
CALL_OCI_RETURN(connection->error, OCITypeByRef(
- OCI(pEnv),
+ connection->session->pEnv,
connection->pError,
coll->elem_ref,
OCI_DURATION_SESSION,
@@ -5333,7 +5379,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,
--- php_oci8.h Thu Sep 12 11:48:03 2002
+++ php_oci8.h Thu Oct 17 13:46:52 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.23 2002/02/10 12:41:52 thies Exp $ */
#if HAVE_OCI8
# ifndef PHP_OCI8_H
@@ -69,7 +69,9 @@
int exclusive;
char *hashed_details;
oci_server *server;
- OCISession *pSession;
+ OCIEnv *pEnv; //sessions own environment
+ OCISession *pSession;
+ ub2 charsetId; //sessions used character set (mostly
+this will be 0, so NLS_LANG will be used.
} oci_session;
typedef struct {
--- config.m4.orig Thu Oct 17 13:27:52 2002
+++ config.m4 Thu Oct 17 13:28:02 2002
@@ -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)
@@ -75,6 +75,18 @@
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,[])
+ ;;
+
*)
AC_MSG_ERROR(Unsupported Oracle version!)
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php