diff --git a/BASIC_README b/BASIC_README
new file mode 100644
index 0000000..3d251cd
--- /dev/null
+++ b/BASIC_README
@@ -0,0 +1,16 @@
+Basic Package Information
+=========================
+
+Fri Feb 15 04:34:00 PST 2013
+
+Client Shared Library 64-bit - 11.2.0.3.0
+
+System name:	Darwin
+Release:	11.3.0
+Version:	Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64
+Machine:	x86_64
+
+Operating in ORACLE_HOME environment.
+Small timezone file = /ade/b/2649109290/oracle/oracore/zoneinfo/timezone_14.dat
+Large timezone file = /ade/b/2649109290/oracle/oracore/zoneinfo/timezlrg_14.dat
+
diff --git a/PRECOMP_README b/PRECOMP_README
new file mode 100644
index 0000000..ba8f7ff
--- /dev/null
+++ b/PRECOMP_README
@@ -0,0 +1,80 @@
+PRECOMP Package Information
+===========================
+
+Fri Feb 15 04:34:38 PST 2013
+
+Client Shared Library 64-bit - 11.2.0.3.0
+
+System name:	Darwin
+Release:	11.3.0
+Version:	Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64
+Machine:	x86_64
+
+Operating in ORACLE_HOME environment.
+Small timezone file = /ade/b/2649109290/oracle/oracore/zoneinfo/timezone_14.dat
+Large timezone file = /ade/b/2649109290/oracle/oracore/zoneinfo/timezlrg_14.dat
+
+==============================================================================
+
+PRECOMP Instant Client (IC) Package (precomp.zip) contains following
+components:
+  i) "proc" binary and related files to precompile a Pro*C application
+ ii) "procob" binary and related files to precompile a Pro*COBOL application
+iii) sample configuration files, demo programs and demo make files for building
+     proc and procob demos and in general any Pro*C/Pro*COBOL application.
+
+Installing PRECOMP IC Package:
+------------------------------
+Prerequisites: 
+Please unzip following .zip files before unzipping precomp.zip:
+
+    a) For runtime support (running Pro*C/Pro*COBOL applications)
+          - Unzip basic.zip (not required if installed instantclient through
+                             Oracle Universal Installer)
+
+    b) For developing Pro*C/Pro*COBOL applications 
+          - Unzip basic.zip (not required if installed instantclient through
+                             Oracle Universal Installer)
+          - Unzip sdk.zip
+
+Notes: 
+    1) Runtime libraries are available in 
+           instantclient<_VV_v>/
+    2) proc binary is available in 
+           instantclient<_VV_v>/sdk/
+    3) procob binary is available in 
+           instantclient<_VV_v>/sdk/
+    4) ott binary is available in
+           instantclient<_VV_v>/sdk/
+    5) rtsora binary is available in
+           instantclient<_VV_v>/sdk/
+    6) All header files required for precompilation are available at
+           instantclient<_VV_v>/sdk/include/
+    7) Sample configuration files (pcscfg.cfg & pcbcfg.cfg) are available at
+           instantclient<_VV_v>/precomp/admin
+    8) Pro*C demo makefile and sample Pro*C application are available at
+           instantclient<_VV_v>/sdk/demo/
+    9) Pro*COBOL demo makefile and sample Pro*COBOL application are available at
+           instantclient<_VV_v>/sdk/demo/
+   10) Please ensure that ICSDKHOME & ICLIBHOME defined in the demo makefiles 
+            point to appropiate locations on your machine before putting them 
+            to use.
+  
+Legend:
+    VV - Major Oracle version number
+     v - Minor Oracle version number
+   (Ex:  For the release 11.1, VV = 11 and v = 1)
+
+
+Configurations Supported:
+-------------------------
+   Platforms              Runtime      Precompile
+   ~~~~~~~~~~~~~~~~~~~~~  ~~~~~~~~~~~  ~~~~~~~~~~~~
+   Linux 32bit (RHEL-4)   Proc:   Yes   proc:   Yes
+                          procob: Yes   procob: Yes
+
+   Windows 32bit          Proc:   Yes   proc:   Yes
+                          procob: Yes   procob: Yes
+
+
+==============================================================================
diff --git a/adrci b/adrci
new file mode 100755
index 0000000..cbf881b
--- /dev/null
+++ b/adrci
Binary files differ
diff --git a/cobsqlintf.o b/cobsqlintf.o
new file mode 100644
index 0000000..d307f11
--- /dev/null
+++ b/cobsqlintf.o
Binary files differ
diff --git a/genezi b/genezi
new file mode 100755
index 0000000..9646263
--- /dev/null
+++ b/genezi
Binary files differ
diff --git a/libclntsh.dylib b/libclntsh.dylib
new file mode 100755
index 0000000..40866f4
--- /dev/null
+++ b/libclntsh.dylib
Binary files differ
diff --git a/libnnz11.dylib b/libnnz11.dylib
new file mode 100755
index 0000000..d114c02
--- /dev/null
+++ b/libnnz11.dylib
Binary files differ
diff --git a/libocci.dylib.11.1 b/libocci.dylib.11.1
new file mode 100755
index 0000000..93af0bb
--- /dev/null
+++ b/libocci.dylib.11.1
Binary files differ
diff --git a/libociei.dylib b/libociei.dylib
new file mode 100755
index 0000000..fe08528
--- /dev/null
+++ b/libociei.dylib
Binary files differ
diff --git a/libocijdbc11.dylib b/libocijdbc11.dylib
new file mode 100755
index 0000000..00da2ee
--- /dev/null
+++ b/libocijdbc11.dylib
Binary files differ
diff --git a/ojdbc5.jar b/ojdbc5.jar
new file mode 100644
index 0000000..ecc78b9
--- /dev/null
+++ b/ojdbc5.jar
Binary files differ
diff --git a/ojdbc6.jar b/ojdbc6.jar
new file mode 100644
index 0000000..e1e1c15
--- /dev/null
+++ b/ojdbc6.jar
Binary files differ
diff --git a/precomp/admin/pcbcfg.cfg b/precomp/admin/pcbcfg.cfg
new file mode 100644
index 0000000..1ae99d6
--- /dev/null
+++ b/precomp/admin/pcbcfg.cfg
@@ -0,0 +1,3 @@
+define=bit64
+comp5=yes
+define=comp5
diff --git a/precomp/admin/pcscfg.cfg b/precomp/admin/pcscfg.cfg
new file mode 100644
index 0000000..263141f
--- /dev/null
+++ b/precomp/admin/pcscfg.cfg
@@ -0,0 +1,3 @@
+sys_include=($ORACLE_HOME/sdk/include,/usr/include)
+ltype=short
+define=__x86_64__
diff --git a/sdk/SDK_README b/sdk/SDK_README
new file mode 100644
index 0000000..f66a301
--- /dev/null
+++ b/sdk/SDK_README
@@ -0,0 +1,16 @@
+SDK Package Information
+=======================
+
+Fri Feb 15 04:34:43 PST 2013
+
+Client Shared Library 64-bit - 11.2.0.3.0
+
+System name:	Darwin
+Release:	11.3.0
+Version:	Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64
+Machine:	x86_64
+
+Operating in ORACLE_HOME environment.
+Small timezone file = /ade/b/2649109290/oracle/oracore/zoneinfo/timezone_14.dat
+Large timezone file = /ade/b/2649109290/oracle/oracore/zoneinfo/timezlrg_14.dat
+
diff --git a/sdk/demo/cdemo81.c b/sdk/demo/cdemo81.c
new file mode 100644
index 0000000..f9db754
--- /dev/null
+++ b/sdk/demo/cdemo81.c
@@ -0,0 +1,445 @@
+#ifdef RCSID
+static char *RCSid =
+   "$Header: cdemo81.c 14-apr-2006.10:55:52 lburgess Exp $ ";
+#endif /* RCSID */
+
+/* Copyright (c) 1996, 2006, Oracle. All rights reserved.  
+*/
+
+/*
+
+   NAME
+     cdemo81.c - Basic OCI V8 functionality
+
+   DESCRIPTION
+
+ *  An example program which adds new employee
+ *  records to the personnel data base.  Checking
+ *  is done to insure the integrity of the data base.
+ *  The employee numbers are automatically selected using
+ *  the current maximum employee number as the start.
+ *
+ *  The program queries the user for data as follows:
+ *
+ *  Enter employee name:
+ *  Enter employee job:
+ *  Enter employee salary:
+ *  Enter employee dept:
+ *
+ *  The program terminates if return key (CR) is entered
+ *  when the employee name is requested.
+ *
+ *  If the record is successfully inserted, the following
+ *  is printed:
+ *
+ *  "ename" added to department "dname" as employee # "empno"
+
+   Demonstrates creating a connection, a session and executing some SQL.
+   Also shows the usage of allocating memory for application use which has the
+   life time of the handle.
+
+   MODIFIED   (MM/DD/YY)
+   lburgess    04/14/06 - lowercase passwords 
+   aliu        04/21/06 - use OCIEnvCreate and exit if it fails 
+   mjaeger     07/14/99 - bug 808870: OCCS: convert tabs, no long lines
+   dchatter    10/14/98 - add the usage of xtrmemsz and usrmempp
+   azhao       06/23/97 - Use OCIBindByPos, OCIBindByName; clean up
+   echen       12/17/96 - OCI beautification
+   dchatter    07/18/96 - delete spurious header files
+   dchatter    07/15/96 - hda is a ub4 array to prevent bus error
+   mgianata    06/17/96 - change ociisc() to OCISessionBegin()
+   aroy        04/26/96 - change OCITransCommitt -> OCITransCommit
+   slari       04/24/96 - use OCITransCommitt
+   aroy        02/21/96 - fix bug in get descriptor handle call
+   lchidamb    02/20/96 - cdemo81.c converted for v8 OCI
+   lchidamb    02/20/96 - Creation
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <oci.h>
+
+static text *username = (text *) "SCOTT";
+static text *password = (text *) "tiger";
+
+/* Define SQL statements to be used in program. */
+static text *insert = (text *)"INSERT INTO emp(empno, ename, job, sal, deptno)\
+  VALUES (:empno, :ename, :job, :sal, :deptno)";
+static text *seldept = (text *)"SELECT dname FROM dept WHERE deptno = :1";
+static text *maxemp = (text *)"SELECT NVL(MAX(empno), 0) FROM emp";
+static text *selemp = (text *)"SELECT ename, job FROM emp";
+
+static OCIEnv *envhp;
+static OCIError *errhp;
+
+static void checkerr(/*_ OCIError *errhp, sword status _*/);
+static void cleanup(/*_ void _*/);
+static void myfflush(/*_ void _*/);
+int main(/*_ int argc, char *argv[] _*/);
+
+static sword status;
+
+int main(argc, argv)
+int argc;
+char *argv[];
+{
+
+  sword    empno, sal, deptno;
+  sword    len, len2, rv, dsize, dsize2;
+  sb4      enamelen = 10;
+  sb4      joblen = 9;
+  sb4      deptlen = 14;
+  sb2      sal_ind, job_ind;
+  sb2      db_type, db2_type;
+  sb1      name_buf[20], name2_buf[20];
+  text     *cp, *ename, *job, *dept;
+
+  sb2      ind[2];                                              /* indicator */
+  ub2      alen[2];                                         /* actual length */
+  ub2      rlen[2];                                         /* return length */
+
+  OCIDescribe  *dschndl1 = (OCIDescribe *) 0,
+               *dschndl2 = (OCIDescribe *) 0,
+               *dschndl3 = (OCIDescribe *) 0;
+
+  OCISession *authp = (OCISession *) 0;
+  OCIServer *srvhp;
+  OCISvcCtx *svchp;
+  OCIStmt   *inserthp,
+            *stmthp,
+            *stmthp1;
+  OCIDefine *defnp = (OCIDefine *) 0;
+
+  OCIBind  *bnd1p = (OCIBind *) 0;             /* the first bind handle */
+  OCIBind  *bnd2p = (OCIBind *) 0;             /* the second bind handle */
+  OCIBind  *bnd3p = (OCIBind *) 0;             /* the third bind handle */
+  OCIBind  *bnd4p = (OCIBind *) 0;             /* the fourth bind handle */
+  OCIBind  *bnd5p = (OCIBind *) 0;             /* the fifth bind handle */
+  OCIBind  *bnd6p = (OCIBind *) 0;             /* the sixth bind handle */
+
+  sword errcode = 0;
+
+  errcode = OCIEnvCreate((OCIEnv **) &envhp, (ub4) OCI_DEFAULT,
+                  (dvoid *) 0, (dvoid * (*)(dvoid *,size_t)) 0,
+                  (dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
+                  (void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **) 0);
+
+  if (errcode != 0) {
+    (void) printf("OCIEnvCreate failed with errcode = %d.\n", errcode);
+    exit(1);
+  }
+
+  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR,
+                   (size_t) 0, (dvoid **) 0);
+
+  /* server contexts */
+  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &srvhp, OCI_HTYPE_SERVER,
+                   (size_t) 0, (dvoid **) 0);
+
+  (void) OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX,
+                   (size_t) 0, (dvoid **) 0);
+
+  (void) OCIServerAttach( srvhp, errhp, (text *)"", strlen(""), 0);
+
+  /* set attribute server context in the service context */
+  (void) OCIAttrSet( (dvoid *) svchp, OCI_HTYPE_SVCCTX, (dvoid *)srvhp,
+                     (ub4) 0, OCI_ATTR_SERVER, (OCIError *) errhp);
+
+  (void) OCIHandleAlloc((dvoid *) envhp, (dvoid **)&authp,
+                        (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0);
+
+  (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
+                 (dvoid *) username, (ub4) strlen((char *)username),
+                 (ub4) OCI_ATTR_USERNAME, errhp);
+
+  (void) OCIAttrSet((dvoid *) authp, (ub4) OCI_HTYPE_SESSION,
+                 (dvoid *) password, (ub4) strlen((char *)password),
+                 (ub4) OCI_ATTR_PASSWORD, errhp);
+
+  checkerr(errhp, OCISessionBegin ( svchp,  errhp, authp, OCI_CRED_RDBMS,
+                          (ub4) OCI_DEFAULT));
+
+  (void) OCIAttrSet((dvoid *) svchp, (ub4) OCI_HTYPE_SVCCTX,
+                   (dvoid *) authp, (ub4) 0,
+                   (ub4) OCI_ATTR_SESSION, errhp);
+
+  checkerr(errhp, OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &stmthp,
+           OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0));
+
+  checkerr(errhp, OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &stmthp1,
+           OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0));
+
+  /* Retrieve the current maximum employee number. */
+  checkerr(errhp, OCIStmtPrepare(stmthp, errhp, maxemp,
+                                (ub4) strlen((char *) maxemp),
+                                (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT));
+
+  /* bind the input variable */
+  checkerr(errhp, OCIDefineByPos(stmthp, &defnp, errhp, 1, (dvoid *) &empno,
+                   (sword) sizeof(sword), SQLT_INT, (dvoid *) 0, (ub2 *)0,
+                   (ub2 *)0, OCI_DEFAULT));
+
+  /* execute and fetch */
+  if (status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
+               (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT))
+  {
+    if (status == OCI_NO_DATA)
+      empno = 10;
+    else
+    {
+      checkerr(errhp, status);
+      cleanup();
+      return OCI_ERROR;
+    }
+  }
+
+
+  /*
+   * When we bind the insert statement we also need to allocate the storage
+   * of the employee name and the job description.
+   * Since the lifetime of these buffers are the same as the statement, we
+   * will allocate it at the time when the statement handle is allocated; this
+   * will get freed when the statement disappears and there is less
+   * fragmentation.
+   *
+   * sizes required are enamelen+2 and joblen+2 to allow for \n and \0
+   *
+   */
+
+
+  checkerr(errhp, OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &inserthp,
+           OCI_HTYPE_STMT, (size_t) enamelen + 2 + joblen + 2,
+           (dvoid **) &ename));
+  job   = (text *) (ename+enamelen+2);
+
+
+  checkerr(errhp, OCIStmtPrepare(stmthp, errhp, insert,
+                                (ub4) strlen((char *) insert),
+                                (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT));
+
+  checkerr(errhp, OCIStmtPrepare(stmthp1, errhp, seldept,
+                                (ub4) strlen((char *) seldept),
+                                (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT));
+
+
+  /*  Bind the placeholders in the INSERT statement. */
+  if ((status = OCIBindByName(stmthp, &bnd1p, errhp, (text *) ":ENAME",
+             -1, (dvoid *) ename,
+             enamelen+1, SQLT_STR, (dvoid *) 0,
+             (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT)) ||
+      (status = OCIBindByName(stmthp, &bnd2p, errhp, (text *) ":JOB",
+             -1, (dvoid *) job,
+             joblen+1, SQLT_STR, (dvoid *) &job_ind,
+             (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT)) ||
+      (status = OCIBindByName(stmthp, &bnd3p, errhp, (text *) ":SAL",
+             -1, (dvoid *) &sal,
+             (sword) sizeof(sal), SQLT_INT, (dvoid *) &sal_ind,
+             (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT)) ||
+      (status = OCIBindByName(stmthp, &bnd4p, errhp, (text *) ":DEPTNO",
+             -1, (dvoid *) &deptno,
+             (sword) sizeof(deptno), SQLT_INT, (dvoid *) 0,
+             (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT)) ||
+      (status = OCIBindByName(stmthp, &bnd5p, errhp, (text *) ":EMPNO",
+             -1, (dvoid *) &empno,
+             (sword) sizeof(empno), SQLT_INT, (dvoid *) 0,
+             (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT)))
+  {
+    checkerr(errhp, status);
+    cleanup();
+    return OCI_ERROR;
+  }
+
+  /*  Bind the placeholder in the "seldept" statement. */
+  if (status = OCIBindByPos(stmthp1, &bnd6p, errhp, 1,
+           (dvoid *) &deptno, (sword) sizeof(deptno),SQLT_INT,
+           (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT))
+  {
+    checkerr(errhp, status);
+    cleanup();
+    return OCI_ERROR;
+  }
+
+  /*  Allocate the dept buffer now that you have length. */
+  /* the deptlen should eventually get from dschndl3.    */
+  deptlen = 14;
+  dept = (text *) malloc((size_t) deptlen + 1);
+
+  /*  Define the output variable for the select-list. */
+  if (status = OCIDefineByPos(stmthp1, &defnp, errhp, 1,
+                             (dvoid *) dept, deptlen+1, SQLT_STR,
+                             (dvoid *) 0, (ub2 *) 0, (ub2 *) 0, OCI_DEFAULT))
+  {
+    checkerr(errhp, status);
+    cleanup();
+    return OCI_ERROR;
+  }
+
+  for (;;)
+  {
+    /* Prompt for employee name.  Break on no name. */
+    printf("\nEnter employee name (or CR to EXIT): ");
+    fgets((char *) ename, (int) enamelen+1, stdin);
+    cp = (text *) strchr((char *) ename, '\n');
+    if (cp == ename)
+    {
+      printf("Exiting... ");
+      cleanup();
+      return OCI_SUCCESS;
+    }
+    if (cp)
+      *cp = '\0';
+    else
+    {
+      printf("Employee name may be truncated.\n");
+      myfflush();
+    }
+    /*  Prompt for the employee's job and salary. */
+    printf("Enter employee job: ");
+    job_ind = 0;
+    fgets((char *) job, (int) joblen + 1, stdin);
+    cp = (text *) strchr((char *) job, '\n');
+    if (cp == job)
+    {
+      job_ind = -1;            /* make it NULL in table */
+      printf("Job is NULL.\n");/* using indicator variable */
+    }
+    else if (cp == 0)
+    {
+      printf("Job description may be truncated.\n");
+      myfflush();
+    }
+    else
+      *cp = '\0';
+
+    printf("Enter employee salary: ");
+    scanf("%d", &sal);
+    myfflush();
+    sal_ind = (sal <= 0) ? -2 : 0;  /* set indicator variable */
+
+    /*
+     *  Prompt for the employee's department number, and verify
+     *  that the entered department number is valid
+     *  by executing and fetching.
+     */
+    do
+    {
+      printf("Enter employee dept: ");
+      scanf("%d", &deptno);
+      myfflush();
+      if ((status = OCIStmtExecute(svchp, stmthp1, errhp, (ub4) 1, (ub4) 0,
+               (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT))
+          && (status != OCI_NO_DATA))
+      {
+        checkerr(errhp, status);
+        cleanup();
+        return OCI_ERROR;
+      }
+      if (status == OCI_NO_DATA)
+        printf("The dept you entered doesn't exist.\n");
+      } while (status == OCI_NO_DATA);
+
+      /*
+       *  Increment empno by 10, and execute the INSERT
+       *  statement. If the return code is 1 (duplicate
+       *  value in index), then generate the next
+       *  employee number.
+       */
+      empno += 10;
+      if ((status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
+               (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT))
+               && status != 1)
+      {
+        checkerr(errhp, status);
+        cleanup();
+        return OCI_ERROR;
+      }
+      while (status == 1)
+      {
+        empno += 10;
+        if ((status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
+               (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT))
+                && status != 1)
+        {
+          checkerr(errhp, status);
+          cleanup();
+          return OCI_ERROR;
+        }
+      }  /* end for (;;) */
+
+      /* Commit the change. */
+      if (status = OCITransCommit(svchp, errhp, 0))
+      {
+        checkerr(errhp, status);
+        cleanup();
+        return OCI_ERROR;
+      }
+      printf("\n\n%s added to the %s department as employee number %d\n",
+                 ename, dept, empno);
+  }
+}
+
+
+void checkerr(errhp, status)
+OCIError *errhp;
+sword status;
+{
+  text errbuf[512];
+  sb4 errcode = 0;
+
+  switch (status)
+  {
+  case OCI_SUCCESS:
+    break;
+  case OCI_SUCCESS_WITH_INFO:
+    (void) printf("Error - OCI_SUCCESS_WITH_INFO\n");
+    break;
+  case OCI_NEED_DATA:
+    (void) printf("Error - OCI_NEED_DATA\n");
+    break;
+  case OCI_NO_DATA:
+    (void) printf("Error - OCI_NODATA\n");
+    break;
+  case OCI_ERROR:
+    (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
+                        errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
+    (void) printf("Error - %.*s\n", 512, errbuf);
+    break;
+  case OCI_INVALID_HANDLE:
+    (void) printf("Error - OCI_INVALID_HANDLE\n");
+    break;
+  case OCI_STILL_EXECUTING:
+    (void) printf("Error - OCI_STILL_EXECUTE\n");
+    break;
+  case OCI_CONTINUE:
+    (void) printf("Error - OCI_CONTINUE\n");
+    break;
+  default:
+    break;
+  }
+}
+
+
+/*
+ *  Exit program with an exit code.
+ */
+void cleanup()
+{
+  if (envhp)
+    (void) OCIHandleFree((dvoid *) envhp, OCI_HTYPE_ENV);
+  return;
+}
+
+
+void myfflush()
+{
+  eb1 buf[50];
+
+  fgets((char *) buf, 50, stdin);
+}
+
+
+/* end of file cdemo81.c */
+
diff --git a/sdk/demo/demo.mk b/sdk/demo/demo.mk
new file mode 100644
index 0000000..ba3e976
--- /dev/null
+++ b/sdk/demo/demo.mk
@@ -0,0 +1,141 @@
+#/bin/make
+###############################################################################
+#                       Make file for OCI and OCCI demos
+###############################################################################
+#  Usage :
+# For compiling & linking the cdemo81.c file
+#    make -f demo.mk buildoci EXE=cdemo81 OBJS=cdemo81.o 
+#
+# For compiling & linking the occidml.cpp
+#    make -f demo.mk buildocci EXE=occidml OBJS=occidml.o
+#
+# For compiling & linking the occiobj.cpp
+#    make -f demo.mk occiobj 
+#
+# In general, for any occi program
+#    make -f demo.mk buildocci EXE=<exename> OBJS="<list of dependent objs>"
+#
+# For compiling all demos
+#    make -f demo.mk
+#
+# NOTE: Please change cc and CC to point to the appropiate location on your
+#       machine.
+#
+###############################################################################
+
+.SUFFIXES: .o .c .cpp
+
+CC=/opt/SunProd/SUNWspro6.1/bin/CC
+cc=/opt/SunProd/SUNWspro6.1/bin/cc
+
+ICINCHOME=../
+ICLIBHOME=../../
+ICLIBPATH=-L$(ICLIBHOME)
+THREADLIBS=-lthread
+CCLIB=$(ICLIBPATH) -locci -lclntsh $(THREADLIBS)
+
+CCINCLUDES = -I$(ICINCHOME)include
+
+CCFLAGS=$(CCINCLUDES) -D_REENTRANT -g -xs 
+LDFLAGS=
+SO_EXT=.so
+
+REMOVE=rm -rf
+MKLINK=ln
+MAKE=make
+MAKEFILE=demo.mk
+CLNCACHE=cleancache
+CACHEDIR=SunWS_cache
+
+CDEMOEXE=cdemo81
+CDEMOOBJS=cdemo81.o
+OCCIDEMO=occidml
+OCCIOBJDEMO=occiobj
+OTT=../ott
+OCCIOTTUSR=hr
+OCCIOTTPWD=hr
+
+.cpp.o:
+	$(CC) -c -I$(ICINCHOME)include $(CCFLAGS) $<
+
+.c.o:
+	$(cc) -c -I$(ICINCHOME)include $(CCFLAGS) $<
+
+all: clean buildoci $(OCCIDEMO) $(OCCIOBJDEMO)
+
+buildoci: $(CLNCACHE) $(LIBCLNT) $(CDEMOOBJS)
+	$(MKLINK) $(ICLIBHOME)libclntsh$(SO_EXT).11.1 $(ICLIBHOME)libclntsh$(SO_EXT)
+	$(MKLINK) $(ICLIBHOME)libocci$(SO_EXT).11.1 $(ICLIBHOME)libocci$(SO_EXT)
+	$(CC) -o $(CDEMOEXE) $(LDFLAGS) $(CDEMOOBJS) $(CCLIB)
+	$(REMOVE) $(ICLIBHOME)libclntsh$(SO_EXT)
+	$(REMOVE) $(ICLIBHOME)libocci$(SO_EXT)
+
+buildocci: $(CLNCACHE) $(LIBCLNT) $(OBJS)
+	$(MKLINK) $(ICLIBHOME)libclntsh$(SO_EXT).11.1 $(ICLIBHOME)libclntsh$(SO_EXT)
+	$(MKLINK) $(ICLIBHOME)libocci$(SO_EXT).11.1 $(ICLIBHOME)libocci$(SO_EXT)
+	$(CC) -o $(EXE) $(LDFLAGS) $(OBJS) $(CCLIB)
+	$(REMOVE) $(ICLIBHOME)libclntsh$(SO_EXT)
+	$(REMOVE) $(ICLIBHOME)libocci$(SO_EXT)
+
+$(OCCIDEMO):
+	$(MAKE) -f $(MAKEFILE) buildocci OBJS=$@.o EXE=$@
+
+$(OCCIOBJDEMO):
+	$(OTT) userid=$(OCCIOTTUSR)/$(OCCIOTTPWD) \
+                intype=$@.typ \
+                outtype=$@out.type \
+                code=cpp \
+                hfile=$@.h \
+                cppfile=$@o.cpp \
+                attraccess=private \
+                unicode=none
+	$(MAKE) -f $(MAKEFILE) buildocci OBJS="$@.o $@m.o $@o.o" EXE=$@
+
+cleancache:
+	$(REMOVE) $(CACHEDIR)
+	$(REMOVE) $(ICLIBHOME)libclntsh$(SO_EXT)
+	$(REMOVE) $(ICLIBHOME)libocci$(SO_EXT)
+
+clean: $(CLNCACHE)
+	$(REMOVE) cdemo81 cdemo81.o occidml occidml.o occiobj occiobj.o occiobjo* occiobjm* occiobj.h occiobjout.type
+
+
+
+#
+# This port-specific file is currently empty on Solaris. Product
+# lines may use this file to override compiler definitions and
+# flags used in occi.mk.
+#
+
+# Linux compiler definitions
+CC=/usr/bin/g++
+cc=/usr/bin/gcc
+
+CCFLAGS=$(CCINCLUDES) -DMAC_OSX -D_GNU_SOURCE -D_REENTRANT -g -m64
+LDFLAGS=-g -m64
+CLNCACHE=
+SO_EXT=.dylib
+
+# This macro CCINCLUDES has to be redefined on Linux because of
+# the existence of the 'new' directory in t_work. The name new
+# clashes with a system header file.
+CCINCLUDES = -I$(SRCHOME)/rdbms/public/ \
+-I$(SRCHOME)/oracore/include -I$(SRCHOME)/oracore/public \
+-I$(SRCHOME)/oracore/port/include \
+-I$(SRCHOME)/nlsrtl/include -I$(SRCHOME)/plsql/public \
+-I$(SRCHOME)/plsql/include -I$(SRCHOME)/network/public \
+-I$(SRCHOME)/network/include -I$(SRCHOME)/otrace/public \
+-I$(SRCHOME)/otrace/include/ -I$(SRCHOME)/precomp/public \
+-I$(SRCHOME)/precomp/include/ -I$(SRCHOME)/slax/include \
+-I$(SRCHOME)/ordts/public -I$(SRCHOME)/ordts/include \
+-I$(SRCHOME)/javavm/include \
+-I$(SRCHOME)/javavm/include/osds/unix/solaris \
+-I$(SRCHOME)/ctx/public -I$(SRCHOME)/ordvir/public \
+-I$(SRCHOME)/ordvir/include -I$(SRCHOME)/rdbms/src/hdir \
+-idirafter .
+
+THREADLIBS=-lpthread
+
+ifdef BUILD_CCC296
+CC=/usr/bin/g++296
+endif
diff --git a/sdk/demo/demo_proc_ic.mk b/sdk/demo/demo_proc_ic.mk
new file mode 100644
index 0000000..aacc40e
--- /dev/null
+++ b/sdk/demo/demo_proc_ic.mk
@@ -0,0 +1,128 @@
+#/bin/make
+###############################################################################
+#                       Make file for PROC demos
+###############################################################################
+#  Usage :
+# For compiling proc demos
+#    make -f demo_proc_ic.mk
+#
+# For precompiling, compiling & linking the procdemo.pc file
+#    make -f demo_proc_ic.mk build EXE=procdemo OBJS=procdemo.o
+#
+# In general, for any proc program
+#    make -f demo_proc_ic.mk build EXE=<exename> OBJS="<list of dependent objs>"
+#
+#    To make use of any PROC options during precompilation, 
+#        make -f demo_proc_ic.mk build PROCFLAGS="<list of proc options>" 
+#            EXE=<exename> OBJS="<list of dependent objs>"
+#
+# NOTES: 
+#    1. Please change "cc/CC" and the "InstantClient directories" to point to 
+#       appropiate locations on your machine before using this makefile.
+#    2. In case of RPM installation, please change the following variables
+#       as mentioned below:
+#         PROC=/usr/lib/oracle/VV.v/client/bin/proc
+#         CCINCLUDES=$(I_SYM)/usr/include/oracle/VV.v/client
+#         PRECOMPPUBH=/usr/include/oracle/VV.v/client
+#         ICLIBHOME=/usr/lib/oracle/VV.v/client/lib/
+#       Legend:
+#         VV - Major Oracle version number
+#          v - Minor Oracle version number
+#         (Ex:  For the release 11.2, VV = 11 and v = 2)
+#
+###############################################################################
+
+
+CC=/usr/bin/gcc
+cc=/usr/bin/gcc
+
+# InstantClient Directories.
+ICSDKHOME=../
+ICLIBHOME=../../
+
+MKLINK=ln
+REMOVE=rm -rf
+CLNCACHE=cleancache
+CACHEDIR=SunWS_cachea
+MAKE=make
+MAKEFILE=demo_proc_ic.mk
+PROCDEMO=procdemo
+
+PROC=$(ICSDKHOME)proc
+SO_EXT=.dylib
+I_SYM=-I
+
+CCINCLUDES= $(I_SYM)$(ICSDKHOME)include
+
+# Pre-compiler Flags.
+PRECOMP_INCLUDE=$(I_SYM). $(SYS_INCLUDE)
+PRECOMPPUBH=$(ICSDKHOME)include
+SYS_INCLUDE=sys_include=\($(PRECOMPPUBH),/usr/include\)
+
+# Compiler Flags.
+OPTIMIZE=
+LDPATHFLAG=-L
+SPFLAGS=-DMAC_OSX -D_GNU_SOURCE -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS -DSS_64BIT_SERVER -DORAX86_64 -DBIT64 -DMACHINE64 -DSLS8NATIVE -DSLU8NATIVE -m64 -D_BCERT_API_ -DRSA_PLATFORM=RSA_MAC_X86_64_DARWIN
+CCFLAGS=-fno-common -no-cpp-precomp -Wall -Wno-unused -fPIC
+LDFLAGS=-g
+LPFLAGS=
+GFLAG=
+CDEBUG=
+USRFLAGS=
+ICLIBPATH=$(LDPATHFLAG)$(ICLIBHOME)
+PFLAGS=$(CCINCLUDES) $(SPFLAGS) $(LPFLAGS)
+CFLAGS=$(GFLAG) $(OPTIMIZE) $(CDEBUG) $(CCFLAGS) $(PFLAGS) $(USRFLAGS)
+
+# Libraries.
+PROLDLIBS=$(LDCLIENTLIBS) $(THREADLIBS)
+LDCLIENTLIBS=$(ICLIBPATH) $(LLIBCLNTSH) $(LDLIBS)
+LLIBCLNTSH=$(LDLIBFLAG)$(LIBCLNTSHNAME)
+LDLIBFLAG=-l
+LIBCLNTSHNAME=clntsh
+LDLIBS=$(EXSYSLIBS) $(MATHLIB) $(USRLIBS)
+EXSYSLIBS=-ldl
+MATHLIB=-lm
+THREADLIBS=-lpthread
+
+C2O=$(CC) $(CFLAGS) -c $*.c
+PCC2C=$(PROC) $(PROCFLAGS) iname=$(PCCSRC) $(PRECOMP_INCLUDE)
+DEMO_PROC_BUILD=$(CC) -o $(EXE) $(OBJS) $(LDFLAGS) $(PROLDLIBS)
+
+#-----------------------------------------------------------------------------
+# Targets for building the proc sample programs.
+all: clean $(PROCDEMO)
+
+$(PROCDEMO):
+	$(MAKE) -f $(MAKEFILE) build OBJS=$@.o EXE=$@
+	
+build: $(CLNCACHE) $(OBJS)
+	$(MKLINK) $(ICLIBHOME)libclntsh$(SO_EXT).11.1 $(ICLIBHOME)libclntsh$(SO_EXT)
+	$(DEMO_PROC_BUILD)
+	$(REMOVE) $(ICLIBHOME)libclntsh$(SO_EXT)
+
+#-----------------------------------------------------------------------------
+# Here are some rules for converting .pc -> .c -> .o
+.SUFFIXES: .pc .c .o
+
+pc1:
+	$(PCC2C)
+
+.pc.c:
+	$(MAKE) -f $(MAKEFILE) PROCFLAGS="$(PROCFLAGS)" PCCSRC=$* I_SYM=include= pc1
+
+.pc.o:
+	$(MAKE) -f $(MAKEFILE) PROCFLAGS="$(PROCFLAGS)" PCCSRC=$* I_SYM=include= pc1
+	$(C2O)
+
+.c.o:
+	$(C2O)
+
+#-----------------------------------------------------------------------------
+# Clean up all executables, *.o and generated *.c files
+clean: $(CLNCACHE)
+	$(REMOVE) $(PROCDEMO) $(PROCDEMO).o $(PROCDEMO).c $(PROCDEMO).lis
+
+cleancache:
+	$(REMOVE) $(CACHEDIR)
+	$(REMOVE) $(ICLIBHOME)libclntsh$(SO_EXT)
+
diff --git a/sdk/demo/demo_procob_ic.mk b/sdk/demo/demo_procob_ic.mk
new file mode 100644
index 0000000..25723ed
--- /dev/null
+++ b/sdk/demo/demo_procob_ic.mk
@@ -0,0 +1,99 @@
+
+###############################################################################
+#                       Make file for PROCOB demos
+###############################################################################
+#  Usage :
+# For compiling procob demos
+#    make -f demo_procob_ic.mk
+#
+# For precompiling, compiling & linking the procobdemo.pco file
+#    make -f demo_procob_ic.mk build EXE=procobdemo COBS=procobdemo.cob
+#
+# In general, for any procob program
+#    make -f demo_procob_ic.mk build EXE=<exename> COBS="<list of dependent cobs>"
+#    To make use of any PROCOB options during precompilation, 
+#        make -f demo_procob_ic.mk build PROCOBFLAGS="<list of procob options>" 
+#            EXE=<exename> COBS="<list of dependent cobs>"
+#
+# NOTES: 
+#    1. Please change "COB" and the "InstantClient directories" to point to 
+#       appropiate locations on your machine before using this makefile.
+#    2. In case of RPM installation, please change the following variables
+#       as mentioned below:
+#         PROCOB=/usr/lib/oracle/VV.v/client/bin/procob
+#         ICLIBHOME=/usr/lib/oracle/VV.v/client/lib/
+#       Legend:
+#         VV - Major Oracle version number
+#          v - Minor Oracle version number
+#         (Ex:  For the release 11.2, VV = 11 and v = 2)
+#
+###############################################################################
+
+COB=cob
+
+# InstantClient Directories.
+ICSDKHOME=../
+ICLIBHOME=../../
+
+MKLINK=ln
+REMOVE=rm -rf
+CLNCACHE=cleancache
+CACHEDIR=SunWS_cachea
+MAKE=make
+MAKEFILE=demo_procob_ic.mk
+PROCOBDEMO=procobdemo
+
+PROCOB=$(ICSDKHOME)/procob
+ICLIBPATH=$(LDPATHFLAG)$(ICLIBHOME)
+SO_EXT=.so
+COBFLAGS=-C IBMCOMP -C NESTCALL -t -x
+LDPATHFLAG=-L
+COBSQLINTF=$(ICLIBHOME)cobsqlintf.o
+LDLIBS=$(EXSYSLIBS) $(MATHLIB) $(USRLIBS)
+EXSYSLIBS=-ldl
+MATHLIB=-lm
+COBOL_PROLDLIBS=$(SHARED_CLIENTLIBS) $(LDLIBS)
+SHARED_CLIENTLIBS=$(LLIBCLNTSH) $(LDFLAGS)
+LLIBCLNTSH=$(LDLIBFLAG)$(LIBCLNTSHNAME)
+LDLIBFLAG=-l
+LIBCLNTSHNAME=clntsh
+LDFLAGS=-g
+
+DEMO_PROCOB_BUILD=$(COB) $(COBFLAGS) -o $(EXE) $(COBS) $(ICLIBPATH) $(COBSQLINTF) $(COBOL_PROLDLIBS)
+
+#-----------------------------------------------------------------------------
+# Targets for building the procob sample programs.
+#
+# The target 'build' puts together an executable $(EXE) from the cobol
+# sources in $(COBS) and the libraries in $(COBOL_PROLDLIBS).
+# The rules to make .cob files from .pco files are later in this file.
+#
+all: clean $(PROCOBDEMO)
+
+$(PROCOBDEMO):
+	$(MAKE) -f $(MAKEFILE) build COBS=$@.cob EXE=$@
+	
+build: $(CLNCACHE) $(COBS)
+	$(MKLINK) $(ICLIBHOME)libclntsh$(SO_EXT).11.1 $(ICLIBHOME)libclntsh$(SO_EXT)
+	$(DEMO_PROCOB_BUILD)
+	$(REMOVE) $(ICLIBHOME)libclntsh$(SO_EXT)
+
+#-----------------------------------------------------------------------------
+# Here are some rules for converting .pco -> .cob -> .o and for .cob -> .gnt.
+#
+.SUFFIXES: .cob .cbl .o .pco $(GNT)
+
+.pco.cob:
+	$(PROCOB) $(PROCOBFLAGS) iname=$*.pco
+
+.cob$(GNT):
+	$(COB2GNT)
+
+#-----------------------------------------------------------------------------
+# Clean up all executables, *.o and generated *.cob files
+clean: $(CLNCACHE)
+	$(REMOVE) $(PROCOBDEMO) $(PROCOBDEMO).o $(PROCOBDEMO).cob $(PROCDEMO).lis $(PROCOBDEMO).int $(PROCOBDEMO).idy 
+
+cleancache:
+	$(REMOVE) $(CACHEDIR)
+	$(REMOVE) $(ICLIBHOME)libclntsh$(SO_EXT)
diff --git a/sdk/demo/occidemo.sql b/sdk/demo/occidemo.sql
new file mode 100644
index 0000000..6d1c6a8
--- /dev/null
+++ b/sdk/demo/occidemo.sql
@@ -0,0 +1,344 @@
+/* Copyright (c) 2002, 2004, Oracle. All rights reserved.  */
+
+/*
+  NAME
+    occidemo.sql - Create OCCI demo objects
+
+  DESCRIPTION
+    SQL Script to create OCCI demo objects
+    Assumes HR schema is setup
+    Assumes system's account passwd to be manager
+    Execute this before any of the OCCI demos are run
+    To drop the objects created by this SQL use occidemod.sql
+
+  MODIFIED
+    sudsrini   03/06/03  - sudsrini_occi_10ir1_demos (include occidemod)
+    idcqe      03/13/01  - Created
+
+*/
+
+
+/* Drop objects before creating them */ 
+
+@occidemod.sql
+
+connect hr/hr
+
+CREATE TABLE elements (
+  element_name VARCHAR2(25),
+  molar_volume BINARY_FLOAT,
+  atomic_weight BINARY_DOUBLE
+);
+
+CREATE TABLE author_tab ( 
+  author_id NUMBER, 
+  author_name VARCHAR2(25) 
+); 
+
+INSERT INTO author_tab (author_id, author_name) VALUES (333, 'JOE');
+INSERT INTO author_tab (author_id, author_name) VALUES (444, 'SMITH');
+
+CREATE OR REPLACE TYPE publ_address AS OBJECT ( 
+  street_no NUMBER, 
+  city VARCHAR2(25) 
+) 
+/ 
+
+CREATE TABLE publisher_tab ( 
+  publisher_id NUMBER, 
+  publisher_add publ_address 
+); 
+
+INSERT INTO publisher_tab (publisher_id, publisher_add) VALUES 
+(11, publ_address (121, 'NEW YORK'));
+
+CREATE TABLE publ_address_tab OF publ_address; 
+
+INSERT INTO publ_address_tab VALUES (22, 'BOSTON');
+INSERT INTO publ_address_tab VALUES (33, 'BUFFALO');
+INSERT INTO publ_address_tab VALUES (44, 'CALIFORNIA');
+
+
+CREATE OR REPLACE TYPE journal AS TABLE OF VARCHAR2(50) 
+/ 
+CREATE TABLE journal_tab (jid NUMBER, jname journal) 
+NESTED TABLE jname STORE AS journal_store;
+
+INSERT INTO journal_tab (jid, jname) VALUES (22, journal ('NATION', 'TIMES'));
+INSERT INTO journal_tab (jid, jname) VALUES (33, journal ('CRICKET', 'ALIVE'));
+
+CREATE OR REPLACE TYPE people_obj AS OBJECT ( 
+  ssn NUMBER, 
+  name VARCHAR2(25) 
+) NOT FINAL; 
+/ 
+
+CREATE OR REPLACE TYPE librarian UNDER people_obj( 
+   empno NUMBER, 
+   sal   NUMBER(7,2), 
+   dob   DATE, 
+   photo BLOB 
+) 
+/ 
+
+CREATE TABLE librarian_tab OF librarian; 
+
+INSERT INTO librarian_tab VALUES 
+(101, 'DAVE', 1001, 10000, '12-Jan-1970', empty_blob());
+INSERT INTO librarian_tab VALUES 
+(102, 'BOB', 1002, 12000, '17-Jan-1970', empty_blob());
+
+CREATE TABLE article_tab ( 
+  artid NUMBER, 
+  artdesc VARCHAR2(4000), 
+  artsummary LONG,
+  artfeedbk VARCHAR2(2000)
+); 
+
+CREATE OR REPLACE PROCEDURE demo_proc (col1 IN NUMBER, col2 IN OUT VARCHAR2,
+col3 OUT CHAR) AS
+BEGIN 
+  col2 := col1 || ' ' || col2 || ' ' || 'IN-OUT';
+  col3 := 'OUT'; 
+END;
+/
+
+CREATE OR REPLACE FUNCTION demo_fun (col1 IN NUMBER,
+col2 IN OUT VARCHAR2, col3 OUT CHAR) RETURN CHAR AS 
+BEGIN 
+  col2 := col1 || ' ' || col2 || ' ' || 'IN-OUT'; 
+  col3 := 'OUT'; 
+  RETURN 'abcd';
+END;
+/
+
+CREATE TABLE book (bookid NUMBER, summary VARCHAR2(4000));
+
+CREATE TABLE cover (c1 NUMBER(5), c2 VARCHAR2(20));
+
+DECLARE 
+ch1 VARCHAR2(4000) := 'aa'; 
+ch2 VARCHAR2(4000):= '';
+nu NUMBER := 0; 
+BEGIN 
+  FOR nu IN 1..11 LOOP
+    ch2 := ch1 || ch2; ch1 := ch2; 
+  END LOOP; 
+  INSERT INTO book (bookid, summary) VALUES (11, ch1); 
+END;
+/
+
+CREATE TYPE elecdoc_typ AS OBJECT
+    ( document_typ      VARCHAR2(32)
+    , formatted_doc     BLOB
+    ) ;
+/
+CREATE TYPE elecdoc_tab AS TABLE OF elecdoc_typ;
+/
+
+CREATE TYPE elheader_typ AS OBJECT
+    ( header_name        VARCHAR2(256)
+    , creation_date      DATE
+    , header_text        VARCHAR2(1024)
+    , logo               BLOB
+    );
+/
+
+CREATE TABLE electronic_media
+    ( product_id        NUMBER(6)
+    , ad_id             NUMBER(6)
+    , ad_composite      BLOB
+    , ad_sourcetext     CLOB
+    , ad_finaltext      CLOB
+    , ad_fltextn        NCLOB
+    , ad_elecdocs_ntab  elecdoc_tab
+    , ad_photo          BLOB
+    , ad_graphic        BFILE
+    , ad_header         elheader_typ
+    , press_release     LONG
+    ) NESTED TABLE ad_elecdocs_ntab STORE AS elecdocs_nestedtab;
+CREATE UNIQUE INDEX printmedia_pk
+    ON electronic_media (product_id, ad_id);
+
+ALTER TABLE electronic_media
+ADD ( CONSTRAINT printmedia__pk
+      PRIMARY KEY (product_id, ad_id)
+    ) ;
+
+
+
+CREATE TYPE people_typ AS OBJECT
+(
+  name VARCHAR2(30),
+  ssn NUMBER,
+  dob DATE
+) not final;
+/
+
+CREATE TABLE people_tab OF people_typ;
+
+INSERT INTO people_tab VALUES (people_typ('john', 111, '01-Jan-1970'));
+INSERT INTO people_tab VALUES (people_typ('jill', 666, '06-Jan-1976'));
+
+CREATE TYPE student UNDER people_typ
+(
+  stud_id NUMBER,
+  teammate REF people_typ
+) NOT FINAL;
+/
+
+CREATE TABLE student_tab OF student;
+INSERT INTO student_tab VALUES ('jimmy',222,'02-Feb-1976',200,
+(SELECT REF(a) FROM people_tab a where name='john'));
+
+CREATE TYPE parttime_stud UNDER student
+(
+  course_id NUMBER,
+  partner REF student
+)NOT FINAL;
+/
+CREATE TABLE parttime_stud_tab OF parttime_stud;
+
+INSERT INTO parttime_stud_tab VALUES ('james',333,'03-Feb-1976',300,
+(SELECT REF(a) FROM people_tab a where name='john'),3000,
+(SELECT REF(a) FROM student_tab a));
+
+
+CREATE TYPE foreign_student UNDER parttime_stud
+(
+  country VARCHAR2(30),
+  leader REF parttime_stud
+);
+/
+CREATE TABLE foreign_student_tab OF foreign_student;
+
+COMMIT;
+
+
+/* OCCI AQ Objects */
+
+
+connect system/manager 
+
+grant aq_administrator_role, aq_user_role to hr;
+grant execute on dbms_aq to hr;
+grant execute on dbms_aqadm to hr;
+
+BEGIN
+  dbms_aqadm.grant_system_privilege('ENQUEUE_ANY','hr',FALSE);
+  dbms_aqadm.grant_system_privilege('DEQUEUE_ANY','hr',FALSE);
+END;
+/
+
+connect hr/hr
+
+CREATE OR REPLACE TYPE hr_obj AS OBJECT
+(a1 NUMBER, a2 VARCHAR2(25));
+/
+
+BEGIN
+  dbms_aqadm.create_queue_table (
+  queue_table => 'hr.table01',
+  queue_payload_type => 'RAW',
+  comment => 'single-consumer',
+  multiple_consumers => false,
+  compatible => '8.1.0'
+);
+END;
+/
+
+BEGIN
+  dbms_aqadm.create_queue (
+  queue_name => 'queue01', 
+  queue_table=> 'hr.table01' 
+);
+END;
+/
+BEGIN
+  dbms_aqadm.start_queue(queue_name => 'queue01');
+END;
+/
+
+BEGIN
+  dbms_aqadm.create_queue_table (
+  queue_table => 'hr.table02',
+  queue_payload_type => 'SYS.ANYDATA',
+  comment => 'multi-consumer',
+  multiple_consumers => true,
+  compatible => '8.1.0'
+);
+END;
+/
+
+BEGIN
+  dbms_aqadm.create_queue (
+  queue_name => 'queue02',
+  queue_table=> 'hr.table02'
+);
+END;
+/
+BEGIN
+  dbms_aqadm.start_queue(queue_name => 'queue02');
+END;
+/
+
+BEGIN
+  dbms_aqadm.create_queue_table (
+  queue_table => 'hr.table03',
+  queue_payload_type => 'hr_obj',
+  comment => 'multi-consumer',
+  multiple_consumers => true,
+  compatible => '8.1.0'
+);
+END;
+/
+
+BEGIN
+  dbms_aqadm.create_queue (
+  queue_name => 'queue03',
+  queue_table=> 'hr.table03'
+);
+END;
+/
+BEGIN
+  dbms_aqadm.start_queue(queue_name => 'queue03');
+END;
+/
+
+BEGIN
+  dbms_aqadm.create_queue_table (
+  queue_table => 'hr.table04',
+  queue_payload_type => 'RAW',
+  comment => 'multiple-consumer',
+  multiple_consumers => true,
+  compatible => '8.1.0'
+);
+END;
+/
+
+BEGIN
+  dbms_aqadm.create_queue (
+  queue_name => 'queue04',
+  queue_table=> 'hr.table04'
+);
+END;
+/
+BEGIN
+  dbms_aqadm.start_queue(queue_name => 'queue04');
+END;
+/
+
+Rem Add default local subscribers to the queues
+
+BEGIN
+  dbms_aqadm.add_subscriber( queue_name=> 'queue03',
+           subscriber=> sys.aq$_agent('AGT1','hr.queue03', 0));
+END;
+/
+
+BEGIN
+  dbms_aqadm.add_subscriber( queue_name=> 'queue04',
+           subscriber=> sys.aq$_agent('AGT1','hr.queue04', 0));
+END;
+/
+
diff --git a/sdk/demo/occidemod.sql b/sdk/demo/occidemod.sql
new file mode 100644
index 0000000..d5d4ce7
--- /dev/null
+++ b/sdk/demo/occidemod.sql
@@ -0,0 +1,121 @@
+/* Copyright (c) 2002, 2003, Oracle Corporation.  All rights reserved.  */
+
+/*
+  NAME
+    occidemod - SQL Script to drop OCCI demo objects
+
+  DESCRIPTION
+    SQL Script to drop OCCI demo objects created by occidemo.sql
+    To be run in the end to drop OCCI demo objects from HR schema
+
+  MODIFIED
+    sudsrini   03/06/03  - sudsrini_occi_10ir1_demos
+    sudsrini   02/21/03  - Created
+
+*/
+
+connect hr/hr
+
+DROP PROCEDURE demo_proc;
+DROP FUNCTION demo_fun;
+
+DROP TABLE elements;
+DROP TABLE author_tab;
+DROP TABLE publisher_tab;
+DROP TABLE publ_address_tab;
+DROP TABLE journal_tab;
+DROP TABLE article_tab;
+DROP TABLE librarian_tab;
+DROP TABLE book;
+DROP TABLE cover;
+
+DROP TYPE journal;
+DROP TYPE publ_address;
+DROP TYPE librarian;
+DROP TYPE people_obj;
+
+
+DROP TABLE electronic_media;
+DROP TYPE elheader_typ;
+DROP TYPE elecdoc_tab;
+DROP TYPE elecdoc_typ;
+
+DROP TABLE foreign_student_tab;
+DROP TABLE parttime_stud_tab;
+DROP TABLE student_tab;
+DROP TABLE people_tab;
+DROP TYPE foreign_student;
+DROP TYPE parttime_stud;
+DROP TYPE student;
+DROP TYPE people_typ;
+
+/* OCCI AQ Object */
+
+connect system/manager 
+
+revoke aq_administrator_role from hr;
+
+connect hr/hr
+
+BEGIN
+  dbms_aqadm.stop_queue(queue_name => 'queue01');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue('queue01');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue_table('hr.table01');
+END;
+/
+
+BEGIN
+  dbms_aqadm.stop_queue(queue_name => 'queue02');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue('queue02');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue_table('hr.table02');
+END;
+/
+
+BEGIN
+  dbms_aqadm.stop_queue(queue_name => 'queue03');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue('queue03');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue_table('hr.table03');
+END;
+/
+
+BEGIN
+  dbms_aqadm.stop_queue(queue_name => 'queue04');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue('queue04');
+END;
+/
+
+BEGIN
+  dbms_aqadm.drop_queue_table('hr.table04');
+END;
+/
+
+DROP TYPE hr_obj;
+
diff --git a/sdk/demo/occidml.cpp b/sdk/demo/occidml.cpp
new file mode 100644
index 0000000..ec5381c
--- /dev/null
+++ b/sdk/demo/occidml.cpp
@@ -0,0 +1,292 @@
+/* Copyright (c) 2001, 2008, Oracle. All rights reserved.  */
+/*
+   NAME
+     occidml.cpp - Basic DML Operations demo
+
+   DESCRIPTION
+     To exhibit the insertion, selection, updating and deletion of
+     a row using OCCI interface
+
+   MODIFIED   (MM/DD/YY)
+   mvasudev   05/22/08 - Add try/catch blocks
+   sudsrini   10/22/06 - Username/Password lower case
+   lburgess   04/14/06 - lowercase passwords 
+   sudsrini   07/23/04 - Copyright Info
+   idcqe      03/05/01 - Creation
+
+*/
+
+#include <iostream>
+#include <occi.h>
+using namespace oracle::occi;
+using namespace std;
+
+class  occidml
+{
+  private:
+
+  Environment *env;
+  Connection *conn;
+  Statement *stmt;
+  public:
+
+  occidml (string user, string passwd, string db)
+  {
+    env = Environment::createEnvironment (Environment::DEFAULT);
+    conn = env->createConnection (user, passwd, db);
+  }
+
+  ~occidml ()
+  {
+    env->terminateConnection (conn);
+    Environment::terminateEnvironment (env);
+  }
+
+  /**
+   * Insertion of a row with dynamic binding, PreparedStatement functionality.
+   */
+  void insertBind (int c1, string c2)
+  {
+    string sqlStmt = "INSERT INTO author_tab VALUES (:x, :y)";
+    stmt=conn->createStatement (sqlStmt);
+    try{
+    stmt->setInt (1, c1);
+    stmt->setString (2, c2);
+    stmt->executeUpdate ();
+    cout << "insert - Success" << endl;
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for insertBind"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    conn->terminateStatement (stmt);
+  }
+
+  /**
+   * Inserting a row into the table.
+   */
+  void insertRow ()
+  {
+    string sqlStmt = "INSERT INTO author_tab VALUES (111, 'ASHOK')";
+    stmt = conn->createStatement (sqlStmt);
+    try{
+    stmt->executeUpdate ();
+    cout << "insert - Success" << endl;
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for insertRow"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    conn->terminateStatement (stmt);
+  }
+
+  /**
+   * updating a row
+   */
+  void updateRow (int c1, string c2)
+  {
+    string sqlStmt = 
+      "UPDATE author_tab SET author_name = :x WHERE author_id = :y";
+    stmt = conn->createStatement (sqlStmt);
+    try{
+    stmt->setString (1, c2);
+    stmt->setInt (2, c1);
+    stmt->executeUpdate ();
+    cout << "update - Success" << endl;
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for updateRow"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    conn->terminateStatement (stmt);
+  }
+
+
+  /**
+   * deletion of a row
+   */
+  void deleteRow (int c1, string c2)
+  {
+    string sqlStmt = 
+      "DELETE FROM author_tab WHERE author_id= :x AND author_name = :y";
+    stmt = conn->createStatement (sqlStmt);
+    try{
+    stmt->setInt (1, c1);
+    stmt->setString (2, c2);
+    stmt->executeUpdate ();
+    cout << "delete - Success" << endl;
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for deleteRow"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    conn->terminateStatement (stmt);
+  }
+
+  /**
+   * displaying all the rows in the table
+   */
+  void displayAllRows ()
+  {
+    string sqlStmt = "SELECT author_id, author_name FROM author_tab \
+    order by author_id";
+    stmt = conn->createStatement (sqlStmt);
+    ResultSet *rset = stmt->executeQuery ();
+    try{
+    while (rset->next ())
+    {
+      cout << "author_id: " << rset->getInt (1) << "  author_name: " 
+        << rset->getString (2) << endl;
+    }
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for displayAllRows"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    stmt->closeResultSet (rset);
+    conn->terminateStatement (stmt);
+  }
+
+  /**
+   * Inserting a row into elements table.
+   * Demonstrating the usage of BFloat and BDouble datatypes
+   */
+  void insertElement (string elm_name, float mvol=0.0, double awt=0.0)
+  {
+    BFloat mol_vol;
+    BDouble at_wt;
+
+    if (!(mvol))
+      mol_vol.isNull = TRUE;
+    else
+      mol_vol.value = mvol;
+
+    if (!(awt))
+      at_wt.isNull = TRUE;
+    else
+      at_wt.value = awt;
+
+    string sqlStmt = "INSERT INTO elements VALUES (:v1, :v2, :v3)";
+    stmt = conn->createStatement (sqlStmt);
+
+    try{
+    stmt->setString(1, elm_name);
+    stmt->setBFloat(2, mol_vol);
+    stmt->setBDouble(3, at_wt);
+    stmt->executeUpdate ();
+    cout << "insertElement - Success" << endl;
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for insertElement"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+    conn->terminateStatement (stmt);
+  }
+
+  /**
+   * displaying rows from element table
+   */
+  void displayElements ()
+  {
+    string sqlStmt = 
+           "SELECT element_name, molar_volume, atomic_weight FROM elements \
+    order by element_name";
+    stmt = conn->createStatement (sqlStmt);
+    ResultSet *rset = stmt->executeQuery ();
+    try{
+    cout.precision(7);
+    while (rset->next ())
+    {
+      string elem_name = rset->getString(1);
+      BFloat mol_vol = rset->getBFloat(2);
+      BDouble at_wt = rset->getBDouble(3);
+
+      cout << "Element Name: " << elem_name << endl;
+
+      if ( mol_vol.isNull )
+        cout << "Molar Volume is NULL" << endl;
+      else
+        cout << "Molar Volume: " << mol_vol.value << " cm3 mol-1" << endl;
+
+      if ( at_wt.isNull )
+        cout << "Atomic Weight is NULL" << endl;
+      else
+        cout << "Atomic Weight: " << at_wt.value << " g/mole" << endl;
+    }
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for displayElements"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    stmt->closeResultSet (rset);
+    conn->terminateStatement (stmt);
+  }
+
+}; // end of class  occidml
+
+
+int main (void)
+{
+  string user = "hr";
+  string passwd = "hr";
+  string db = "";
+  try{
+  cout << "occidml - Exhibiting simple insert, delete & update operations" 
+       << endl;
+  occidml *demo = new occidml (user, passwd, db);
+  cout << "Displaying all records before any operation" << endl;
+  demo->displayAllRows ();
+
+  cout << "Inserting a record into the table author_tab " 
+    << endl;
+  demo->insertRow ();
+
+  cout << "Displaying the records after insert " << endl;
+  demo->displayAllRows ();
+
+  cout << "Inserting a records into the table author_tab using dynamic bind"
+    << endl;
+  demo->insertBind (222, "ANAND");
+ 
+  cout << "Displaying the records after insert using dynamic bind" << endl;
+  demo->displayAllRows ();
+
+  cout << "deleting a row with author_id as 222 from author_tab table" << endl;
+  demo->deleteRow (222, "ANAND");
+
+  cout << "updating a row with author_id as 444 from author_tab table" << endl;
+  demo->updateRow (444, "ADAM");
+
+  cout << "displaying all rows after all the operations" << endl;
+  demo->displayAllRows ();
+
+  cout << "inserting radio active element properties" << endl;
+  demo->insertElement ("Uranium", 12.572, 238.0289 );
+  demo->insertElement ("Plutonium", 12.12, 244.0642 );
+  demo->insertElement ("Curium", 18.17, 247.0703 );
+  demo->insertElement ("Thorium");
+  demo->insertElement ("Radium", 41.337, 226.0254);
+
+  cout << "displaying all radio active element properties" << endl;
+  demo->displayElements ();
+
+  delete (demo);
+  }
+  catch (SQLException ex){
+    cout << ex.getMessage() << endl;
+  }
+  cout << "occidml - done" << endl;
+}
diff --git a/sdk/demo/occiobj.cpp b/sdk/demo/occiobj.cpp
new file mode 100644
index 0000000..499595a
--- /dev/null
+++ b/sdk/demo/occiobj.cpp
@@ -0,0 +1,196 @@
+/* Copyright (c) 2001, 2006, Oracle. All rights reserved.  */
+/*
+   NAME
+     occiobj.cpp - OCCI Embedded Object demo
+
+   DESCRIPTION
+     This demo performs all DML operations using OCCI interface
+     on embedded object column of table
+
+
+   MODIFIED   (MM/DD/YY)
+   sudsrini    10/22/06 - Username/Password lower case
+   lburgess    04/14/06 - lowercase passwords 
+   sudsrini    07/23/04 - Copyright Info
+   idcqe       03/05/01 - Creation
+
+*/
+
+#include <iostream>
+#include "occiobjm.h"
+
+using namespace oracle::occi;
+using namespace std;
+
+class occiobj
+{
+  private:
+
+  Environment *env;
+  Connection *con;
+  Statement *stmt;
+  public:
+
+  occiobj (string user, string passwd, string db)
+  {
+    env = Environment::createEnvironment (Environment::OBJECT);
+    occiobjm (env);
+    con = env->createConnection (user, passwd, db);
+  }
+
+  ~occiobj ()
+  {
+    env->terminateConnection (con);
+    Environment::terminateEnvironment (env);
+  }
+
+  /**
+   * Insertion of a row 
+   */
+  void insertRow (int c1, int a1, string a2)
+  {
+    cout << "Inserting record - Publisher id :" << c1 << 
+      ", Publisher address :" << a1 << ", " << a2 <<endl; 
+    string sqlStmt = "INSERT INTO publisher_tab VALUES (:x, :y)";
+    try{
+    stmt = con->createStatement (sqlStmt);
+    stmt->setInt (1, c1);
+    address *o = new address ();
+    o->setStreet_no (Number (a1));
+    o->setCity (a2);
+    stmt->setObject (2, o);
+    stmt->executeUpdate ();
+    cout << "Insert - Success" << endl;
+    delete (o);
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for insertRow"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    con->terminateStatement (stmt);
+  }
+
+
+  /**
+   * updating a row
+   */
+  void updateRow (int c1, int a1, string a2)
+  {
+    cout << "Upadating record with publisher id :"<< c1 << endl;
+    string sqlStmt = 
+      "UPDATE publisher_tab SET publisher_add= :x WHERE publisher_id = :y";
+    try{
+    stmt = con->createStatement (sqlStmt);
+    address *o = new address ();
+    o->setStreet_no (Number (a1));
+    o->setCity (a2);
+    stmt->setObject (1, o);
+    stmt->setInt (2, c1);
+    stmt->executeUpdate ();
+    cout << "Update - Success" << endl;
+    delete (o);
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for updateRow"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+    con->terminateStatement (stmt);
+  }
+
+
+  /**
+   * deletion of a row
+   */
+  void deleteRow (int c1, int a1, string a2)
+  {
+    cout << "Deletion of record where publisher id :" << c1 <<endl; 
+    string sqlStmt = 
+    "DELETE FROM publisher_tab WHERE publisher_id= :x AND publisher_add = :y";
+    try{
+    stmt = con->createStatement (sqlStmt);
+    stmt->setInt (1, c1);
+
+    address *o = new address ();
+    o->setStreet_no (Number (a1));
+    o->setCity (a2);
+    stmt->setObject (2, o);
+    stmt->executeUpdate ();
+    cout << "Delete - Success" << endl;
+    delete (o);
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for deleteRow"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    con->terminateStatement (stmt);
+  }
+
+  /**
+   * displaying all the rows in the table
+   */
+  void displayAllRows ()
+  {
+    string sqlStmt = "SELECT publisher_id, publisher_add FROM publisher_tab \
+    order by publisher_id";
+    try{
+    stmt = con->createStatement (sqlStmt);
+    ResultSet *rset = stmt->executeQuery ();
+   
+    while (rset->next ())
+    {
+      cout << "publisher id: " << rset->getInt (1) 
+           << " publisher address: address (" ;
+      address *o =  (address *)rset->getObject (2);
+      cout << (int)o->getStreet_no () << ", " << o->getCity () << ")" << endl;
+    }
+
+    stmt->closeResultSet (rset);
+    }catch(SQLException ex)
+    {
+     cout<<"Exception thrown for displayAllRows"<<endl;
+     cout<<"Error number: "<<  ex.getErrorCode() << endl;
+     cout<<ex.getMessage() << endl;
+    }
+
+    con->terminateStatement (stmt);
+  }
+
+};//end of class occiobj;
+
+
+int main (void)
+{
+  string user = "hr";
+  string passwd = "hr";
+  string db = "";
+
+  try
+  {
+    cout << "occiobj - Exhibiting simple insert, delete & update operations" 
+     " on Oracle objects" << endl;
+    occiobj *demo = new occiobj (user, passwd, db);
+
+    cout << "displaying all rows before operations" << endl;
+    demo->displayAllRows ();
+  
+    demo->insertRow (12, 122, "MIKE");
+  
+    demo->deleteRow (11, 121, "ANNA");
+  
+    demo->updateRow (23, 123, "KNUTH");
+  
+    cout << "displaying all rows after all operations" << endl;
+    demo->displayAllRows ();
+  
+    delete (demo);
+    cout << "occiobj - done" << endl;
+  }catch (SQLException ea)
+  {
+    cerr << "Error running the demo: " << ea.getMessage () << endl;
+  }
+}
diff --git a/sdk/demo/occiobj.typ b/sdk/demo/occiobj.typ
new file mode 100644
index 0000000..dd788cd
--- /dev/null
+++ b/sdk/demo/occiobj.typ
@@ -0,0 +1,3 @@
+CASE=SAME
+MAPFILE=occiobjm.cpp
+TYPE publ_address as address
diff --git a/sdk/demo/procdemo.pc b/sdk/demo/procdemo.pc
new file mode 100644
index 0000000..a9175cf
--- /dev/null
+++ b/sdk/demo/procdemo.pc
@@ -0,0 +1,118 @@
+/*
+ *  procdemo.pc
+ *
+ *  This program connects to ORACLE, declares and opens a cursor, 
+ *  fetches the names, salaries, and commissions of all
+ *  salespeople, displays the results, then closes the cursor. 
+ */ 
+
+#include <stdio.h>
+#include <string.h>
+#include <sqlca.h>
+#include <stdlib.h>
+#include <sqlda.h>
+#include <sqlcpr.h>
+
+#define UNAME_LEN      20 
+#define PWD_LEN        11 
+ 
+/*
+ * Use the precompiler typedef'ing capability to create
+ * null-terminated strings for the authentication host
+ * variables. (This isn't really necessary--plain char *'s
+ * would work as well. This is just for illustration.)
+ */
+typedef char asciiz[PWD_LEN]; 
+
+EXEC SQL TYPE asciiz IS CHARZ(PWD_LEN) REFERENCE; 
+asciiz     username; 
+asciiz     password; 
+
+struct emp_info 
+{ 
+    asciiz     emp_name; 
+    float      salary; 
+    float      commission; 
+}; 
+
+void sql_error(msg) 
+    char *msg;
+{ 
+    char err_msg[512];
+    size_t buf_len, msg_len;
+
+    EXEC SQL WHENEVER SQLERROR CONTINUE;
+
+    printf("\n%s\n", msg);
+
+/* Call sqlglm() to get the complete text of the
+ * error message.
+ */
+    buf_len = sizeof (err_msg);
+    sqlglm(err_msg, &buf_len, &msg_len);
+    printf("%.*s\n", msg_len, err_msg);
+
+    EXEC SQL ROLLBACK RELEASE;
+    exit(EXIT_FAILURE);
+} 
+
+void main() 
+{ 
+    struct emp_info *emp_rec_ptr; 
+
+/* Allocate memory for emp_info struct. */ 
+    if ((emp_rec_ptr = 
+        (struct emp_info *) malloc(sizeof(struct emp_info))) == 0)
+    { 
+        fprintf(stderr, "Memory allocation error.\n"); 
+        exit(EXIT_FAILURE); 
+    } 
+ 
+/* Connect to ORACLE. */ 
+    strcpy(username, "scott"); 
+    strcpy(password, "tiger"); 
+ 
+    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--");
+ 
+    EXEC SQL CONNECT :username IDENTIFIED BY :password; 
+    printf("\nConnected to ORACLE as user: %s\n", username); 
+ 
+/* Declare the cursor. All static SQL explicit cursors
+ * contain SELECT commands. 'salespeople' is a SQL identifier,
+ * not a (C) host variable.
+ */
+    EXEC SQL DECLARE salespeople CURSOR FOR 
+        SELECT ENAME, SAL, COMM 
+            FROM EMP 
+            WHERE JOB LIKE 'SALES%'; 
+ 
+/* Open the cursor. */
+    EXEC SQL OPEN salespeople; 
+ 
+/* Get ready to print results. */
+    printf("\n\nThe company's salespeople are--\n\n");
+    printf("Salesperson   Salary   Commission\n"); 
+    printf("-----------   ------   ----------\n"); 
+ 
+/* Loop, fetching all salesperson's statistics.
+ * Cause the program to break the loop when no more
+ * data can be retrieved on the cursor.
+ */
+    EXEC SQL WHENEVER NOT FOUND DO break; 
+
+    for (;;) 
+    { 
+        EXEC SQL FETCH salespeople INTO :emp_rec_ptr; 
+        printf("%s %9.2f %12.2f\n", emp_rec_ptr->emp_name, 
+                emp_rec_ptr->salary, emp_rec_ptr->commission); 
+    } 
+ 
+/* Close the cursor. */
+    EXEC SQL CLOSE salespeople; 
+ 
+    printf("\nGOOD-BYE!!\n\n");
+
+    EXEC SQL COMMIT WORK RELEASE; 
+    exit(EXIT_SUCCESS); 
+} 
+
diff --git a/sdk/demo/procobdemo.pco b/sdk/demo/procobdemo.pco
new file mode 100644
index 0000000..245a69e
--- /dev/null
+++ b/sdk/demo/procobdemo.pco
@@ -0,0 +1,90 @@
+      *****************************************************************
+      * procobdemo.pco - Pro*COBOL demo file for Instant Client.      *
+      *                                                               *
+      * This program logs on to ORACLE, declares and opens a cursor,  *
+      * fetches the names, salaries, and commissions of all           *
+      * salespeople, displays the results, then closes the cursor.    * 
+      *****************************************************************
+
+       IDENTIFICATION DIVISION.
+       PROGRAM-ID. CURSOR-OPS.
+       ENVIRONMENT DIVISION.
+       DATA DIVISION.
+       WORKING-STORAGE SECTION.
+
+           EXEC SQL BEGIN DECLARE SECTION END-EXEC.
+       01  USERNAME          PIC X(10) VARYING.
+       01  PASSWD            PIC X(10) VARYING.
+       01  EMP-REC-VARS.
+           05  EMP-NAME      PIC X(10) VARYING.
+           05  SALARY        PIC S9(6)V99
+                             DISPLAY SIGN LEADING SEPARATE.
+           05  COMMISSION    PIC S9(6)V99
+                             DISPLAY SIGN LEADING SEPARATE.
+           EXEC SQL VAR SALARY IS DISPLAY(8,2) END-EXEC.
+           EXEC SQL VAR COMMISSION IS DISPLAY(8,2) END-EXEC.
+           EXEC SQL END DECLARE SECTION END-EXEC.
+
+           EXEC SQL INCLUDE SQLCA END-EXEC.
+
+       01  DISPLAY-VARIABLES.
+           05  D-EMP-NAME    PIC X(10).
+           05  D-SALARY      PIC Z(4)9.99.
+           05  D-COMMISSION  PIC Z(4)9.99.
+
+       PROCEDURE DIVISION.
+
+       BEGIN-PGM.
+           EXEC SQL WHENEVER SQLERROR
+               DO PERFORM SQL-ERROR END-EXEC.
+           PERFORM LOGON.
+           EXEC SQL DECLARE SALESPEOPLE CURSOR FOR
+               SELECT ENAME, SAL, COMM
+               FROM EMP
+               WHERE JOB LIKE 'SALES%'
+           END-EXEC.
+           EXEC SQL OPEN SALESPEOPLE END-EXEC.
+           DISPLAY " ".
+           DISPLAY "SALESPERSON  SALARY      COMMISSION".
+           DISPLAY "-----------  ----------  ----------".
+
+       FETCH-LOOP.
+           EXEC SQL WHENEVER NOT FOUND
+               DO PERFORM SIGN-OFF END-EXEC.
+           EXEC SQL FETCH SALESPEOPLE
+               INTO :EMP-NAME, :SALARY, :COMMISSION
+           END-EXEC.
+           MOVE EMP-NAME-ARR TO D-EMP-NAME.
+           MOVE SALARY TO D-SALARY.
+           MOVE COMMISSION TO D-COMMISSION.
+           DISPLAY D-EMP-NAME, "     ", D-SALARY, "    ", D-COMMISSION.
+           MOVE SPACES TO EMP-NAME-ARR.
+           GO TO FETCH-LOOP.
+
+       LOGON.
+           MOVE "scott" TO USERNAME-ARR.
+           MOVE 5 TO USERNAME-LEN.
+           MOVE "tiger" TO PASSWD-ARR.
+           MOVE 5 TO PASSWD-LEN.
+           EXEC SQL
+               CONNECT :USERNAME IDENTIFIED BY :PASSWD
+           END-EXEC.
+           DISPLAY " ".
+           DISPLAY "CONNECTED TO ORACLE AS USER:  ", USERNAME-ARR.
+
+       SIGN-OFF.
+           EXEC SQL CLOSE SALESPEOPLE END-EXEC. 
+           DISPLAY " ".
+           DISPLAY "HAVE A GOOD DAY.".
+           DISPLAY " ".
+           EXEC SQL COMMIT WORK RELEASE END-EXEC.
+           STOP RUN.
+
+       SQL-ERROR.
+           EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
+           DISPLAY " ".
+           DISPLAY "ORACLE ERROR DETECTED:".
+           DISPLAY " ".
+           DISPLAY SQLERRMC.
+           EXEC SQL ROLLBACK WORK RELEASE END-EXEC.
+           STOP RUN.
diff --git a/sdk/include/ldap.h b/sdk/include/ldap.h
new file mode 100755
index 0000000..cae4635
--- /dev/null
+++ b/sdk/include/ldap.h
@@ -0,0 +1,1178 @@
+/*
+ * $Header: ldap/public/ldap.h /main/28 2008/09/26 16:32:41 vmedam Exp $ 
+ */
+
+/* Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.*/
+/*
+   NAME
+     ldap.h - Used by clients. 
+   DESCRIPTION
+     <short description of component this file declares/defines>
+   PUBLIC FUNCTION(S)
+     <list of external functions declared/defined - with one-line descriptions>
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+   RETURNS
+     <function return values, for .c file with single function>
+   NOTES
+     <other useful comments, qualifications, etc.>
+   MODIFIED   (MM/DD/YY)
+      vmedam   09/25/08 - 
+      ******** 09/17/08 - bug#7312369
+      ******** 03/20/08 - bug#5743318
+      ******** 03/17/08 - Bug 6838567
+      ******** 09/16/05 - fix bug#3935094 
+      ******** 05/09/05 - Bug 4288744
+      ******** 06/11/04 - Bug 3512354 
+      ******** 02/12/04 - Removing data type mismatch with internal definitions
+      ******   10/22/03 - fix bug 1869186 
+      ******   10/01/03 - Add ora_ldap_init_clientctx 
+      ******   08/11/03 - Add new option for sasl credentials 
+      ******** 02/22/03 - bugfix #2802996
+      ******   02/02/03 - Add SASL interfaces
+      ******** 10/15/02 - client side referral cache changes
+      ******** 10/12/02 -  change in discovery api's
+    ********  04/30/01 -  fix compilation errors
+    *******   04/13/01 - add normalize DN protos
+    ******    04/07/01 -  v3 Modifications
+    *****     06/02/00 -  fix bug 1294614
+    *****     03/31/00 -  fix porting except. # 1234272
+    ******    05/19/98 -  Initial Creation
+*/
+/*
+ * Copyright (c) 1990, 2008, Oracle and/or its affiliates. All rights reserved.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#ifndef GSLC_ORACLE
+#define GSLC_ORACLE
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef WINSOCK
+#include "msdos.h"
+#include <winsock.h>
+#endif
+
+/* BER classes and mask */
+#define LBER_CLASS_UNIVERSAL	0x00
+#define LBER_CLASS_APPLICATION	0x40
+#define LBER_CLASS_CONTEXT	0x80
+#define LBER_CLASS_PRIVATE	0xc0
+#define LBER_CLASS_MASK		0xc0
+
+/* BER encoding type and mask */
+#define LBER_PRIMITIVE		0x00
+#define LBER_CONSTRUCTED	0x20
+#define LBER_ENCODING_MASK	0x20
+
+#define LBER_BIG_TAG_MASK	0x1f
+#define LBER_MORE_TAG_MASK	0x80
+
+/*
+ * Note that LBER_ERROR and LBER_DEFAULT are values that can never appear
+ * as valid BER tags, and so it is safe to use them to report errors.  In
+ * fact, any tag for which the following is true is invalid:
+ *     (( tag & 0x00000080 ) != 0 ) && (( tag & 0xFFFFFF00 ) != 0 )
+ */
+#define LBER_ERROR		-1
+#define LBER_DEFAULT		-1
+
+/* general BER types we know about */
+#define LBER_BOOLEAN		0x01L
+#define LBER_INTEGER		0x02L
+#define LBER_BITSTRING		0x03L
+#define LBER_OCTETSTRING	0x04L
+#define LBER_NULL		0x05L
+#define LBER_ENUMERATED		0x0aL
+#define LBER_SEQUENCE		0x30L	/* constructed */
+#define LBER_SET		0x31L	/* constructed */
+
+#define OLD_LBER_SEQUENCE	0x10L	/* w/o constructed bit - broken */
+#define OLD_LBER_SET		0x11L	/* w/o constructed bit - broken */
+
+typedef int (*BERTranslateProc)( char **bufp, unsigned int *buflenp,
+	int free_input );
+
+typedef struct seqorset {
+        unsigned int   sos_clen;
+        unsigned int   sos_tag;
+        char            *sos_first;
+        char            *sos_ptr;
+        struct seqorset *sos_next;
+} Seqorset;
+#define NULLSEQORSET    ((Seqorset *) 0)
+
+#define SOS_STACK_SIZE  8 /* depth of the pre-allocated sos structure stack */
+
+typedef struct berelement {
+	char		*ber_buf;
+	char		*ber_ptr;
+	char		*ber_end;
+	struct seqorset	*ber_sos;
+	unsigned int	ber_tag;
+	unsigned int	ber_len;
+	int		ber_usertag;
+	char		ber_options;
+#define LBER_USE_DER		0x01
+#define LBER_USE_INDEFINITE_LEN	0x02
+#define LBER_TRANSLATE_STRINGS	0x04
+	char		*ber_rwptr;
+	BERTranslateProc ber_encode_translate_proc;
+	BERTranslateProc ber_decode_translate_proc;
+        int             ber_flags;
+        int             ber_sos_stack_posn;
+        Seqorset        ber_sos_stack[SOS_STACK_SIZE];
+} BerElement;
+#define NULLBER	((BerElement *) 0)
+
+/* sgsluns - private network endpoint type
+ */
+struct sgsluns
+{
+ int   sock_sgsluns;      /* socket identifier */
+ long  state_sgsluns;     /* sgsluns state flag (SGSLUNS_STATE_xxx) */
+ char  saddr_sgsluns[32]; /* inet address of other end of this connection
+                           * in the form A.B.C.D where A,B,C, and D are
+                           * base 256 notation integers. eg. "192.0.0.1"
+                           */
+};
+typedef struct sgsluns sgsluns;
+
+typedef struct sockbuf {
+#ifndef MACOS
+	int		sb_sd;
+#else /* MACOS */
+	void		*sb_sd;
+#endif /* MACOS */
+	BerElement	sb_ber;
+
+	int		sb_naddr;	/* > 0 implies using CLDAP (UDP) */
+	void		*sb_useaddr;	/* pointer to sockaddr to use next */
+	void		*sb_fromaddr;	/* pointer to message source sockaddr */
+	void		**sb_addrs;	/* actually an array of pointers to
+						sockaddrs */
+
+	int		sb_options;	/* to support copying ber elements */
+#define LBER_TO_FILE		0x01	/* to a file referenced by sb_fd   */
+#define LBER_TO_FILE_ONLY	0x02	/* only write to file, not network */
+#define LBER_MAX_INCOMING_SIZE	0x04	/* impose limit on incoming stuff  */
+#define LBER_NO_READ_AHEAD	0x08	/* read only as much as requested  */
+	int		sb_fd;
+	int		sb_max_incoming;
+        void            *sb_nzenv;        /* nzos environment pointer */
+        void        *sb_sslContext;
+        int         sb_sslauth;       /* type of ssl authentication */
+        int         sb_sslflag;
+        int         ssl_sd;
+        sgsluns         *sb_endp;       /* socket end point */
+} Sockbuf;
+#define READBUFSIZ	8192
+
+/* structure for returning a sequence of octet strings + length */
+struct berval {
+	unsigned int	bv_len;
+	char		*bv_val;
+};
+
+#define LDAP_PORT	389
+#define LDAP_SSL_PORT	636
+
+#ifndef DEF_SSL_PORT
+extern int sslmodeenabled ;
+#endif
+
+#define LDAP_VERSION1	1
+#define LDAP_VERSION2	2
+#define LDAP_VERSION3   3
+
+#define LDAP_VERSION   LDAP_VERSION2 /*default should stay as LDAPv2*/
+
+#define LDAP_VERSION_MAX LDAP_VERSION3
+
+#define COMPAT20
+#define COMPAT30
+#if defined(COMPAT20) || defined(COMPAT30)
+#define COMPAT
+#endif
+
+#define LDAP_MAX_ATTR_LEN	256
+
+/* various options that can be set/unset */
+#define LDAP_OPT_DESC                   1
+#define LDAP_OPT_DEREF                  2
+#define LDAP_OPT_SIZELIMIT              3
+#define LDAP_OPT_TIMELIMIT              4
+#define LDAP_OPT_THREAD_FN_PTRS         5
+#define LDAP_OPT_REBIND_FN              6
+#define LDAP_OPT_REBIND_ARG             7
+#define LDAP_OPT_REFERRALS              8
+#define LDAP_OPT_RESTART                9
+#define LDAP_OPT_SSL                    10
+#define LDAP_OPT_IO_FN_PTRS             11
+#define LDAP_OPT_CACHE_FN_PTRS          13
+#define LDAP_OPT_CACHE_STRATEGY         14
+#define LDAP_OPT_CACHE_ENABLE           15
+#define LDAP_OPT_REFERRAL_HOP_LIMIT     16
+#define LDAP_OPT_PROTOCOL_VERSION       17
+#define LDAP_OPT_SERVER_CONTROLS        18
+#define LDAP_OPT_CLIENT_CONTROLS        19
+#define LDAP_OPT_PREFERRED_LANGUAGE     20
+#define LDAP_OPT_ERROR_NUMBER           49
+#define LDAP_OPT_ERROR_STRING           50
+
+/* client side referral cache enable option */
+#define ORA_LDAP_OPT_RFRL_CACHE         200
+
+/* ldap connect timeout */
+#define ORA_LDAP_OPT_CONNECT_TIMEOUT    210
+
+/* directory server types */
+#define LDAP_DIRTYPE_OID        1  /* Oracle Internet Directory */
+#define LDAP_DIRTYPE_AD         2  /* Microsoft Active Directory */
+#define LDAP_DIRTYPE_NETSCAPE   4  /* Netscape Directory Server  */
+#define LDAP_DIRTYPE_NDS        8  /* Novell Directory Service   */
+#define LDAP_DIRTYPE_UNKNOWN    4096 /* Unknown */
+
+/* for on/off options */
+#define LDAP_OPT_ON     ((void *)1)
+#define LDAP_OPT_OFF    ((void *)0)
+
+
+/* SSL Authentication modes */
+#define GSLC_SSL_NO_AUTH         1
+#define GSLC_SSL_ONEWAY_AUTH  	32
+#define GSLC_SSL_TWOWAY_AUTH  	64
+
+
+/* Abandon support */
+#define ABANDONorTL(op)      ((op)->o_abandon == 1)
+
+/* debugging stuff */
+#ifdef LDAP_DEBUG
+extern int	ldap_debug;
+extern unsigned int debug_flag;
+#define LDAP_DEBUG_TRACE	0x001
+#define LDAP_DEBUG_PACKETS	0x002
+#define LDAP_DEBUG_ARGS		0x004
+#define LDAP_DEBUG_CONNS	0x008
+#define LDAP_DEBUG_BER		0x010
+#define LDAP_DEBUG_FILTER	0x020
+#define LDAP_DEBUG_CONFIG	0x040
+#define LDAP_DEBUG_ACL		0x080
+#define LDAP_DEBUG_STATS	0x100
+#define LDAP_DEBUG_STATS2	0x200
+#define LDAP_DEBUG_SHELL	0x400
+#define LDAP_DEBUG_PARSE	0x800
+#define LDAP_DEBUG_PROCESS	0x2000
+#define LDAP_DEBUG_MUST	        0x4000
+#ifndef LDAP_DEBUG_ANY
+# define LDAP_DEBUG_ANY		0xffff
+#endif /* LDAP_DEBUG_ANY */
+
+#ifdef LDAP_SYSLOG
+#define Debug( level, fmt, arg1, arg2, arg3 )	\
+	{ \
+		if ( ldap_debug & level ) \
+			fprintf( stderr, fmt, arg1, arg2, arg3 ); \
+	}
+#else /* LDAP_SYSLOG */
+#ifndef WINSOCK
+#define Debug( level, fmt, arg1, arg2, arg3 ) \
+		if ( ldap_debug & level ) \
+			fprintf( stderr, fmt, arg1, arg2, arg3 );
+#else /* !WINSOCK */
+extern void Debug( int level, char* fmt, ... );
+#endif /* !WINSOCK */
+#endif /* LDAP_SYSLOG */
+#else /* LDAP_DEBUG */
+#define Debug( level, fmt, arg1, arg2, arg3 )
+#endif /* LDAP_DEBUG */
+
+/* 
+ * specific LDAP instantiations of BER types we know about
+ */
+
+/* general stuff */
+#define LDAP_TAG_MESSAGE	0x30L	/* tag is 0x10 + constructed bit */
+#define OLD_LDAP_TAG_MESSAGE	0x10L	/* forgot the constructed bit  */
+#define LDAP_TAG_MSGID		0x02L   /* INTEGER */
+#define LDAP_TAG_LDAPDN         0x04L   /* OCTET STRING */
+#define LDAP_TAG_CONTROLS       0xa0L   /* context specific + constructed + 0 */
+#define LDAP_TAG_REFERRAL       0xa3L   /* context specific + constructed + 3 */
+#define LDAP_TAG_NEWSUPERIOR    0x80L   /* context specific + primitive */
+#define LDAP_TAG_MRA_OID        0x81L   /* context specific + primitive */
+#define LDAP_TAG_MRA_TYPE       0x82L   /* context specific + primitive */
+#define LDAP_TAG_MRA_VALUE      0x83L   /* context specific + primitive */
+#define LDAP_TAG_MRA_DNATTRS    0x84L   /* context specific + primitive */
+#define LDAP_TAG_EXOP_REQ_OID   0x80L   /* context specific + primitive */
+#define LDAP_TAG_EXOP_REQ_VALUE 0x81L   /* context specific + primitive */
+#define LDAP_TAG_EXOP_RES_OID   0x8aL   /* context specific + primitive */
+#define LDAP_TAG_EXOP_RES_VALUE 0x8bL   /* context specific + primitive */
+#define LDAP_TAG_SK_MATCHRULE   0x80L   /* context specific + primitive */
+#define LDAP_TAG_SK_REVERSE     0x81L   /* context specific + primitive */
+#define LDAP_TAG_SR_ATTRTYPE    0x80L   /* context specific + primitive */
+#define LDAP_TAG_SASL_RES_CREDS 0x87L   /* context specific + primitive */
+#define LDAP_TAG_VLV_BY_INDEX   0xa0L   /* context specific + constructed + 0 */
+#define LDAP_TAG_VLV_BY_VALUE   0x81L   /* context specific + primitive + 1 */
+
+/* possible operations a client can invoke */
+#define LDAP_REQ_BIND			0x60L	/* application + constructed */
+#define LDAP_REQ_UNBIND			0x42L	/* application + primitive   */
+#define LDAP_REQ_SEARCH			0x63L	/* application + constructed */
+#define LDAP_REQ_MODIFY			0x66L	/* application + constructed */
+#define LDAP_REQ_ADD			0x68L	/* application + constructed */
+#define LDAP_REQ_DELETE			0x4aL	/* application + primitive   */
+#define LDAP_REQ_MODRDN			0x6cL	/* application + constructed */
+#define LDAP_REQ_MODDN                  0x6cL   /* application + constructed */
+#define LDAP_REQ_COMPARE		0x6eL	/* application + constructed */
+#define LDAP_REQ_ABANDON		0x50L	/* application + primitive   */
+
+/* New defs added for LDAP V3 support */
+#define LDAP_REQ_EXTENDED		0x77L   /* application + constructed */
+/* version 3.0 compatibility stuff */
+#define LDAP_REQ_UNBIND_30		0x62L
+#define LDAP_REQ_DELETE_30		0x6aL
+#define LDAP_REQ_ABANDON_30		0x70L
+
+/* 
+ * old broken stuff for backwards compatibility - forgot application tag
+ * and constructed/primitive bit
+ */
+#define OLD_LDAP_REQ_BIND		0x00L
+#define OLD_LDAP_REQ_UNBIND		0x02L
+#define OLD_LDAP_REQ_SEARCH		0x03L
+#define OLD_LDAP_REQ_MODIFY		0x06L
+#define OLD_LDAP_REQ_ADD		0x08L
+#define OLD_LDAP_REQ_DELETE		0x0aL
+#define OLD_LDAP_REQ_MODRDN		0x0cL
+#define OLD_LDAP_REQ_COMPARE		0x0eL
+#define OLD_LDAP_REQ_ABANDON		0x10L
+
+/* possible result types a server can return */
+#define LDAP_RES_BIND			0x61L /* application+constructed+1 */
+#define LDAP_RES_SEARCH_ENTRY		0x64L	/* 100 */
+#define LDAP_RES_SEARCH_RESULT		0x65L	/* 101 */
+#define LDAP_RES_MODIFY			0x67L	/* 103 */
+#define LDAP_RES_ADD			0x69L	/* 105 */
+#define LDAP_RES_DELETE			0x6bL	/* 107 */
+#define LDAP_RES_MODRDN			0x6dL	/* 109 */
+#define LDAP_RES_RENAME 		0x6dL	/* same as LDAP_RES_MODRDN */
+#define LDAP_RES_COMPARE		0x6fL	/* 111 */
+#define LDAP_RES_SEARCH_REFERENCE	0x73L	/* 115 */
+#define LDAP_RES_EXTENDED               0x78L   /* 120 */
+#define LDAP_RES_ANY			(-1L)
+
+/* old broken stuff for backwards compatibility */
+#define OLD_LDAP_RES_BIND		0x01L
+#define OLD_LDAP_RES_SEARCH_ENTRY	0x04L
+#define OLD_LDAP_RES_SEARCH_RESULT	0x05L
+#define OLD_LDAP_RES_MODIFY		0x07L
+#define OLD_LDAP_RES_ADD		0x09L
+#define OLD_LDAP_RES_DELETE		0x0bL
+#define OLD_LDAP_RES_MODRDN		0x0dL
+#define OLD_LDAP_RES_COMPARE		0x0fL
+
+/* authentication methods available */
+#define LDAP_AUTH_NONE		0x00L	/* no authentication		  */
+#define LDAP_AUTH_SIMPLE	0x80L	/* context specific + primitive   */
+#define LDAP_AUTH_SASL          0xa3L   /* context specific + constructed  */
+
+/* supported SASL methods */
+#define LDAP_SASL_SIMPLE        0       /* special value used for simple bind */
+#define LDAP_SASL_EXTERNAL      "EXTERNAL"
+
+/* authentication methods supported in v2 */
+#define LDAP_AUTH_KRBV4		0xffL	/* means do both of the following */
+#define LDAP_AUTH_KRBV41	0x81L	/* context specific + primitive   */
+#define LDAP_AUTH_KRBV42	0x82L	/* context specific + primitive   */
+#define LDAP_AUTH_SASL_V2	0x83L   /* context specific + primitive */
+#define LDAP_AUTH_REPL		0x90L	/* replication specific		  */
+
+
+/* 3.0 compatibility auth methods */
+#define LDAP_AUTH_SIMPLE_30	0xa0L	/* context specific + constructed */
+#define LDAP_AUTH_KRBV41_30	0xa1L	/* context specific + constructed */
+#define LDAP_AUTH_KRBV42_30	0xa2L	/* context specific + constructed */
+#define LDAP_AUTH_SASL_30       0xa3L   /* context specific + constructed */
+/* old broken stuff */
+#define OLD_LDAP_AUTH_SIMPLE	0x00L
+#define OLD_LDAP_AUTH_KRBV4	0x01L
+#define OLD_LDAP_AUTH_KRBV42	0x02L
+
+/* filter types */
+#define LDAP_FILTER_AND		0xa0L	/* context specific + constructed */
+#define LDAP_FILTER_OR		0xa1L	/* context specific + constructed */
+#define LDAP_FILTER_NOT		0xa2L	/* context specific + constructed */
+#define LDAP_FILTER_EQUALITY	0xa3L	/* context specific + constructed */
+#define LDAP_FILTER_SUBSTRINGS	0xa4L	/* context specific + constructed */
+#define LDAP_FILTER_GE		0xa5L	/* context specific + constructed */
+#define LDAP_FILTER_LE		0xa6L	/* context specific + constructed */
+#define LDAP_FILTER_PRESENT	0x87L	/* context specific + primitive   */
+#define LDAP_FILTER_APPROX	0xa8L	/* context specific + constructed */
+
+/* 3.0 compatibility filter types */
+#define LDAP_FILTER_PRESENT_30	0xa7L	/* context specific + constructed */
+
+/* old broken stuff */
+#define OLD_LDAP_FILTER_AND		0x00L
+#define OLD_LDAP_FILTER_OR		0x01L
+#define OLD_LDAP_FILTER_NOT		0x02L
+#define OLD_LDAP_FILTER_EQUALITY	0x03L
+#define OLD_LDAP_FILTER_SUBSTRINGS	0x04L
+#define OLD_LDAP_FILTER_GE		0x05L
+#define OLD_LDAP_FILTER_LE		0x06L
+#define OLD_LDAP_FILTER_PRESENT		0x07L
+#define OLD_LDAP_FILTER_APPROX		0x08L
+
+/* substring filter component types */
+#define LDAP_SUBSTRING_INITIAL	0x80L	/* context specific */
+#define LDAP_SUBSTRING_ANY	0x81L	/* context specific */
+#define LDAP_SUBSTRING_FINAL	0x82L	/* context specific */
+
+/* 3.0 compatibility substring filter component types */
+#define LDAP_SUBSTRING_INITIAL_30	0xa0L	/* context specific */
+#define LDAP_SUBSTRING_ANY_30		0xa1L	/* context specific */
+#define LDAP_SUBSTRING_FINAL_30		0xa2L	/* context specific */
+
+/* old broken stuff */
+#define OLD_LDAP_SUBSTRING_INITIAL	0x00L
+#define OLD_LDAP_SUBSTRING_ANY		0x01L
+#define OLD_LDAP_SUBSTRING_FINAL	0x02L
+
+/* search scopes */
+#define LDAP_SCOPE_BASE		0x00
+#define LDAP_SCOPE_ONELEVEL	0x01
+#define LDAP_SCOPE_SUBTREE	0x02
+
+/* for modifications */
+typedef struct ldapmod {
+	int		mod_op;
+#define LDAP_MOD_ADD		0x00
+#define LDAP_MOD_DELETE		0x01
+#define LDAP_MOD_REPLACE	0x02
+#define LDAP_MOD_BVALUES	0x80
+	char		*mod_type;
+        int             mod_ver;
+        char            mod_time[48];
+        char            mod_server[128];
+	union {
+		char		**modv_strvals;
+		struct berval	**modv_bvals;
+	} mod_vals;
+        struct berval   **modv_nvals;
+#define mod_values	mod_vals.modv_strvals
+#define mod_bvalues	mod_vals.modv_bvals
+#ifdef ONLDAPD
+	struct ldapmod	*mod_next;
+	int createTombstone;
+#endif
+} LDAPMod;
+
+/* 
+ * possible error codes we can return
+ */
+
+#define LDAP_SUCCESS			              0x00
+#define GSL_SUCCESS 	LDAP_SUCCESS
+#define LDAP_OPERATIONS_ERROR		0x01
+#define LDAP_PROTOCOL_ERROR		0x02
+#define LDAP_TIMELIMIT_EXCEEDED		0x03
+#define LDAP_SIZELIMIT_EXCEEDED		0x04
+#define LDAP_COMPARE_FALSE		0x05
+#define LDAP_COMPARE_TRUE		0x06
+#define LDAP_STRONG_AUTH_NOT_SUPPORTED	0x07
+#define LDAP_STRONG_AUTH_REQUIRED	0x08
+#define LDAP_PARTIAL_RESULTS		0x09
+#define LDAP_REFERRAL			0x0A
+#define LDAP_ADMINLIMIT_EXCEEDED	0x0B
+#define LDAP_UNAVAILABLE_CRITICALEXTENSION	0x0C
+#define LDAP_CONFIDENTIALITY_REQUIRED	        0x0D
+#define LDAP_SASL_BIND_IN_PROGRESS              0x0E
+
+#define LDAP_NO_SUCH_ATTRIBUTE		0x10
+#define LDAP_UNDEFINED_TYPE		0x11
+#define LDAP_INAPPROPRIATE_MATCHING	0x12
+#define LDAP_CONSTRAINT_VIOLATION	0x13
+#define LDAP_TYPE_OR_VALUE_EXISTS	0x14
+#define LDAP_INVALID_SYNTAX		0x15
+
+#define LDAP_NO_SUCH_OBJECT		0x20
+#define LDAP_ALIAS_PROBLEM		0x21
+#define LDAP_INVALID_DN_SYNTAX		0x22
+#define LDAP_IS_LEAF			0x23
+#define LDAP_ALIAS_DEREF_PROBLEM	0x24
+
+#define NAME_ERROR(n)	((n & 0xf0) == 0x20)
+
+#define LDAP_INAPPROPRIATE_AUTH		0x30
+#define LDAP_INVALID_CREDENTIALS	0x31
+#define LDAP_INSUFFICIENT_ACCESS	0x32
+#define LDAP_BUSY			0x33
+#define LDAP_UNAVAILABLE		0x34
+#define LDAP_UNWILLING_TO_PERFORM	0x35
+#define LDAP_LOOP_DETECT		0x36
+
+#define LDAP_NAMING_VIOLATION		0x40
+#define LDAP_OBJECT_CLASS_VIOLATION	0x41
+#define LDAP_NOT_ALLOWED_ON_NONLEAF	0x42
+#define LDAP_NOT_ALLOWED_ON_RDN		0x43
+#define LDAP_ALREADY_EXISTS		0x44
+#define LDAP_NO_OBJECT_CLASS_MODS	0x45
+#define LDAP_RESULTS_TOO_LARGE		0x46
+#define LDAP_AFFECT_MULTIPLE_DSAS               0x47
+
+#define LDAP_OTHER			0x50
+#define LDAP_SERVER_DOWN		0x51
+#define LDAP_LOCAL_ERROR		0x52
+#define LDAP_ENCODING_ERROR		0x53
+#define LDAP_DECODING_ERROR		0x54
+#define LDAP_TIMEOUT			0x55
+#define LDAP_AUTH_UNKNOWN		0x56
+#define LDAP_FILTER_ERROR		0x57
+#define LDAP_USER_CANCELLED		0x58
+#define LDAP_PARAM_ERROR		0x59
+#define LDAP_NO_MEMORY			0x5a
+#define LDAP_CONNECT_ERROR              0x5b    /* 91 */
+#define LDAP_NOT_SUPPORTED              0x5c    /* 92 - LDAPv3 */
+#define LDAP_CONTROL_NOT_FOUND          0x5d    /* 93 - LDAPv3 */
+#define LDAP_NO_RESULTS_RETURNED        0x5e    /* 94 - LDAPv3 */
+#define LDAP_MORE_RESULTS_TO_RETURN     0x5f    /* 95 - LDAPv3 */
+#define LDAP_CLIENT_LOOP                0x60    /* 96 - LDAPv3 */
+#define LDAP_REFERRAL_LIMIT_EXCEEDED    0x61    /* 97 - LDAPv3 */
+
+
+/* discover server related error codes */
+#define ORA_LDAP_INFO_NOT_FOUND         500  /* oracle specific error codes */
+#define ORA_LDAP_LOOKUP_ERROR           501
+#define ORA_LDAP_DNS_ADDR_NOT_FOUND     502
+#define ORA_LDAP_FILE_NOT_FOUND         503
+#define ORA_LDAP_FILE_PARSE_ERROR       504
+
+/* SSL bind related error codes */
+#define ORA_LDAP_SSL_INITIALIZE_ERROR   550
+#define ORA_LDAP_SSL_CTXCONFIG_ERROR    551
+#define ORA_LDAP_SSL_OPENWALLET_ERROR   552
+#define ORA_LDAP_SSL_CTXCREATE_ERROR    553
+#define ORA_LDAP_SSL_HANDSHAKE_ERROR    554
+#define ORA_LDAP_SSL_PEERCRED_ERROR     555
+
+
+/* default limit on nesting of referrals */
+#define LDAP_DEFAULT_REFHOPLIMIT	5
+
+/* discover server related structs and declarations */
+
+/* source from where information can be discovered */
+#define ORA_DNS_DISCOVER                1
+#define ORA_CFGFILE_DISCOVER            2
+#define ORA_AUTO_DISCOVER               3
+
+/* method to be applied for obtaining hostname info from DNS */
+#define ORA_USE_INPUT_DN_METHOD         1   
+#define ORA_USE_MC_DOMAIN_METHOD        2   
+#define ORA_USE_DFLT_LOOKUP_METHOD      4   
+#define ORA_USE_ALL_METHODS             (ORA_USE_INPUT_DN_METHOD + \
+                                         ORA_USE_MC_DOMAIN_METHOD + \
+                                         ORA_USE_DFLT_LOOKUP_METHOD) 
+
+/* result types */
+#define ORA_DEF_ADMIN_CTXT         1 
+#define ORA_DIR_SERVERS            2 
+#define ORA_DIR_SERVER_TYPE        3 
+#define ORA_ALTDIR_SERVERS         4 
+#define ORA_ORCLCOMMCTXMAP         5 
+#define ORA_DIRSRVR_CONN_SEC       6 
+#define ORA_CFGFL_PATH             7
+
+/* properties that can be set in the discovery handle */
+#define ORA_DNS_DN                  1
+#define ORA_DNS_DISCOVER_METHOD     2
+#define ORA_SSLMODE                 3
+
+typedef void * OraLdapHandle;
+typedef void * OraResultHandle;
+
+typedef void OraLdapClientCtx;
+
+/* Options for SASL credential functions */
+#define ORA_LDAP_SASL_MECH_DIGEST_MD5    "DIGEST-MD5" /* SASL Mechanism : 
+                                                         Digest MD5 */
+#define   ORA_LDAP_CRED_HANDLE_SASL_MD5   1
+
+/* properties that can be set in Credential handle */
+#define   ORA_LDAP_CRED_SASL_REALM                1
+#define   ORA_LDAP_CRED_SASL_AUTH_PASSWORD        2
+#define   ORA_LDAP_CRED_SASL_AUTHORIZATION_ID     3
+#define   ORA_LDAP_CRED_SASL_SECURITY_PROPERTIES  4
+#define   ORA_LDAP_CRED_SASL_NORM_AUTHDN          5
+
+#define ora_ldap_init_clientctx(ctxptr) ((OraLdapClientCtx **)NULL != (ctxptr) && (*((OraLdapClientCtx **)(ctxptr)) = (OraLdapClientCtx *)NULL,1)) ? LDAP_SUCCESS : LDAP_PARAM_ERROR
+
+#define ora_ldap_free_clientctx(ctxptr) ((OraLdapClientCtx **)NULL != (ctxptr) && (*((OraLdapClientCtx **)(ctxptr)) = (OraLdapClientCtx *)NULL,1)) ? LDAP_SUCCESS : LDAP_PARAM_ERROR
+
+/*
+ * This structure represents both ldap messages and ldap responses.
+ * These are really the same, except in the case of search responses,
+ * where a response has multiple messages.
+ */
+
+typedef struct ldapmsg {
+	int		lm_msgid;	/* the message id */
+	int		lm_msgtype;	/* the message type */
+	BerElement	*lm_ber;	/* the ber encoded message contents */
+	struct ldapmsg	*lm_chain;	/* for search - next msg in the resp */
+	struct ldapmsg	*lm_next;	/* next response */
+	unsigned int	lm_time;	/* used to maintain cache */
+} LDAPMessage;
+#define NULLMSG	((LDAPMessage *) NULL)
+
+
+#ifdef LDAP_REFERRALS
+/*
+ * structure for tracking LDAP server host, ports, DNs, etc.
+ */
+typedef struct ldap_server {
+	char			*lsrv_host;
+	char			*lsrv_dn;	/* if NULL, use default */
+	int			lsrv_port;
+	unsigned int		lsrv_options;   /* boolean options */
+#define	LDAP_SRV_OPT_SECURE	0x01
+	struct ldap_server	*lsrv_next;
+} LDAPServer;
+
+
+/*
+ * structure for representing an LDAP server connection
+ */
+typedef struct ldap_conn {
+	Sockbuf			*lconn_sb;
+	BerElement		*lconn_ber;  /* non-NULL if in midst of msg. */
+	int			lconn_version;  /* LDAP protocol version */
+	int			lconn_refcnt;
+	char        *lconn_lastused;	/* time */
+	int			lconn_status;
+#define LDAP_CONNST_NEEDSOCKET		1
+#define LDAP_CONNST_CONNECTING		2
+#define LDAP_CONNST_CONNECTED		3
+#define LDAP_CONNST_DEAD                4
+	LDAPServer		*lconn_server;
+	char			*lconn_binddn;  /* DN of last successful bind */
+	int			lconn_bound;    /* has a bind been done? */
+	char			*lconn_krbinstance;
+	struct ldap_conn	*lconn_next;
+} LDAPConn;
+
+
+/*
+ * structure used to track outstanding requests
+ */
+typedef struct ldapreq {
+	int		lr_msgid;	/* the message id */
+	int		lr_status;	/* status of request */
+#define LDAP_REQST_INPROGRESS	1
+#define LDAP_REQST_CHASINGREFS	2
+#define LDAP_REQST_NOTCONNECTED	3
+#define LDAP_REQST_WRITING	4
+	int		lr_outrefcnt;	/* count of outstanding referrals */
+	int		lr_origid;	/* original request's message id */
+	int		lr_parentcnt;	/* count of parent requests */
+	int		lr_res_msgtype;	/* result message type */
+	int		lr_res_errno;	/* result LDAP errno */
+	char		*lr_res_error;	/* result error string */
+	char		*lr_res_matched;/* result matched DN string */
+	BerElement	*lr_ber;	/* ber encoded request contents */
+	LDAPConn	*lr_conn;	/* connection used to send request */
+	char		*lr_binddn;     /* request is a bind for this DN */
+	struct ldapreq	*lr_parent;	/* request that spawned this referral */
+	struct ldapreq	*lr_refnext;	/* next referral spawned */
+	struct ldapreq	*lr_prev;	/* previous request */
+	struct ldapreq	*lr_next;	/* next request */
+} LDAPRequest;
+#endif /* LDAP_REFERRALS */
+
+
+/*
+ * structure for client cache
+ */
+#define LDAP_CACHE_BUCKETS	31	/* cache hash table size */
+typedef struct ldapcache {
+	LDAPMessage	*lc_buckets[LDAP_CACHE_BUCKETS];/* hash table */
+	LDAPMessage	*lc_requests;			/* unfulfilled reqs */
+	int		lc_timeout;			/* request timeout */
+	int		lc_maxmem;			/* memory to use */
+	int		lc_memused;			/* memory in use */
+	int		lc_enabled;			/* enabled? */
+	unsigned int	lc_options;			/* options */
+#define LDAP_CACHE_OPT_CACHENOERRS	0x00000001
+#define LDAP_CACHE_OPT_CACHEALLERRS	0x00000002
+}  LDAPCache;
+#define NULLLDCACHE ((LDAPCache *)NULL)
+
+/*
+ * structures for ldap getfilter routines
+ */
+
+typedef struct ldap_filt_info {
+	char			*lfi_filter;
+	char			*lfi_desc;
+	int			lfi_scope;	/* LDAP_SCOPE_BASE, etc */
+	int			lfi_isexact;	/* exact match filter? */
+	struct ldap_filt_info	*lfi_next;
+} LDAPFiltInfo;
+
+typedef struct ldap_filt_list {
+    char			*lfl_tag;
+    char			*lfl_pattern;
+    char			*lfl_delims;
+    LDAPFiltInfo		*lfl_ilist;
+    struct ldap_filt_list	*lfl_next;
+} LDAPFiltList;
+
+
+#define LDAP_FILT_MAXSIZ	1024
+
+typedef struct ldap_filt_desc {
+	LDAPFiltList		*lfd_filtlist;
+	LDAPFiltInfo		*lfd_curfip;
+	LDAPFiltInfo		lfd_retfi;
+	char			lfd_filter[ LDAP_FILT_MAXSIZ ];
+	char			*lfd_curval;
+	char			*lfd_curvalcopy;
+	char			**lfd_curvalwords;
+	char			*lfd_filtprefix;
+	char			*lfd_filtsuffix;
+} LDAPFiltDesc;
+
+
+typedef struct ldapcontrol {
+    char             *ldctl_oid;
+    struct berval    ldctl_value;
+    char             ldctl_iscritical;
+} LDAPControl, *PLDAPControl;
+
+/* some common controls */
+#define LDAP_CONTROL_MANAGEDSAIT "2.16.840.1.113730.3.4.2"
+
+typedef struct ldappend {
+        void            *lp_sema;       /* semaphore to post */
+	int             lp_msgid;       /* message id */
+        LDAPMessage     *lp_result;     /* result storage */
+        struct ldappend *lp_prev;       /* previous pending */
+        struct ldappend *lp_next;       /* next pending */
+} LDAPPend;
+
+/* structure for holding credential information - used
+ * to bind to referred server when chasing referrals
+ */
+typedef struct ldapcreds {
+       char    *binddn;
+       char    *passwd;
+       int     authmethod;
+       char    *proxyDN;
+} LDAPCreds;
+
+/*
+ * structure representing an ldap connection
+ */
+
+typedef struct ldap {
+	Sockbuf		ld_sb;		/* socket descriptor & buffer */
+	char		*ld_host;
+	int		ld_version;
+	char		ld_lberoptions;
+	int		ld_deref;
+#define LDAP_DEREF_NEVER	0
+#define LDAP_DEREF_SEARCHING	1
+#define LDAP_DEREF_FINDING	2
+#define LDAP_DEREF_ALWAYS	3
+
+	int		ld_timelimit;
+	int		ld_sizelimit;
+#define LDAP_NO_LIMIT		0
+
+	LDAPFiltDesc	*ld_filtd;	/* from getfilter for ufn searches */
+	char		*ld_ufnprefix;	/* for incomplete ufn's */
+
+	int		ld_errno;
+	char		*ld_error;
+	char		*ld_matched;
+	int		ld_msgid;
+
+	/* do not mess with these */
+#ifdef LDAP_REFERRALS
+	LDAPRequest	*ld_requests;	/* list of outstanding requests */
+#else /* LDAP_REFERRALS */
+	LDAPMessage	*ld_requests;	/* list of outstanding requests */
+#endif /* LDAP_REFERRALS */
+	LDAPMessage	*ld_responses;	/* list of outstanding responses */
+	int		*ld_abandoned;	/* array of abandoned requests */
+	char		ld_attrbuffer[100];
+	LDAPCache	*ld_cache;	/* non-null if cache is initialized */
+	char		*ld_cldapdn;	/* DN used in connectionless search */
+
+	/* it is OK to change these next four values directly */
+	int		ld_cldaptries;	/* connectionless search retry count */
+	int		ld_cldaptimeout;/* time between retries */
+	int		ld_refhoplimit;	/* limit on referral nesting */
+	unsigned int	ld_options;	/* boolean options */
+#ifdef LDAP_DNS
+#define LDAP_OPT_DNS		0x00000001	/* use DN & DNS */
+#endif /* LDAP_DNS */
+
+#define LDAP_BITOPT_REFERRALS   0x80000000
+#define LDAP_BITOPT_SSL         0x40000000
+#define LDAP_BITOPT_DNS         0x20000000
+#define LDAP_BITOPT_RESTART     0x10000000
+#define LDAP_BITOPT_RECONNECT   0x08000000
+#define LDAP_BITOPT_ASYNC       0x04000000
+
+	/* do not mess with the rest though */
+	char		*ld_defhost;	/* full name of default server */
+	int		ld_defport;	/* port of default server */
+	BERTranslateProc ld_lber_encode_translate_proc;
+	BERTranslateProc ld_lber_decode_translate_proc;
+#ifdef LDAP_REFERRALS
+	LDAPConn	*ld_defconn;	/* default connection */
+	LDAPConn	*ld_conns;	/* list of server connections */
+	void		*ld_selectinfo;	/* platform specifics for select */
+	int		(*ld_rebindproc)( struct ldap *ld, char **dnp,
+				char **passwdp, int *authmethodp, int freeit );
+				/* routine to get info needed for re-bind */
+#endif /* LDAP_REFERRALS */
+
+        /* V3 ldap controls */
+        LDAPControl     **ld_servercontrol;
+        LDAPControl     **ld_clientcontrol;
+ 
+        /* Pending results */
+        LDAPPend        *ld_pend;       /* list of pending results */
+
+        void            *gsluctx;    /* gslu context handle */ 
+        /* client side referral cache-usage enable/disable option */
+        int             ld_refcache_enabled; 
+        /* current status of the refcache */
+        int             ld_refcache_status;
+        void            *ld_refcache;  /* client side referral cache */
+        void            *ld_wrk_selectinfo;
+        LDAPCreds       *ld_creds;     /* credential information */
+} LDAP;
+
+/*
+ * structure for ldap friendly mapping routines
+ */
+
+typedef struct friendly {
+	char	*f_unfriendly;
+	char	*f_friendly;
+} FriendlyMap;
+
+
+/*
+ * handy macro to check whether LDAP struct is set up for CLDAP or not
+ */
+#define LDAP_IS_CLDAP( ld )	( ld->ld_sb.sb_naddr > 0 )
+
+
+/*
+ * types for ldap URL handling
+ */
+typedef struct ldap_url_desc {
+    char	*lud_host;
+    int		lud_port;
+    char	*lud_dn;
+    char	**lud_attrs;
+    int		lud_scope;
+    char	*lud_filter;
+    char	*lud_string;	/* for internal use only */
+} LDAPURLDesc;
+#define NULLLDAPURLDESC	((LDAPURLDesc *)NULL)
+
+#define LDAP_URL_ERR_NOTLDAP	1	/* URL doesn't begin with "ldap://" */
+#define LDAP_URL_ERR_NODN	2	/* URL has no DN (required) */
+#define LDAP_URL_ERR_BADSCOPE	3	/* URL scope string is invalid */
+#define LDAP_URL_ERR_MEM	4	/* can't allocate memory space */
+
+/* General Purpose Defines */
+#define GSL_ERR_GENERAL 	(int)-1
+#define	GSL_NULL_TEXT		(char *)NULL
+
+#ifndef LDAPFUNCDECL
+#ifdef _WIN32
+#define LDAPFUNCDECL    __declspec( dllexport )
+#else /* _WIN32 */
+#define LDAPFUNCDECL
+#endif /* _WIN32 */
+#endif /* LDAPFUNCDECL */
+
+#if !defined(MACOS) && !defined(DOS) && !defined(_WIN32) && !defined(WINSOCK)
+#include <sys/time.h>
+#endif
+LDAPFUNCDECL LDAP *ldap_open( char *host, int port );
+LDAPFUNCDECL LDAP *ldap_init( char *defhost, int defport );
+LDAPFUNCDECL int ldap_init_SSL( Sockbuf *,char *, char *,int);
+
+LDAPFUNCDECL LDAPMessage *ldap_first_entry( LDAP *ld, LDAPMessage *chain );
+LDAPFUNCDECL LDAPMessage *ldap_next_entry( LDAP *ld, LDAPMessage *entry );
+LDAPFUNCDECL int ldap_count_entries( LDAP *ld, LDAPMessage *chain );
+
+LDAPFUNCDECL char *ldap_get_dn( LDAP *ld, LDAPMessage *entry );
+LDAPFUNCDECL char *ldap_dn2ufn( char *dn );
+LDAPFUNCDECL char **ldap_explode_dn( char *dn, int notypes );
+LDAPFUNCDECL char **ldap_explode_dns( char *dn );
+
+LDAPFUNCDECL char *ldap_first_attribute( LDAP *ld, LDAPMessage *entry,
+        BerElement **ber );
+LDAPFUNCDECL char *ldap_next_attribute( LDAP *ld, LDAPMessage *entry,
+        BerElement *ber );
+
+LDAPFUNCDECL char **ldap_get_values( LDAP *ld, LDAPMessage *entry, char *target
+);
+LDAPFUNCDECL struct berval **ldap_get_values_len( LDAP *ld, LDAPMessage *entry,
+        char *target );
+LDAPFUNCDECL int ldap_count_values( char **vals );
+LDAPFUNCDECL int ldap_count_values_len( struct berval **vals );
+LDAPFUNCDECL void ldap_value_free( char **vals );
+LDAPFUNCDECL void ldap_value_free_len( struct berval **vals );
+
+LDAPFUNCDECL int ldap_result2error( LDAP *ld, LDAPMessage *r, int freeit );
+LDAPFUNCDECL char *ldap_err2string( int err );
+LDAPFUNCDECL void ldap_perror( LDAP *ld, char *s );
+
+LDAPFUNCDECL void ldap_mods_free( LDAPMod **mods, int freemods );
+
+LDAPFUNCDECL void ldap_free_friendlymap( FriendlyMap **map );
+
+LDAPFUNCDECL int ldap_sort_entries( LDAP *ld, LDAPMessage **chain, char *attr,
+        int (*cmp)() );
+
+LDAPFUNCDECL int ldap_is_ldap_url( char *url );
+LDAPFUNCDECL int ldap_url_parse( char *url, LDAPURLDesc **ludpp );
+LDAPFUNCDECL void ldap_free_urldesc( LDAPURLDesc *ludp );
+LDAPFUNCDECL int ldap_url_search( LDAP *ld, char *url, int attrsonly );
+LDAPFUNCDECL int ldap_url_search_s( LDAP *ld, char *url, int attrsonly,
+        LDAPMessage **res );
+LDAPFUNCDECL int ldap_url_search_st( LDAP *ld, char *url, int attrsonly,
+        struct timeval *timeout, LDAPMessage **res );
+
+LDAPFUNCDECL int ldap_bind( LDAP *ld, char *who, char *passwd, int authmethod );
+LDAPFUNCDECL int ldap_bind_s( LDAP *ld, char *who, char *cred, int method );
+
+LDAPFUNCDECL int ldap_simple_bind( LDAP *ld, char *who, char *passwd );
+LDAPFUNCDECL int ldap_simple_bind_s( LDAP *ld, char *who, char *passwd );
+
+LDAPFUNCDECL int ldap_compare( LDAP *ld, char *dn, char *attr, char *value );
+LDAPFUNCDECL int ldap_compare_s( LDAP *ld, char *dn, char *attr, char *value );
+
+LDAPFUNCDECL int ldap_delete( LDAP *ld, char *dn );
+LDAPFUNCDECL int ldap_delete_s( LDAP *ld, char *dn );
+
+LDAPFUNCDECL int ldap_modify( LDAP *ld, char *dn, LDAPMod **mods );
+LDAPFUNCDECL int ldap_modify_s( LDAP *ld, char *dn, LDAPMod **mods );
+
+LDAPFUNCDECL int ldap_modrdn( LDAP *ld, char *dn, char *newrdn );
+LDAPFUNCDECL int ldap_modrdn_s( LDAP *ld, char *dn, char *newrdn );
+LDAPFUNCDECL int ldap_modrdn2( LDAP *ld, char *dn, char *newrdn,
+        int deleteoldrdn );
+LDAPFUNCDECL int ldap_modrdn2_s( LDAP *ld, char *dn, char *newrdn,
+        int deleteoldrdn);
+
+LDAPFUNCDECL int ldap_result( LDAP *ld, int msgid, int all,
+        struct timeval *timeout, LDAPMessage **result );
+LDAPFUNCDECL int ldap_msgfree( LDAPMessage *lm );
+LDAPFUNCDECL int ldap_msgdelete( LDAP *ld, int msgid );
+LDAPFUNCDECL void ldap_memfree( void *p );
+LDAPFUNCDECL void ber_free( BerElement *ber, int freebuf );
+
+LDAPFUNCDECL int ldap_search( LDAP *ld, char *base, int scope, char *filter,
+        char **attrs, int attrsonly );
+LDAPFUNCDECL int ldap_search_s( LDAP *ld, char *base, int scope, char *filter,
+        char **attrs, int attrsonly, LDAPMessage **res );
+LDAPFUNCDECL int ldap_search_st( LDAP *ld, char *base, int scope, char *filter,
+    char **attrs, int attrsonly, struct timeval *timeout, LDAPMessage **res );
+
+LDAPFUNCDECL int ldap_unbind( LDAP *ld );
+LDAPFUNCDECL int ldap_unbind_s( LDAP *ld );
+
+LDAPFUNCDECL int ldap_abandon( LDAP *ld, int msgid );
+
+LDAPFUNCDECL int ldap_add( LDAP *ld, char *dn, LDAPMod **attrs );
+LDAPFUNCDECL int ldap_add_s( LDAP *ld, char *dn, LDAPMod **attrs );
+
+LDAPFUNCDECL int ldap_rename( LDAP *ld, char *dn, char *newrdn, char *newparent,
+                            int deleteoldrdn, LDAPControl **serverctrls,
+                            LDAPControl **clientctrls, int *msgidp);   
+LDAPFUNCDECL int ldap_rename_s(LDAP *ld,char *dn,char *newrdn,char *newparent,
+                            int deleteoldrdn,PLDAPControl *serverctrls,
+                            PLDAPControl    *clientctrls);   
+
+LDAPFUNCDECL void ldap_getfilter_free(LDAPFiltDesc *lfdp);
+LDAPFUNCDECL int ldap_abandon_ext( LDAP *ld, int msgid,
+	LDAPControl **serverctrls,  LDAPControl **clientctrls );
+
+LDAPFUNCDECL int ldap_add_ext( LDAP *ld, char *dn, LDAPMod **attrs,
+		LDAPControl **serverctrls,  LDAPControl **clientctrls,
+		int  *msgidp );
+LDAPFUNCDECL int ldap_add_ext_s( LDAP *ld, char *dn, LDAPMod **attrs,
+		LDAPControl **serverctrls,  LDAPControl **clientctrls);
+
+LDAPFUNCDECL int ldap_replic_bind( LDAP *ld, char *dn, char *passwd );
+LDAPFUNCDECL int ldap_replic_bind_s( LDAP *ld, char *dn, char *passwd );
+
+LDAPFUNCDECL int ldap_kerberos_bind_s( LDAP *ld, char *who );
+LDAPFUNCDECL int ldap_kerberos_bind1( LDAP *ld, char *who );
+LDAPFUNCDECL int ldap_kerberos_bind1_s( LDAP *ld, char *who );
+LDAPFUNCDECL int ldap_kerberos_bind2( LDAP *ld, char *who );
+LDAPFUNCDECL int ldap_kerberos_bind2_s( LDAP *ld, char *who );
+
+LDAPFUNCDECL int ldap_sasl_bind(LDAP * ld, char * dn, char * mechanism,
+				struct berval * cred, 
+				LDAPControl   ** serverctrls,
+				LDAPControl   ** clientctrls,
+				int  * msgidp);
+LDAPFUNCDECL int ldap_sasl_bind_s(LDAP * ld, char * dn, char * mechanism,
+				struct berval * cred, 
+				LDAPControl   ** serverctrls,
+				LDAPControl   ** clientctrls);
+
+LDAPFUNCDECL int ldap_parse_sasl_bind_result(LDAP * ld, LDAPMessage * res,
+				struct berval ** servercredp,
+				int freeit);
+
+LDAPFUNCDECL int ldap_native_bind_s(LDAP * ld,char * dn,char * mechanism,
+					struct berval * cred,
+					unsigned int dir_type);
+
+LDAPFUNCDECL int ldap_compare_ext( LDAP *ld, char *dn, char *attr, 
+				struct berval *value, LDAPControl **serverctrls,
+				LDAPControl **clientctrls, int *msgidp );
+LDAPFUNCDECL int ldap_compare_ext_s( LDAP *ld, char *dn, char *attr, 
+				struct berval *value, LDAPControl **serverctrls,
+				LDAPControl **clientctrls );
+
+LDAPFUNCDECL int ldap_delete_ext( LDAP *ld, char *dn, 
+			LDAPControl **serverctrls, LDAPControl **clientctrls,
+			int *msgidp );
+LDAPFUNCDECL int ldap_delete_ext_s( LDAP *ld, char *dn,
+			LDAPControl **serverctrls, LDAPControl **clientctrls );
+
+LDAPFUNCDECL int ldap_modify_ext( LDAP *ld, char *dn, LDAPMod **mods,
+			 LDAPControl **serverctrls, LDAPControl **clientctrls,
+			 int *msgidp );
+LDAPFUNCDECL int ldap_modify_ext_s( LDAP *ld, char *dn, LDAPMod **mods,
+			 LDAPControl **serverctrls, LDAPControl **clientctrls );
+
+
+LDAPFUNCDECL int ldap_get_entry_controls(  LDAP *ld, LDAPMessage *entry,
+					 LDAPControl ***serverctrlsp);
+
+LDAPFUNCDECL char **ldap_explode_rdn( char *dn, int notypes );
+
+LDAPFUNCDECL int ldap_search_ext ( LDAP *ld, char *base, int scope, 
+			char *filter, char **attrs, int attrsonly,
+                        LDAPControl **serverctrls, LDAPControl **clientctrls,
+			struct timeval *timeoutp, int sizelimit, int *msgidp );
+LDAPFUNCDECL int ldap_search_ext_s ( LDAP *ld, char *base, int scope, 
+			char *filter, char **attrs, int attrsonly,
+                        LDAPControl **serverctrls, LDAPControl **clientctrls,
+			struct timeval *timeoutp, int sizelimit, 
+			LDAPMessage **res);
+
+LDAPFUNCDECL int ldap_set_option( LDAP *ld, int option, void *optdata );
+LDAPFUNCDECL int ldap_get_option( LDAP *ld, int option, void *optdata );
+
+LDAPFUNCDECL void ldap_control_free( LDAPControl *ctrl );
+LDAPFUNCDECL void ldap_controls_free( LDAPControl **ctrl );
+
+LDAPFUNCDECL int ldap_msgid( LDAPMessage *lm );
+LDAPFUNCDECL int ldap_msgtype( LDAPMessage *lm );
+
+LDAPFUNCDECL LDAPMessage* ldap_next_reference( LDAP *ld, LDAPMessage *res );
+LDAPFUNCDECL LDAPMessage* ldap_first_reference( LDAP *ld, LDAPMessage *res );
+LDAPFUNCDECL int ldap_count_references( LDAP *ld, LDAPMessage *res );
+
+LDAPFUNCDECL LDAPMessage* ldap_first_message( LDAP *ld, LDAPMessage *chain );
+LDAPFUNCDECL LDAPMessage* ldap_next_message( LDAP *ld, LDAPMessage *chain );
+LDAPFUNCDECL int ldap_count_messages( LDAP *ld, LDAPMessage *chain );
+
+LDAPFUNCDECL int ora_ldap_normalize_dn( char *dn, char *normDn);
+LDAPFUNCDECL int ora_ldap_normalize_dn_with_case( char *dn, char *normDn, 
+						int lower_case);
+
+#ifdef LDAP_REFERRALS
+LDAPFUNCDECL void ldap_set_rebind_proc(LDAP * ld, int (*rebindproc) (LDAP * ld,
+                char **dnp, char **passwdp, int *authmethodp, int freeit));
+LDAPFUNCDECL void ora_ldap_set_rebind_proc(OraLdapClientCtx * clientCtx,
+                LDAP * ld, int (*rebindproc) (LDAP * ld, char **dnp,
+                            char **passwdp, int *authmethodp, int freeit));
+#endif /*LDAP_REFERRALS*/
+
+
+
+/* SASL functions */
+
+LDAPFUNCDECL int ora_ldap_init_SASL (OraLdapClientCtx *clientCtx, LDAP *ld, 
+                                 char * dn, char * mech, void * cred, 
+                                 LDAPControl **serverctrls, 
+                                 LDAPControl **clientctrls);
+
+LDAPFUNCDECL OraLdapHandle ora_ldap_create_cred_hdl (OraLdapClientCtx *clientCtx,int credType);
+
+LDAPFUNCDECL int ora_ldap_set_cred_props (OraLdapClientCtx * clientCtx, OraLdapHandle cred, 
+                             int propType, void *inProperty);
+
+LDAPFUNCDECL int ora_ldap_get_cred_props (OraLdapClientCtx * clientCtx, OraLdapHandle cred, 
+                             int propType, void *outProperty);
+
+LDAPFUNCDECL int ora_ldap_free_cred_hdl (OraLdapClientCtx * clientCtx, OraLdapHandle cred);
+
+/* LDAP Client Context Functions */
+
+LDAPFUNCDECL int ora_ldap_create_clientctx(OraLdapClientCtx ** clientCtx);
+
+LDAPFUNCDECL int ora_ldap_set_clientctx(OraLdapClientCtx * clientCtx, 
+                                         int property_type, 
+                                         void * property);
+
+LDAPFUNCDECL int ora_ldap_destroy_clientctx(OraLdapClientCtx ** clientCtx);
+
+/*
+ * discover server functions
+ */
+LDAPFUNCDECL int ora_ldap_discover ( OraLdapHandle     hdl,
+                                     OraResultHandle   * reshdl);
+LDAPFUNCDECL LDAP *ora_ldap_discover_open( OraLdapHandle  hdl);
+
+LDAPFUNCDECL OraLdapHandle  ora_create_discov_hdl(int  discoveryType);
+
+LDAPFUNCDECL int  ora_free_discov_hdl(OraLdapHandle  hdl);
+LDAPFUNCDECL int  ora_free_result_hdl(OraResultHandle  reshdl);
+
+LDAPFUNCDECL int ora_get_result( OraResultHandle  reshdl,
+                                         int resType, char *** result);
+
+LDAPFUNCDECL int ora_set_discov_prop( OraLdapHandle  hdl,
+                                         int prop, void * inval);
+
+LDAPFUNCDECL int ora_get_discov_prop( OraLdapHandle  hdl,
+                                         int prop, void * outval);
+
+
+#if defined(ultrix) || defined( nextstep )
+extern char *strdup();
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/sdk/include/nzerror.h b/sdk/include/nzerror.h
new file mode 100644
index 0000000..3ba15e3
--- /dev/null
+++ b/sdk/include/nzerror.h
@@ -0,0 +1,686 @@
+/* DISABLE check_long_lines  */
+
+/*
+ * $Header: security_src/public/nzerror.h /st_ldap_db11.2/3 2011/04/29 12:36:28 rchahal Exp $
+ *
+* Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. 
+ */
+
+/* ENABLE check_long_lines  */
+/*
+  NAME
+     nzerror.h - error numbers for the Oracle Security Server
+  DESCRIPTION
+     None.
+  PUBLIC FUNCTION(S)
+     None.
+  PRIVATE FUNCTION(S)
+     None.
+  NOTES
+     A pragma is used to silence olint about the enum value names not being
+     unique within 7 characters. This limit is being changed to 30.
+  MODIFIED
+     rchahal    06/12/06 - 
+     skalyana   01/30/05 - 
+     rchahal    07/16/04 - add cert label 
+     rchahal    07/06/04 - 
+     rchahal    10/15/03 - bug 2513821 
+     rchahal    08/14/03 - new error range (43000 - 43499) 
+     skalyana   08/25/03 - Error changes 
+     rchahal    06/27/03 - RSA errors
+     rchahal    05/27/03 - convert wallet
+     skalyana   03/07/03 - Move FIPS errors
+     rchahal    02/28/03 - bug 2648177
+     rchahal    01/20/03 - use sltsky
+     rchahal    11/11/02 - pkcs11 support
+     skalyana   11/29/02 - Add mutex errors
+     akoyfman   11/01/02 - adding crl cache
+     rchahal    10/23/02 - crldp error
+     rchahal    10/15/02 - fetch crl from ldap
+     rchahal    10/07/02 - crl support
+     akoyfman   10/16/02 - Update with SSL PLus 4.2 errors
+     skalyana   10/04/02 - Certicom SSL Plus 4.2 Upgrade changes
+     akoyfman   08/06/02 - adding sso wallet errors
+     akoyfman   07/12/02 - adding secret store errors
+     skalyana   07/07/02 - Add more errors for FIPS self tests
+     skalyana   07/01/02 - Add more errors
+     skalyana   06/03/02 - Add NZ error for self test failure.
+     ajacobs    02/22/01 - Add some entrust errors
+     vle        02/09/01 - add error mesg
+     lkethana   08/11/00 - Extension Errors
+     lkethana   07/30/00 - add pkcs12 errors
+     lkethana   06/17/00 - mult cert errors
+     lkethana   06/11/00 - multiple cert support
+     rturlapa   03/29/00 - Add error meesage for Entrust Login failure.
+     rwessman   07/07/99 - Deleted include of sslerrs.h. It caused the RDBMS bu
+     rwessman   07/02/99 - fixed merge errors
+     rwessman   07/01/99 - moved NZOS errors to nzerror to make them visible
+     supriya    12/16/98 - add new error for cert chain.
+     arswamin   12/04/98 - add NZERROR_NO_MATCHING_PRIVATE_KEY
+     qdinh      11/12/98 - add NZERROR_VALIDITY_EXPIRED.
+     arswamin   06/17/98 - add INIT_FAILED
+     sdange     06/10/98 - change wrong password to bad password
+     amthakur   06/09/98 - adding error messages
+     wliau      03/10/97 - Add new error message for snzdfo.c.
+     rwessman   03/14/97 - Consolidated PL/SQL toolkit errors into generic erro
+     rwessman   02/26/97 - Added NZERROR_UNSUPPORTED. Corrected values of
+                           errors outside the valid range.
+     asriniva   03/02/97 - Fix olint warning
+     rwessman   02/26/97 - Added NZERROR_UNSUPPORTED
+     rwessman   01/02/97 - Changed PLSQL package errors to be TK_PLSQL to
+                           separate them from the errors generated by the
+                           Oracle interface.
+     rwessman   12/30/96 - Merged in PL/SQL toolkit errors
+     sdange     11/14/96 - (Added NZERROR_DECRYPT_FAILED to the enum list)
+     rwessman   12/02/96 -
+     rwessman   11/25/96 - Added error messages for PL/SQL functions.
+     asriniva   10/31/96 - Include oratypes.h
+     asriniva   10/29/96 - Fix numbering.
+     asriniva   10/29/96 - Fix error numbers
+     asriniva   10/29/96 - Correct type-o
+     asriniva   10/28/96 - Add more TK errors
+     asriniva   10/28/96 - Convert OKAPI errors to TK errors.
+     rwessman   10/17/96 - still more OSS TK errors
+     asriniva   10/16/96 - OKAPI errors
+     asriniva   10/15/96 - OSSTK errors
+     rwessman   10/15/96 - Added more OSS TK errors
+     asriniva   10/09/96 - Add OSSTK errors.
+     rwessman   09/05/96 - Added errors for PL/SQL functions.
+     wliau      09/05/96 - correct error numbers.
+     $Log:  $
+ * Revision 1.26  1996/07/15  23:07:23  wliau
+ * Added NZERROR_AUTH_SHARED_MEMORY
+ *
+ * Revision 1.25  1996/07/01  20:40:15  asriniva
+ * Finished RSA verify/sign.
+ *
+ * Revision 1.24  1996/06/27  20:39:41  rwessman
+ * Added more errors.
+ *
+ * Revision 1.23  1996/05/31  17:33:40  rwessman
+ * Updated nzerror.h to contain bug # for olint enum bug.
+ *
+ * Revision 1.22  1996/05/31  17:12:30  rwessman
+ * Assigned values to the various errors.
+ *
+ * Revision 1.21  1996/05/13  20:46:58  ggilchri
+ * Added more attribute related error conditions
+ *
+*/
+
+#ifndef NZERROR_ORACLE
+# define NZERROR_ORACLE
+
+#ifndef ORATYPES
+# include <oratypes.h>
+#endif /* ORATYPES */
+
+/*
+** Errors - when an error is added here, a message corresponding to the
+** error number must be added to the message file.
+** New errors must be assigned numbers, otherwise the compiler can assign any
+** value that it wants, which may lead to invalid error numbers being
+** generated.
+** The number range currently assigned to the OSS is 28750 - 29249
+** New number range 43000 - 43499
+*/
+
+typedef enum nzerror
+{
+  NZERROR_OK = 0,
+  NZERROR_GENERIC = 28750,                          /* A catchall for errors */
+  NZERROR_NO_MEMORY = 28751,                               /* No more memory */
+  NZERROR_DATA_SOURCE_INIT_FAILED = 28752,     /* Failed to init data source */
+  NZERROR_DATA_SOURCE_TERM_FAILED = 28753,/* Failed to terminate data source */
+  NZERROR_OBJECT_STORE_FAILED = 28754, /* Store object in data source failed */
+  NZERROR_OBJECT_GET_FAILED = 28755,
+                                 /* Failed to obtain object from data source */
+  NZERROR_MEMORY_ALLOC_FAILED = 28756,
+                                       /* Callback failed to allocate memory */
+  NZERROR_MEMORY_ALLOC_0_BYTES = 28757,
+                                   /* Attempted to ask for 0 bytes of memory */
+  NZERROR_MEMORY_FREE_FAILED = 28758,
+                                           /* Callback failed to free memory */
+  NZERROR_FILE_OPEN_FAILED = 28759,
+                                                      /* Open of file failed */
+  NZERROR_LIST_CREATION_FAILED = 28760,
+                                                  /* Creation of list failed */
+  NZERROR_NO_ELEMENT = 28761,
+                                                    /* No list element found */
+  NZERROR_ELEMENT_ADD_FAILED = 28762,
+                                          /* Addition of list element failed */
+  NZERROR_PARAMETER_BAD_TYPE = 28763,
+                                   /* Retrieval of an unknown parameter type */
+  NZERROR_PARAMETER_RETRIEVAL = 28764,      /* Retrieval of parameter failed */
+                             
+  NZERROR_NO_LIST = 28765,                /* Data method list does not exist */
+  NZERROR_TERMINATE_FAIL = 28766,                     /* Failed to terminate */
+  NZERROR_BAD_VERSION_NUMBER = 28767,                  /* Bad version number */
+  NZERROR_BAD_MAGIC_NUMBER = 28768,                      /* Bad magic number */
+  NZERROR_METHOD_NOT_FOUND = 28769,
+                           /* Data retrieval method specified does not exist */
+  NZERROR_ALREADY_INITIALIZED = 28770,
+                                    /*The data source is already initialized */
+  NZERROR_NOT_INITIALIZED = 28771,     /* The data source is not initialized */
+  NZERROR_BAD_FILE_ID = 28772,                             /* File ID is bad */
+  NZERROR_WRITE_MAGIC_VERSION = 28773,  /* Failed to write magic and version */
+  NZERROR_FILE_WRITE_FAILED = 28774,              /* Failed to write to file */
+  NZERROR_FILE_CLOSE_FAILED = 28775,                 /* Failed to close file */
+  NZERROR_OUTPUT_BUFFER_TOO_SMALL = 28776,
+                           /* The buffer supplied by the caller is too small */
+  NZERROR_BINDING_CREATION_FAILED = 28777,/* NL failed in creating a binding */
+  NZERROR_PARAMETER_MALFORMED = 28778,    /* A parameter was in a bad format */
+  NZERROR_PARAMETER_NO_METHOD = 28779,
+                                  /* No method was specified for a data type */
+  NZERROR_BAD_PARAMETER_METHOD = 28780,      /* Illegal method for data type */
+  NZERROR_PARAMETER_NO_DATA = 28781,    /* No method specified when required */
+  NZERROR_NOT_ALLOCATED = 28782,             /* Data source is not allocated */
+  NZERROR_INVALID_PARAMETER = 28783,               /* Invalid parameter name */
+  NZERROR_FILE_NAME_TRANSLATION = 28784,/* Could not translate OSD file name */
+  NZERROR_NO_SUCH_PARAMETER = 28785,   /* Selected parameter is non-existent */
+
+  NZERROR_DECRYPT_FAILED = 28786,  
+                                 /* Encrypted private key decryption failure */ 
+  NZERROR_ENCRYPT_FAILED = 28787,     /* Private key encryption failed */
+ 
+  NZERROR_INVALID_INPUT = 28788,     /* Incorrect input or unknown error */ 
+
+  NZERROR_NAME_TYPE_NOT_FOUND = 28789,
+                                  /* Type of name requested is not available */
+  NZERROR_NLS_STRING_OPEN_FAILED = 28790,
+                                        /* Failure to generate an NLS string */
+  NZERROR_CERTIFICATE_VERIFY = 28791,      /* Failed to verify a certificate */
+  NZERROR_OCI_PLSQL_FAILED = 28792,
+                                 /* an OCI call to process some plsql failed */
+  NZERROR_OCI_BIND_FAILED = 28793,
+                              /* an OCI call to bind an internal var. failed */
+  NZERROR_ATTRIBUTE_INIT = 28794,           /* failed to init role retrieval */
+  NZERROR_ATTRIBUTE_FINISH_FAILED = 28795,/* Did not complete role retrieval */
+  NZERROR_UNSUPPORTED_METHOD = 28796, /* Data method specified not supported */
+  NZERROR_INVALID_KEY_DATA_TYPE = 28797,
+                                      /* Invalid data type specified for key */
+  NZEROR_BIND_SUBKEY_COUNT = 28798,
+       /* Number of sub-keys to bind does not match count in initialized key */
+  NZERROR_AUTH_SHARED_MEMORY = 28799,
+    /* Failed to retreieve authentication information from the shared memory */
+  NZERROR_RIO_OPEN = 28800,                               /* RIO Open Failed */
+  NZERROR_RIO_OBJECT_TYPE = 28801,                /* RIO object type invalid */
+  NZERROR_RIO_MODE = 28802,                              /* RIO mode invalid */
+  NZERROR_RIO_IO = 28803,                     /* RIO io set or numberinvalid */
+  NZERROR_RIO_CLOSE = 28804,                             /* RIO close failed */
+  NZERROR_RIO_RETRIEVE = 28805,                       /* RIO retrieve failed */
+  NZERROR_RIO_STORE = 28806,                             /* RIO store failed */
+  NZERROR_RIO_UPDATE = 28807,                           /* RIO update failed */
+  NZERROR_RIO_INFO = 28808,                               /* RIO info failed */
+  NZERROR_RIO_DELETE = 28809,                           /* RIO delete failed */
+  NZERROR_KD_CREATE = 28810,                 /* Key descriptor create failed */
+  NZERROR_RIO_ACCESS_DESCRIPTOR = 28811,        /* access descriptor invalid */
+  NZERROR_RIO_RECORD = 28812,                              /* record invalid */
+  NZERROR_RIO_RECORD_TYPE = 28813,    /* record type and AD type not matched */
+  NZERROR_PLSQL_ORACLE_TO_REAL = 28814,
+          /* A number passed to PL/SQL could not be converted to real format */
+  NZERROR_PLSQL_REAL_TO_ORACLE = 28815,
+       /* A number in machine format could not be converted to Oracle format */
+  NZERROR_TK_PLSQL_NO_PASSWORD = 28816,
+                         /* A password was not provided to a PL/SQL function */
+  NZERROR_TK_PLSQL_GENERIC = 28817,
+                                      /* A PL/SQL function returned an error */
+  NZERROR_TK_PLSQL_NO_CONTEXT = 28818,
+               /* The package context was not specified to a PL/SQL function */
+  NZERROR_TK_PLSQL_NO_DIST_NAME = 28819,
+      /* The user's distinguished name was not provided to a PL/SQL function */
+  NZERROR_TK_PLSQL_NO_STATE = 28820,
+/* The state of either a signature or decryption/encryption was not provided */
+  NZERROR_TK_PLSQL_NO_INPUT = 28821,
+                       /* An input buffer was specified to a PL/SQL function */
+  NZERROR_TK_PLSQL_NO_SEED = 28822,
+         /* No seed was specified to the PL/SQL seed initialization function */
+  NZERROR_TK_PLSQL_NO_BYTES = 28823,
+  /* Number of bytes was not specified to the PL/SQL random number generator */
+  NZERROR_TK_INVALID_STATE = 28824,
+                     /* Invalid encryption/decryption/signature state passed */
+  NZERROR_TK_PLSQL_NO_ENG_FUNC = 28825,
+                                  /* No crypto engine function was passed in */
+  NZERROR_TK_INV_ENG_FUNC = 28826,
+                          /* An invalid crypto engine function was passed in */
+  NZERROR_TK_INV_CIPHR_TYPE = 28827,
+                                     /* An invalid cipher type was passed in */
+  NZERROR_TK_INV_IDENT_TYPE = 28828,
+                                   /* An invalid identity type was specified */
+  NZERROR_TK_PLSQL_NO_CIPHER_TYPE = 28829,
+                                             /* No cipher type was specified */
+  NZERROR_TK_PLSQL_NO_IDENT_TYPE = 28830,
+                                           /* No identity type was specified */
+  NZERROR_TK_PLSQL_NO_DATA_FMT = 28831,
+                                        /* No data unit format was specified */
+  NZERROR_TK_INV_DATA_FMT = 28832,
+                        /* Invalid data unit format was provided to function */
+  NZERROR_TK_PLSQL_INSUFF_INFO = 28833,
+       /* Not enough info (usually parameters) provided to a PL/SQL function */
+  NZERROR_TK_PLSQL_BUF_TOO_SMALL = 28834,
+           /* Buffer provided by PL/SQL is too small for data to be returned */
+  NZERROR_TK_PLSQL_INV_IDENT_DESC = 28835,
+                             /* Identity descriptor not present or too small */
+  NZERROR_TK_PLSQL_WALLET_NOTOPEN = 28836,
+                                           /* Wallet has not been opened yet */
+  NZERROR_TK_PLSQL_NO_WALLET = 28837,
+                        /* No wallet descriptor specified to PL/SQL function */
+  NZERROR_TK_PLSQL_NO_IDENTITY = 28838,
+                      /* No identity descriptor specified to PL/SQL function */
+  NZERROR_TK_PLSQL_NO_PERSONA = 28839,
+                   /* No persona descriptor was specified to PL/SQL function */
+  NZERROR_TK_PLSQL_WALLET_OPEN = 28840,
+                                                /* Wallet was already opened */
+  NZERROR_UNSUPPORTED = 28841,                 /* Operation is not supported */
+  NZERROR_FILE_BAD_PERMISSION = 28842,      /* Bad file permission specified */
+  NZERROR_FILE_OSD_ERROR = 28843,             /* OSD error when opening file */
+  NZERROR_NO_WALLET  = 28844,  /* cert + privkey + tp files do not exist */
+  NZERROR_NO_CERTIFICATE_ALERT    = 28845,  /* no certificate */
+  NZERROR_NO_PRIVATE_KEY          = 28846,  /* no private-key */
+  NZERROR_NO_CLEAR_PRIVATE_KEY_FILE   = 28847,   /* no clear key-file */
+  NZERROR_NO_ENCRYPTED_PRIVATE_KEY_FILE = 28848,  /* no encrypted priv key */
+  NZERROR_NO_TRUSTPOINTS     = 28849,       /* no trustpoints */
+  NZERROR_NO_CLEAR_TRUSTPOINT_FILE    = 28850,   /* no clear trustpoints */
+  NZERROR_NO_ENCRYPTED_TRUSTPOINT_FILE = 28851,   /* no encrypted trustpoints */
+  NZERROR_BAD_PASSWORD    = 28852,   /* bad password */
+  NZERROR_INITIALIZATION_FAILED   =  28853, /* init failed or 
+                      module loading failed */
+  /******************************* SSL ERRORS ********************************/
+  /*
+   * In order to allow SSL errors to be mapped to Oracle errors, space is
+   * provided here. One Oracle error is provided for each SSL error to make
+   * error handling easier. A macro is provided to do the conversion.
+   * NOTE: ANY CHANGE IN SSL ERRORS MUST BE REFLECTED HERE.
+   * To add an SSL error, use the following formula to calculate the Oracle
+   * error:
+   * new_oracle_error = (new_ssl_error - SSLMemoryError) + NZERROR_SSLMemoryErr
+   * or numerically:
+   * new_oracle_error = (new_ssl_error - -7000) + 28854
+   */
+  NZERROR_SSLMemoryErr = 28854,
+  NZERROR_SSLUnsupportedErr = 28855,
+  NZERROR_SSLOverflowErr = 28856,
+  NZERROR_SSLUnknownErr = 28857,
+  NZERROR_SSLProtocolErr = 28858,
+  NZERROR_SSLNegotiationErr = 28859,
+  NZERROR_SSLFatalAlert = 28860,
+  NZERROR_SSLWouldBlockErr = 28861,
+  NZERROR_SSLIOErr = 28862,
+  NZERROR_SSLSessionNotFoundErr = 28863,
+  NZERROR_SSLConnectionClosedGraceful = 28864,
+  NZERROR_SSLConnectionClosedError = 28865,
+  NZERROR_ASNBadEncodingErr = 28866,
+  NZERROR_ASNIntegerTooBigErr = 28867,
+  NZERROR_X509CertChainInvalidErr = 28868,
+  NZERROR_X509CertExpiredErr = 28869,
+  NZERROR_X509NamesNotEqualErr = 28870,
+  NZERROR_X509CertChainIncompleteErr = 28871,
+  NZERROR_X509DataNotFoundErr = 28872,
+  NZERROR_SSLBadParameterErr = 28873,
+  NZERROR_SSLIOClosedOverrideGoodbyeKiss = 28874,
+  NZERROR_X509MozillaSGCErr  =  28875,
+  NZERROR_X509IESGCErr       =  28876,
+  NZERROR_ImproperServerCredentials = 28877,
+  NZERROR_ImproperClientCredentials = 28878,
+  NZERROR_NoProtocolSideSet = 28879,
+  NZERROR_setPersonaFailed = 28880,
+  NZERROR_setCertFailed = 28881,
+  NZERROR_setVKeyFailed = 28882,
+  NZERROR_setTPFailed = 28883,
+  NZERROR_BadCipherSuite = 28884,
+  NZERROR_NoKeyPairForKeyUsage = 28885,
+
+/* ============>>>  ENTRUST ERRORS */
+  NZERROR_EntrustLoginFailed = 28890,
+  NZERROR_EntrustGetInfoFailed = 28891,
+  NZERROR_EntrustLoadCertificateFailed = 28892,
+  NZERROR_EntrustGetNameFailed = 28893,
+
+/* ============>>> NZERRORS CONTINUED */
+  NZERROR_CertNotInstalled = 29000,
+  NZERROR_ServerDNMisMatched = 29002,
+  NZERROR_ServerDNMisConfigured = 29003,
+
+/* ============>>> PKI VENDORS ERRORS 29050 - 29099 */
+
+/* ============>>> SSL Errors CONTINUED */
+  NZERROR_CIC_ERR_SSL_ALERT_CB_FAILURE = 29004,
+  NZERROR_CIC_ERR_SSL_BAD_CERTIFICATE = 29005,
+  NZERROR_CIC_ERR_SSL_BAD_CERTIFICATE_REQUEST = 29006,
+  NZERROR_CIC_ERR_SSL_BAD_CLEAR_KEY_LEN = 29007,
+  NZERROR_CIC_ERR_SSL_BAD_DHPARAM_KEY_LENGTH = 29008,
+  NZERROR_CIC_ERR_SSL_BAD_ENCRYPTED_KEY_LEN = 29009,
+  NZERROR_CIC_ERR_SSL_BAD_EXPORT_KEY_LENGTH = 29010,
+  NZERROR_CIC_ERR_SSL_BAD_FINISHED_MESSAGE = 29011,
+  NZERROR_CIC_ERR_SSL_BAD_KEY_ARG_LEN = 29012,
+  NZERROR_CIC_ERR_SSL_BAD_MAC = 29013,
+  NZERROR_CIC_ERR_SSL_BAD_MAX_FRAGMENT_LENGTH_EXTENSION = 29014,
+  NZERROR_CIC_ERR_SSL_BAD_MESSAGE_LENGTH = 29015,
+  NZERROR_CIC_ERR_SSL_BAD_PKCS1_PADDING = 29016,
+  NZERROR_CIC_ERR_SSL_BAD_PREMASTER_SECRET_LENGTH = 29017,
+  NZERROR_CIC_ERR_SSL_BAD_PREMASTER_SECRET_VERSION = 29018,
+  NZERROR_CIC_ERR_SSL_BAD_PROTOCOL_VERSION = 29019,
+  NZERROR_CIC_ERR_SSL_BAD_RECORD_LENGTH = 29020,
+  NZERROR_CIC_ERR_SSL_BAD_SECRET_KEY_LEN = 29021,
+  NZERROR_CIC_ERR_SSL_BAD_SIDE = 29022,
+  NZERROR_CIC_ERR_SSL_BUFFERS_NOT_EMPTY = 29023,
+  NZERROR_CIC_ERR_SSL_CERTIFICATE_VALIDATE_FAILED = 29024,
+  NZERROR_CIC_ERR_SSL_CERT_CHECK_CALLBACK = 29025,
+  NZERROR_CIC_ERR_SSL_DECRYPT_FAILED = 29026,
+  NZERROR_CIC_ERR_SSL_ENTROPY_COLLECTION = 29027,
+  NZERROR_CIC_ERR_SSL_FAIL_SERVER_VERIFY = 29028,
+  NZERROR_CIC_ERR_SSL_HANDSHAKE_ALREADY_COMPLETED = 29029,
+  NZERROR_CIC_ERR_SSL_HANDSHAKE_REQUESTED = 29030,
+  NZERROR_CIC_ERR_SSL_HANDSHAKE_REQUIRED = 29031,
+  NZERROR_CIC_ERR_SSL_INCOMPLETE_IDENTITY = 29032,
+  NZERROR_CIC_ERR_SSL_INVALID_PFX = 29033,
+  NZERROR_CIC_ERR_SSL_NEEDS_CIPHER_OR_CLIENTAUTH = 29034,
+  NZERROR_CIC_ERR_SSL_NEEDS_PRNG = 29035,
+  NZERROR_CIC_ERR_SSL_NOT_SUPPORTED = 29036,
+  NZERROR_CIC_ERR_SSL_NO_CERTIFICATE = 29037,
+  NZERROR_CIC_ERR_SSL_NO_MATCHING_CERTIFICATES = 29038,
+  NZERROR_CIC_ERR_SSL_NO_MATCHING_CIPHER_SUITES = 29039,
+  NZERROR_CIC_ERR_SSL_NO_SUPPORTED_CIPHER_SUITES = 29040,
+  NZERROR_CIC_ERR_SSL_NULL_CB = 29041,
+  NZERROR_CIC_ERR_SSL_READ_BUFFER_NOT_EMPTY = 29042,
+  NZERROR_CIC_ERR_SSL_READ_REQUIRED = 29043,
+  NZERROR_CIC_ERR_SSL_RENEGOTIATION_ALREADY_REQUESTED = 29044,
+  NZERROR_CIC_ERR_SSL_RENEGOTIATION_REFUSED = 29045,
+  NZERROR_CIC_ERR_SSL_RESUMABLE_SESSION = 29046,
+  NZERROR_CIC_ERR_SSL_TLS_EXTENSION_MISMATCH = 29047,
+  NZERROR_CIC_ERR_SSL_UNEXPECTED_MSG = 29048,
+  NZERROR_CIC_ERR_SSL_UNKNOWN_RECORD = 29049,
+  NZERROR_CIC_ERR_SSL_UNSUPPORTED_CLIENT_AUTH_MODE = 29050,
+  NZERROR_CIC_ERR_SSL_UNSUPPORTED_PUBKEY_TYPE = 29051,
+  NZERROR_CIC_ERR_SSL_WRITE_BUFFER_NOT_EMPTY = 29052,
+  NZERROR_CIC_ERR_PKCS12_MISSING_ALG = 29053,
+  NZERROR_CIC_ERR_PKCS_AUTH_FAILED = 29054,
+  NZERROR_CIC_ERR_PKCS_BAD_CONTENT_TYPE = 29055,
+  NZERROR_CIC_ERR_PKCS_BAD_INPUT = 29056,
+  NZERROR_CIC_ERR_PKCS_BAD_PADDING = 29057,
+  NZERROR_CIC_ERR_PKCS_BAD_SN = 29058,
+  NZERROR_CIC_ERR_PKCS_BAD_SN_LENGTH = 29059,
+  NZERROR_CIC_ERR_PKCS_BAD_VERSION = 29060,
+  NZERROR_CIC_ERR_PKCS_BASE = 29061,
+  NZERROR_CIC_ERR_PKCS_FIELD_NOT_PRESENT = 29062,
+  NZERROR_CIC_ERR_PKCS_NEED_CERTVAL = 29063,
+  NZERROR_CIC_ERR_PKCS_NEED_PASSWORD = 29064,
+  NZERROR_CIC_ERR_PKCS_NEED_PKC = 29065,
+  NZERROR_CIC_ERR_PKCS_NEED_PRV_KEY = 29066,
+  NZERROR_CIC_ERR_PKCS_NEED_TRUSTED = 29067,
+  NZERROR_CIC_ERR_PKCS_UNSUPPORTED_CERT_FORMAT = 29068,
+  NZERROR_CIC_ERR_PKCS_UNSUP_PRVKEY_TYPE = 29069,
+  NZERROR_CIC_ERR_CODING_BAD_PEM = 29070,
+  NZERROR_CIC_ERR_CODING_BASE = 29071, 
+  NZERROR_CIC_ERR_DER_BAD_ENCODING = 29072,
+  NZERROR_CIC_ERR_DER_BAD_ENCODING_LENGTH = 29073,
+  NZERROR_CIC_ERR_DER_BASE = 29074,
+  NZERROR_CIC_ERR_DER_ELEMENT_TOO_LONG = 29075,
+  NZERROR_CIC_ERR_DER_INDEFINITE_LENGTH = 29076,
+  NZERROR_CIC_ERR_DER_NO_MORE_ELEMENTS = 29077,
+  NZERROR_CIC_ERR_DER_OBJECT_TOO_LONG = 29078,
+  NZERROR_CIC_ERR_DER_TAG_SIZE = 29079,
+  NZERROR_CIC_ERR_DER_TIME_OUT_OF_RANGE = 29080,
+  NZERROR_CIC_ERR_DER_UNUSED_BITS_IN_BIT_STR = 29081,
+  NZERROR_CIC_ERR_GENERAL_BASE = 29082,
+  NZERROR_CIC_ERR_HASH_BASE = 29083,
+  NZERROR_CIC_ERR_ILLEGAL_PARAM = 29084,
+  NZERROR_CIC_ERR_MEM_NOT_OURS = 29085,
+  NZERROR_CIC_ERR_MEM_OVERRUN = 29086,
+  NZERROR_CIC_ERR_MEM_UNDERRUN = 29087,
+  NZERROR_CIC_ERR_MEM_WAS_FREED = 29088,
+  NZERROR_CIC_ERR_NOT_FOUND = 29090,
+  NZERROR_CIC_ERR_NO_PTR = 29091,
+  NZERROR_CIC_ERR_TIMEOUT = 29092,
+  NZERROR_CIC_ERR_UNIT_MASK = 29093,
+  NZERROR_CIC_ERR_BAD_CTX = 29094,
+  NZERROR_CIC_ERR_BAD_INDEX = 29095,
+  NZERROR_CIC_ERR_BAD_LENGTH = 29096,
+  NZERROR_CIC_ERR_CODING_BAD_ENCODING = 29097,
+  NZERROR_CIC_ERR_SSL_NO_CLIENT_AUTH_MODES = 29098,
+
+  /* ============>>> PKCS12 error 29100 - 29149  */
+  
+  NZERROR_LOCKEYID_CREATE_FAILED = 29100,
+  NZERROR_P12_ADD_PVTKEY_FAILED = 29101,
+  NZERROR_P12_ADD_CERT_FAILED = 29102,
+  NZERROR_P12_WLT_CREATE_FAILED = 29103,
+  NZERROR_P12_ADD_CERTREQ_FAILED = 29104,
+  NZERROR_P12_WLT_EXP_FAILED = 29105,
+  NZERROR_P12_WLT_IMP_FAILED = 29106,
+  NZERROR_P12_CREATE_FAILED = 29107,
+  NZERROR_P12_DEST_FAILED = 29107,
+  NZERROR_P12_RAND_ERROR = 29108, 
+  NZERROR_P12_PVTKEY_CRT_FAILED = 29109,
+  NZERROR_P12_INVALID_BAG = 29110,
+  NZERROR_P12_INVALID_INDEX = 29111,
+  NZERROR_P12_GET_CERT_FAILED = 29112,
+  NZERROR_P12_GET_PVTKEY_FAILED = 29113,
+  NZERROR_P12_IMP_PVTKEY_FAILED = 29114,
+  NZERROR_P12_EXP_PVTKEY_FAILED = 29115,
+  NZERROR_P12_GET_ATTRIB_FAILED = 29116,
+  NZERROR_P12_ADD_ATTRIB_FAILED = 29117,
+  NZERROR_P12_CRT_ATTRIB_FAILED = 29118,
+  NZERROR_P12_IMP_CERT_FAILED = 29119,
+  NZERROR_P12_EXP_CERT_FAILED = 29120,
+  NZERROR_P12_ADD_SECRET_FAILED = 29121,
+  NZERROR_P12_ADD_PKCS11INFO_FAILED = 29122,
+  NZERROR_P12_GET_PKCS11INFO_FAILED = 29123,
+  NZERROR_P12_MULTIPLE_PKCS11_LIBNAME = 29124,
+  NZERROR_P12_MULTIPLE_PKCS11_TOKENLABEL = 29125,
+  NZERROR_P12_MULTIPLE_PKCS11_TOKENPASSPHRASE = 29126,
+  NZERROR_P12_UNKNOWN_PKCS11INFO = 29127,
+  NZERROR_P12_PKCS11_LIBNAME_NOT_SET = 29128,
+  NZERROR_P12_PKCS11_TOKENLABEL_NOT_SET = 29129,
+  NZERROR_P12_PKCS11_TOKENPASSPHRASE_NOT_SET = 29130,
+  NZERROR_P12_MULTIPLE_PKCS11_CERTLABEL = 29131,
+
+/* ===========>>> SSL Errors CONTINUED 29135 - 29139 */
+  NZERROR_CIC_ERR_RANDOM = 29135,
+  NZERROR_CIC_ERR_SMALL_BUFFER = 29136,
+  NZERROR_CIC_ERR_SSL_BAD_CONTEXT = 29137,
+
+/* ==========>>> Mutex Errors 29138 - 29139 */
+  NZERROR_MUTEX_INITIALIZE_FAILED = 29138,
+  NZERROR_MUTEX_DESTROY_FAILED = 29139,
+
+
+/* ============>>> EXTENSIONS Errors 29140 - 29149 */
+  NZERROR_BS_CERTOBJ_CREAT_FAILED = 29140,
+  NZERROR_BS_DER_IMP_FAILED = 29141,
+
+
+/* ============>>> FIPS ERRORS 29150 - 29175 */
+  NZERROR_DES_SELF_TEST_FAILED = 29150,
+  NZERROR_3DES_SELF_TEST_FAILED = 29151,
+  NZERROR_SHA_SELF_TEST_FAILED = 29152,
+  NZERROR_RSA_SELF_TEST_FAILED = 29153,
+  NZERROR_DRNG_SELF_TEST_FAILED = 29154,
+  NZERROR_CKEYPAIR_SELF_TEST_FAILED = 29155,
+  NZERROR_CRNG_SELF_TEST_FAILED = 29156,
+  NZERROR_FIPS_PATHNAME_ERROR = 29157,
+  NZERROR_FIPS_LIB_OPEN_FAILED = 29158,
+  NZERROR_FIPS_LIB_READ_ERROR = 29159,
+  NZERROR_FIPS_LIB_DIFFERS = 29160,
+  NZERROR_DAC_SELF_TEST_FAILED = 29161,
+  NZERROR_NONFIPS_CIPHERSUITE = 29162,
+  NZERROR_VENDOR_NOT_SUPPORTED_FIPS_MODE = 29163,
+  NZERROR_EXTERNAL_PKCS12_NOT_SUPPORTED_FIPS_MODE = 29164,
+  NZERROR_AES_SELF_TEST_FAILED = 29165,
+
+/* ============>>> CRL ERRORS 29176 - 29200 */
+  NZERROR_CRL_SIG_VERIFY_FAILED = 29176, /*CRL signature verification failed*/ 
+  NZERROR_CERT_NOT_IN_CRL = 29177, 
+                                 /*Cert is not in CRL - cert is not revoked*/ 
+  NZERROR_CERT_IN_CRL = 29178,           /*Cert is in CRL - cert is revoked*/ 
+  NZERROR_CERT_IN_CRL_CHECK_FAILED = 29179, /*Cert revocation check failed */ 
+  NZERROR_INVALID_CERT_STATUS_PROTOCOL = 29180, 
+  NZERROR_LDAP_OPEN_FAILED = 29181,  /* ldap_open failed */
+  NZERROR_LDAP_BIND_FAILED = 29182,  /* ldap_bind failed */
+  NZERROR_LDAP_SEARCH_FAILED = 29183,  /* ldap_search failed */
+  NZERROR_LDAP_RESULT_FAILED = 29184,  /* ldap_result failed */
+  NZERROR_LDAP_FIRSTATTR_FAILED = 29185,  /* ldap_first_attribute failed */
+  NZERROR_LDAP_GETVALUESLEN_FAILED = 29186,  /* ldap_get_values_len failed */
+  NZERROR_LDAP_UNSUPPORTED_VALMEC = 29187, 
+                                       /* unsupported validation mechanism */
+  NZERROR_LDAP_COUNT_ENTRIES_FAILED = 29188,/* ldap_count_entries failed */
+  NZERROR_LDAP_NO_ENTRY_FOUND = 29189, /* No entry found in OID */
+  NZERROR_LDAP_MULTIPLE_ENTRIES_FOUND = 29190, /* Multiple entries in OID*/
+  NZERROR_OID_INFO_NOT_SET = 29191, 
+  NZERROR_LDAP_VALMEC_NOT_SET = 29192,  
+                                     /* Validation mechanism not set in OID*/
+  NZERROR_CRLDP_NO_CRL_FOUND = 29193,  
+                                     /* No CRL found using CRLDP mechanism */
+  NZERROR_CRL_NOT_IN_CACHE = 29194,  /* No CRL found in the cache*/
+  NZERROR_CRL_EXPIRED = 29195,       /* CRL nextUpdate time is in the past */
+
+/* ============>>>  ADD ERRORS HERE -- NOTE DECREASING numbers */
+  NZERROR_DN_MATCH  =            29222,  /* for nztCompareDN */
+  NZERROR_CERT_CHAIN_CREATION  = 29223,  /* unable to create a cert chain
+                 * with the existing TPs for the 
+                 * cert to be installed. 
+                 */
+  NZERROR_NO_MATCHING_CERT_REQ = 29224,  /* No matching cert_req was 
+                 * found the corresponding to
+                 * the privatekey which
+                 * matches the cert to be
+                 * installed */
+  NZERROR_CERT_ALREADY_INSTALLED = 29225, /* we are attempting to
+                  * install a cert again into
+                  * a persona which already 
+                  * has it installed.
+                  */
+  NZERROR_NO_MATCHING_PRIVATE_KEY = 29226, /* could not find a matching 
+                   * persona-private(privatekey) in
+                   * the Persona, for the given
+                   * cert(public key). 
+                   */
+  NZERROR_VALIDITY_EXPIRED = 29227, /* certificate validity date expired */
+  NZERROR_TK_BYTES_NEEDED = 29228,   /* Couldn't determine # of bytes needed */
+  NZERROR_TK_BAD_MAGIC_NUMBER = 29229,
+                     /* Magic number found in header does not match expected */
+  NZERROR_TK_BAD_HEADER_LENGTH = 29230,
+                /* Header length passed in not sufficient for message header */
+  NZERROR_TK_CE_INIT = 29231,          /* Crypto engine failed to initialize */
+  NZERROR_TK_CE_KEYINIT = 29232,  /* Crypto engine key initialization failed */
+  NZERROR_TK_CE_ENCODE_KEY = 29233,           /* Count not encode key object */
+  NZERROR_TK_CE_DECODE_KEY = 29234,      /* Could not decode key into object */
+  NZERROR_TK_CE_GEYKEYINFO = 29235,  /* Crypto engine failed to get key info */
+  NZERROR_TK_SEED_RANDOM = 29236,   /* Couldn't seed random number generator */
+  NZERROR_TK_CE_ALGFINISH = 29237,              /* Couldn't finish algorithm */
+  NZERROR_TK_CE_ALGAPPLY = 29238,        /* Couldn't apply algorithm to data */
+  NZERROR_TK_CE_ALGINIT = 29239,           /* Couldn't init CE for algorithm */
+  NZERROR_TK_ALGORITHM = 29240,      /* Have no idea what algorithm you want */
+  NZERROR_TK_CANNOT_GROW = 29241,         /* Cannot grow output buffer block */
+  NZERROR_TK_KEYSIZE = 29242,               /* Key not large enough for data */
+  NZERROR_TK_KEYTYPE = 29243,                           /* Unknown key type. */
+
+  NZERROR_TK_PLSQL_NO_WRL = 29244,
+                 /* Wallet resource locator not specified to PL/SQL function */
+
+  NZERROR_TK_CE_FUNC = 29245,              /* Unknown crypto engine function */
+  NZERROR_TK_TDU_FORMAT = 29246,                       /* Unknown TDU format */
+  NZERROR_TK_NOTOPEN = 29247,                         /* Object must be open */
+  NZERROR_TK_WRLTYPE = 29248,                                /* Bad WRL type */
+  NZERROR_TK_CE_STATE = 29249,  /* Bad state specified for the crypto engine */
+
+  /* After 29249, use error numbers in block 43000 - 43499 */
+  NZERROR_PKCS11_LIBRARY_NOT_FOUND = 43000, /* PKCS #11 library not found */
+  NZERROR_PKCS11_TOKEN_NOT_FOUND = 43001, 
+                                         /* can't find token with given label*/
+  NZERROR_PKCS11_BAD_PASSPHRASE = 43002,  /* passphrase is incorrect/expired */
+  NZERROR_PKCS11_GET_FUNC_LIST = 43003,  /* C_GetFunctionList returned error */
+  NZERROR_PKCS11_INITIALIZE = 43004,     /* C_Initialize returned error */
+  NZERROR_PKCS11_NO_TOKENS_PRESENT = 43005, /* No tokens present */
+  NZERROR_PKCS11_GET_SLOT_LIST = 43006,  /* C_GetSlotList returned error */
+
+  NZERROR_PKCS11_GET_TOKEN_INFO = 43008,  /* C_GetTokenInfo returned error */
+  NZERROR_PKCS11_SYMBOL_NOT_FOUND = 43009, /* Symbol not found in PKCS11 lib */
+
+  NZERROR_PKCS11_TOKEN_LOGIN_FAILED = 43011, /* Token login failed */
+
+  NZERROR_PKCS11_CHANGE_PROVIDERS_ERROR = 43013, /* Change providers error */
+  NZERROR_PKCS11_GET_PRIVATE_KEY_ERROR = 43014, 
+                              /* Error trying to find private key on token */
+  NZERROR_PKCS11_CREATE_KEYPAIR_ERROR = 43015, /* Key pair gen error */
+  NZERROR_PKCS11_WALLET_CONTAINS_P11_INFO = 43016, /* Wallet already contains
+                                                      pkcs11 info */
+  NZERROR_PKCS11_NO_CERT_ON_TOKEN = 43017,      /* No cert found on token */
+  NZERROR_PKCS11_NO_USER_CERT_ON_TOKEN = 43018, /*No user cert found on token*/
+  NZERROR_PKCS11_NO_CERT_ON_TOKEN_WITH_GIVEN_LABEL = 43019, /*No cert found on token with given certificate label.*/
+  NZERROR_PKCS11_MULTIPLE_CERTS_ON_TOKEN_WITH_GIVEN_LABEL = 43020, /*Multiple certs found on token with given certificate label.*/
+  NZERROR_PKCS11_CERT_WITH_LABEL_NOT_USER_CERT  = 43021, /*Cert with given cert is not a user cert because no corresponding pvt key found on token */
+
+  /* RSA ERRORS 43050 - 43059 */
+  NZERROR_BIND_SERVICE_ERROR = 43050,    /* C_BindService returned error */
+  NZERROR_CREATE_KEY_OBJ_ERROR = 43051,  /* B_CreateKeyObject returned error */
+  NZERROR_GET_CERT_FIELDS = 43052,       /* C_GetCertFields returned error */
+  NZERROR_CREATE_PKCS10_OBJECT = 43053,  
+                                      /* C_CreatePKCS10Object returned error */
+  NZERROR_SET_PKCS10_FIELDS = 43054,     /* C_SetPKCS10Fields returned error */
+  NZERROR_SIGN_CERT_REQUEST = 43055,     /* C_SignCertRequest returned error */
+  NZERROR_GET_PKCS10_DER = 43056,        /* C_GetPKCS10DER returned error */
+  NZERROR_INITIALIZE_CERTC = 43057,      /* C_InitializeCertC returned error */
+  NZERROR_INSERT_PRIVATE_KEY = 43058,   /* C_InsertPrivateKey returned error */
+  NZERROR_RSA_ERROR = 43059,            /* RSA error. See trace output */
+
+  /* slts ERRORS 43060 - 43069 */
+  NZERROR_SLTSCTX_INIT_FAILED = 43060,    /* sltsini() returned error */
+  NZERROR_SLTSKYC_FAILED = 43061,         /* sltskyc() returned error */
+  NZERROR_SLTSCTX_TERM_FAILED = 43062,    /* sltster() returned error */
+  NZERROR_SLTSKYS_FAILED = 43063,         /* sltskys() returned error */
+
+  NZERROR_INVALID_HEADER_LENGTH = 43070,       /* bad sso header length */
+  NZERROR_WALLET_CONTAINS_USER_CREDENTIALS = 43071, /* wallet not empty */
+  NZERROR_CANNOT_MODIFY_AL = 43072,       /* Cannot modify AL wallet */
+  NZERROR_FILE_LOCK_FAILED = 43073,       /* Cannot lock wallet file */
+
+  /* Certificate selection errors 43080 - 43099 */
+  NZERROR_MULTIPLE_MATCHING_CREDENTIALS = 43080, /* Multiple matching certs */
+
+
+  NZERROR_CSF_ALIAS_INVALID = 43100,      /* alias is invalid */
+  NZERROR_CSF_KEY_INVALID = 43101,        /* key invalid */
+  NZERROR_CSF_CRED_NOT_SUPPORTED = 43102, /* only pwd cred supported */
+  NZERROR_CSF_HOSTNAME = 43103,           /* hostname error */
+  NZERROR_CSF_XML = 43104,                /* XmlCreate error. See trace */
+  NZERROR_CSF_WALLET_NOT_SPECIFIED = 43105,  /* no wallet specified */
+  NZERROR_CSF_MAP_NOT_IN_STORE = 43106,   /* map does not exist in store */
+  NZERROR_CSF_KEY_NOT_IN_STORE = 43107,   /* key does not exist in store */
+  NZERROR_CSF_ENTRY_EXISTS = 43108,       /* entry with map/key exists */
+  NZERROR_CSF_BTSTRP_WLT_PATH_NOT_SET = 43109, /* bootWallet Path not set */
+  NZERROR_CSF_BTSTRP_WLT_MAP_NOT_SET = 43110,  /* bootWallet map (alias) not set */
+  NZERROR_CSF_BTSTRP_WLT_KEY_NOT_SET = 43111,  /* bootWallet key not set */
+  NZERROR_CSF_LDAP_USERNAME_NOT_SET = 43112,   /* ldap username not set */
+  NZERROR_CSF_LDAP_PWD_NOT_SET = 43113,        /* ldap password not set */
+  NZERROR_CSF_LDAP_URL_NOT_SET = 43114,        /* ldap url not set */
+  NZERROR_CSF_LDAP_PORT_NOT_SET = 43115,       /* ldap port not set */
+  NZERROR_CSF_LDAP_FARMNAME_NOT_SET = 43116,   /* ldap farmname not set */
+  NZERROR_CSF_LDAP_ROOTNAME_NOT_SET = 43117,   /* ldap rootname not set */
+
+  NZERROR_LX_ERROR = 43120,     /* lx api returned error */
+
+  NZERROR_LAST_ERROR = 43499,                        /* Last available error */
+                                            /* MAXIMUM ERROR NUMBER IS 43499 */
+
+  /*
+   * DO NOT JUST INSERT NEW ERRORS IN ANY OLD PLACE.  New errors should be
+   * added such the current error retains their integer values. Duplicate
+   * values will cause compiler errors.
+   */
+  NZERROR_THIS_MUST_BE_LAST
+
+} nzerror;
+
+/*
+ * Macro to convert SSL errors to Oracle errors. As SSL errors are negative
+ * and Oracle numbers are positive, the following needs to be done.
+ * 1. The base error number, which is the highest, is added to the
+ *    SSL error to get the index into the number range.
+ * 2. The result is added to the base Oracle number to get the Oracle error.
+ */
+#define NZERROR_SSL_TO_ORACLE(ssl_error_) \
+  ((ssl_error_ == SSLNoErr) \
+   ? NZERROR_OK \
+   : (nzerror) ((ssl_error_ - SSLMemoryErr) + (uword) NZERROR_SSLMemoryErr))
+#endif /* NZERROR_ORACLE */ 
diff --git a/sdk/include/nzt.h b/sdk/include/nzt.h
new file mode 100644
index 0000000..42fec33
--- /dev/null
+++ b/sdk/include/nzt.h
@@ -0,0 +1,2387 @@
+/* DISABLE check_long_lines */
+
+/* Copyright (c) 1996, 2007, Oracle. All rights reserved.  */
+/* Copyright (c) 1996, 2007, Oracle. All rights reserved.  */
+
+/*
+ * 
+ */
+
+/* 
+ * NAME
+ *    nzt.h
+ * 
+ * DESCRIPTION
+ *    Toolkit public declarations.
+ *    
+ * PUBLIC FUNCTIONS
+ *    nztwOpenWallet           - Open a wallet based on a WRL and pwd.
+ *    nztwCloseWallet          - Close a wallet.
+ * +  nztwCreateWallet         - Create a new wallet.
+ * +  nztwDestroyWallet        - Destroy an existing wallet.
+ *    nztwRetrievePersonaCopy  - Retieve a copy of a particular persona.
+ * +  nzteStorePersona         - Store a persona in the wallet.
+ *    nzteOpenPersona          - Open a persona.
+ *    nzteClosePersona         - Close a persona.
+ * +  nzteRemovePersona        - Remove a persona from a wallet.
+ * +  nzteCreatePersona        - Create a persona.
+ *    nzteDestroyPersona       - Destroy a persona.
+ *    nztiStoreTrustedIdentity - Store an identity with associated trust.
+ *    nzteRetrieveTrustedIdentCopy - Retrieves a trusted identity from persona
+ * +  nzteSetProtection        - Modify the protection set in a persona.
+ * +  nzteGetProtection        - Get the protection set in a persona
+ *    nztePriKey               - Get the Private Key (X509 Only)
+ *    nzteMyCert               - Get the Certificate (X509 only)
+ *    nzteX509CreatePersona    - Create a persona given an X509 Certificate.
+ * +  nztiRemoveIdentity       - Remove an identity from a persona.
+ *    nztiCreateIdentity       - Create an identity.
+ *    nztiDuplicateIdentity    - Create a complete copy of an identity.
+ *    nztiAbortIdentity        - Discard an unstored identity.
+ *    nztidGetIdentityDesc     - Gets Identity Description from Identity.
+ *    nztidFreeIdentityDesc    - Frees memory for Identity Desc object.
+ *    nztSign                  - Generate an attached signature.
+ * +  nztxSignExpansion        - Determine size of signature.
+ *    nztVerify                - Verify an attached signature.               
+ *    nztValidate              - Validate an identity.                       
+ *    nztsd_SignDetached       - Generate a detached signature.
+ * +  nztxsd_SignDetachedExpansion - Determine size of detached signature.
+ *    nztved_VerifyDetached    - Verify a detached signature.                 
+ * +  nztEncrypt               - Symmetric key encryption.   
+ * +  nztxEncryptExpansion     - Determine the tdu length for encryption.
+ * +  nztDecrypt               - Symmetric key decryption.                   
+ * +  nztEnvelope              - Sign then encrypt data for recipient(s).    
+ * +  nztDeEnvelope            - Reverse nztEnvelope.                        
+ * +  nztKeyedHash             - Generate keyed hash.                        
+ * +  nztxKeyedHashExpansion   - Determine size of TDU for keyed hash.
+ *    nztHash                  - Generate hash.   
+ * +  nztxHashExpansion        - Determine the size of the TDU for a hash.
+ *    nztSeedRandom            - See the random number generator.
+ *    nztrb_RandomBytes        - Generate a series of random bytes.          
+ *    nztrn_RandomNumber       - Generate a random number.                   
+ *    nztbbInitBlock           - Initialize a buffer block.                  
+ *    nztbbReuseBlock          - Reuse a buffer block.           
+ *    nztbbSizeBlock           - Find the size of the buffer block.
+ *    nztbbGrowBlock           - Grow initialized buffer block by 'inc' bytes.
+ *    nztbbPurgeBlock          - Purge the memory used within a buffer block.
+ *    nztbbSetBlock            - Set block to known state.
+ *    nztkec_PKEncrypt         - Encrypt data then encrypt key for recipient.
+ *    nztkdc_PKDecrypt         - Decrypt PKEncrypt'ed data.                  
+ *    nztific_FreeIdentityContent - Free the contents of an identity.
+ *    nztifdn                  - Create an identity from a distinguished name
+ *    nztcts_CipherSpecToStr   - Converts the Cipher Spec Code To String
+ *    nztiae_IsAuthEnabled     - Checks to see if Authentication is Enabled
+ *                               in the current Cipher Spec.
+ *    nztiae_IsEncrEnabled     - Checks to see if Encryption is Enabled
+ *                               in the current Cipher Spec.
+ *    nztiae_IsHashEnabled     - Checks to see if Hashing is Enabled
+ *                               in the current Cipher Spec.
+ *    nztwGetCertInfo          - Get peer certificate info
+ *
+ * NOTE: the '+' indicates that these functions are UNSUPPORTED at this time.
+ * 
+ * NOTES
+ *    
+ * MODIFIED
+ *    shiahuan   11/28/07 - 
+ *    skalyana   08/15/07 - 
+ *    pkale      09/28/06 - Bug 5565668: Removed __STDC__
+ *    tnallath   09/22/05 - 
+ *    rchahal    07/27/04 - add keyusage 
+ *    srtata     11/10/03 - fix nztSetAppDefaultLocation header 
+ *    rchahal    10/15/03 - bug 2513821 
+ *    rchahal    11/11/02 - pkcs11 support
+ *    akoyfman   07/05/02 - adding secret store to persona
+ *    supriya    10/11/01 - Fix for bug # 2015732
+ *    ajacobs    04/04/01 - make NZT_REGISTRY_WRL always available
+ *    ajacobs    03/06/01 - olint fix
+ *    ajacobs    03/02/01 - Add GetCertInfo
+ *    supriya    02/23/01 - Move nzttKPUsage from nzt0.h
+ *    rchahal    01/26/01 - olint fixes
+ *    supriya    12/07/00 - Change fn name
+ *    supriya    12/01/00 - Certificate API's needed for iAS
+ *    supriya    06/19/00 - Adding definitions for MCS and ENTR
+ *    lkethana   05/31/00 - multiple cert support
+ *    skanjila   06/25/99 - Remove nztcts_CipherSpecToStr() to NZOS.
+ *    skanjila   06/23/99 - Change API of nztcts_CipherSpecToStr.
+ *    lkethana   06/18/99 - rem nztIPrivateAlloc, etc
+ *    lkethana   06/10/99 - changing size_t to ub4
+ *    lkethana   06/02/99 - add api for getting auth/encry/hash capability of c
+ *    arswamin   12/28/98 - add NZT_MAX_MD5.
+ *    arswamin   12/21/98 - change signature of compareDN
+ *    qdinh      12/21/98 - change size_t to ub4.
+ *    inetwork   11/22/98 - Removing NZDEPRECATED definition
+ *    amthakur   09/14/98 - deprecating and updating the c-structures.
+ *    arswamin   09/24/98 - adding NZTTWRL_NULL for SSO support.
+ *    amthakur   07/30/98 - changing the prototype of nztGetCertChain.
+ *    qdinh      05/01/98 - add NZTTIDENTTYPE_INVALID_TYPE
+ *    qdinh      04/17/98 - add NZTTWRL_ORACLE.
+ *    ascott     10/08/97 - implement nztiStoreTrustedIdentity
+ *    ascott     10/07/97 - add nztiGetIdentityDesc
+ *    ascott     09/28/97 - clarify prototype comments and error codes
+ *    ascott     09/05/97 - update identity: create, destroy, duplicate
+ *    ascott     08/21/97 - add GetCert and GetPriKey
+ *    ascott     08/07/97 - add other WRL settings
+ *    asriniva   03/25/97 - Add ANSI prototypes
+ *    rwessman   03/19/97 - Added prototypes for nztific_FreeIdentityContent()
+ *    asriniva   03/11/97 - Fix olint errors
+ *    sdange     02/28/97 - Removed inclusion of nz0decl.h
+ *    sdange     02/18/97 - Moved nzt specific declarations from nz0decl.h
+ *    asriniva   01/21/97 - Remove prototypes.
+ *    asriniva   10/31/96 - Include oratypes.h
+ *    asriniva   10/15/96 - Declare buffer block helper functions
+ *    asriniva   10/08/96 - First pass at wallet open/close
+ *    asriniva   10/04/96 - Add random number seed function
+ *    asriniva   10/03/96 - Reorder parameters in nztbbSetBlock
+ *    asriniva   10/03/96 - Keep editing.
+ *    asriniva   10/03/96 - Continued edits.
+ *    asriniva   10/02/96 - Continue editing.
+ *    asriniva   09/26/96 -
+ */
+   
+/* ENABLE check_long_lines */
+
+#ifndef NZT_ORACLE
+#define NZT_ORACLE
+
+#ifndef ORATYPES
+# include <oratypes.h>
+#endif /* ORATYPES */
+
+#ifndef NZERROR_ORACLE
+# include <nzerror.h>         /* NZ error type */
+#endif /* NZERROR_ORACLE */
+
+
+#define NZT_MAX_SHA1 20
+#define NZT_MAX_MD5  16
+
+/***************************************/
+/* PUBLIC CONSTANTS, MACROS, AND TYPES */
+/***************************************/
+
+/*
+ * Wallet Resource Locator Type Strings
+ *
+ * WRL TYPE        PARAMETERS      BEHAVIOR
+ * ========        ==========      =====================================
+ * default:          <none>        Uses directory defined by the parameter
+ *                                 SNZD_DEFAULT_FILE_DIRECTORY which in 
+ *                                 unix is "$HOME/oracle/oss"
+ * 
+ * file:            file path      Find the Oracle wallet in this directory.
+ *                                 example: file:<dir-path>
+ * 
+ * sqlnet:           <none>        In this case, the directory path will be 
+ *                                 retrieved from the sqlnet.ora file under
+ *                                 the oss.source.my_wallet parameter.
+ *
+ * mcs:              <none>        Microsoft WRL.
+ *
+ * entr:             dir path      Entrust WRL. eg: ENTR:<dir-path>   
+ * 
+ */
+/* Note that there is no NZT_NULL_WRL.  Instead look in snzd.h for DEFAULT_WRP
+ * which is used in our new defaulting mechanism.  The NZT_DEFAULT_WRL
+ * should be deprecated.
+ */
+#define NZT_DEFAULT_WRL    ((text *)"default:")
+#define NZT_SQLNET_WRL     ((text *)"sqlnet:")
+#define NZT_FILE_WRL       ((text *)"file:")
+#define NZT_ENTR_WRL       ((text *)"entr:")
+#define NZT_MCS_WRL        ((text *)"mcs:")
+#define NZT_ORACLE_WRL      ((text *)"oracle:")
+#define NZT_REGISTRY_WRL   ((text *)"reg:")
+          
+enum nzttwrl 
+{
+   NZTTWRL_DEFAULT = 1,    /* Default, use SNZD_DEFAULT_FILE_DIRECTORY */
+   NZTTWRL_SQLNET,         /* Use oss.source.my_wallet in sqlnet.ora file */
+   NZTTWRL_FILE,           /* Find the oracle wallet in this directory */
+   NZTTWRL_ENTR,           /* Find the entrust profile in this directory */
+   NZTTWRL_MCS,            /* WRL for Microsoft */
+   NZTTWRL_ORACLE,      /* Get the wallet from OSS db */
+   NZTTWRL_NULL,           /* New SSO defaulting mechanism */
+   NZTTWRL_REGISTRY        /* Find the wallet in Windows Registry */
+};
+typedef enum nzttwrl nzttwrl;
+
+#ifndef NZ0DECL_ORACLE
+   /*
+    * With the elimination of nz0decl.h from public, we need this
+    * redundant typedef.
+    */
+   typedef struct nzctx nzctx;
+   typedef struct nzstrc nzstrc;
+   typedef struct nzosContext nzosContext;
+#endif /* NZ0DECL_ORACLE */
+
+/* Moved from nz0decl.h */
+
+typedef struct nzttIdentity nzttIdentity;
+typedef struct nzttIdentityPrivate nzttIdentityPrivate;
+typedef struct nzttPersona nzttPersona;
+typedef struct nzttPersonaPrivate nzttPersonaPrivate;
+typedef struct nzttWallet nzttWallet;
+typedef struct nzttWalletPrivate nzttWalletPrivate;
+typedef struct nzttWalletObj nzttWalletObj; /* For wallet object */
+typedef struct nzssEntry nzssEntry; /* For secretstore */
+typedef struct nzpkcs11_Info nzpkcs11_Info;
+
+/*
+ * Crypto Engine State
+ *
+ * Once the crypto engine (CE) has been initialized for a particular
+ * cipher, it is either at the initial state, or it is continuing to
+ * use the cipher.  NZTCES_END is used to change the state back to
+ * initialized and flush any remaining output.  NZTTCES_RESET can be
+ * used to change the state back to initialized and throw away any
+ * remaining output.
+ */
+enum nzttces 
+{
+   NZTTCES_CONTINUE = 1,    /* Continue processing input */
+   NZTTCES_END,             /* End processing input */
+   NZTTCES_RESET            /* Reset processing and skip generating output */
+};
+typedef enum nzttces nzttces;
+
+/*
+ * Crypto Engine Functions
+ *
+ * List of crypto engine categories; used to index into protection
+ * vector.
+ */
+enum nzttcef
+{
+   NZTTCEF_DETACHEDSIGNATURE = 1,   /* Signature, detached from content */
+   NZTTCEF_SIGNATURE,               /* Signature combined with content */
+   NZTTCEF_ENVELOPING,              /* Signature and encryption with content */
+   NZTTCEF_PKENCRYPTION,            /* Encryption for one or more recipients */
+   NZTTCEF_ENCRYPTION,              /* Symmetric encryption */
+   NZTTCEF_KEYEDHASH,               /* Keyed hash/checkusm */
+   NZTTCEF_HASH,                    /* Hash/checsum */
+   NZTTCEF_RANDOM,                  /* Random byte generation */
+
+   NZTTCEF_LAST                     /* Used for array size */
+};
+typedef enum nzttcef nzttcef;
+
+/*
+ * State of the persona.
+ */
+enum nzttState
+{
+   NZTTSTATE_EMPTY = 0,     /* is not in any state(senseless???) */
+   NZTTSTATE_REQUESTED,     /* cert-request */
+   NZTTSTATE_READY,         /* certificate */
+   NZTTSTATE_INVALID,         /* certificate */
+   NZTTSTATE_RENEWAL        /* renewal-requested */
+};
+typedef enum nzttState nzttState;
+
+/*
+ * Cert-version types
+ * 
+ * This is used to quickly look-up the cert-type
+ */
+enum nzttVersion
+{
+   NZTTVERSION_X509v1 = 1,        /* X.509v1 */
+   NZTTVERSION_X509v3,            /* X.509v3 */
+#ifdef NZDEPRECATED
+   NZTTVERSION_SYMMETRIC,         /* Symmetric */
+#endif
+   NZTTVERSION_INVALID_TYPE       /* For Initialization */
+};
+typedef enum nzttVersion nzttVersion;
+
+/*
+ * Cipher Types
+ *
+ * List of all cryptographic algorithms, some of which may not be
+ * available.
+ */
+enum nzttCipherType 
+{
+   NZTTCIPHERTYPE_RSA = 1,          /* RSA public key */
+   NZTTCIPHERTYPE_DES,              /* DES */
+   NZTTCIPHERTYPE_RC4,              /* RC4 */
+   NZTTCIPHERTYPE_MD5DES,           /* DES encrypted MD5 with salt (PBE) */
+   NZTTCIPHERTYPE_MD5RC2,           /* RC2 encrypted MD5 with salt (PBE) */
+   NZTTCIPHERTYPE_MD5,              /* MD5 */
+   NZTTCIPHERTYPE_SHA               /* SHA */
+};
+typedef enum nzttCipherType nzttCipherType;
+
+/*
+ * TDU Formats
+ *
+ * List of possible toolkit data unit (TDU) formats.  Depending on the
+ * function and cipher used some may be not be available.
+ */
+enum nztttdufmt
+{
+   NZTTTDUFMT_PKCS7 = 1,            /* PKCS7 format */
+   NZTTTDUFMT_RSAPAD,               /* RSA padded format */
+   NZTTTDUFMT_ORACLEv1,             /* Oracle v1 format */
+   NZTTTDUFMT_LAST                  /* Used for array size */
+};
+typedef enum nztttdufmt nztttdufmt;
+
+/*
+ * Validate State
+ *
+ * Possible validation states an identity can be in.
+ */
+enum nzttValState
+{
+   NZTTVALSTATE_NONE = 1,        /* Needs to be validated */
+   NZTTVALSTATE_GOOD,            /* Validated */
+   NZTTVALSTATE_REVOKED          /* Failed to validate */
+};
+typedef enum nzttValState nzttValState;
+
+/*
+ * Policy Fields <----NEW (09/14/98)
+ *
+ * Policies enforced
+ */
+enum nzttPolicy
+{
+   NZTTPOLICY_NONE = 0,
+   NZTTPOLICY_RETRY_1, /* number of retries for decryption = 1 */
+   NZTTPOLICY_RETRY_2, /* number of retries for decryption = 2 */
+   NZTTPOLICY_RETRY_3  /* number of retries for decryption = 3 */
+};
+typedef enum nzttPolicy nzttPolicy;
+
+/*
+ * Persona Usage <----NEW (09/14/98)
+ *
+ * what a persona will be used for?
+ */
+
+#ifdef NZDEPRECATED_MULTIPLECERTS
+enum nzttUsage
+{
+   NZTTUSAGE_NONE = 0,
+   NZTTUSAGE_SSL  /* persona for SSL usage */
+};
+typedef enum nzttUsage nzttUsage;
+#endif
+
+/*
+ * Personas and identities have unique id's that are represented with
+ * 128 bits.
+ */
+typedef ub1 nzttID[16];
+
+/*
+ * Identity Types
+ *
+ * List of all Identity types..
+ */
+enum nzttIdentType 
+{
+   NZTTIDENTITYTYPE_INVALID_TYPE = 0,  
+   NZTTIDENTITYTYPE_CERTIFICTAE,      
+   NZTTIDENTITYTYPE_CERT_REQ,      
+   NZTTIDENTITYTYPE_RENEW_CERT_REQ,      
+   NZTTIDENTITYTYPE_CLEAR_ETP,      
+   NZTTIDENTITYTYPE_CLEAR_UTP,      
+   NZTTIDENTITYTYPE_CLEAR_PTP       
+};
+typedef enum nzttIdentType nzttIdentType;
+
+typedef ub4 nzttKPUsage;
+/* IF new types are added nztiMUS should be changed */
+#define NZTTKPUSAGE_NONE 0
+#define NZTTKPUSAGE_SSL 1             /* SSL Server */
+#define NZTTKPUSAGE_SMIME_ENCR 2
+#define NZTTKPUSAGE_SMIME_SIGN 4
+#define NZTTKPUSAGE_CODE_SIGN 8
+#define NZTTKPUSAGE_CERT_SIGN 16
+#define NZTTKPUSAGE_SSL_CLIENT 32     /* SSL Client */
+#define NZTTKPUSAGE_INVALID_USE 0xffff
+
+
+/*
+ * Timestamp as 32 bit quantity in UTC.
+ */
+typedef ub1 nzttTStamp[4];
+
+/*
+ * Buffer Block
+ *
+ * A function that needs to fill (and possibly grow) an output buffer
+ * uses an output parameter block to describe each buffer.
+ *
+ * The flags_nzttBufferBlock member tells the function whether the
+ * buffer can be grown or not.  If flags_nzttBufferBlock is 0, then
+ * the buffer will be realloc'ed automatically.  
+ *
+ * The buflen_nzttBufferBLock member is set to the length of the
+ * buffer before the function is called and will be the length of the
+ * buffer when the function is finished.  If buflen_nzttBufferBlock is
+ * 0, then the initial pointer stored in pobj_nzttBufferBlock is
+ * ignored.
+ *
+ * The objlen_nzttBufferBlock member is set to the length of the
+ * object stored in the buffer when the function is finished.  If the
+ * initial buffer had a non-0 length, then it is possible that the
+ * object length is shorter than the buffer length.
+ *
+ * The pobj_nzttBufferBlock member is a pointer to the output object.
+ */
+struct nzttBufferBlock
+{
+# define NZT_NO_AUTO_REALLOC     0x1
+
+   uword flags_nzttBufferBlock;     /* Flags */
+   ub4 buflen_nzttBufferBlock;   /* Total length of buffer */
+   ub4 usedlen_nzttBufferBlock;  /* Length of used buffer part */
+   ub1 *buffer_nzttBufferBlock;     /* Pointer to buffer */
+};
+typedef struct nzttBufferBlock nzttBufferBlock;
+
+/*
+ * Wallet.
+ */
+struct nzttWallet
+{
+   ub1 *ldapName_nzttWallet;              /* user's LDAP Name */
+   ub4  ldapNamelen_nzttWallet;           /* len of user's LDAP Name */
+   nzttPolicy securePolicy_nzttWallet;    /* secured-policy of the wallet */
+   nzttPolicy openPolicy_nzttWallet;      /* open-policy of the wallet */
+   nzttPersona *persona_nzttWallet;       /* List of personas in wallet */
+   nzttWalletPrivate *private_nzttWallet; /* Private wallet information */
+#ifdef NZDEPRECATED
+   ub4 npersona_nzttWallet;            /* Number of personas */
+#endif
+};
+
+/*
+ * The wallet contains, one or more personas.  A persona always
+ * contains its private key and its identity.  It may also contain
+ * other 3rd party identites.  All identities qualified with trust
+ * where the qualifier can indicate anything from untrusted to trusted
+ * for specific operations.
+ */
+
+/*
+ * Persona
+ *
+ * Structure containing information about a persona.
+ */
+struct nzttPersona
+{
+   ub1 *genericName_nzttPersona;              /* user-friendly persona name  */
+   ub4  genericNamelen_nzttPersona;           /* persona-name length */
+   nzttPersonaPrivate *private_nzttPersona;   /* Opaque part of persona */
+   nzttIdentity *mycertreqs_nzttPersona;      /* My cert-requests */
+   nzttIdentity *mycerts_nzttPersona;         /* My certificates */
+   nzttIdentity *mytps_nzttPersona;           /* List of trusted identities */
+   nzssEntry *mystore_nzttPersona;            /* List of secrets */
+   nzpkcs11_Info *mypkcs11Info_nzttPersona;   /* PKCS11 token info */
+   struct nzttPersona *next_nzttPersona;      /* Next persona */
+#ifdef NZDEPRECATED_MULTIPLECERTS
+  /* As Persona has multiple certs for different
+     usages, Persona Usage does not mean anything. Similarly
+     each key pair has its own state and Persona state itself
+     does not mean anything. - lk 5/31/00
+  */
+   nzttUsage usage_nzttPersona;               /* persona usage; SSL/SET/.. */
+   nzttState state_nzttPersona;               /* persona state-requested/ready */
+   ub4 ntps_nzttPersona;                   /* Num of trusted identities */
+#endif
+};
+
+/*
+ * Identity
+ *
+ * Structure containing information about an identity.
+ *
+ * NOTE
+ *  -- the next_trustpoint field only applies to trusted identities and
+ *     has no meaning (i.e. is NULL) for self identities.
+ */
+struct nzttIdentity
+{
+   text *dn_nzttIdentity;                      /* Alias */
+   ub4 dnlen_nzttIdentity;                  /* Length of alias */
+   text *comment_nzttIdentity;                 /* Comment  */
+   ub4 commentlen_nzttIdentity;             /* Length of comment */
+   nzttIdentityPrivate *private_nzttIdentity;  /* Opaque part of identity */
+   nzttIdentity *next_nzttIdentity;            /* next identity in list */
+};
+
+struct nzttB64Cert
+{
+   ub1 *b64Cert_nzttB64Cert;
+   ub4  b64Certlen_nzttB64Cert;
+   struct nzttB64Cert *next_nzttB64Cert;
+};
+typedef struct nzttB64Cert nzttB64Cert;
+
+
+struct nzttPKCS7ProtInfo
+{
+   nzttCipherType mictype_nzttPKCS7ProtInfo;    /* Hash cipher */
+   nzttCipherType symmtype_nzttPKCS7ProtInfo;   /* Symmetric cipher */
+   ub4 keylen_nzttPKCS7ProtInfo;             /* Length of key to use */
+};
+typedef struct nzttPKCS7ProtInfo nzttPKCS7ProtInfo;
+
+/*
+ * Protection Information.
+ *
+ * Information specific to a type of protection.
+ */
+union nzttProtInfo
+{
+   nzttPKCS7ProtInfo pkcs7_nzttProtInfo;
+};
+typedef union nzttProtInfo nzttProtInfo;
+
+/*
+ * A description of a persona so that the toolkit can create one.  A
+ * persona can be symmetric or asymmetric and both contain an
+ * identity.  The identity for an asymmetric persona will be the
+ * certificate and the identity for the symmetric persona will be
+ * descriptive information about the persona.  In either case, an
+ * identity will have been created before the persona is created.
+ *
+ * A persona can be stored separately from the wallet that references
+ * it.  By default, a persona is stored with the wallet (it inherits
+ * with WRL used to open the wallet).  If a WRL is specified, then it
+ * is used to store the actuall persona and the wallet will have a
+ * reference to it.
+ */
+struct nzttPersonaDesc
+{
+   ub4 privlen_nzttPersonaDesc;        /* Length of private info (key)*/
+   ub1 *priv_nzttPersonaDesc;             /* Private information */
+   ub4 prllen_nzttPersonaDesc;         /* Length of PRL */
+   text *prl_nzttPersonaDesc;             /* PRL for storage */
+   ub4 aliaslen_nzttPersonaDesc;       /* Length of alias */
+   text *alias_nzttPersonaDesc;           /* Alias */
+   ub4 longlen_nzttPersonaDesc;        /* Length of longer description*/
+   text *long_nzttPersonaDesc;            /* Longer persona description */
+};
+typedef struct nzttPersonaDesc nzttPersonaDesc;
+
+/*
+ * A description of an identity so that the toolkit can create one.
+ * Since an identity can be symmetric or asymmetric, the asymmetric
+ * identity information will not be used when a symmetric identity is
+ * created.  This means the publen_nzttIdentityDesc and
+ * pub_nzttIdentityDesc members will not be used when creating a
+ * symmetric identity.
+ */
+struct nzttIdentityDesc
+{
+   ub4 publen_nzttIdentityDesc;        /* Length of identity */
+   ub1 *pub_nzttIdentityDesc;             /* Type specific identity */
+   ub4 dnlen_nzttIdentityDesc;         /* Length of alias */
+   text *dn_nzttIdentityDesc;             /* Alias */
+   ub4 longlen_nzttIdentityDesc;       /* Length of longer description */
+   text *long_nzttIdentityDesc;           /* Longer description */
+   ub4 quallen_nzttIdentityDesc;       /* Length of trust qualifier */
+   text *trustqual_nzttIdentityDesc;      /* Trust qualifier */
+};
+typedef struct nzttIdentityDesc nzttIdentityDesc;
+
+/********************************/
+/* PUBLIC FUNCTION DECLARATIONS */
+/********************************/
+
+/*---------------------- nztwOpenWallet ----------------------*/
+
+/*
+ * NAME
+ *    nztwOpenWallet - Open a wallet based on a wallet Resource Locator (WRL).
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    wrllen   {IN}     Length of WRL.
+ *    wrl      {IN}     WRL.
+ *    pwdlen   {IN}     Length of password.
+ *    pwd      {IN}     Password.
+ *    wallet   {IN/OUT} Initialized wallet structure.   
+ * 
+ * NOTES
+ *    The syntax for a WRL is <Wallet Type>:<Wallet Type Parameters>.
+ *
+ *    Wallet Type       Wallet Type Parameters.
+ *    -----------       ----------------------
+ *    File              Pathname (e.g. "file:/home/asriniva")
+ *    Oracle            Connect string (e.g. "oracle:scott/tiger@oss")
+ *
+ *    There are also defaults.  If the WRL is NZT_DEFAULT_WRL, then
+ *    the platform specific WRL default is used.  If only the wallet
+ *    type is specified, then the WRL type specific default is used
+ *    (e.g. "oracle:")
+ *
+ *    There is an implication with Oracle that should be stated: An
+ *    Oracle based wallet can be implemented in a user's private space
+ *    or in world readable space.
+ *
+ *    When the wallet is opened, the password is verified by hashing
+ *    it and comparing against the password hash stored with the
+ *    wallet.  The list of personas (and their associated identities)
+ *    is built and stored into the wallet structure.
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_RIO_OPEN     RIO could not open wallet (see network trace file).
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_TK_WRLTYPE   WRL type is not known.
+ *    NZERROR_TK_WRLPARM   WRL parm does not match type.
+ */
+nzerror nztwOpenWallet( nzctx *, ub4, text *, ub4, text *, 
+                           nzttWallet * );
+
+
+/*---------------------- nztwCloseWallet ----------------------*/
+
+/*
+ * NAME
+ *    nztwCloseWallet - Close a wallet
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wallet   {IN/OUT} Wallet.
+ * 
+ * NOTES
+ *    Closing a wallet also closes all personas associated with that
+ *    wallet.  It does not cause a persona to automatically be saved
+ *    if it has changed.  The implication is that a persona can be
+ *    modified by an application but if it is not explicitly saved it
+ *    reverts back to what was in the wallet.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_RIO_CLOSE    RIO could not close wallet (see network trace file).
+ */
+nzerror nztwCloseWallet( nzctx *, nzttWallet * );
+
+/*--------------------nztwGetCertInfo----------------------------*/
+/****NOTE: This function is a temporary hack.****/
+/****DO NOT CALL.  It will soon disappear.****/
+nzerror nztwGetCertInfo( nzctx *nz_context,
+                            nzosContext *nzosCtx,
+                            nzttWallet *walletRef,
+                            void *peerCert );
+
+
+/*------------------------ nztwConstructWallet -----------------------*/
+/*
+ * 
+ * nzerror nztwConstructWallet( nzctx *oss_context,    
+ *              nzttPolicy openPolicy,
+ *              nzttPolicy securePolicy,
+ *              ub1 *ldapName,
+ *              ub4 ldapNamelen,
+ *              nzstrc *wrl,
+ *              nzttPersona *personas,
+ *              nzttWallet **wallet );
+ */
+
+/*---------------------- nztwRetrievePersonaCopy ----------------------*/
+
+/*
+ * NAME
+ *    nztwRetrievePersonaCopy - Retrieves a persona based from wallet
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    wallet   {IN}     Wallet.
+ *    index    {IN}     Which wallet index to remove (first persona is zero).
+ *    persona  {OUT}    Persona found.
+ * 
+ * NOTES
+ *    Retrieves a persona from the wallet based on the index number passed
+ *    in.  This persona is a COPY of the one stored in the wallet, therefore
+ *    it is perfectly fine for the wallet to be closed after this call is 
+ *    made.
+ *
+ *    The caller is responsible for disposing of the persona when completed.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ */
+nzerror nztwRetrievePersonaCopy( nzctx *, nzttWallet *, ub4, 
+                           nzttPersona ** );
+
+
+/*---------------------- nztwRetrievePersonaCopyByName ----------------------*/
+
+/*
+ * NAME
+ *    nztwRetrievePersonaCopyByName - Retrieves a persona based on its name.
+ *
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wallet   {IN}     Wallet.
+ *    name    {IN}     Name of the persona 
+ *    persona  {OUT}    Persona found.
+ *
+ * NOTES
+ *    Retrieves a persona from the wallet based on the name of the persona. 
+ *    This persona is a COPY of the one stored in the wallet, therefore
+ *    it is perfectly fine for the wallet to be closed after this call is
+ *    made.
+ *
+ *    The caller is responsible for disposing of the persona when completed.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ */
+nzerror nztwRetrievePersonaCopyByName( nzctx *, nzttWallet *, char *,
+                           nzttPersona ** );
+
+/*---------------------- nzteOpenPersona ----------------------*/
+
+/*
+ * NAME
+ *    nzteOpenPersona - Open a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    persona  {IN/OUT} Persona.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password failed to decrypt persona.
+ *    NZERROR_TK_BADPRL    Persona resource locator did not work.
+ *    NZERROR_RIO_OPEN     Could not open persona (see network trace file).
+ */
+nzerror nzteOpenPersona( nzctx *, nzttPersona * );
+
+/*--------------------- nzteClosePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteClosePersona - Close a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN/OUT} Persona.
+ * 
+ * NOTES
+ *    Closing a persona does not store the persona, it simply releases
+ *    the memory associated with the crypto engine.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nzteClosePersona( nzctx *, nzttPersona * );
+
+/*--------------------- nzteDestroyPersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteDestroyPersona - Destroy a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}        OSS context.
+ *    persona  {IN/OUT}    Persona.
+ * 
+ * NOTES
+ *    The persona is destroyd in the open state, but it will
+ *    not be associated with a wallet.
+ *    
+ *    The persona parameter is doubly indirect so that at the
+ *    conclusion of the function, the pointer can be set to NULL.
+ *
+ *
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_TK_TYPE   Unsupported itype/ctype combination.
+ *    NZERROR_TK_PARMS  Error in persona description.
+ */
+nzerror nzteDestroyPersona( nzctx *, nzttPersona ** );
+
+/*---------------------- nzteRetrieveTrustedIdentCopy ----------------------*/
+
+/*
+ * NAME
+ *    nzteRetrieveTrustedIdentCopy - Retrieves a trusted identity from persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    persona  {IN}     Persona.
+ *    index    {IN}     Which wallet index to remove (first element is zero).
+ *    identity {OUT}    Trusted Identity from this persona.
+ * 
+ * NOTES
+ *    Retrieves a trusted identity from the persona based on the index 
+ *    number passed in.  This identity is a COPY of the one stored in 
+ *    the persona, therefore it is perfectly fine to close the persona
+ *    after this call is made.
+ *
+ *    The caller is responsible for freeing the memory of this object 
+ *    by calling nztiAbortIdentity it is no longer needed
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ */
+nzerror nzteRetrieveTrustedIdentCopy( nzctx *, nzttPersona *, ub4, 
+                           nzttIdentity ** );
+
+/*--------------------- nztePriKey ---------------------*/
+
+/*
+ * NAME
+ *    nztePriKey - Get the decrypted Private Key for the Persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    vkey     {OUT}    Private Key [B_KEY_OBJ]
+ *    vkey_len {OUT}    Private Key Length
+ * 
+ * NOTES
+ *    This funiction will only work for X.509 based persona which contain
+ *    a private key.  
+ *    A copy of the private key is returned to the caller so that they do not 
+ *    have to worry about the key changeing "underneath them".
+ *    Memory will be allocated for the vkey and therefore, the CALLER
+ *    will be responsible for freeing this memory.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_NO_MEMORY    ossctx is null.
+ *    NZERROR_TK_BADPRL    Persona resource locator did not work.
+ */
+nzerror nztePriKey( nzctx *, nzttPersona *, ub1 **, ub4 * );
+
+/*--------------------- nzteMyCert ---------------------*/
+
+/*
+ * NAME
+ *    nzteMyCert - Get the X.509 Certificate for a persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    cert     {OUT}    X.509 Certificate [BER encoded]
+ *    cert_len {OUT}    Certificate length
+ * 
+ * NOTES
+ *    This funiction will only work for X.509 based persona which contain
+ *    a certificate for the self identity. 
+ *    A copy of the certificate is returned to the caller so that they do not 
+ *    have to worry about the certificate changeing "underneath them".
+ *    Memory will be allocated for the cert and therefore, the CALLER
+ *    will be responsible for freeing this memory.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_NO_MEMORY    ossctx is null.
+ */
+nzerror nzteMyCert( nzctx *, nzttPersona *, ub1 **, ub4 * );
+
+/*--------------------- nzteX509CreatePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteX509CreatePersona - Given a BER X.509 cert, create a persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    cert     {IN}     X.509 Certificate [BER encoded]
+ *    cert_len {IN}     Certificate length
+ *    persona  {OUT}    Persona.
+ * 
+ * NOTES
+ *    Memory will be allocated for the persona and therefore, the CALLER
+ *    will be responsible for freeing this memory.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_NO_MEMORY    ossctx is null.
+ */
+nzerror nzteX509CreatePersona( nzctx *, ub1 *, ub4, nzttPersona ** );
+
+/*-------------------- nztiCreateIdentity --------------------*/
+
+/*
+ * NAME
+ *    nztiCreateIdentity - Create an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    itype    {IN}     Identity type.
+ *    desc     {IN}     Description of identity.
+ *    identity {IN/OUT} Identity.
+ * 
+ * NOTES
+ *    Memory is only allocated for the identity structure.  The elements in
+ *    the description struct are not copied.  Rather their pointers are copied
+ *    into the identity structure.  Therefore, the caller should not free
+ *    the elements referenced by the desc.  These elements will be freed
+ *    when the nztiDestroyIdentity is called.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_PARMS     Error in description.
+ */
+nzerror nztiCreateIdentity( nzctx *, nzttVersion, nzttIdentityDesc *,
+                               nzttIdentity ** );
+
+#ifdef NZ_OLD_TOOLS
+/*-------------------- nztiDuplicateIdentity --------------------*/
+
+/*
+ * NAME
+ *    nztiDuplicateIdentity - Duplicate an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt     {IN}     OSS context.
+ *    identity     {IN}     Target Identity.
+ *    new_identity {IN}     New Identity.
+ * 
+ * NOTES
+ *    Memory for the identity is allocated inside the function, and all
+ *    internal identity elements as well.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_TK_NOTFOUND  Identity not found.
+ *    NZERROR_PARMS     Error in description.
+ */
+nzerror nztiDuplicateIdentity( nzctx *, nzttIdentity *, 
+                              nzttIdentity ** );
+#endif /* NZ_OLD_TOOLS */
+
+/*--------------------- nztiAbortIdentity ---------------------*/
+
+/*
+ * NAME
+ *    nztiAbortIdentity - Abort an unassociated identity.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    identity {IN/OUT} Identity.
+ * 
+ * NOTES
+ *    It is an error to try to abort an identity that can be
+ *    referenced through a persona.
+ *    
+ *    The identity pointer is set to NULL at the conclusion.
+ * 
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_CANTABORT    Identity is associated with persona.
+ */
+nzerror nztiAbortIdentity( nzctx *, nzttIdentity ** );
+
+#ifdef NZ_OLD_TOOLS
+/*----------------- nztidGetIdentityDesc -----------------*/
+
+/*
+ * NAME
+ *    nztidGetIdentityDesc - Gets an Identity Description from the identity
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     Success.
+ *    identity    {IN}     Identity.
+ *    description {IN/OUT} Identity Description.
+ * 
+ * NOTES
+ *    Memory is allocated for the Identity Description. It
+ *    is the callers responsibility to free this memory by calling 
+ *    nztiFreeIdentityDesc.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+nzerror nztidGetIdentityDesc( nzctx *, nzttIdentity *,
+                                     nzttIdentityDesc ** );
+
+/*----------------- nztidFreeIdentityDesc -----------------*/
+
+/*
+ * NAME
+ *    nztidFreeIdentityDesc - Frees memory for Identity Desc object.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     oss context.
+ *    description {IN/OUT} Identity Description.
+ * 
+ * NOTES
+ *    Memory is freed for all Identity description elements.  Pointer is 
+ *    then set to null.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+nzerror nztidFreeIdentityDesc( nzctx *, nzttIdentityDesc ** );
+#endif /* NZ_OLD_TOOLS */
+
+/*---------------- nztific_FreeIdentityContent ----------------*/
+
+/*
+ * NAME
+ *     nztific_FreeIdentityContent - free the contents of an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt         {IN}     OSS context.
+ *    identity         {IN/OUT} freed identity
+ * 
+ * NOTES
+ *    Free a created identity.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+/*
+ * Free the identity content.
+ */
+nzerror nztific_FreeIdentityContent( nzctx *ossctx,
+                                        nzttIdentity *identity );
+
+
+/*-------------------------- nztSign --------------------------*/
+
+/*
+ * NAME
+ *    nztSign - Create an attached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Open persona acting as signer.
+ *    state    {IN}     State of signature.
+ *    inlen    {IN}     Length of this input part.
+ *    in       {IN}     This input part.
+ *    tdubuf   {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztSign( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                    nzttBufferBlock * );
+
+/*------------------------- nztVerify -------------------------*/
+
+/*
+ * NAME
+ *    nztVerify - Verify an attached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of verification.
+ *    intdulen {IN}     TDU length.
+ *    intdu    {IN}     TDU.
+ *    out      {IN/OUT} Extracted message.
+ *    verified {OUT}    TRUE if signature verified.
+ *    validated{OUT}    TRUE if signing identity validated.
+ *    identity {OUT} Identity of signing party.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow outptu buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztVerify( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                      nzttBufferBlock *, boolean *, boolean *,
+                      nzttIdentity ** );
+
+/*------------------------ nztValidate ------------------------*/
+
+/*
+ * NAME
+ *    nztValidate - Validate an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    identity {IN}  Identity.
+ *    validated{OUT} TRUE if identity was validated.  
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztValidate( nzctx *, nzttPersona *, nzttIdentity *, boolean * );
+
+/*-------------------- nztsd_SignDetached --------------------*/
+
+/*
+ * NAME
+ *    nztsd_SignDetached - Generate a detached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of signature.
+ *    inlen    {IN}     Length of this input part.
+ *    in       {IN}     This input part.
+ *    tdubuf   {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztsd_SignDetached( nzctx *, nzttPersona *, nzttces, ub4, ub1 *, 
+                               nzttBufferBlock * );
+
+/*------------------- nztved_VerifyDetached -------------------*/
+
+/*
+ * NAME
+ *    nztved_VerifyDetached - Verify a detached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of verification.
+ *    inlen    {IN}     Length of data.
+ *    in       {IN}     Data.
+ *    intdulen {IN}     Input TDU length.
+ *    tdu      {IN}     Input TDU.
+ *    verified {OUT}    TRUE if signature verified.
+ *    validated{OUT}    TRUE if signing identity validated.
+ *    identity {OUT} Identity of signing party.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztved_VerifyDetached( nzctx *, nzttPersona *, nzttces, ub4, 
+                                  ub1 *, ub4, ub1 *, boolean *, boolean *, 
+                                  nzttIdentity ** );
+
+/*--------------------- nztkec_PKEncrypt ---------------------*/
+
+/*
+ * NAME
+ *    nztkec_PKEncrypt - Encrypt data symmetrically, encrypt key asymmetrically
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    nrecipients {IN}     Number of recipients for this encryption.
+ *    recipients  {IN}     List of recipients.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    There is a limitation of 1 recipient (nrecipients = 1) at this
+ *    time.
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztkec_PKEncrypt( nzctx *, nzttPersona *, ub4, nzttIdentity *, 
+                             nzttces, ub4, ub1 *, nzttBufferBlock * );
+
+/*---------------- nztxkec_PKEncryptExpansion ----------------*/
+
+/*
+ * NAME
+ *    nztxkec_PKEncryptExpansion - Determine the buffer needed for PKEncrypt
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context. 
+ *    persona     {IN}     Persona.
+ *    nrecipients {IN}     Number of recipients.
+ *    inlen       {IN}     Length of input.
+ *    tdulen      {out}    Length of buffer need.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztxkec_PKEncryptExpansion( nzctx *, nzttPersona *, ub4, ub4,
+                                       ub4 * );
+
+/*--------------------- nztkdc_PKDecrypt ---------------------*/
+
+/*
+ * NAME
+ *    nztkdc_PKDecrypt - Decrypt a PKEncrypted message.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztkdc_PKDecrypt( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                             nzttBufferBlock * );
+
+/*-------------------------- nztHash --------------------------*/
+
+/*
+ * NAME
+ *    nztHash - Generate a hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of hash.
+ *    inlen    {IN}     Length of this input.
+ *    in       {IN}     This input.
+ *    tdu      {IN/OUT} Output tdu.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztHash( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                    nzttBufferBlock * );
+
+/*----------------------- nztSeedRandom -----------------------*/
+
+/*
+ * NAME
+ *    nztSeedRandom - Seed the random function
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    seedlen  {IN}  Length of seed.
+ *    seed     {IN}  Seed.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztSeedRandom( nzctx *, nzttPersona *, ub4, ub1 * );
+
+/*--------------------- nztrb_RandomBytes ---------------------*/
+
+/*
+ * NAME
+ *    nztrb_RandomBytes - Generate a buffer random bytes.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    nbytes   {IN}     Number of bytes desired.
+ *    out      {IN/OUT} Buffer block for bytes.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztrb_RandomBytes( nzctx *, nzttPersona *, ub4, 
+                              nzttBufferBlock * );
+
+/*-------------------- nztrn_RandomNumber --------------------*/
+
+/*
+ * NAME
+ *    nztrn_RandomNumber - Generate a random number
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    num      {OUT}    Number.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztrn_RandomNumber( nzctx *, nzttPersona *, uword * );
+
+/*---------------------- nztbbInitBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbInitBlock - Initialize a buffer block.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    block    {IN/OUT} Buffer block.
+ * 
+ * NOTES
+ *    The buffer block is initialized to be empty (all members are set
+ *    to 0/NULL).  Such a block will be allocated memory as needed.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nztbbInitBlock( nzctx *, nzttBufferBlock * );
+
+/*---------------------- nztbbReuseBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbReuseBlock - Reuse an already initialized and possibly used block.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    block    {IN/OUT} Buffer block.
+ * 
+ * NOTES
+ *    This function simply sets the used length member of the buffer
+ *    block to 0.  If the block already has memory allocated to it,
+ *    this will cause it to be reused.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nztbbReuseBlock( nzctx *, nzttBufferBlock * );
+
+/*---------------------- nztbbSizeBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbSizeBlock - Size an initialized block to a particular size.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    len      {IN}     Minimum number of unused bytes desired.
+ *    block    {IN/OUT} Buffer block.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nztbbSizeBlock( nzctx *, ub4, nzttBufferBlock * );
+
+/*----------------------- nztbbGrowBlock -----------------------*/
+
+/*
+ * NAME
+ *    nzbbGrowBlock - Increase the size of the buffer block.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    inc      {IN}     Number of bytes to increase.
+ *    block    {IN/OUT} Buffer block.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nztbbGrowBlock( nzctx *, ub4, nzttBufferBlock * );
+
+/*---------------------- nztbbPurgeBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbPurgeBlock - Purge a buffer block of its memory.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    block    {IN/OUT} Buffer block.
+ * 
+ * NOTES
+ *    The memory used by the buffer block as the buffer is released.
+ *    The buffer block itself is not affected.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nztbbPurgeBlock( nzctx *, nzttBufferBlock * );
+
+/*----------------------- nztbbSetBlock -----------------------*/
+
+/*
+ * NAME
+ *    nztbbSetBlock - Set a buffer block to a known state.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    flags    {IN}     Flags to set.
+ *    buflen   {IN}     Length of buffer.
+ *    usedlen  {IN}     Used length.
+ *    buffer   {IN}     Buffer.
+ *    block    {IN/OUT} Buffer block
+ * 
+ * NOTES
+ *    If buflen > 0, objlen == 0, and obj == NULL, then buflen bytes
+ *    of memory is allocated and a pointer is stored in the buffer
+ *    block.
+ *
+ *    The buffer parameter remains unchanged.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nztbbSetBlock( nzctx *,  uword, ub4, ub4, ub1 *, 
+                          nzttBufferBlock * );
+
+
+/*--------------------- nztiGetSecInfo ---------------------*/
+
+/*
+ * NAME
+ *    nztiGetSecInfo - Get some security information for SSL
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *       persona  {IN}      persona
+ *       dname    {OUT}       distinguished name of the certificate
+ *       dnamelen {OUT}       length of the distinguished name 
+ *       issuername {OUT}     issuer name of the certificate
+ *       certhash {OUT}      SHA1 hash of the certificate
+ *   certhashlen{OUT}   length of the hash
+ * NOTES
+ *    This function allocate memories for issuername, certhash, and dname.
+ *   To deallocate memory for those params, you should call nztdbuf_DestroyBuf.
+ * RETURNS
+ *    
+ */
+nzerror nztiGetSecInfo( nzctx *, nzttPersona *, text **, ub4 *,
+            text **, ub4 *, ub1 **, ub4 * );
+
+
+/*---------------------- nztiGetDName ----------------------*/
+
+/*
+ * NAME
+ *    nztiGetDName - Get the distinguished name for the given identity
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   identity {IN}      identity need to get dname from
+ *   dn   {OUT}      distinguished name
+ *   dnlen   {OUT}      length of the dname
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    
+ */
+
+nzerror nztiGetDName( nzctx *, nzttIdentity *,
+              text **, ub4 * );
+
+/*------------------- nztiGetIssuerName -------------------*/
+
+/*
+ * NAME
+ *    nztiGetIssuerName -  Get IssuerName for the given identity 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   identity {IN}      identity need to get issuername from
+ *   issuername {OUT}          issuer's name
+ *   issuernamelen {OUT}   length of the issuer's name
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    
+ */
+nzerror nztiGetIssuerName( nzctx *, nzttIdentity *,
+               text **, ub4 * );
+
+
+/*-------------------- nztgch_GetCertHash --------------------*/
+
+/*
+ * NAME
+ *    nztgch_GetCertHash -  Get SHA1 hash for the certificate of the identity 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   identity {IN}      identity need to get issuername from
+ *   certHash {OUT}          certHash buffer 
+ *   hashLen {OUT}      length of the certHash 
+ * 
+ * NOTES
+ *    Need to call nztdbuf_DestroyBuf to deallocate memory for certHash.   
+ * RETURNS
+ *    
+ */
+nzerror nztgch_GetCertHash( nzctx *, nzttIdentity *,
+              ub1 **, ub4 * );
+
+/*-------------------- nztdbuf_DestroyBuf --------------------*/
+
+/*
+ * NAME
+ *    nztdbuf_DestroyBuf - Deallocation funtions for ub1 and text buffer 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   buf      {IN}      Allocated buffer to be destroyed.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    
+ */
+nzerror nztdbuf_DestroyBuf( nzctx *, void  ** );
+
+
+/*----------------------- nztGetCertChain -----------------------*/
+
+/*
+ * NAME
+ *    nztGetCertChain - 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    
+ */
+nzerror nztGetCertChain( nzctx *, nzttWallet * );
+
+/*----------------------- nztCompareDN -----------------------*/
+
+/*
+ * NAME
+ *    nztCompareDN - 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   dn1   {IN}      distinguished name 1
+ *   dn2     {IN}      distinguished name 2
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+nzerror nztCompareDN( nzctx *, ub1 *,ub4 ,  ub1 *, ub4, boolean * );
+
+
+#ifdef NZ_OLD_TOOLS
+/*--------------------- nztIdentityAlloc ---------------------*/
+
+/*
+ * NAME
+ *    nztIdentityAlloc - Allocate memory for nzttIdentity context
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   identity {OUT}      nzttIdentity context
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+nzerror nztIdentityAlloc( nzctx *, nzttIdentity ** );
+
+/*--------------------- nztIPrivateAlloc ---------------------*/
+
+/*
+ * NAME
+ *    nztIPrivateAlloc - Allocate memory for nzttIdentityPrivate
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ * 
+ *       osscntxt {IN}        OSS context.
+ *   ipriv   {OUT}      identityPrivate structure
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+
+nzerror nztIPrivateAlloc( nzctx *, nzttIdentityPrivate **);
+
+
+/*---------------------- nztIDupContent ----------------------*/
+
+/*
+ * NAME
+ *    nztIDupContent - 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *    targetIdentity{OUT}   target identity
+ *   sourceIdentity {IN}   source identity
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+
+nzerror nztIDupContent( nzctx *, nzttIdentity *, nzttIdentity * );
+/*---------------------- nztIPDuplicate ----------------------*/
+
+/*
+ * NAME
+ *    nztIPDuplicate - 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   target_ipriv {OUT}   target identityPrivate
+ *   source_ipriv {IN}   source identityPrivate
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+nzerror nztIPDuplicate( nzctx *, nzttIdentityPrivate **,
+          nzttIdentityPrivate * );
+
+/*--------------------- nztiDupIdentList ---------------------*/
+
+/*
+ * NAME
+ *    nztiDupIdentList - 
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   source_identities {IN}   source identity list
+ *   numIdent {OUT}      number of identity in the list
+ *   ppidentity {OUT}   Target of identity   
+ *   
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+nzerror nztiDupIdentList( nzctx *, nzttIdentity  *, ub4 *, 
+                             nzttIdentity ** );
+
+/*--------------------- nztFreeIdentList ---------------------*/
+
+/*
+ * NAME
+ *    nztFreeIdentList - Free memory for a list of Identities
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   identity {IN}      identity context
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+nzerror nztFreeIdentList( nzctx *, nzttIdentity ** );
+#endif /* NZ_OLD_TOOLS */
+
+/*--------------------- nztCheckVaLidity ---------------------*/
+
+/*
+ * NAME
+ *    nztCheckVaLidity -  Check the validity of certificate
+ * 
+ * PARAMETERS
+ *    Name   {IN/OUT}   Description
+ *       osscntxt {IN}        OSS context.
+ *   start_time      Start time of the certificate
+ *   end_time      End time of the certificate
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK       succeeded
+ *   others         failed
+ *    
+ */
+nzerror nztCheckValidity( nzctx *, ub4 , ub4 );
+
+/*--------------------- nztwCreateWallet ---------------------*/
+
+/*
+ * NAME
+ *    nztwCreateWallet - Create a new wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wrllen   {IN}     Length of wallet resource locator.
+ *    wrl      {IN}     WRL.
+ *    pwdlen   {IN}     Length of password (see notes below).
+ *    pwd      {IN}     Password.
+ *    wallet   {IN/OUT} Wallet. 
+ * 
+ * NOTES
+ *    It is an error to try to create a wallet that already exists.
+ *    The previously existing wallet must be destroyed first.
+ *
+ *    The wallet itself is not encrypted.  Rather, all the personas in
+ *    the wallet are encrypted under the same password.  A hash of the
+ *    password is stored in the wallet.
+ *
+ *    Upon success, an empty open wallet is stored in the wallet
+ *    parameter.
+ *    
+ * RETURNS
+ *    NZERROR_OK                 Sucess.
+ *    NZERROR_TK_WALLET_EXISTS   Wallet already exists.
+ *    NZERROR_RIO_OPEN           RIO could not create wallet (see trace file).
+ */
+nzerror nztwCreateWallet( nzctx *, ub4, text *, ub4, text *, 
+                             nzttWallet * );
+
+
+/*--------------------- nztwDestroyWallet ---------------------*/
+
+/*
+ * NAME
+ *    nztwDestroyWallet - Destroy an existing wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wrllen   {IN}     Length of wallet resource locator.
+ *    wrl      {IN}     WRL.
+ *    pwdlen   {IN}     Length of password.
+ *    pwd      {IN}     Password.
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_RIO_OPEN     RIO could not open wallet (see trace file).
+ *    NZERROR_RIO_DELETE   Delete failed (see trace file).
+ */
+nzerror nztwDestroyWallet( nzctx *, ub4, text *, ub4, text * );
+
+/*--------------------- nzteStorePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteStorePersona - Store an open persona in a wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    persona  {IN/OUT} Persona.
+ *    wallet   {IN/OUT} Wallet.
+ * 
+ * NOTES
+ *    If the open persona is not associated with any wallet (it was
+ *    created via the nzteClosePersona function), then storing the
+ *    persona creates that association.  The wallet will also have an
+ *    updated persona list that reflects this association.
+ *
+ *    If the open persona was associated with wallet 'A' (it was
+ *    opened via the nztwOpenWallet function), and is stored back into
+ *    wallet 'A', then then the old persona is overwritten by the new
+ *    persona if the password can be verified.  Recall that all
+ *    personas have a unique identity id.  If that id changes then
+ *    storing the persona will put a new persona in the wallet.
+ *
+ *    If the open persona was associated with wallet 'A' and is stored
+ *    into wallet 'B', and if wallet 'B' does not contain a persona
+ *    with that unique identity id, then the persona will be copied
+ *    into wallet 'B', wallet 'B''s persona list will be updated, and
+ *    the persona structure will be updated to be associated with
+ *    wallet 'B'.  If wallet 'B' already contained the persona, it
+ *    would be overwritten by the new persona.
+ *
+ *    The persona parameter is doubly indirect so that at the
+ *    conclusion of the function call, the pointer can be directed to
+ *    the persona in the wallet.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_RIO_STORE    Store failed (see network trace file).
+ */
+nzerror nzteStorePersona( nzctx *, nzttPersona **, nzttWallet * );
+
+/*--------------------- nzteRemovePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteRemovePersona - Remove a persona from the wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN/OUT} Persona.
+ * 
+ * NOTES
+ *    The password is verified before trying to remove the persona.
+ *    
+ *    If the persona is open, it is closed.  The persona is removed
+ *    from the wallet list and the persona pointer is set to NULL.
+ *    
+ *    A double indirect pointer to the persona is required so that the
+ *    persona pointer can be set to NULL upon completion.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_RIO_DELETE   Delete failed.
+ */
+nzerror nzteRemovePersona( nzctx *, nzttPersona ** );
+
+/*--------------------- nzteCreatePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteCreatePersona - Create a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    itype    {IN}     Identity type.
+ *    ctype    {IN}     Cipher type.
+ *    desc     {IN}     Persona description.
+ *    persona  {OUT}    Persona.
+ * 
+ * NOTES
+ *    The resulting persona is created in the open state, but it will
+ *    not be associated with a wallet.
+ *    
+ *    The memory for the persona is allocated by the function.
+ *
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_TK_TYPE   Unsupported itype/ctype combination.
+ *    NZERROR_TK_PARMS  Error in persona description.
+ */
+nzerror nzteCreatePersona( nzctx *, nzttVersion, nzttCipherType, 
+                              nzttPersonaDesc *, nzttPersona ** );
+
+
+/*----------------- nztiStoreTrustedIdentity -----------------*/
+
+/*
+ * NAME
+ *    nztiStoreTrustedIdentity - Store an identity into a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     Success.
+ *    identity {IN/OUT} Trusted Identity.
+ *    persona  {IN/OUT} Persona.    
+ * 
+ * NOTES
+ *    The identity is not saved with the persona in the wallet until
+ *    the persona is stored.
+ *    
+ *    The identity parameter is double indirect so that it can point
+ *    into the persona at the conclusion of the call.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+nzerror nztiStoreTrustedIdentity( nzctx *, nzttIdentity **,
+                                     nzttPersona * );
+
+/*--------------------- nzteSetProtection ---------------------*/
+
+/*
+ * NAME
+ *    nzteSetProtection - Set the protection type for a CE function.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN/OUT} Persona.
+ *    func     {IN}     CE function.
+ *    tdufmt   {IN}     TDU Format.
+ *    protinfo {IN}     Protection information specific to this format.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK              Success.
+ *    NZERROR_TK_PROTECTION   Unsupported protection.
+ *    NZERROR_TK_PARMS        Error in protection info.
+ */
+nzerror nzteSetProtection( nzctx *, nzttPersona *, nzttcef, nztttdufmt,
+                              nzttProtInfo * );
+
+/*--------------------- nzteGetProtection ---------------------*/
+
+/*
+ * NAME
+ *    nzteGetProtection - Get the protection type for a CE function.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    func     {IN}     CE function.
+ *    tdufmt   {OUT}    TDU format.
+ *    protinfo {OUT}    Protection information.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+nzerror nzteGetProtection( nzctx *, nzttPersona *, nzttcef, nztttdufmt *,
+                              nzttProtInfo * );
+
+/*-------------------- nztiRemoveIdentity --------------------*/
+
+/*
+ * NAME
+ *    nztiRemoveIdentity - Remove an identity from an open persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    identity {IN/OUT}     Identity.
+ * 
+ * NOTES
+ *    If the persona is not stored, this identity will still be in the
+ *    persona stored in the wallet.
+ *    
+ *    The identity parameter is doubly indirect so that at the
+ *    conclusion of the function, the pointer can be set to NULL.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTFOUND  Identity not found.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ */
+nzerror nztiRemoveIdentity( nzctx *, nzttIdentity ** );
+
+/*----------------- nztifdn -----------------*/
+
+/*
+ * NAME
+ *    nztifdn - create an Identity From a Distinguished Name
+ * 
+ * PARAMETERS
+ *    osscntxt           {IN}  OSS context.
+ *    length             {IN}  Length of the distinguished name
+ *    distinguished_name {IN}  distinguished name string
+ *    ppidentity         {OUT} created identity
+ * 
+ * NOTES
+ *    Given a distinguished name, return the identity that corresponds to it.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+nzerror nztifdn( nzctx         *ossctx,
+                    ub4         length,
+                    text          *distinguished_name,
+                    nzttIdentity **ppidentity );
+
+/*--------------------- nztxSignExpansion ---------------------*/
+
+/*
+ * NAME
+ *    nztxSignExpansion - Determine the size of the attached signature buffer.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of input.
+ *    tdulen   {OUT} Buffer needed for signature.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztxSignExpansion( nzctx *, nzttPersona *, ub4, ub4 * );
+
+/*--------------- nztxsd_SignDetachedExpansion ---------------*/
+
+/*
+ * NAME
+ *    nztxsd_SignDetachedExpansion - Determine the size of buffer needed.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of input.
+ *    tdulen   {OUT} Buffer needed for signature.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztxsd_SignDetachedExpansion( nzctx *, nzttPersona *, ub4,
+                                         ub4 * );
+
+/*------------------------ nztEncrypt ------------------------*/
+
+/*
+ * NAME
+ *    nztEncrypt - Symmetrically encrypt
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztEncrypt( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                       nzttBufferBlock * );
+
+/*------------------- nztxEncryptExpansion -------------------*/
+
+/*
+ * NAME
+ *    nztxEncryptExpansion - Determine the size of the TDU to encrypt.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}  OSS context.
+ *    persona     {IN}  Persona.
+ *    inlen       {IN}  Length of this input part.
+ *    tdulen      {OUT} Length of TDU.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztxEncryptExpansion( nzctx *, nzttPersona *, ub4, ub4 * );
+
+/*------------------------ nztDecrypt ------------------------*/
+
+/*
+ * NAME
+ *    nztDecrypt - Decrypt an Encrypted message.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of decryption.
+ *    inlen    {IN}     Length of this input part.
+ *    in       {IN}     This input part.
+ *    out      {IN/OUT} Cleartext message.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztDecrypt( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                       nzttBufferBlock * );
+
+/*------------------------ nztEnvelope ------------------------*/
+
+/*
+ * NAME
+ *    nztEnvelope - Sign and PKEncrypt a message.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    nrecipients {IN}     Number of recipients for this encryption.
+ *    recipients  {IN}     List of recipients.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztEnvelope( nzctx *, nzttPersona *, ub4, nzttIdentity *,
+                        nzttces, ub4, ub1 *, nzttBufferBlock * );
+
+/*----------------------- nztDeEnvelope -----------------------*/
+
+/*
+ * NAME
+ *    nztDeEnvelope - PKDecrypt and verify a message.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    out         {OUT}    Message from TDU.
+ *    verified    {OUT}    TRUE if verified.
+ *    validated   {OUT}    TRUE if validated.
+ *    sender      {OUT}    Identity of sender.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztDeEnvelope( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                          nzttBufferBlock *, boolean *, boolean *,
+                          nzttIdentity ** );
+
+/*----------------------- nztKeyedHash -----------------------*/
+
+/*
+ * NAME
+ *    nztKeyedHash - Generate a keyed hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of hash.
+ *    inlen    {IN}     Length of this input.
+ *    in       {IN}     This input.
+ *    tdu      {IN/OUT} Output tdu.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztKeyedHash( nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                         nzttBufferBlock * );
+
+/*------------------ nztxKeyedHashExpansion ------------------*/
+
+/*
+ * NAME
+ *    nztxKeyedHashExpansion - Determine the space needed for a keyed hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of this input.
+ *    tdulen   {OUT} TDU length.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztxKeyedHashExpansion( nzctx *, nzttPersona *, ub4, 
+                                   ub4 * );
+
+/*--------------------- nztxHashExpansion ---------------------*/
+
+/*
+ * NAME
+ *    nztxHashExpansion - Determine the size of the TDU for a hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of this input.
+ *    tdulen   {OUT} TDU length.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+nzerror nztxHashExpansion( nzctx *, nzttPersona *, ub4, ub4 * );
+
+/*---------------- nztiae_IsAuthEnabled ----------------*/
+
+/*
+ * NAME
+ *    nztiae_IsAuthEnabled -  Checks to see if Authentication is Enabled
+ *                               in the current Cipher Spec.
+ * 
+ * PARAMETERS
+ *    ctx   {IN}   Oracle SSL Context
+ *      ncipher {IN}    CipherSuite
+ *      authEnabled {OUT} Boolean for is Auth Enabled?
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *      NZERROR_OK on success.
+ *      NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+nzerror nztiae_IsAuthEnabled( nzctx *ctx, 
+                                  ub2 ncipher, 
+                                  boolean *authEnabled );
+
+/*---------------- nztiee_IsEncrEnabled ----------------*/
+/*
+ * NAME
+ *    nztiee_IsEncrEnabled -  Checks to see if Encryption is Enabled
+ *                               in the current Cipher Spec.
+ * 
+ * PARAMETERS
+ *    ctx   {IN}   Oracle SSL Context
+ *      ncipher {IN}    CipherSuite
+ *      EncrEnabled {OUT} Boolean for is Auth Enabled?
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *      NZERROR_OK on success.
+ *      NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+nzerror nztiee_IsEncrEnabled( nzctx *ctx, 
+                                  ub2 ncipher, 
+                                  boolean *EncrEnabled );
+
+/*---------------- nztihe_IsHashEnabled ----------------*/
+/*
+ * NAME
+ *    nztihe_IsHashEnabled -  Checks to see if HAshing is Enabled
+ *                               in the current Cipher Spec.
+ * 
+ * PARAMETERS
+ *    ctx   {IN}   Oracle SSL Context
+ *      ncipher {IN}    CipherSuite
+ *      hashEnabled {OUT} Boolean for is Auth Enabled?
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *      NZERROR_OK on success.
+ *      NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+nzerror nztihe_IsHashEnabled( nzctx *ctx, 
+                                  ub2 ncipher, 
+                                  boolean *hashEnabled );
+
+/*
+ *
+ */
+
+nzerror nztGetIssuerName( nzctx *ctx,
+                             nzttIdentity *identity,
+                             ub1  **issuername,
+                             ub4   *issuernamelen );
+
+nzerror nztGetSubjectName( nzctx *ctx,
+                              nzttIdentity *identity,
+                              ub1  **subjectname,
+                              ub4   *subjectnamelen );
+
+nzerror nztGetBase64Cert( nzctx *ctx,
+                              nzttIdentity *identity,
+                              ub1  **b64cert,
+                              ub4   *b64certlen );
+
+nzerror nztGetSerialNumber( nzctx *ctx,
+                              nzttIdentity *identity,
+                              ub1   **serialnum,
+                              ub4    *serialnumlen );
+
+nzerror nztGetValidDate( nzctx *ctx,
+                            nzttIdentity *identity,
+                            ub4  *startdate, 
+                            ub4  *enddate  );
+
+nzerror nztGetVersion( nzctx *ctx,
+                          nzttIdentity *identity,
+                          nzstrc *pVerStr  );
+
+nzerror nztGetPublicKey( nzctx *ctx,
+                            nzttIdentity *identity,
+                            ub1  **pubKey,
+                            ub4   *pubKeylen );
+
+nzerror nztGenericDestroy( nzctx *ctx,
+                              ub1  **var );
+
+nzerror nztSetAppDefaultLocation( nzctx *ctx,
+                                     text *,
+                                     size_t );
+
+nzerror nztSearchNZDefault( nzctx *ctx,
+                            boolean *search );
+
+nzerror nztSetLightWeight(nzctx *ctx,
+                          boolean flag);
+
+#endif /* NZT_ORACLE */
+
diff --git a/sdk/include/occi.h b/sdk/include/occi.h
new file mode 100644
index 0000000..2dca9e6
--- /dev/null
+++ b/sdk/include/occi.h
@@ -0,0 +1,78 @@
+/* Copyright (c) 2000, 2002, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     occi.h - Oracle C++ Interface header files.
+
+   DESCRIPTION 
+     <short description of facility this file declares/defines> 
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+      descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   vvinay      08/19/02 - 
+   aahluwal    06/03/02 - bug 2360115
+   gayyappa    01/03/01 - removed inclusions before occiCommon.h
+   kmohan      04/11/00 - include oci.h and occiCommon.h also
+   rkasamse    04/03/00 - header file for all the OCCI classes
+   rkasamse    04/03/00 - Creation
+
+*/
+
+#ifndef OCCI_ORACLE
+# define OCCI_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef OCCIDATA_ORACLE
+#include <occiData.h>
+#endif
+
+#ifndef OCCICONTROL_ORACLE
+#include <occiControl.h>
+#endif
+
+#ifndef OCCIOBJECTS_ORACLE
+#include <occiObjects.h>
+#endif
+
+#ifndef OCCIAQ_ORACLE
+#include <occiAQ.h>
+#endif
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#endif                                              /* OCCI_ORACLE */
diff --git a/sdk/include/occiAQ.h b/sdk/include/occiAQ.h
new file mode 100644
index 0000000..e07e40c
--- /dev/null
+++ b/sdk/include/occiAQ.h
@@ -0,0 +1,374 @@
+/* Copyright (c) 2002, 2005, Oracle. All rights reserved.  */
+ 
+/* 
+   NAME 
+     occiAQ.h - Header file for occi AQ classes
+
+   DESCRIPTION 
+     Class declarations for Producer, Consumer, Message, Agent
+     Listener, Subscription
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+     descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   cparampa    10/12/02 - creation
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCIAQ_ORACLE
+# define OCCIAQ_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+namespace oracle {
+namespace occi {
+namespace aq{
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+class Message
+{
+  public:
+
+     enum MessageState
+     {
+        MSG_READY = OCI_MSG_READY,
+        MSG_WAITING = OCI_MSG_WAITING,
+        MSG_PROCESSED = OCI_MSG_PROCESSED,
+        MSG_EXPIRED = OCI_MSG_EXPIRED
+     };
+     enum PayloadType
+     {
+        RAW,
+        ANYDATA,
+        OBJECT
+     };
+
+     Message( const Environment *env );
+     Message( const Message& rhs);
+     ~Message();
+     
+     void operator=(const Message& rhs);
+     int getAttemptsToDequeue() const ;
+     void setCorrelationId( const OCCI_STD_NAMESPACE::string& corr_id ) ;
+     OCCI_STD_NAMESPACE::string getCorrelationId() const ;
+     void setDelay( int delay ) ;
+     int getDelay() const ;
+     Date getMessageEnqueuedTime() const ;
+     void setExceptionQueueName( const OCCI_STD_NAMESPACE::string& queue ) ;
+     OCCI_STD_NAMESPACE::string getExceptionQueueName() const ;
+     void setExpiration( int exp ) ;
+     int getExpiration() const ;
+     MessageState getMessageState() const ;
+     void setPriority( int priority ) ;
+     int getPriority() const ;
+     void setRecipientList( OCCI_STD_NAMESPACE::vector<Agent>& ag_list ) ;
+     void setSenderId( const Agent& sender ) ;
+     Agent getSenderId() const ;
+     void setOriginalMessageId( const Bytes& queue ) ;
+     Bytes getOriginalMessageId() const ;
+     void setNull();
+     bool isNull() const;
+
+     void setBytes( const Bytes& bytes); 
+     void setObject( PObject* pobj);
+     void setAnyData( const AnyData& any);
+
+     Bytes getBytes() const ;
+     PObject *getObject() ;
+     AnyData getAnyData() const ;
+
+     PayloadType getPayloadType( ) const;
+
+   private:
+     Ptr<MessageImpl> ptr;
+     OCIAQMsgProperties* getOCIMsgProperties() const;
+     Message( const Environment *env, const Connection *con, 
+          OCIAQMsgProperties *msgprop, void *data, unsigned int dataLen, 
+          bool isNull, PayloadType pType);
+     friend class ConsumerImpl;
+     friend class ProducerImpl;
+     friend class NotifyResult;
+};
+
+class Producer
+{
+   public:
+
+     enum EnqueueSequence
+     {
+       ENQ_BEFORE = OCI_ENQ_BEFORE,
+       ENQ_TOP    = OCI_ENQ_TOP
+     };
+     enum Visibility
+     {
+       ENQ_IMMEDIATE = OCI_ENQ_IMMEDIATE,
+       ENQ_ON_COMMIT = OCI_ENQ_ON_COMMIT
+     };
+     
+     Producer( const Connection *conn ); 
+     Producer( const Connection *conn, 
+               const OCCI_STD_NAMESPACE::string& queue ); 
+     Producer( const Producer& rhs);
+     ~Producer();
+
+     void operator=(const Producer& prod);
+     void setRelativeMessageId( const Bytes& msgid );
+     Bytes getRelativeMessageId() const;
+     void setSequenceDeviation( EnqueueSequence option );
+     EnqueueSequence getSequenceDeviation() const;
+     void setVisibility( Visibility option );
+     Visibility getVisibility() const;
+     void setQueueName( const OCCI_STD_NAMESPACE::string& queue );
+     OCCI_STD_NAMESPACE::string getQueueName() const;
+     void setTransformation( const OCCI_STD_NAMESPACE::string& fName);
+     OCCI_STD_NAMESPACE::string getTransformation() const;
+     Bytes send( Message& msg, const OCCI_STD_NAMESPACE::string& queue );
+     Bytes send( Message& msg );
+     void setNull();
+     bool isNull() const;
+
+  private:
+     Ptr<ProducerImpl> ptr; 
+};
+
+class Consumer
+{
+   public:
+
+     enum DequeueMode
+     {
+       DEQ_BROWSE  = OCI_DEQ_BROWSE,
+       DEQ_LOCKED  = OCI_DEQ_LOCKED,
+       DEQ_REMOVE  = OCI_DEQ_REMOVE,
+       DEQ_REMOVE_NODATA = OCI_DEQ_REMOVE_NODATA
+     };
+     enum Navigation
+     {
+       DEQ_FIRST_MSG        = OCI_DEQ_FIRST_MSG,
+       DEQ_NEXT_TRANSACTION = OCI_DEQ_NEXT_TRANSACTION,
+       DEQ_NEXT_MSG         = OCI_DEQ_NEXT_MSG
+     };
+     enum Visibility
+     {
+       DEQ_IMMEDIATE = OCI_DEQ_IMMEDIATE,
+       DEQ_ON_COMMIT = OCI_DEQ_ON_COMMIT
+     };
+     enum
+     {
+       DEQ_WAIT_FOREVER = OCI_DEQ_WAIT_FOREVER,
+       DEQ_NO_WAIT      = OCI_DEQ_NO_WAIT
+     };
+     
+     Consumer( const Connection *conn ); 
+     Consumer( const Connection * conn, const Agent& agent); 
+     Consumer( const Connection *conn,
+               const OCCI_STD_NAMESPACE::string& queue ); 
+     Consumer(const Consumer& con);
+     ~Consumer();
+    
+     void operator=(const Consumer& con);
+     void setAgent(const Agent& agent);
+     void setConsumerName( const OCCI_STD_NAMESPACE::string& name );
+     OCCI_STD_NAMESPACE::string getConsumerName() const;
+     void setCorrelationId( const OCCI_STD_NAMESPACE::string& cor_id );
+     OCCI_STD_NAMESPACE::string getCorrelationId() const;
+     void setDequeueMode( DequeueMode mode );
+     DequeueMode getDequeueMode() const;
+     void setMessageIdToDequeue( const Bytes& msgid );
+     Bytes getMessageIdToDequeue() const;
+     void setPositionOfMessage( Navigation pos );
+     Navigation getPositionOfMessage() const;
+     void setVisibility( Visibility option );
+     Visibility getVisibility() const;
+     void setWaitTime( unsigned int wait );
+     unsigned int getWaitTime() const;
+     void setQueueName( const OCCI_STD_NAMESPACE::string& queue );
+     OCCI_STD_NAMESPACE::string getQueueName() const;
+     void setTransformation( const OCCI_STD_NAMESPACE::string& fName);
+     OCCI_STD_NAMESPACE::string getTransformation() const;
+     Message receive( Message::PayloadType pType,
+                      const OCCI_STD_NAMESPACE::string& type="",
+                      const OCCI_STD_NAMESPACE::string& schema="");
+     void setNull();
+     bool isNull() const;
+
+   private:
+     Ptr<ConsumerImpl> ptr; 
+};
+
+class Agent
+{
+   public:
+     Agent( const Environment *env ); 
+     Agent( const Environment *env, 
+            const OCCI_STD_NAMESPACE::string& name, 
+            const OCCI_STD_NAMESPACE::string& address, 
+            unsigned int protocol=0 ) ; 
+     Agent(const Agent& a);
+     ~Agent() ;
+ 
+     void operator=(const Agent& a);
+     void setName( const OCCI_STD_NAMESPACE::string& name );
+     OCCI_STD_NAMESPACE::string getName() const;
+     void setAddress( const OCCI_STD_NAMESPACE::string& addr );
+     OCCI_STD_NAMESPACE::string getAddress() const;
+     void setProtocol(unsigned int protocol = 0);
+     unsigned int getProtocol() const; 
+     void setNull(); 
+     bool isNull() const;
+     OCIAQAgent* getOCIAQAgent() const;
+
+   private:
+     Ptr<AgentImpl> ptr;
+     Agent( const Environment *env, OCIAQAgent *rhs, bool toFree = false );
+     friend class Listener;
+     friend class MessageImpl;
+};
+
+class Listener
+{
+   public:
+     Listener( const Connection *conn ); 
+     Listener( const Connection *conn, 
+               OCCI_STD_NAMESPACE::vector<Agent> &agList, 
+               int waitTime=0 );
+     ~Listener();
+     
+     Agent listen();
+     void setAgentList(OCCI_STD_NAMESPACE::vector<Agent> &agList);
+     void setTimeOutForListen(int waitTime);
+     OCCI_STD_NAMESPACE::vector<Agent> getAgentList() const;
+     int getTimeOutForListen() const; 
+
+   private:
+     const ConnectionImpl *conn; 
+     OCIAQAgent** agentList; 
+     unsigned int numAgents;
+     int timeOut;
+     void *listenerExt;
+};
+
+
+class Subscription
+{
+  public:
+    enum Presentation
+    {
+       PRES_DEFAULT = OCI_SUBSCR_PRES_DEFAULT,
+       PRES_XML = OCI_SUBSCR_PRES_XML
+    };
+    enum Protocol
+    {
+       PROTO_CBK = OCI_SUBSCR_PROTO_OCI,
+       PROTO_MAIL = OCI_SUBSCR_PROTO_MAIL,
+       PROTO_SERVER = OCI_SUBSCR_PROTO_SERVER,
+       PROTO_HTTP = OCI_SUBSCR_PROTO_HTTP
+    };
+    enum Namespace
+    {
+       NS_ANONYMOUS = OCI_SUBSCR_NAMESPACE_ANONYMOUS,
+       NS_AQ = OCI_SUBSCR_NAMESPACE_AQ
+    }; 
+    
+    Subscription(const Environment* env);
+    Subscription(const Environment* env, OCISubscription* sub);
+    Subscription(const Subscription& sub);
+    ~Subscription();
+    
+    void operator=(const Subscription& sub);
+    unsigned int getDatabaseServersCount() const;
+    void setDatabaseServerNames(
+        const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string>& dbsrv);
+    OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string>
+                      getDatabaseServerNames() const ;
+    void setNotifyCallback(unsigned int (*callback)(Subscription& sub, 
+                                                    NotifyResult *nr));
+    unsigned int  (*getNotifyCallback() const)(Subscription& sub, 
+                                               NotifyResult *nr); 
+    void setCallbackContext(void* ctx);
+    void* getCallbackContext() const;
+    void setSubscriptionName(const OCCI_STD_NAMESPACE::string& name);
+    OCCI_STD_NAMESPACE::string getSubscriptionName() const ;
+    void setSubscriptionNamespace(Namespace nameSpace);
+    Namespace getSubscriptionNamespace() const ;
+    void setPayload(const Bytes& payload);
+    Bytes getPayload() const ;
+    void setRecipientName( const OCCI_STD_NAMESPACE::string& name);
+    OCCI_STD_NAMESPACE::string getRecipientName() const;
+    void setPresentation( Presentation pres) ;
+    Presentation getPresentation() const ;
+    void setProtocol( Protocol prot) ;
+    Protocol getProtocol() const ;
+    OCISubscription* getOCISubscription() const;
+    void setNull();
+    bool isNull() const;
+    Environment* getEnvironment() const;
+
+  private:
+    Ptr<SubscriptionImpl> ptr;
+};
+
+class NotifyResult
+{
+   public:
+     Bytes getPayload() const;
+     Message getMessage() const;
+     Bytes getMessageId() const;
+     OCCI_STD_NAMESPACE::string getConsumerName() const;
+     OCCI_STD_NAMESPACE::string getQueueName() const;
+
+  private:
+     const EnvironmentImpl *env;
+     void *payload;
+     unsigned int payloadLen;
+     void *desc;
+     ub4 mode;
+     void *notifyResultExt;
+
+     //private constructor
+     NotifyResult(const Environment *env, void *payload, ub4 payloadLen, 
+                  void *pdescriptor, ub4 mode);
+
+     friend class SubscriptionImpl;
+};
+      
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+} /* end of namespace aq */
+} /* end of namespace occi */
+} /* end of namespace oracle */
+
+#endif                                              /* OCCIAQ_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/sdk/include/occiCommon.h b/sdk/include/occiCommon.h
new file mode 100644
index 0000000..5485ff0
--- /dev/null
+++ b/sdk/include/occiCommon.h
@@ -0,0 +1,982 @@
+/* Copyright (c) 2000, 2008, Oracle. All rights reserved.  */
+ 
+/* 
+   NAME 
+     occiCommon.h - header file for doing forward references
+
+   DESCRIPTION 
+     Just declare all the classes
+
+   RELATED DOCUMENTS 
+     OCCI Programmer's Guide 
+ 
+   EXPORT FUNCTION(S) 
+     none
+
+   INTERNAL FUNCTION(S)
+     none
+
+   EXAMPLES
+
+   NOTES
+     none
+
+*/
+
+
+#ifndef OCCICOMMON_ORACLE
+# define OCCICOMMON_ORACLE
+
+#ifndef _olint
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORASTRINGSTL
+#define ORASTRINGSTL
+#include <string>
+#endif
+
+#ifndef ORAVECTORSTL
+#include <vector>
+#define ORAVECTORSTL
+#endif
+
+#ifndef ORALISTSTL
+#include <list>
+#define ORALISTSTL
+#endif
+
+#define OCCI_STD_NAMESPACE std
+#define OCCI_HAVE_STD_NAMESPACE 1
+
+// version definitions
+#define OCCI_MAJOR_VERSION OCI_MAJOR_VERSION
+#define OCCI_MINOR_VERSION OCI_MINOR_VERSION
+
+namespace oracle {
+namespace occi {
+
+//UString is the class for UTF16 characterset
+//check for version = 3.2 or 3.3
+#if (__GNUC__ == 3 && (__GNUC_MINOR__ == 2 || __GNUC_MINOR__ == 3))  
+  //char_traits<T> specialization for utext for gcc 3.2.3
+  struct utext_char_traits
+  {
+  typedef utext          char_type;
+  typedef unsigned int   int_type;
+
+  typedef OCCI_STD_NAMESPACE::streampos      pos_type;
+  typedef OCCI_STD_NAMESPACE::streamoff      off_type;
+  typedef OCCI_STD_NAMESPACE::mbstate_t      state_type;
+
+  //assign one char to another
+  static void assign(char_type& c1, const char_type& c2)
+    { 
+        c1 = c2; 
+    }
+
+  //are 2 chars equal ?
+  static bool eq(const char_type& c1, const char_type& c2) 
+    {
+       return c1 == c2; 
+    }
+
+  //is char c1 less then c2 ?
+  static bool lt(const char_type& c1, const char_type& c2) 
+    { 
+       return c1 < c2; 
+    }
+
+  //compare 2 strings of char
+  static int compare(const char_type* s1, const char_type* s2, size_t n) 
+    {
+      for (size_t i = 0; i < n; ++i)
+        if (!eq(s1[i], s2[i]))
+          return s1[i] < s2[i] ? -1 : 1;
+      return 0;
+    }
+
+  //length of a char string
+  static size_t length(const char_type* s) 
+    {
+      const char_type nullchar = char_type(0);
+      size_t i = 0;
+   
+        while (!eq(*s++, nullchar)) i++; 
+        return i;
+    }
+
+  //find a character in the char string
+  static const char_type* find(const char_type* s, 
+                      size_t n, const char_type& c)
+    {
+       for ( ; n > 0 ; ++s, --n)
+         if (eq(*s, c))
+           return s;
+       return 0;
+    }
+
+  //move n chars from s2 to s1
+  static char_type* move(char_type* s1, const char_type* s2, size_t n) 
+    {
+       memmove(s1, s2, n * sizeof(char_type));
+       return s1;
+    }
+ 
+  //copy n chars from s2 to s1   
+  static char_type* copy(char_type* s1, const char_type* s2, size_t n) 
+    {
+       memcpy(s1, s2, n * sizeof(char_type));
+       return s1;
+    } 
+
+  //fill char c into s
+  static char_type* assign(char_type* s, size_t n, char_type c) 
+    {
+      for (size_t i = 0; i < n; ++i)
+        assign(s[i], c);
+      return s;
+    }
+
+  //is the int representation eof ?
+  static int_type not_eof(const int_type& c) 
+    {
+       if (c == eof())
+         return 0;
+       else
+         return c;
+    }
+
+  //cast a int type to char
+  static char_type to_char_type(const int_type& c)
+    { 
+       return static_cast<char_type>(c);
+    }
+
+  //cast char to int type
+  static int_type to_int_type(const char_type& c)
+    {  
+      return static_cast<int_type>(c);
+    }
+
+  //eq operator when the chars are represented as ints
+  static bool eq_int_type(const int_type& c1, const int_type& c2) 
+    {
+      return c1 == c2;
+    }
+
+  //eof character
+  static int_type eof() 
+    {
+      return static_cast<int_type>(-1);
+    }
+
+   
+  }; //end char_traits<unsigned short>
+
+typedef OCCI_STD_NAMESPACE::basic_string<utext, utext_char_traits> UString;
+#else
+//for non gcc 3.2.3 platforms
+typedef OCCI_STD_NAMESPACE::basic_string<utext> UString;
+#endif /* if gcc 3.2.3 */
+
+class Environment;
+class EnvironmentImpl;
+class Connection;
+class ConnectionImpl;
+class ConnectionPool;
+class ConnectionPoolImpl;
+class StatelessConnectionPool;
+class StatelessConnectionPoolImpl;
+class Statement;
+class StatementImpl;
+class ResultSet;
+class ResultSetImpl;
+class SQLException;
+class SQLExceptionImpl;
+class BatchSQLException;
+class BatchSQLExceptionImpl;
+class Stream;
+class PObject;
+class Number;
+class Bytes;
+class BytesImpl;
+class Date;
+class Timestamp;
+
+class MetaData;
+class MetaDataImpl;
+template <class T> class Ref;
+class RefImpl;
+class RefAny;
+class Blob;
+class Bfile;
+class Clob;
+class LobStreamImpl;
+class AnyData;
+class AnyDataImpl;
+class Map;
+class IntervalDS;
+class IntervalYM;
+
+namespace aq {
+class Message;
+class MessageImpl;
+class Agent;
+class AgentImpl;
+class Producer;
+class ProducerImpl;
+class Consumer;
+class ConsumerImpl;
+class Listener;
+class Subscription;
+class SubscriptionImpl;
+class NotifyResult;
+}
+
+typedef struct BFloat BFloat;
+typedef struct BDouble BDouble;
+
+/*---------------------------------------------------------------------------
+                           ENUMERATORS
+  ---------------------------------------------------------------------------*/
+enum Type
+{
+ OCCI_SQLT_CHR=SQLT_CHR,
+ OCCI_SQLT_NUM=SQLT_NUM,
+ OCCIINT = SQLT_INT,
+ OCCIFLOAT = SQLT_FLT,
+ OCCIBFLOAT = SQLT_BFLOAT,
+ OCCIBDOUBLE = SQLT_BDOUBLE,
+ OCCIIBFLOAT = SQLT_IBFLOAT,
+ OCCIIBDOUBLE = SQLT_IBDOUBLE,
+ OCCI_SQLT_STR=SQLT_STR,
+ OCCI_SQLT_VNU=SQLT_VNU,
+ OCCI_SQLT_PDN=SQLT_PDN,
+ OCCI_SQLT_LNG=SQLT_LNG,
+ OCCI_SQLT_VCS=SQLT_VCS,
+ OCCI_SQLT_NON=SQLT_NON,
+ OCCI_SQLT_RID=SQLT_RID,
+ OCCI_SQLT_DAT=SQLT_DAT,
+ OCCI_SQLT_VBI=SQLT_VBI,
+ OCCI_SQLT_BIN=SQLT_BIN,
+ OCCI_SQLT_LBI=SQLT_LBI,
+ OCCIUNSIGNED_INT = SQLT_UIN,
+ OCCI_SQLT_SLS=SQLT_SLS,
+ OCCI_SQLT_LVC=SQLT_LVC,
+ OCCI_SQLT_LVB=SQLT_LVB,
+ OCCI_SQLT_AFC=SQLT_AFC,
+ OCCI_SQLT_AVC=SQLT_AVC,
+ OCCI_SQLT_CUR=SQLT_CUR,
+ OCCI_SQLT_RDD=SQLT_RDD,
+ OCCI_SQLT_LAB=SQLT_LAB,
+ OCCI_SQLT_OSL=SQLT_OSL,
+ OCCI_SQLT_NTY=SQLT_NTY,
+ OCCI_SQLT_REF=SQLT_REF,
+ OCCI_SQLT_CLOB=SQLT_CLOB,
+ OCCI_SQLT_BLOB=SQLT_BLOB,
+ OCCI_SQLT_BFILEE=SQLT_BFILEE,
+ OCCI_SQLT_CFILEE=SQLT_CFILEE,
+ OCCI_SQLT_RSET=SQLT_RSET,
+ OCCI_SQLT_NCO=SQLT_NCO,
+ OCCI_SQLT_VST=SQLT_VST,
+ OCCI_SQLT_ODT=SQLT_ODT,
+ OCCI_SQLT_DATE=SQLT_DATE,
+ OCCI_SQLT_TIME=SQLT_TIME,
+ OCCI_SQLT_TIME_TZ=SQLT_TIME_TZ,
+ OCCI_SQLT_TIMESTAMP=SQLT_TIMESTAMP,
+ OCCI_SQLT_TIMESTAMP_TZ=SQLT_TIMESTAMP_TZ,
+ OCCI_SQLT_INTERVAL_YM=SQLT_INTERVAL_YM,
+ OCCI_SQLT_INTERVAL_DS=SQLT_INTERVAL_DS,
+ OCCI_SQLT_TIMESTAMP_LTZ=SQLT_TIMESTAMP_LTZ,
+ OCCI_SQLT_FILE=SQLT_FILE,
+ OCCI_SQLT_CFILE=SQLT_CFILE,
+ OCCI_SQLT_BFILE=SQLT_BFILE,
+ 
+ OCCICHAR = 32 *1024,
+ OCCIDOUBLE,
+ OCCIBOOL,
+ OCCIANYDATA ,
+ OCCINUMBER,
+ OCCIBLOB,
+ OCCIBFILE,
+ OCCIBYTES,
+ OCCICLOB ,
+ OCCIVECTOR,
+ OCCIMETADATA,
+ OCCIPOBJECT,
+ OCCIREF ,
+ OCCIREFANY,
+ OCCISTRING  ,
+ OCCISTREAM  ,
+ OCCIDATE  ,
+ OCCIINTERVALDS  ,
+ OCCIINTERVALYM  ,
+ OCCITIMESTAMP,
+ OCCIROWID,
+ OCCICURSOR
+
+
+};
+
+enum LockOptions {OCCI_LOCK_NONE = OCI_LOCK_NONE,
+                      OCCI_LOCK_X = OCI_LOCK_X, 
+                      OCCI_LOCK_X_NOWAIT = OCI_LOCK_X_NOWAIT
+                     };
+
+enum {OCCI_MAX_PREFETCH_DEPTH = UB4MAXVAL};
+
+enum TypeCode
+{
+
+OCCI_TYPECODE_REF = OCI_TYPECODE_REF,
+OCCI_TYPECODE_DATE = OCI_TYPECODE_DATE,
+OCCI_TYPECODE_REAL = OCI_TYPECODE_REAL,
+OCCI_TYPECODE_DOUBLE = OCI_TYPECODE_DOUBLE,
+OCCI_TYPECODE_BDOUBLE = OCI_TYPECODE_BDOUBLE,
+OCCI_TYPECODE_FLOAT = OCI_TYPECODE_FLOAT,
+OCCI_TYPECODE_BFLOAT = OCI_TYPECODE_BFLOAT,
+OCCI_TYPECODE_NUMBER = OCI_TYPECODE_NUMBER,
+OCCI_TYPECODE_DECIMAL = OCI_TYPECODE_DECIMAL,
+OCCI_TYPECODE_OCTET = OCI_TYPECODE_OCTET,
+OCCI_TYPECODE_INTEGER = OCI_TYPECODE_INTEGER,
+OCCI_TYPECODE_SMALLINT= OCI_TYPECODE_SMALLINT,
+OCCI_TYPECODE_RAW = OCI_TYPECODE_RAW,
+OCCI_TYPECODE_VARCHAR2 = OCI_TYPECODE_VARCHAR2,
+OCCI_TYPECODE_VARCHAR = OCI_TYPECODE_VARCHAR,
+OCCI_TYPECODE_CHAR = OCI_TYPECODE_CHAR,
+OCCI_TYPECODE_VARRAY= OCI_TYPECODE_VARRAY,
+OCCI_TYPECODE_TABLE = OCI_TYPECODE_TABLE,
+OCCI_TYPECODE_CLOB = OCI_TYPECODE_CLOB,
+OCCI_TYPECODE_BLOB = OCI_TYPECODE_BLOB,
+OCCI_TYPECODE_BFILE = OCI_TYPECODE_BFILE,
+OCCI_TYPECODE_OBJECT = OCI_TYPECODE_OBJECT,
+OCCI_TYPECODE_NAMEDCOLLECTION = OCI_TYPECODE_NAMEDCOLLECTION
+};
+
+enum CharSetForm
+{
+  OCCI_SQLCS_IMPLICIT = SQLCS_IMPLICIT // use local db char set
+ ,OCCI_SQLCS_NCHAR = SQLCS_NCHAR // use local db nchar set
+ ,OCCI_SQLCS_EXPLICIT = SQLCS_EXPLICIT // char set explicitly specified
+ ,OCCI_SQLCS_FLEXIBLE = SQLCS_FLEXIBLE // pl/sql flexible parameter
+};
+
+enum LobOpenMode
+{ OCCI_LOB_READONLY = OCI_LOB_READONLY
+ ,OCCI_LOB_READWRITE = OCI_LOB_READWRITE
+ ,OCCI_LOB_WRITEONLY = OCI_LOB_WRITEONLY
+ ,OCCI_LOB_APPENDONLY = OCI_LOB_APPENDONLY
+ ,OCCI_LOB_FULLOVERWRITE = OCI_LOB_FULLOVERWRITE
+ ,OCCI_LOB_FULLREAD = OCI_LOB_FULLREAD
+};
+
+enum LobOptionType
+{
+  OCCI_LOB_OPT_NONE        = 0,
+  OCCI_LOB_OPT_COMPRESS    = OCI_LOB_OPT_COMPRESS,
+  OCCI_LOB_OPT_ENCRYPT     = OCI_LOB_OPT_ENCRYPT,
+  OCCI_LOB_OPT_DEDUPLICATE = OCI_LOB_OPT_DEDUPLICATE,
+  OCCI_LOB_OPT_ALLOCSIZE   = OCI_LOB_OPT_ALLOCSIZE,
+  OCCI_LOB_OPT_CONTENTTYPE = OCI_LOB_OPT_CONTENTTYPE,
+  OCCI_LOB_OPT_MODTIME     = OCI_LOB_OPT_MODTIME  
+};
+
+enum LobOptionValue
+{
+  // Compression Options
+  OCCI_LOB_COMPRESS_OFF    = OCI_LOB_COMPRESS_OFF,
+  OCCI_LOB_COMPRESS_ON     = OCI_LOB_COMPRESS_ON,
+  // Encryption Options
+  OCCI_LOB_ENCRYPT_OFF     = OCI_LOB_ENCRYPT_OFF,
+  OCCI_LOB_ENCRYPT_ON      = OCI_LOB_ENCRYPT_ON,
+  // Sharing Options
+  OCCI_LOB_DEDUPLICATE_OFF = OCI_LOB_DEDUPLICATE_OFF,
+  OCCI_LOB_DEDUPLICATE_ON  = OCI_LOB_DEDUPLICATE_ON
+};
+
+class RefCounted {
+public:
+    RefCounted();
+    virtual ~RefCounted(){} 
+    const RefCounted * newRef() const;
+    void deleteRef() const;
+
+private:
+
+    void onZeroReferences();
+    unsigned long references_;
+  };
+
+template <class T> 
+class ConstPtr
+{
+
+public:
+
+ConstPtr( const T* ptr = 0 );
+ConstPtr( const ConstPtr<T>& mp );
+~ConstPtr();
+const T * operator->() const;
+const T* rawPtr() const;
+
+#ifdef MEMBER_TEMPLATE
+template<class OtherType> operator ConstPtr<OtherType>();
+#endif
+
+protected:
+
+void operator=( const ConstPtr<T>& mp );
+const T* rawPtr_;
+
+};
+
+template <class T>
+class Ptr : public ConstPtr<T> {
+
+public:
+
+Ptr( T* ptr = 0 );
+Ptr( const Ptr<T>& mp );
+void operator=( const Ptr<T>& mp );
+const T * operator->() const;
+T * operator->();
+T* rawPtr() ;
+const T* rawPtr() const;
+
+
+
+#ifdef MEMBER_TEMPLATE
+  template<class OtherType>
+  operator Ptr<OtherType>();
+#endif
+
+};
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+  void getVector(const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect);
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<UString> &vect);
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<BFloat> &vect);
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<BDouble> &vect);
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  template <class T>
+  void getVectorOfRefs( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  
+  #if !defined(WIN32COMMON) && !defined(__MVS__)
+  template <class T>
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  #endif
+  #if defined(WIN32COMMON) || defined(__MVS__)
+  template <class T>
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<T> &vect,
+  void *(*rSQL)(void *));
+  #else
+  template <class T>
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<T *> &vect,
+  void *(*rSQL)(void *));
+  #endif
+
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<UString> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<BFloat> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<BDouble> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  template <class T>
+  void setVectorOfRefs( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  #if !defined(WIN32COMMON) && !defined(__MVS__)
+  template <class T>
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  #endif
+  #if defined(WIN32COMMON) || defined(__MVS__)
+  template <class T>
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector< T > &vect) ;
+  #else
+  template <class T>
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+  #endif
+
+  void getVector( ResultSet *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<int> &vect) ;
+  void getVector( ResultSet *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+  void getVector( ResultSet *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<UString> &vect) ;//UTF16 support
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<unsigned int> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<float> &vect); 
+  void getVector(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BFloat> &vect);
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<double> &vect);
+  void getVector(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BDouble> &vect);
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  template <class T>
+  void getVectorOfRefs(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #if !defined(WIN32COMMON) && !defined(__MVS__)
+  template <class T>
+  void getVector(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #endif
+  #if defined(WIN32COMMON) || defined(__MVS__)
+  template <class T>
+  void getVector( ResultSet *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T > &vect) ;
+  #else
+  template <class T>
+  void getVector( ResultSet *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+  #endif
+
+
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  void getVector( Statement *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<int> &vect) ;
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<UString> &vect) ;//UTF16 support
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<unsigned int> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<float> &vect) ;
+  void getVector(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BFloat> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<double> &vect) ;
+  void getVector(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BDouble> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  template <class T>
+  void getVectorOfRefs(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #if !defined(WIN32COMMON) && !defined(__MVS__)
+  template <class T>
+  void getVector(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #endif
+  #if defined(WIN32COMMON) || defined(__MVS__)
+  template <class T>
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T > &vect) ;
+  #else
+  template <class T>
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+  #endif
+
+
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<unsigned int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<double> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<float> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<Number> &vect,
+                 const OCCI_STD_NAMESPACE::string &sqltype);
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+         const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect,
+         const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<RefAny> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Blob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Clob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Bfile> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Date> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  template  <class T>
+  void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  #if !defined(WIN32COMMON) && !defined(__MVS__)
+  template  <class T>
+  void setVector(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  #endif
+  #if defined(WIN32COMMON) || defined(__MVS__)
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex, 
+                  const OCCI_STD_NAMESPACE::vector< T > &vect, 
+                  const OCCI_STD_NAMESPACE::string   &sqltype) ;
+  #else
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex,
+                  const OCCI_STD_NAMESPACE::vector<T* > &vect, 
+                  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  #endif
+
+/* ------------------------------------------------------------------------
+   Statement setVector functions, schema & type separate 
+   arguments - multibyte support
+   ------------------------------------------------------------------------
+*/
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<unsigned int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<double> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<float> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<Number> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName);
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+         const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect,
+         const OCCI_STD_NAMESPACE::string &schemaName,
+         const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<RefAny> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Blob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Clob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Bfile> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Date> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  template  <class T>
+  void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+
+  #if !defined(WIN32COMMON) && !defined(__MVS__)
+  template  <class T>
+  void setVector(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+  #endif
+
+  #if defined(WIN32COMMON) || defined(__MVS__)
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex, 
+                  const OCCI_STD_NAMESPACE::vector< T > &vect, 
+                  const OCCI_STD_NAMESPACE::string &schemaName,
+                  const OCCI_STD_NAMESPACE::string &typeName) ;
+  #else
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<T* > &vect, const OCCI_STD_NAMESPACE::string
+  &schemaName, const OCCI_STD_NAMESPACE::string &typeName) ;
+  #endif
+
+/*-------------------------------------------------------------------------
+  Statement setVector function - UTF16 support
+  -------------------------------------------------------------------------
+*/
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<int> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<unsigned int> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<double> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<float> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<Number> &vect,
+                 const UString &schemaName,
+                 const UString &typeName);
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<UString> &vect,
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<UString> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<RefAny> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Blob> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Clob> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Bfile> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Date> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  template  <class T>
+  void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const UString &schemaName,
+  const UString &typeName) ;
+
+  #if !defined(WIN32COMMON) && !defined(__MVS__)
+  template  <class T>
+  void setVector(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const UString &schemaName,
+  const UString &typeName) ;
+  #endif
+
+  #if defined(WIN32COMMON) || defined(__MVS__)
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex, 
+                  const OCCI_STD_NAMESPACE::vector< T > &vect, 
+                  const UString &schemaName,
+                  const UString &typeName) ;
+  #else
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<T* > &vect, const UString
+  &schemaName, const UString &typeName) ;
+  #endif
+
+
+/* Global method for array pins */
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+OCCI_STD_NAMESPACE::vector<T* > &vectObj, 
+LockOptions lockOpt = OCCI_LOCK_NONE );
+
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+LockOptions lockOpt = OCCI_LOCK_NONE );
+
+#ifdef ORAXB8_DEFINED
+      void readVectorOfBfiles(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Bfile> &vec,
+          oraub8 *byte_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+
+      void readVectorOfBlobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Blob> &vec,
+          oraub8 *byte_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+      void writeVectorOfBlobs(const Connection *conn, 
+          OCCI_STD_NAMESPACE::vector<Blob> &vec,
+          oraub8 *byte_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+
+      void readVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+      void writeVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+      void readVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          utext *buffers[], oraub8 *buffer_lens);
+      void writeVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          utext *buffers[], oraub8 *buffer_lens);
+#endif
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+
+
+#endif /* _olint */
+
+#endif                                              /* OCCICOMMON_ORACLE */
diff --git a/sdk/include/occiControl.h b/sdk/include/occiControl.h
new file mode 100644
index 0000000..392f057
--- /dev/null
+++ b/sdk/include/occiControl.h
@@ -0,0 +1,2137 @@
+/* Copyright  Oracle Corporation 2000, 2006. All Rights Reserved. */ 
+ 
+/* 
+   NAME 
+     occiControl.h - header file for OCCI control classes
+
+   DESCRIPTION 
+     Class definitions for MetaData,SQLException,Environment,
+     Connection,Statement, ConnectionPool, StatelessConnectionPool
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+     descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCICONTROL_ORACLE
+# define OCCICONTROL_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef ORAEXCEPTION
+#define ORAEXCEPTION
+#include <exception>
+#endif
+
+namespace oracle {
+namespace occi {
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+class MetaData
+{
+  public :
+    
+      enum AttrId 
+      {ATTR_PTYPE = OCI_ATTR_PTYPE,
+      ATTR_TIMESTAMP = OCI_ATTR_TIMESTAMP, 
+      ATTR_OBJ_ID = OCI_ATTR_OBJ_ID,
+      ATTR_OBJ_NAME = OCI_ATTR_OBJ_NAME, 
+      ATTR_OBJ_SCHEMA = OCI_ATTR_OBJ_SCHEMA,
+      ATTR_OBJID = OCI_ATTR_OBJID,
+      ATTR_NUM_COLS = OCI_ATTR_NUM_COLS,
+      ATTR_LIST_COLUMNS = OCI_ATTR_LIST_COLUMNS,
+      ATTR_REF_TDO = OCI_ATTR_REF_TDO,
+      ATTR_IS_TEMPORARY = OCI_ATTR_IS_TEMPORARY,
+      ATTR_IS_TYPED = OCI_ATTR_IS_TYPED,
+      ATTR_DURATION = OCI_ATTR_DURATION,
+      ATTR_COLLECTION_ELEMENT = OCI_ATTR_COLLECTION_ELEMENT,
+      ATTR_RDBA = OCI_ATTR_RDBA,
+      ATTR_TABLESPACE = OCI_ATTR_TABLESPACE,
+      ATTR_CLUSTERED = OCI_ATTR_CLUSTERED,
+      ATTR_PARTITIONED = OCI_ATTR_PARTITIONED,
+      ATTR_INDEX_ONLY = OCI_ATTR_INDEX_ONLY,
+      ATTR_LIST_ARGUMENTS = OCI_ATTR_LIST_ARGUMENTS,
+      ATTR_IS_INVOKER_RIGHTS = OCI_ATTR_IS_INVOKER_RIGHTS,
+      ATTR_LIST_SUBPROGRAMS = OCI_ATTR_LIST_SUBPROGRAMS,
+      ATTR_NAME = OCI_ATTR_NAME,
+      ATTR_OVERLOAD_ID = OCI_ATTR_OVERLOAD_ID,
+      ATTR_TYPECODE = OCI_ATTR_TYPECODE,
+      ATTR_COLLECTION_TYPECODE = OCI_ATTR_COLLECTION_TYPECODE,
+      ATTR_VERSION = OCI_ATTR_VERSION,
+      ATTR_IS_INCOMPLETE_TYPE = OCI_ATTR_IS_INCOMPLETE_TYPE,
+      ATTR_IS_SYSTEM_TYPE = OCI_ATTR_IS_SYSTEM_TYPE,
+      ATTR_IS_PREDEFINED_TYPE = OCI_ATTR_IS_PREDEFINED_TYPE,
+      ATTR_IS_TRANSIENT_TYPE = OCI_ATTR_IS_TRANSIENT_TYPE,
+      ATTR_IS_SYSTEM_GENERATED_TYPE = 
+              OCI_ATTR_IS_SYSTEM_GENERATED_TYPE,
+      ATTR_HAS_NESTED_TABLE = OCI_ATTR_HAS_NESTED_TABLE,
+      ATTR_HAS_LOB = OCI_ATTR_HAS_LOB,
+      ATTR_HAS_FILE = OCI_ATTR_HAS_FILE,
+      ATTR_NUM_TYPE_ATTRS = OCI_ATTR_NUM_TYPE_ATTRS,
+      ATTR_LIST_TYPE_ATTRS = OCI_ATTR_LIST_TYPE_ATTRS,
+      ATTR_NUM_TYPE_METHODS = OCI_ATTR_NUM_TYPE_METHODS, 
+      ATTR_LIST_TYPE_METHODS = OCI_ATTR_LIST_TYPE_METHODS,
+      ATTR_MAP_METHOD = OCI_ATTR_MAP_METHOD,
+      ATTR_ORDER_METHOD = OCI_ATTR_ORDER_METHOD,
+      ATTR_DATA_SIZE = OCI_ATTR_DATA_SIZE,
+      ATTR_DATA_TYPE = OCI_ATTR_DATA_TYPE,
+      ATTR_PRECISION = OCI_ATTR_PRECISION,
+      ATTR_SCALE = OCI_ATTR_SCALE,
+      ATTR_TYPE_NAME = OCI_ATTR_TYPE_NAME,
+      ATTR_SCHEMA_NAME = OCI_ATTR_SCHEMA_NAME,
+      ATTR_CHARSET_ID = OCI_ATTR_CHARSET_ID,
+      ATTR_CHARSET_FORM = OCI_ATTR_CHARSET_FORM,
+      ATTR_ENCAPSULATION = OCI_ATTR_ENCAPSULATION,
+      ATTR_IS_CONSTRUCTOR = OCI_ATTR_IS_CONSTRUCTOR,
+      ATTR_IS_DESTRUCTOR = OCI_ATTR_IS_DESTRUCTOR,
+      ATTR_IS_OPERATOR = OCI_ATTR_IS_OPERATOR,
+      ATTR_IS_SELFISH = OCI_ATTR_IS_SELFISH,
+      ATTR_IS_MAP = OCI_ATTR_IS_MAP,
+      ATTR_IS_ORDER = OCI_ATTR_IS_ORDER,
+      ATTR_IS_RNDS = OCI_ATTR_IS_RNDS,
+      ATTR_IS_RNPS = OCI_ATTR_IS_RNPS,
+      ATTR_IS_WNDS = OCI_ATTR_IS_WNDS,
+      ATTR_IS_WNPS = OCI_ATTR_IS_WNPS,
+      ATTR_NUM_ELEMS = OCI_ATTR_NUM_ELEMS,
+      ATTR_LINK = OCI_ATTR_LINK,
+      ATTR_MIN = OCI_ATTR_MIN,
+      ATTR_MAX = OCI_ATTR_MAX,
+      ATTR_INCR = OCI_ATTR_INCR,
+      ATTR_CACHE = OCI_ATTR_CACHE,
+      ATTR_ORDER = OCI_ATTR_ORDER,
+      ATTR_HW_MARK  = OCI_ATTR_HW_MARK,
+      ATTR_IS_NULL = OCI_ATTR_IS_NULL,
+      ATTR_POSITION = OCI_ATTR_POSITION,
+      ATTR_HAS_DEFAULT =  OCI_ATTR_HAS_DEFAULT,
+      ATTR_LEVEL = OCI_ATTR_LEVEL,
+      ATTR_IOMODE = OCI_ATTR_IOMODE,
+      ATTR_RADIX = OCI_ATTR_RADIX,
+      ATTR_SUB_NAME = OCI_ATTR_SUB_NAME,
+      ATTR_LIST_OBJECTS = OCI_ATTR_LIST_OBJECTS,
+      ATTR_NCHARSET_ID = OCI_ATTR_NCHARSET_ID,
+      ATTR_LIST_SCHEMAS = OCI_ATTR_LIST_SCHEMAS,
+      ATTR_MAX_PROC_LEN = OCI_ATTR_MAX_PROC_LEN,
+      ATTR_MAX_COLUMN_LEN = OCI_ATTR_MAX_COLUMN_LEN,
+      ATTR_CURSOR_COMMIT_BEHAVIOR = 
+          OCI_ATTR_CURSOR_COMMIT_BEHAVIOR,
+      ATTR_MAX_CATALOG_NAMELEN = OCI_ATTR_MAX_CATALOG_NAMELEN,
+      ATTR_CATALOG_LOCATION = OCI_ATTR_CATALOG_LOCATION,
+      ATTR_SAVEPOINT_SUPPORT =  OCI_ATTR_SAVEPOINT_SUPPORT,
+      ATTR_NOWAIT_SUPPORT =  OCI_ATTR_NOWAIT_SUPPORT,
+      ATTR_AUTOCOMMIT_DDL =  OCI_ATTR_AUTOCOMMIT_DDL,
+      ATTR_LOCKING_MODE =  OCI_ATTR_LOCKING_MODE,
+      ATTR_IS_FINAL_TYPE = OCI_ATTR_IS_FINAL_TYPE,
+      ATTR_IS_INSTANTIABLE_TYPE = OCI_ATTR_IS_INSTANTIABLE_TYPE,
+      ATTR_IS_SUBTYPE = OCI_ATTR_IS_SUBTYPE,
+      ATTR_SUPERTYPE_SCHEMA_NAME = OCI_ATTR_SUPERTYPE_SCHEMA_NAME,
+      ATTR_SUPERTYPE_NAME = OCI_ATTR_SUPERTYPE_NAME,
+      ATTR_FSPRECISION = OCI_ATTR_FSPRECISION,
+      ATTR_LFPRECISION = OCI_ATTR_LFPRECISION,
+      ATTR_IS_FINAL_METHOD = OCI_ATTR_IS_FINAL_METHOD,
+      ATTR_IS_INSTANTIABLE_METHOD = OCI_ATTR_IS_INSTANTIABLE_METHOD,
+      ATTR_IS_OVERRIDING_METHOD = OCI_ATTR_IS_OVERRIDING_METHOD,
+      ATTR_CHAR_USED = OCI_ATTR_CHAR_USED,
+      ATTR_CHAR_SIZE = OCI_ATTR_CHAR_SIZE,
+      ATTR_COL_ENC = OCI_ATTR_COL_ENC,
+      ATTR_COL_ENC_SALT = OCI_ATTR_COL_ENC_SALT,
+      ATTR_TABLE_ENC = OCI_ATTR_TABLE_ENC,
+      ATTR_TABLE_ENC_ALG = OCI_ATTR_TABLE_ENC_ALG,
+      ATTR_TABLE_ENC_ALG_ID = OCI_ATTR_TABLE_ENC_ALG_ID
+     };
+
+     enum ParamType
+         { 
+           PTYPE_TABLE = OCI_PTYPE_TABLE
+          ,PTYPE_VIEW = OCI_PTYPE_VIEW
+          ,PTYPE_PROC = OCI_PTYPE_PROC
+          ,PTYPE_FUNC = OCI_PTYPE_FUNC
+          ,PTYPE_PKG = OCI_PTYPE_PKG
+          ,PTYPE_TYPE = OCI_PTYPE_TYPE
+          ,PTYPE_TYPE_ATTR = OCI_PTYPE_TYPE_ATTR
+          ,PTYPE_TYPE_COLL = OCI_PTYPE_TYPE_COLL
+          ,PTYPE_TYPE_METHOD = OCI_PTYPE_TYPE_METHOD
+          ,PTYPE_SYN = OCI_PTYPE_SYN
+          ,PTYPE_SEQ = OCI_PTYPE_SEQ
+          ,PTYPE_COL = OCI_PTYPE_COL
+          ,PTYPE_ARG = OCI_PTYPE_ARG
+          ,PTYPE_TYPE_ARG = OCI_PTYPE_TYPE_ARG
+          ,PTYPE_TYPE_RESULT = OCI_PTYPE_TYPE_RESULT
+          ,PTYPE_SCHEMA = OCI_PTYPE_SCHEMA
+          ,PTYPE_DATABASE = OCI_PTYPE_DATABASE
+          ,PTYPE_UNK = OCI_PTYPE_UNK
+         };
+
+
+     enum { DURATION_SESSION = OCI_DURATION_SESSION
+          ,DURATION_TRANS = OCI_DURATION_TRANS
+          ,DURATION_NULL = OCI_DURATION_NULL
+          ,TYPEENCAP_PRIVATE = OCI_TYPEENCAP_PRIVATE
+          ,TYPEENCAP_PUBLIC = OCI_TYPEENCAP_PUBLIC
+          ,TYPEPARAM_IN = OCI_TYPEPARAM_IN
+          ,TYPEPARAM_OUT = OCI_TYPEPARAM_OUT
+          ,TYPEPARAM_INOUT = OCI_TYPEPARAM_INOUT
+          ,CURSOR_OPEN = OCI_CURSOR_OPEN
+          ,CURSOR_CLOSED = OCI_CURSOR_CLOSED
+          ,CL_START = OCI_CL_START
+          ,CL_END = OCI_CL_END
+          ,SP_SUPPORTED = OCI_SP_SUPPORTED
+          ,SP_UNSUPPORTED = OCI_SP_UNSUPPORTED
+          ,NW_SUPPORTED = OCI_NW_SUPPORTED
+          ,NW_UNSUPPORTED = OCI_NW_UNSUPPORTED
+          ,AC_DDL = OCI_AC_DDL
+          ,NO_AC_DDL = OCI_NO_AC_DDL
+          ,LOCK_IMMEDIATE = OCI_LOCK_IMMEDIATE
+          ,LOCK_DELAYED = OCI_LOCK_DELAYED  
+         }; 
+
+      MetaData(const MetaData &omd);
+      unsigned int getAttributeCount() const 
+      ;
+      AttrId getAttributeId(unsigned int attributenum) const 
+      ;
+      Type getAttributeType(unsigned int attributenum) const 
+      ;
+      int getInt(MetaData::AttrId attrid) const 
+      ;
+      bool getBoolean(MetaData::AttrId attrid) const 
+      ;
+      unsigned int getUInt(MetaData::AttrId attrid) const 
+      ;
+      OCCI_STD_NAMESPACE::string getString(MetaData::AttrId attrid) const 
+      ;
+      UString getUString(MetaData::AttrId attrid) const 
+      ;
+      Number getNumber(MetaData::AttrId attrid) const
+      ;
+      RefAny getRef(MetaData::AttrId attrid) const 
+      ;
+      Timestamp getTimestamp(MetaData::AttrId attrid) const 
+      ;
+      MetaData getMetaData(MetaData::AttrId attrid) const
+      ;
+      OCCI_STD_NAMESPACE::vector<MetaData> getVector(MetaData::AttrId attrid)
+      const ;
+      void  operator  =(const MetaData &omd);
+
+      ~MetaData();  
+     
+   private:
+
+  enum ociAttrType { OCI_UB1, 
+                         OCI_UB2, 
+                         OCI_UB4,
+                         OCI_SB1, 
+                         OCI_WORD,
+                         OCI_UB1_BOOL,     
+                         OCI_UB1PTR_TIMESTAMP,
+                         OCI_UB1PTR_NUMBER,
+                         OCI_TEXTPTR,
+                         OCI_DVOIDPTR_PARAM,
+                         OCI_DVOIDPTR_PARAMLIST,
+                         OCI_OCIREFPTR,
+                         OCI_OCIDURATION,
+                         OCI_OCITYPECODE,
+                         OCI_OCITYPEENCAP,
+                         OCI_OCITYPEPARAMMODE,
+                         OCI_OCIPRECISION
+                      };
+
+  enum AttrCount {COMMON_ATTR_COUNT = 5,
+        TABLE_ATTR_COUNT = 15,
+        VIEW_ATTR_COUNT = 7, 
+        FUNCPROC_ATTR_COUNT = 4,
+        PKG_ATTR_COUNT = 2,
+        TYP_ATTR_COUNT = 27, 
+        TYPEATTR_ATTR_COUNT = 14,
+        TYPEMTHD_ATTR_COUNT = 16,
+        COLL_ATTR_COUNT = 12,
+        SYN_ATTR_COUNT = 4,
+        SEQ_ATTR_COUNT = 7,
+        COL_ATTR_COUNT = 15,
+        ARG_TYPARG_TYPRES_ATTR_COUNT = 20, 
+        SCHEMA_ATTR_COUNT = 1,
+        DATABASE_ATTR_COUNT = 13,
+        UNK_ATTR_COUNT = 0
+        };
+
+  static const AttrId commonAttrId[COMMON_ATTR_COUNT];
+  static const ociAttrType commonAttrType[COMMON_ATTR_COUNT];
+  static const AttrId tableAttrId[TABLE_ATTR_COUNT];
+  static const ociAttrType tableAttrType[TABLE_ATTR_COUNT];
+  static const AttrId viewAttrId[VIEW_ATTR_COUNT];
+  static const ociAttrType viewAttrType[VIEW_ATTR_COUNT];
+  static const AttrId funcprocAttrId[FUNCPROC_ATTR_COUNT];
+  static const ociAttrType funcprocAttrType[FUNCPROC_ATTR_COUNT];
+  static const AttrId pkgAttrId[PKG_ATTR_COUNT];
+  static const ociAttrType pkgAttrType[PKG_ATTR_COUNT];
+  static const AttrId typAttrId[TYP_ATTR_COUNT];
+  static const ociAttrType typAttrType[TYP_ATTR_COUNT];
+  static const AttrId typeattrAttrId[TYPEATTR_ATTR_COUNT];
+  static const ociAttrType typeattrAttrType[TYPEATTR_ATTR_COUNT];
+  static const AttrId typmethdAttrId[TYPEMTHD_ATTR_COUNT];
+  static const ociAttrType typemthdAttrType[TYPEMTHD_ATTR_COUNT];
+  static const AttrId collAttrId[COLL_ATTR_COUNT];
+  static const ociAttrType collAttrType[COLL_ATTR_COUNT];
+  static const AttrId synAttrId[SYN_ATTR_COUNT];
+  static const ociAttrType synAttrType[SYN_ATTR_COUNT];
+  static const AttrId seqAttrId[SEQ_ATTR_COUNT];
+  static const ociAttrType seqAttrType[SEQ_ATTR_COUNT];
+  static const AttrId colAttrId[COL_ATTR_COUNT];
+  static const ociAttrType colAttrType[COL_ATTR_COUNT];
+  static const AttrId argtargtresAttrId[ARG_TYPARG_TYPRES_ATTR_COUNT];
+  static const ociAttrType argtargtresAttrType[
+                   ARG_TYPARG_TYPRES_ATTR_COUNT];
+  static const AttrId schemaAttrId[SCHEMA_ATTR_COUNT];
+  static const ociAttrType schemaAttrType[SCHEMA_ATTR_COUNT];
+  static const AttrId databaseAttrId[DATABASE_ATTR_COUNT];
+  static const ociAttrType databaseAttrType[DATABASE_ATTR_COUNT];
+
+  Ptr<MetaDataImpl> metaDataImplPtr;
+  const OCIParam* paramhp;
+  const ConnectionImpl* sesn;
+  const AttrId* attrIdArray;
+  const ociAttrType* attrTypeArray;
+  AttrCount attrCount;
+  
+  MetaData(const Connection *sessp, const OCCI_STD_NAMESPACE::string& objName,
+  ParamType prmtyp ) ;
+  MetaData(const Connection *sessp, const UString& objName,
+  ParamType prmtyp ) ;
+  MetaData(const Connection *sessp, 
+  const RefAny& ref) ;
+  MetaData(const Connection *sessp, MetaDataImpl *implPtr,
+  OCIParam* parm) ;
+  MetaData(const Connection *sessp, MetaDataImpl *implPtr,
+  OCIParam *parm, ub1 parmTyp) ;
+  ub1 getParamType(OCIParam* prm) const ;
+  const AttrId* getAttrIdArrayAddr(ub1 prmTyp) const;
+  const ociAttrType* getAttrTypeArrayAddr(ub1 prmTyp) const;
+  AttrCount getAttrCount(ub1 prmTyp) const; 
+  Type getType(ociAttrType typ) const;
+  bool isListTypeAttribute(AttrId attrid,ub1 ptyp) const;
+  boolean isInvalidAttrId(AttrId attrid,sb4* pos, 
+            boolean* isTypeSpecificAttrPtr) const;
+  ociAttrType getValidAttrType(sb4 index, boolean isTypeSpecificAttr)
+  const;
+
+  int getListType (const OCIParam *plist) const;
+  unsigned int getLowerBound(int ltype) const;
+  unsigned int getUpperBound(unsigned int ltype, 
+    unsigned int paramnum) const;
+  friend class ConnectionImpl;
+  friend class ResultSetImpl;
+
+};
+
+//return codes for user callbacks
+enum
+{
+  OCCI_SUCCESS = OCI_SUCCESS,
+  FO_RETRY = OCI_FO_RETRY
+};
+
+
+class Connection
+{
+   public :
+
+      // specifies the type of proxy to be created,
+      // used for future enhancements
+      enum ProxyType
+      {PROXY_DEFAULT
+      };
+
+      enum FailOverType
+      {
+        FO_NONE = OCI_FO_NONE,
+        FO_SESSION = OCI_FO_SESSION,
+        FO_SELECT = OCI_FO_SELECT
+      }; 
+
+      enum FailOverEventType
+      {
+        FO_BEGIN = OCI_FO_BEGIN,
+        FO_END = OCI_FO_END,
+        FO_ABORT = OCI_FO_ABORT,
+        FO_REAUTH = OCI_FO_REAUTH,
+        FO_ERROR = OCI_FO_ERROR
+      };
+
+      enum Purity
+      {
+        DEFAULT = OCI_ATTR_PURITY_DEFAULT,
+        NEW = OCI_ATTR_PURITY_NEW,
+        SELF = OCI_ATTR_PURITY_SELF
+      };
+
+      virtual ~Connection() { }
+      virtual Statement* createStatement(
+        const OCCI_STD_NAMESPACE::string  &sql = "") 
+         =0; 
+      virtual void terminateStatement(Statement *statement) =0;
+      virtual void commit()  =0; 
+      virtual void rollback()  =0;
+      virtual MetaData getMetaData(const OCCI_STD_NAMESPACE::string &object, 
+        MetaData::ParamType prmtyp 
+        = MetaData::PTYPE_UNK) const 
+         =0; 
+      virtual MetaData getMetaData(const RefAny &ref) const
+         =0; 
+      virtual OCCI_STD_NAMESPACE::string getClientCharSet() const 
+         =0; 
+      virtual OCCI_STD_NAMESPACE::string getClientNCHARCharSet() const 
+         =0; 
+      virtual void changePassword(const OCCI_STD_NAMESPACE::string &user,
+        const OCCI_STD_NAMESPACE::string &oldPassword,
+        const OCCI_STD_NAMESPACE::string &newPassword) 
+         =0; 
+      virtual void flushCache()  =0; 
+
+      virtual OCIServer*  getOCIServer() const =0;
+      virtual OCISvcCtx*  getOCIServiceContext() const =0;
+      virtual OCISession* getOCISession() const =0;
+
+      //new interfaces
+
+      virtual Statement* createStatement(const UString &sql) = 0;
+      virtual MetaData getMetaData(const UString &object, 
+        MetaData::ParamType prmtyp 
+        = MetaData::PTYPE_UNK) const 
+         =0; 
+      virtual UString getClientCharSetUString() const 
+         =0; 
+      virtual UString getClientNCHARCharSetUString() const 
+         =0; 
+      virtual void changePassword(const UString &user,
+        const UString &oldPassword,
+        const UString &newPassword) 
+         =0; 
+      virtual OCCI_STD_NAMESPACE::string getTag() const =0;
+      virtual void setStmtCacheSize(unsigned int cacheSize) = 0;
+      virtual unsigned int getStmtCacheSize() const =0;
+      virtual Statement* createStatement(const OCCI_STD_NAMESPACE::string &sql,
+                    const OCCI_STD_NAMESPACE::string &tag) = 0;
+      virtual void terminateStatement(Statement* stmt, 
+                    const OCCI_STD_NAMESPACE::string &tag) = 0;
+      virtual bool isCached(const OCCI_STD_NAMESPACE::string &sql,
+                    const OCCI_STD_NAMESPACE::string &tag = "") = 0;
+      virtual void registerSubscriptions(
+       const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+      virtual void unregisterSubscription(const aq::Subscription& sub) =0;
+      virtual void postToSubscriptions(
+       const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+      virtual Statement* createStatement(const UString &sql,
+                    const UString &tag) = 0;
+      virtual void terminateStatement(Statement* stmt, 
+                    const UString &tag) = 0;
+      virtual bool isCached(const UString &sql,
+                    const UString &tag) = 0;
+      virtual void setTAFNotify(
+            int (*notifyFn)(Environment *env, Connection *conn, void *ctx,
+                      FailOverType foType, FailOverEventType foEvent),
+         void *ctx) = 0;
+      virtual OCCI_STD_NAMESPACE::string getServerVersion() const =0;
+      virtual UString getServerVersionUString() const =0;
+      virtual void cancel() =0;
+};
+
+class StatelessConnectionPool
+{
+  public :
+
+    enum PoolType
+    {
+      HETEROGENEOUS = OCI_DEFAULT,
+      HOMOGENEOUS = OCI_SPC_HOMOGENEOUS,
+      NO_RLB = OCI_SPC_NO_RLB,
+      USES_EXT_AUTH = 16
+    };
+
+    enum BusyOption
+    {
+       WAIT = OCI_SPOOL_ATTRVAL_WAIT,
+       NOWAIT = OCI_SPOOL_ATTRVAL_NOWAIT,
+       FORCEGET = OCI_SPOOL_ATTRVAL_FORCEGET
+    };
+
+    enum DestroyMode
+    {
+       DEFAULT = OCI_DEFAULT,
+       SPD_FORCE = OCI_SPD_FORCE
+    };
+
+    virtual ~StatelessConnectionPool() {}
+    virtual unsigned int getBusyConnections() const =0;
+    virtual unsigned int getOpenConnections() const =0;
+    virtual unsigned int getMinConnections() const =0;
+    virtual unsigned int getMaxConnections() const =0;
+    virtual unsigned int getIncrConnections() const =0;
+    virtual OCCI_STD_NAMESPACE::string getPoolName() const =0;
+    virtual unsigned int getTimeOut() const =0;
+    virtual void setBusyOption(BusyOption busyOption) =0;
+    virtual BusyOption getBusyOption() const =0;
+    virtual void setTimeOut(unsigned int connTimeOut =0) =0;
+    virtual void setPoolSize(unsigned int maxConn =1,
+      unsigned int minConn =0, unsigned int incrConn =1) =0;
+    virtual Connection* getConnection( 
+      const OCCI_STD_NAMESPACE::string &tag ="") =0;
+    virtual Connection* getConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &password,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual Connection* getAnyTaggedConnection(
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual Connection* getAnyTaggedConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &Password,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual Connection* getProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+    virtual Connection* getProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      const OCCI_STD_NAMESPACE::string &tag = "" ,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+    virtual Connection* getAnyTaggedProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+    virtual Connection* getAnyTaggedProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      const OCCI_STD_NAMESPACE::string &tag="",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT ) =0;
+    virtual void releaseConnection (Connection *connection,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual void terminateConnection (Connection *connection) =0;
+    virtual void setStmtCacheSize(unsigned int cacheSize) =0;
+    virtual unsigned int getStmtCacheSize() const =0;
+
+    virtual Connection* getConnection(const UString &tag)=0;
+    virtual Connection* getConnection(const UString &userName,
+      const UString &password,
+      const UString &tag)=0;
+    virtual Connection* getAnyTaggedConnection(const UString &tag)=0;
+    virtual Connection* getAnyTaggedConnection( const UString &userName,
+      const UString &Password, const UString &tag)=0 ;
+    virtual Connection* getProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const UString &tag,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT)=0;
+    virtual Connection* getProxyConnection(const UString &name,
+      const UString &tag, Connection::ProxyType
+      proxyType = Connection::PROXY_DEFAULT)=0;
+    virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const UString &tag,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT)=0;
+    virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+      const UString &tag,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT )=0;
+    virtual void releaseConnection(Connection *connection,
+      const UString  &tag)=0;
+
+
+    virtual Connection* getConnection( 
+     const OCCI_STD_NAMESPACE::string &connectionClass,
+     const Connection::Purity purity,
+     const OCCI_STD_NAMESPACE::string &tag = "") =0;
+
+    virtual Connection* getConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &password,
+      const OCCI_STD_NAMESPACE::string &connectionClass,
+      const Connection::Purity purity,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+
+    virtual Connection* getAnyTaggedConnection(
+      const OCCI_STD_NAMESPACE::string &connectionClass,
+      const Connection::Purity purity,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+
+    virtual Connection* getAnyTaggedConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &Password,
+      const OCCI_STD_NAMESPACE::string &connectionClass,
+      const Connection::Purity purity,
+      const OCCI_STD_NAMESPACE::string &tag = "")= 0;
+
+    virtual Connection* getProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const OCCI_STD_NAMESPACE::string &connectionClass,
+      const Connection::Purity purity, 
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType  = Connection::PROXY_DEFAULT) = 0;
+
+    virtual Connection* getProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      const OCCI_STD_NAMESPACE::string &connectionClass,
+      const Connection::Purity purity, 
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) = 0;
+
+    virtual Connection* getAnyTaggedProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const OCCI_STD_NAMESPACE::string &connectionClass,
+      const Connection::Purity purity,
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) = 0;
+
+
+    virtual Connection* getAnyTaggedProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      const OCCI_STD_NAMESPACE::string &connectionClass,
+      const Connection::Purity purity,
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) = 0;
+
+
+    virtual Connection* getConnection(
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag) = 0;
+
+
+
+    virtual Connection* getConnection(const UString &userName,
+      const UString &password,
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag) = 0;
+
+    virtual Connection* getAnyTaggedConnection(
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag) =0;
+
+
+
+    virtual Connection* getAnyTaggedConnection( const UString &userName,
+      const UString &Password, 
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag) =0;
+
+    virtual Connection* getProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag, Connection::ProxyType proxyType) =0;
+
+   virtual Connection* getProxyConnection(const UString &name,
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag, Connection::ProxyType proxyType) = 0;
+
+
+    virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag,
+      Connection::ProxyType proxyType) = 0; 
+
+    virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+      const UString &connectionClass,
+      const Connection::Purity purity,
+      const UString &tag,
+      Connection::ProxyType proxyType ) =0;
+
+};
+
+
+class ConnectionPool
+{
+  public :
+
+    virtual ~ConnectionPool() {}
+    virtual unsigned int getBusyConnections() const 
+       =0; 
+    virtual unsigned int getOpenConnections() const 
+       =0; 
+    virtual unsigned int getMinConnections() const 
+       =0; 
+    virtual unsigned int getMaxConnections() const 
+       =0; 
+    virtual unsigned int getIncrConnections() const 
+       =0; 
+    virtual OCCI_STD_NAMESPACE::string getPoolName() const 
+       =0; 
+    virtual unsigned int getTimeOut() const 
+       =0; 
+    virtual void setErrorOnBusy() 
+       =0; 
+    virtual void setTimeOut(unsigned int connTimeOut =0) 
+       =0; 
+    virtual void setPoolSize(unsigned int minConn =0,
+      unsigned int maxConn =1, unsigned int incrConn =1) 
+       =0; 
+    virtual Connection* createConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &password)  =0; 
+
+    virtual Connection* createProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      Connection::ProxyType proxyType = 
+      Connection::PROXY_DEFAULT)  =0; 
+
+    virtual Connection* createProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      Connection::ProxyType proxyType =
+      Connection::PROXY_DEFAULT)  =0;
+
+    virtual void terminateConnection
+      (Connection *connection) =0;
+
+    //new interfaces
+
+    virtual Connection* createConnection(
+      const UString &userName,
+      const UString &password)  =0; 
+    
+    virtual Connection* createProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      Connection::ProxyType proxyType = 
+      Connection::PROXY_DEFAULT)  =0; 
+    
+    virtual Connection* createProxyConnection(const UString &name,
+      Connection::ProxyType proxyType =
+      Connection::PROXY_DEFAULT)  =0;
+    
+    virtual void setStmtCacheSize(unsigned int cacheSize) =0;
+    virtual unsigned int getStmtCacheSize() const =0;
+
+    virtual UString getPoolNameUString() const 
+       =0; 
+};
+
+class   Environment     
+{
+ public:
+                    // class constants
+
+  enum Mode
+  {
+    DEFAULT = OCI_DEFAULT,
+    OBJECT = OCI_OBJECT,
+    SHARED = OCI_SHARED,
+    NO_USERCALLBACKS = OCI_NO_UCB,
+    THREADED_MUTEXED = OCI_THREADED,
+    THREADED_UNMUTEXED = OCI_THREADED | OCI_NO_MUTEX,
+    EVENTS = OCI_EVENTS,
+    USE_LDAP = OCI_USE_LDAP
+  };
+
+  virtual ~Environment(){}
+
+                    // public methods
+
+  static Environment * createEnvironment(
+                              Mode mode = DEFAULT,
+                              void *ctxp = 0,
+                              void *(*malocfp)(void *ctxp, size_t size) = 0,
+                              void *(*ralocfp)(void *ctxp, void *memptr,
+                                               size_t newsize) = 0,
+                              void (*mfreefp)(void *ctxp, void *memptr) = 0);
+  
+  static Environment * createEnvironment(
+                              const OCCI_STD_NAMESPACE::string &charset,
+                              const OCCI_STD_NAMESPACE::string &ncharset,
+                              Mode mode = DEFAULT,
+                              void *ctxp = 0,
+                              void *(*malocfp)(void *ctxp, size_t size) = 0,
+                              void *(*ralocfp)(void *ctxp, void *memptr,
+                                               size_t newsize) = 0,
+                              void (*mfreefp)(void *ctxp, void *memptr) = 0);
+
+  static void terminateEnvironment(Environment *env);
+  
+  static Environment* getXAEnvironment(const 
+                           OCCI_STD_NAMESPACE::string& dbname);
+
+  static void releaseXAEnvironment(Environment *env);
+  
+  static void getClientVersion( int &majorVersion, int &minorVersion, 
+                                int &updateNum, int &patchNum, 
+                                int &portUpdateNum );
+
+
+  virtual Connection * createConnection(
+    const OCCI_STD_NAMESPACE::string &userName,
+    const OCCI_STD_NAMESPACE::string &password, 
+    const OCCI_STD_NAMESPACE::string &connectString = "") = 0;
+
+  virtual void terminateConnection(Connection *connection) = 0;
+
+  virtual ConnectionPool* createConnectionPool(
+    const OCCI_STD_NAMESPACE::string &poolUserName,
+    const OCCI_STD_NAMESPACE::string &poolPassword, 
+    const OCCI_STD_NAMESPACE::string &connectString ="", 
+    unsigned int minConn =0,
+    unsigned int maxConn =1, unsigned int incrConn =1) = 0;
+
+  virtual void terminateConnectionPool(ConnectionPool *poolp) = 0;
+
+  virtual unsigned int getCurrentHeapSize() const = 0;
+
+  virtual OCIEnv * getOCIEnvironment() const = 0;
+
+  virtual Map *getMap() const = 0;
+ 
+  virtual void setCacheMaxSize(unsigned int maxSize) = 0; 
+  
+  virtual unsigned int getCacheMaxSize() const = 0; 
+  
+  virtual void setCacheOptSize(unsigned int OptSize) = 0; 
+  
+  virtual unsigned int getCacheOptSize() const = 0; 
+
+
+  //new interfaces
+
+  virtual Connection * createConnection(const UString &userName,
+    const UString &password, const UString &connectString) = 0;
+  
+  virtual ConnectionPool* createConnectionPool(
+    const UString &poolUserName,
+    const UString &poolPassword, const UString &connectString, 
+    unsigned int minConn =0,
+    unsigned int maxConn =1, unsigned int incrConn =1) = 0;
+
+  virtual Connection* getXAConnection(const 
+                           OCCI_STD_NAMESPACE::string& dbname) = 0;
+
+  virtual void releaseXAConnection(Connection* conn) =0;
+  
+  virtual StatelessConnectionPool* createStatelessConnectionPool(
+    const OCCI_STD_NAMESPACE::string &poolUserName,
+    const OCCI_STD_NAMESPACE::string &poolPassword,
+    const OCCI_STD_NAMESPACE::string &connectString = "",
+    unsigned int maxConn = 1, unsigned int minConn = 0,
+    unsigned int incrConn = 1,
+    StatelessConnectionPool::PoolType pType 
+                                 = StatelessConnectionPool::HETEROGENEOUS) = 0;
+  
+  virtual StatelessConnectionPool* createStatelessConnectionPool(
+    const UString &poolUserName,
+    const UString &poolPassword,
+    const UString &connectString,
+    unsigned int maxConn = 1, unsigned int minConn = 0,
+    unsigned int incrConn = 1,
+    StatelessConnectionPool::PoolType pType 
+                                 = StatelessConnectionPool::HETEROGENEOUS) = 0;
+
+  virtual void terminateStatelessConnectionPool(StatelessConnectionPool *poolp,
+  StatelessConnectionPool::DestroyMode mode = StatelessConnectionPool::DEFAULT)
+      = 0;
+  virtual void setLDAPAuthentication(unsigned int mode) =0;
+
+  virtual unsigned int getLDAPAuthentication() const =0;
+  
+  virtual void setLDAPLoginNameAndPassword(
+     const OCCI_STD_NAMESPACE::string &login,
+     const OCCI_STD_NAMESPACE::string &passwd) =0;
+
+  virtual void setLDAPAdminContext(const OCCI_STD_NAMESPACE::string &ctx)=0;
+
+  virtual OCCI_STD_NAMESPACE::string getLDAPAdminContext() const =0;
+
+  virtual void setLDAPHostAndPort(const OCCI_STD_NAMESPACE::string &host,
+     unsigned int port) =0;
+
+  virtual OCCI_STD_NAMESPACE::string getLDAPHost() const =0;
+
+  virtual unsigned int getLDAPPort() const =0;  
+ 
+  virtual void registerSubscriptions(
+     const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+
+  virtual void unregisterSubscription(const aq::Subscription& sub) =0; 
+ 
+  virtual void enableSubscription(const aq::Subscription& sub) =0;
+  
+  virtual void disableSubscription(const aq::Subscription& sub) =0;
+  
+  virtual bool getCacheSortedFlush() const = 0;
+
+  virtual void setCacheSortedFlush(bool flag) = 0;
+
+  virtual Connection * createConnection(
+                   const OCCI_STD_NAMESPACE::string &userName,
+                   const OCCI_STD_NAMESPACE::string &password,
+                   const OCCI_STD_NAMESPACE::string &connectString,
+                   const OCCI_STD_NAMESPACE::string &connectionClass,
+                   const Connection::Purity purity) = 0;
+
+  virtual Connection * createConnection(const UString &userName, 
+                const  UString &password, const UString &connectString,
+                const UString &connectionclass, 
+                const Connection::Purity purity) =0;
+
+  private:
+
+};
+
+
+
+class Map
+{
+ public:
+
+  virtual ~Map(){}
+  virtual void put(const OCCI_STD_NAMESPACE::string&, void *(*)(void *), 
+                void (*)(void *, void *)) = 0;
+  virtual void getReadSQL(
+    void *, unsigned int, void *, unsigned int, void **) const = 0;
+  virtual void getWriteSQL(
+    void *, unsigned int, void *, unsigned int, void **) const = 0;
+  virtual void put(const OCCI_STD_NAMESPACE::string&, 
+                const OCCI_STD_NAMESPACE::string&, void *(*)(void *), 
+                void (*)(void *, void *)) = 0;
+  virtual void putUTF16(const OCCI_STD_NAMESPACE::string&, 
+                const OCCI_STD_NAMESPACE::string&, void *(*)(void *), 
+                void (*)(void *, void *)) = 0;
+
+ private:
+};
+
+
+   
+class SQLException : public OCCI_STD_NAMESPACE::exception
+{
+ public:
+
+  virtual int getErrorCode() const;
+  
+  virtual OCCI_STD_NAMESPACE::string getMessage() const;
+
+  const char *what() const throw();
+
+  virtual void setErrorCtx(void *ctx);
+  
+  SQLException();
+
+  SQLException(const SQLException &e);
+
+  void operator=(const SQLException &other);
+
+  virtual ~SQLException() throw();
+
+  virtual int getXAErrorCode(const OCCI_STD_NAMESPACE::string& dbname) const;
+  
+  virtual UString getUStringMessage() const;
+
+  virtual OCCI_STD_NAMESPACE::string getNLSMessage(Environment *env) const;
+  
+  virtual UString getNLSUStringMessage(Environment *env) const;
+
+ protected:
+
+  Ptr<SQLExceptionImpl> ptr_;
+  SQLException(SQLExceptionImpl *ptr);
+
+  friend SQLException SQLExceptionCreate(int errorCode);
+  friend SQLException SQLExceptionCreate(void *handle,
+  int handleType);
+  friend class BatchSQLException;
+};
+
+class BatchSQLException : public SQLException
+{
+  public:
+    virtual ~BatchSQLException() throw();
+
+    unsigned int getFailedRowCount() const;
+    unsigned int getRowNum( unsigned int index ) const;
+    SQLException getException ( unsigned int index ) const;
+ 
+  private:
+    BatchSQLException();
+
+    BatchSQLException(SQLExceptionImpl *ptr); 
+    friend BatchSQLException BatchSQLExceptionCreate(void *handle); 
+};
+
+class Statement 
+{
+ public:
+                                // class constants
+
+  virtual ~Statement() {}
+  
+  enum Status                                   
+  {
+    UNPREPARED,
+    PREPARED,
+    RESULT_SET_AVAILABLE,
+    UPDATE_COUNT_AVAILABLE,
+    NEEDS_STREAM_DATA,
+    STREAM_DATA_AVAILABLE
+  };
+  
+                                // common methods
+  
+  virtual void setSQL(const OCCI_STD_NAMESPACE::string &sql) = 0; 
+
+  virtual OCCI_STD_NAMESPACE::string getSQL() const = 0;
+
+  virtual Status execute(const OCCI_STD_NAMESPACE::string &sql = "") = 0;
+  
+  virtual ResultSet * getResultSet() = 0;
+  
+  virtual unsigned int getUpdateCount() const = 0; 
+  
+  virtual ResultSet * executeQuery(
+    const OCCI_STD_NAMESPACE::string &sql = "") = 0;
+  
+  virtual unsigned int executeUpdate(
+    const OCCI_STD_NAMESPACE::string &sql = "") = 0; 
+  
+  virtual Status status() const = 0;  
+                                        
+  virtual void closeResultSet(ResultSet *resultSet) = 0;
+  
+  virtual void setPrefetchRowCount(unsigned int rowCount) = 0; 
+  
+  virtual void setPrefetchMemorySize(unsigned int bytes) = 0;
+  
+  virtual void setAutoCommit(bool autoCommit) = 0;
+  
+  virtual bool getAutoCommit() const = 0;
+  
+  virtual OCIStmt * getOCIStatement() const = 0;
+
+
+                    // methods for prepared statements with IN
+                    // parameters  
+
+  virtual void setMaxParamSize(unsigned int paramIndex,unsigned int maxSize)=0;
+  
+  virtual unsigned int getMaxParamSize(unsigned int paramIndex) const = 0;
+
+  virtual void setNull(unsigned int paramIndex, Type type) = 0;
+ 
+  virtual void setInt(unsigned int paramIndex, int x) = 0; 
+  
+  virtual void setUInt(unsigned int paramIndex, unsigned int x) = 0; 
+  
+  virtual void setFloat(unsigned int paramIndex, float x) = 0; 
+
+  virtual void setDouble(unsigned int paramIndex, double x) = 0; 
+
+  virtual void setNumber(unsigned int paramIndex, const Number &x) = 0; 
+  
+  virtual void setString(unsigned int paramIndex, 
+    const OCCI_STD_NAMESPACE::string &x) = 0; 
+
+  virtual void setBytes(unsigned int paramIndex, const Bytes &x) = 0; 
+
+  virtual void setDate(unsigned int paramIndex, const Date &x) = 0; 
+  
+  virtual void setTimestamp(unsigned int paramIndex, const Timestamp &x) = 0; 
+
+  virtual void setBlob(unsigned int paramIndex, const Blob &x) = 0;
+
+  virtual void setClob(unsigned int paramIndex, const Clob &x) = 0;
+
+  virtual void setBfile(unsigned int paramIndex, const Bfile &x) = 0;
+
+  virtual void setIntervalYM(unsigned int paramIndex, const IntervalYM &x) = 0;
+ 
+  virtual void setIntervalDS(unsigned int paramIndex, const IntervalDS &x) = 0;
+ 
+  virtual void setRowid(unsigned int paramIndex, const Bytes &x) = 0; 
+  
+  virtual void setRef(unsigned int paramIndex, const RefAny &x) = 0; 
+
+  virtual void setObject(unsigned int paramIndex, PObject * x) = 0; 
+  
+  virtual void setDataBuffer(unsigned int paramIndex, void *buffer, 
+                             Type type,
+                             sb4 size, ub2 *length, sb2 *ind = NULL,
+                             ub2 *rc = NULL) = 0; 
+
+  virtual void setDataBufferArray(unsigned int paramIndex, void *buffer, 
+                                  Type type,
+                                  ub4 arraySize, ub4 *arrayLength,
+                                  sb4 elementSize,
+                                  ub2 *elementLength, sb2 *ind = NULL,
+                                  ub2 *rc = NULL) = 0;
+
+  virtual void setCharSet(unsigned int paramIndex, 
+  const OCCI_STD_NAMESPACE::string & charSet) = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getCharSet(unsigned int paramIndex) 
+  const = 0; 
+  
+  virtual void setDatabaseNCHARParam(
+    unsigned int paramIndex, bool isNCHAR) = 0;
+                                         
+  virtual bool getDatabaseNCHARParam(unsigned int paramIndex) const = 0;       
+
+  virtual void closeStream(Stream *stream) =0;
+
+  virtual Stream * getStream(unsigned int paramIndex) = 0; 
+  
+  virtual unsigned int getCurrentStreamParam() const = 0; 
+  
+  virtual unsigned int getCurrentStreamIteration() const = 0;
+
+  virtual void setBinaryStreamMode(unsigned int colIndex, 
+    unsigned int size) =0;
+
+  virtual void setCharacterStreamMode(unsigned int colIndex, 
+    unsigned int size) =0;
+  
+  virtual void setMaxIterations(unsigned int maxIterations) = 0;
+  
+  virtual unsigned int getMaxIterations() const = 0; 
+
+  virtual void addIteration() = 0; 
+  
+  virtual unsigned int getCurrentIteration() const = 0; 
+
+  virtual Status executeArrayUpdate(unsigned int arrayLength) = 0;
+  
+
+                    // methods for Callable Statements
+
+  virtual void registerOutParam(unsigned int paramIndex, Type type, 
+  unsigned int maxSize=0, const OCCI_STD_NAMESPACE::string &sqltype="") = 0;
+  
+  virtual bool isNull(unsigned int paramIndex) const = 0;
+
+  virtual bool isTruncated(unsigned int paramIndex) const
+   =0;
+
+  
+  virtual void setErrorOnNull(unsigned int paramIndex, 
+    bool causeException) = 0;
+                               
+  virtual void setErrorOnTruncate(unsigned int paramIndex,
+  bool causeException)  = 0;
+
+  virtual int preTruncationLength(unsigned int paramIndex) const
+   =0;
+
+
+  virtual int getInt(unsigned int paramIndex)  = 0; 
+  
+  virtual unsigned int getUInt(unsigned int paramIndex)  = 0; 
+  
+  virtual float getFloat(unsigned int paramIndex)  = 0; 
+
+  virtual double getDouble(unsigned int paramIndex)  = 0; 
+  
+  virtual Number getNumber(unsigned int paramIndex)  = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getString(unsigned int paramIndex)  = 0; 
+  
+  virtual Bytes getBytes(unsigned int paramIndex)  = 0; 
+
+  virtual Date getDate(unsigned int paramIndex)  = 0; 
+  
+  virtual Timestamp getTimestamp(unsigned int paramIndex)  = 0; 
+
+  virtual Bytes getRowid(unsigned int paramIndex)  = 0; 
+  
+  virtual PObject * getObject(unsigned int paramIndex)  = 0; 
+  
+  virtual Blob getBlob(unsigned int paramIndex)  = 0; 
+  
+  virtual Clob getClob(unsigned int paramIndex)  = 0; 
+  
+  virtual Bfile getBfile(unsigned int paramIndex)  = 0; 
+
+  virtual IntervalYM getIntervalYM(unsigned int paramIndex)  = 0; 
+ 
+  virtual IntervalDS getIntervalDS(unsigned int paramIndex)  = 0; 
+
+  virtual RefAny getRef(unsigned int paramIndex)  = 0;  
+
+  virtual ResultSet * getCursor(unsigned int paramIndex)   = 0;
+
+  virtual Connection* getConnection() const =0; 
+
+  //new interfaces
+
+  virtual void setRef(unsigned int paramIndex, const RefAny &x, 
+                      const OCCI_STD_NAMESPACE::string &typName, 
+                      const OCCI_STD_NAMESPACE::string &schName = "") = 0; 
+  
+  virtual void setSQLUString(const UString &sql) = 0;
+  
+  virtual UString getSQLUString() const = 0;
+  
+  virtual Status execute(const UString &sql) = 0;
+                                
+  virtual ResultSet * executeQuery(
+    const UString &sql) = 0;
+  
+  virtual unsigned int executeUpdate(
+    const UString &sql) = 0; 
+  
+  virtual void setBFloat(unsigned int paramIndex, const BFloat &fval) = 0;
+  
+  virtual void setBDouble(unsigned int paramIndex, const BDouble &dval) = 0;
+  
+  virtual void setUString(unsigned int paramIndex,
+    const UString &x) = 0;
+  
+  virtual void setCharSetUString(unsigned int paramIndex, 
+  const UString & charSet) = 0; 
+  
+  virtual UString getCharSetUString(unsigned int paramIndex) 
+  const = 0; 
+  
+  virtual void registerOutParam(unsigned int paramIndex, Type type, 
+  unsigned int maxSize, const OCCI_STD_NAMESPACE::string &typName,
+  const OCCI_STD_NAMESPACE::string &schName) = 0;
+  
+  virtual void registerOutParam(unsigned int paramIndex, Type type, 
+  unsigned int maxSize, const UString &typName, 
+  const UString &schName) = 0;
+  
+  virtual BFloat getBFloat(unsigned int paramIndex)  = 0;
+  
+  virtual BDouble getBDouble(unsigned int paramIndex)  = 0;
+
+  virtual UString getUString(unsigned int paramIndex)  = 0; 
+  
+  virtual void disableCaching() =0;
+  
+  virtual void setRef(unsigned int paramIndex, const RefAny &x, 
+                      const UString &typName, 
+                      const UString &schName) = 0; 
+
+  virtual void setBinaryStreamMode(unsigned int colIndex, 
+    unsigned int size, bool INArg) =0;
+
+  virtual void setCharacterStreamMode(unsigned int colIndex, 
+    unsigned int size, bool INArg) =0;
+
+  virtual void setNull(unsigned int paramIndex, Type type,
+               const OCCI_STD_NAMESPACE::string &typeName,
+               const OCCI_STD_NAMESPACE::string &schemaName = "") = 0;
+
+  virtual void setNull(unsigned int paramIndex, Type type,
+               UString &typeName, UString &schemaName) = 0;
+
+  virtual void setBatchErrorMode( bool batchErrorMode ) =0;
+
+  virtual bool getBatchErrorMode( ) const =0;
+
+};
+
+
+
+class ResultSet 
+{
+ public:
+                                // class constants
+  
+  enum Status                                   
+  {
+    END_OF_FETCH = 0,
+    DATA_AVAILABLE,
+    STREAM_DATA_AVAILABLE
+  };
+  virtual ~ResultSet(){}
+ 
+                                // public methods
+
+  virtual Status next(unsigned int numRows = 1) = 0;
+  
+  virtual Status status() const = 0;            
+  
+  virtual unsigned int getNumArrayRows()  const = 0;
+  
+  virtual void cancel() = 0;
+
+  virtual void setMaxColumnSize(unsigned int colIndex, unsigned int max) = 0;
+  
+  virtual unsigned int getMaxColumnSize(unsigned int colIndex) const = 0;
+  
+  virtual bool isNull(unsigned int colIndex) const = 0;
+  
+  virtual bool isTruncated(unsigned int paramIndex) const
+   =0;
+
+  virtual void setErrorOnNull(unsigned int colIndex, bool causeException) = 0;
+  virtual void setErrorOnTruncate(unsigned int paramIndex,
+  bool causeException)   =0;
+
+  virtual int preTruncationLength(unsigned int paramIndex) const
+   =0;
+
+  virtual int getInt(unsigned int colIndex)   = 0; 
+  
+  virtual unsigned int getUInt(unsigned int colIndex)   = 0; 
+  
+  virtual float getFloat(unsigned int colIndex)  = 0; 
+
+  virtual double getDouble(unsigned int colIndex)  = 0; 
+
+  virtual Number getNumber(unsigned int colIndex)  = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getString(unsigned int colIndex)  = 0; 
+  
+  virtual Bytes getBytes(unsigned int colIndex)  = 0; 
+
+  virtual Date getDate(unsigned int colIndex)  = 0; 
+  
+  virtual Timestamp getTimestamp(unsigned int colIndex)  = 0; 
+  
+  virtual Bytes getRowid(unsigned int colIndex)  = 0; 
+  
+  virtual PObject * getObject(unsigned int colIndex)  = 0; 
+  
+  virtual Blob getBlob(unsigned int colIndex)  = 0; 
+  
+  virtual Clob getClob(unsigned int colIndex)  =0; 
+  
+  virtual Bfile getBfile(unsigned int colIndex)  = 0; 
+
+  virtual  IntervalYM getIntervalYM(unsigned int colIndex)  =0;
+   
+  virtual  IntervalDS getIntervalDS(unsigned int colIndex)  =0;
+   
+  virtual RefAny getRef(unsigned int colIndex)  = 0; 
+
+  virtual Bytes getRowPosition() const = 0; 
+
+  virtual ResultSet * getCursor(unsigned int colIndex)  = 0; 
+  
+  virtual void setDataBuffer(unsigned int colIndex, void *buffer, Type type,
+                             sb4 size = 0, ub2 *length = NULL,
+                             sb2 *ind = NULL, ub2 *rc = NULL) = 0;
+
+  virtual void setCharSet(unsigned int colIndex, 
+  const OCCI_STD_NAMESPACE::string & charSet) = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getCharSet(unsigned int colIndex) 
+  const = 0; 
+  
+  virtual void setBinaryStreamMode(unsigned int colIndex, unsigned int size)
+    = 0;
+
+  virtual void setCharacterStreamMode(unsigned int colIndex, unsigned int size)
+    = 0;
+  
+  virtual void setDatabaseNCHARParam(unsigned int paramIndex, 
+    bool isNCHAR) = 0;
+  
+  virtual bool getDatabaseNCHARParam(unsigned int paramIndex) const = 0;       
+                                         
+  virtual Stream * getStream(unsigned int colIndex)  = 0; 
+
+  virtual void closeStream(Stream *stream) =0;
+  
+  virtual unsigned int getCurrentStreamColumn() const= 0; 
+  
+  virtual unsigned int getCurrentStreamRow() const= 0;       
+  
+  virtual OCCI_STD_NAMESPACE::vector<MetaData> getColumnListMetaData() const 
+    = 0;
+
+  virtual Statement* getStatement() const=0;
+
+  //new interfaces
+
+  virtual BFloat getBFloat(unsigned int colIndex)  = 0;
+  
+  virtual BDouble getBDouble(unsigned int colIndex)  = 0;
+  
+  virtual UString getUString(unsigned int colIndex)  = 0; 
+  
+  virtual void setCharSetUString(unsigned int colIndex, 
+  const UString & charSet) = 0; 
+  
+  virtual UString getCharSetUString(unsigned int colIndex) 
+  const = 0; 
+
+  virtual void setPrefetchRowCount(unsigned int rowCount) = 0; 
+  
+  virtual void setPrefetchMemorySize(unsigned int bytes) = 0;
+};
+
+
+class Stream
+{
+  public : 
+
+    enum Status {READY_FOR_READ, READY_FOR_WRITE, INACTIVE};
+
+    virtual ~Stream(){}
+    virtual int readBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual int readLastBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual void writeBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual void writeLastBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual Status status() const  =0;
+
+};
+
+/*---------------------------------------------------------------------------
+                PROTOTYPES USED BY FUNCTION TEMPLATES
+ -------------------------------------------------------------------------*/
+  void getVectorOfPObjects( ResultSet *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<PObject *> &vect) ;
+  void getVectorOfOCIRefs(ResultSet  *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<void *> &vect) ;
+  void getVectorOfPObjects( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<PObject *> &vect) ;
+  void getVectorOfOCIRefs(Statement  *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<void *> &vect) ;
+  void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<PObject *> &vect, 
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<PObject *> &vect, 
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<PObject *> &vect, 
+  const UString &schemaName,
+  const UString &typeName) ;
+  void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+  const  OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+  const  OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+  const  OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+  const UString &schemaName,
+  const UString &typeName) ;
+  void pinVectorOfOCIRefs(const Connection *conn, 
+  OCCI_STD_NAMESPACE::vector<void *> & vecRef,
+  OCCI_STD_NAMESPACE::vector<void *> & vecCor,
+  OCCI_STD_NAMESPACE::vector<PObject *> &vecPObj,LockOptions &lockOpt );
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------------ getVector for objects ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of objects
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of objects(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of RefAny.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with objects.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : NTY
+
+        will call getVector(..., vector<PObject*>)
+*/
+#if defined(WIN32COMMON) || defined(__MVS__)
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void getVector( ResultSet *rs, unsigned int index,OCCI_STD_NAMESPACE::vector<T>
+& vect) 
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(rs, index, vec_pobj);
+
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for ( unsigned int i=0; i< size; i++)
+    vect.push_back((T)vec_pobj[i]);
+}
+
+#else
+template <class T>
+void getVector( ResultSet *rs, unsigned int index, OCCI_STD_NAMESPACE::vector<T
+ *> &vect)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(rs, index, vec_pobj);
+
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+    vect.push_back((T *)vec_pobj[i]);
+}
+#endif
+
+/*------------------------ getVector for objects ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of objects
+
+   PARAMETERS
+      stmt - Statement
+      vect- reference to vector of objects(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of RefAny.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with objects.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : NTY
+
+        will call getVector(..., vector<PObject*>)
+*/
+#if defined(WIN32COMMON) || defined(__MVS__)
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void getVector( Statement *stmt, unsigned int index, 
+OCCI_STD_NAMESPACE::vector<T> &vect) 
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(stmt, index, vec_pobj);
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+    vect.push_back((T)vec_pobj[i]);
+}
+#else
+template <class T>
+void getVector( Statement *stmt, unsigned int index,
+OCCI_STD_NAMESPACE::vector<T *> &vect)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(stmt, index, vec_pobj);
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+    vect.push_back((T *)vec_pobj[i]);
+}
+#endif
+
+/*------------------------ getVector for Ref<T> ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of Ref<T>
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+#if !defined(WIN32COMMON) && !defined(__MVS__)
+template <class T>
+void getVector( ResultSet *rs, unsigned int index, 
+                OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) 
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(rs, index, vec_ref);
+
+  const Connection *sess = rs->getStatement()->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+}
+#endif
+
+/*------------------------ setVector for PObject*---------------------------*/
+/*
+   NAME
+      SetVector - overloaded function. Binds the attribute in the current
+      position with a vector of objects.
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of objects(OUT parameter).
+
+   DESCRIPTION
+     Binds the column in the specified position with a vector of signed int .
+   The column at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with objects .
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : SQLT_NTY
+ 
+     This will be calling setVector(..., vector<PObject*>,..)
+
+*/
+#if defined(WIN32COMMON) || defined(__MVS__)
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<T> &vect, 
+                const OCCI_STD_NAMESPACE::string &sqltype) 
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+  
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T> &vect, const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T> &vect, const UString &schemaName,
+const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+#else
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const OCCI_STD_NAMESPACE::string &sqltype)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const UString &schemaName,
+const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+#endif
+
+/*------------------------ setVector for Ref<T>---------------------------*/
+/*
+   NAME
+      setVector - overloaded function. Binds the attribute in the current
+      position with a vector of Ref<T>.
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of REF
+
+   DESCRIPTION
+     Binds the column in the specified position with a vector of signed int .
+   The column at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with OCIRef* .
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : REF 
+
+     This will just call setVector(..., vector<OCIRef*>,..)
+
+
+*/
+#if !defined(WIN32COMMON) && !defined(__MVS__)
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+                const OCCI_STD_NAMESPACE::string &sqltype)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+                const OCCI_STD_NAMESPACE::string &schemaName,
+                const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+                const UString &schemaName,
+                const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+#endif
+
+/*------------------------ getVector for Ref<T> ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of Ref<T>
+
+   PARAMETERS
+      stmt - Statement
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+#if !defined(WIN32COMMON) && !defined(__MVS__)
+template <class T>
+void getVector( Statement *stmt, unsigned int index, 
+                OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) 
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(stmt, index, vec_ref);
+
+  const Connection *sess = stmt->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref <T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T> (sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+ 
+}
+#endif
+
+// Platform independent get/setVectorOfRefs method added
+// get(set)Vector of Ref<T> and get(set)VectorOfRefs are identical 
+// in functionality. 
+
+/*------------------------ getVectorOfRefs for Ref<T> ----------------------*/
+/*
+   NAME
+      getVectorOfRefs - overloaded function. Retrieves the attribute in the
+      current position as a vector of Ref<T>
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+
+template <class T>
+void getVectorOfRefs( ResultSet *rs, unsigned int index, 
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(rs, index, vec_ref);
+
+  const Connection *sess = rs->getStatement()->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+}
+
+/*------------------------ setVectorOfRefs for Ref<T>-----------------------*/
+/*
+   NAME
+      setVectorOfRefs - overloaded function. Binds the attribute in the current
+      position with a vector of Ref<T>.
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of REF
+
+   DESCRIPTION
+     Binds the column in the specified position with a vector of signed int .
+   The column at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with OCIRef* .
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : REF
+
+     This will just call setVector(..., vector<OCIRef*>,..)
+
+
+*/
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index, 
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+const OCCI_STD_NAMESPACE::string &sqltype)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, sqltype);
+}
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index, 
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index, 
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+const UString &schemaName,
+const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+/*------------------------ getVectorOfRefs for Ref<T> ----------------------*/
+/*
+   NAME
+      getVectorOfRefs - overloaded function. Retrieves the attribute in the
+      current position as a vector of Ref<T>
+
+   PARAMETERS
+      stmt - Statement
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+
+template <class T>
+void getVectorOfRefs( Statement *stmt, unsigned int index, 
+OCCI_STD_NAMESPACE::vector <Ref<T> > &vect)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(stmt, index, vec_ref);
+
+  const Connection *sess = stmt->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref <T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T> (sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+}
+/*----------------------------- pinVectorOfRefs---------------------*/
+/*
+   NAME
+    pinVectorOfRefs - array pin implementation
+
+   PARAMETERS
+     conn- Connection object
+     vecRef - vector of OCIRefs *
+     vecCor - vector of OCIComplexObject *
+     vecPOBj - vector of PObject * ( OUT )
+
+   DESCRIPTION
+    implements the array pin of refs passed and returns the corresponding
+    PObject s
+
+   RETURNS
+
+   NOTES
+*/
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+OCCI_STD_NAMESPACE::vector<T* > &vectObj, LockOptions lockOpt) 
+{
+   
+ OCCI_STD_NAMESPACE::vector<void *> vecRef;
+ OCCI_STD_NAMESPACE::vector<void *> vecCor;
+ OCCI_STD_NAMESPACE::vector<PObject *> vecPObj;
+ unsigned int sz = vect.size();
+ vecRef.reserve( sz );
+ vecCor.reserve( sz );
+
+ for ( unsigned int  i=0; i < sz; i++)
+ {
+   vecRef.push_back((void *)vect[i].getRef());
+   vecCor.push_back((void *)vect[i].getCor());
+ }
+ pinVectorOfOCIRefs(conn, vecRef, vecCor, vecPObj, lockOpt);
+ for ( unsigned int  k=0; k < sz; k++)
+ {
+   vectObj.push_back((T *)vecPObj[k]);
+   vect[k].setPinnedObject(vecPObj[k]);
+ }
+}
+
+/*----------------------------- pinVectorOfRefs---------------------*/
+/*
+   NAME
+    pinVectorOfRefs - array pin implementation
+
+   PARAMETERS
+     conn- Connection object
+     vecRef - vector of OCIRefs *
+     vecCor - vector of OCIComplexObject *
+
+   DESCRIPTION
+    implements the array pin of refs passed 
+
+   RETURNS
+
+   NOTES
+*/
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+LockOptions lockOpt)
+{
+  
+ OCCI_STD_NAMESPACE::vector<void *> vecRef;
+ OCCI_STD_NAMESPACE::vector<void *> vecCor;
+ OCCI_STD_NAMESPACE::vector<PObject *> vecPObj;
+ unsigned int sz = vect.size();
+ vecRef.reserve( sz );
+ vecCor.reserve( sz );
+
+ for ( unsigned int  i=0; i < sz; i++)
+ {
+   vecRef.push_back((void *)vect[i].getRef());
+   vecCor.push_back((void *)vect[i].getCor());
+ }
+ pinVectorOfOCIRefs(conn, vecRef, vecCor,vecPObj, lockOpt);
+ for ( unsigned int  k=0; k < sz; k++)
+   vect[k].setPinnedObject(vecPObj[k]);
+}
+
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif                                              /* OCCICONTROL_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/sdk/include/occiData.h b/sdk/include/occiData.h
new file mode 100644
index 0000000..9c9631d
--- /dev/null
+++ b/sdk/include/occiData.h
@@ -0,0 +1,1170 @@
+/* Copyright (c) 2000, 2009, Oracle and/or its affiliates. 
+All rights reserved. */
+   
+/* 
+   NAME 
+     occiData.h - header file for OCCI data classes
+
+   DESCRIPTION 
+     Class definitions for Stream, Blob, Clob ,Bfile,
+     Number, Date, IntervalYM, IntervalDS, Time,
+     Timestamp
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+   <external functions declared for use outside package - 
+    one-line descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   kkverma     11/23/09 - Replace OCIEnv* type ocienv member to Environment type
+   slynn       03/18/08 - Add get/setContentType.
+   slynn       09/14/06 - Remove string.clear()
+   slynn       07/28/06 - Migrate to new 11g LOB terminology 
+   slynn       06/21/06 - Add LobRegion 
+   slynn       05/25/06 - New NG Lob Functionality. 
+   cparampa    09/06/04 - Date changes
+   shiyer      10/31/03 - Timestamp constructors issue 
+   rvallam     10/07/03 - bug 3089939 - add private method in Date to compute 
+                          hour and min component in daysBetween to be passed 
+                          to set method of IntervalDS.
+   cparampa    08/21/03 - added toCopy to IntervalDS and IntervalYM
+   cparampa    07/14/03 - make SubscriptionImpl friend of Bytes class. 
+   rvallam     02/12/03 - modified BFloat/BDouble interface - BFloat/BDouble
+                          type is now a struct
+   cparampa    01/20/03 - made ProducerImpl friend of Bytes class
+   rvallam     11/19/02 - objects support for interval class
+   shiyer      11/15/02 - Add UTF16 support to IntervalYM & IntervalDS
+   cparampa    12/11/02 - removed references to class Payload
+   cparampa    10/12/02 - AQ additions
+   shiyer      10/12/02 - Added UTF16 version of get/set CharsetId in Clob
+   shiyer      09/06/02 - OCCI globalization support
+   aahluwal    06/04/02 - bug 2360115
+   vvinay      02/21/02 - operator= added for Bytes
+   gayyappa    10/23/01 - fix bug 2073327 , use string instead of 
+                          enum CharSet 
+   vvinay      12/21/01 - signed char constructor and cast operator
+                          (bug 2073334)
+                          binary operator methods not friends any more
+   gayyappa    15/10/01 - add parameter toCopy to Lob/Timestamp private 
+                          constructors 
+   rvallam     04/09/01 - change private constructor in Number to pass
+                          parameter by reference and made it const
+   chliang     03/05/01 - disable olint
+   rvallam     01/27/02 - remove #include <ostream>
+   gayyappa    01/17/01 - add methods/operators to Interval and
+                          timestamp classes..
+   gayyappa    12/15/00 - interface changes in set methods
+   rvallam     11/29/00 - change method signature in Bytes
+                          added 3 new methods in Number  
+   rvallam     10/20/00  - change method signatures in Date
+   rvallam     09/15/00 - make StmtImpl/ResultSetImpl friend to 
+                          interval classes 
+   gayyappa    08/21/00 - modified timestamp, interval headers.
+                          add OCIEnv to constructor of Bytes.,
+                          removed getOCIRaw from Bytes.
+                          add const to setVector mthds of anydata.
+                          add void* data member to Timestamp/Interval.
+   rvallam     08/10/00 - modified CORE class headers to add friends , 
+                          added private constructor in Bytes
+   slari       08/02/00 - comment out Stream
+   rratnam     08/04/00 - updated the LOB stream interface
+   rkasamse    08/07/00 - make getVector friend of Time
+   slari       07/31/00 - add const to Bytes methods
+   slari       07/25/00 - disable Bytes(Bytes *)
+   slari       07/23/00 - add Bytes
+   gayyappa    07/26/00 - update Timestamp, IntervalYM, IntervalDS.
+   gayyappa    07/04/00 - for fixing a problem in occiNumber
+   rratnam     06/13/00 - Updated LOB class headers
+   kmohan      05/31/00 - Change Environment to Environment * in 
+                          Date constructor
+   kmohan      05/29/00 - No string
+   rkasamse    04/25/00 - Added string class header
+   etucker     04/19/00 - Added CORE class headers
+   kmohan      04/11/00 - Creation
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCIDATA_ORACLE
+# define OCCIDATA_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef OCCICONTROL_ORACLE
+#include <occiControl.h>
+#endif
+
+namespace oracle {
+namespace occi {
+class Bytes
+{
+ 
+ public:
+ 
+  Bytes(const Environment *env = NULL);      // default constructor
+ 
+  Bytes(unsigned char *value, unsigned int count, 
+            unsigned int offset = 0, const Environment *env = NULL); 
+
+  Bytes(const Bytes &e); // copy constructor
+
+ 
+                    // public methods
+ 
+  void getBytes(unsigned char *dst, unsigned int count, 
+                        unsigned int srcBegin = 0,
+                        unsigned int dstBegin = 0) const; 
+ 
+  unsigned int length() const;
+ 
+  unsigned char byteAt(unsigned int index) const;
+
+  bool isNull() const;
+ 
+  void setNull();
+
+  void operator=(const Bytes &other);
+ 
+  ~Bytes();
+
+private:
+                                // private data members
+  Bytes(OCIEnv *,OCIRaw *) ;
+  Bytes(Ptr<BytesImpl> bytesPtr) ;
+  Ptr<BytesImpl> ptr_;
+  friend class AnyDataImpl;
+  friend class aq::MessageImpl;
+  friend class aq::ProducerImpl;
+  friend class aq::SubscriptionImpl;
+  friend  void getVector(const AnyData &any, 
+                         OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+  friend  void setVector(AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+
+};
+ 
+class Bfile
+{
+  public :
+
+    Bfile();
+    Bfile(const Connection *connectionp) ;
+    Bfile(const Bfile &srcBfile) ;
+    ~Bfile();
+    unsigned int length() const ;
+    OCCI_STD_NAMESPACE::string getDirAlias() const ;
+    UString getUStringDirAlias() const ;
+    OCCI_STD_NAMESPACE::string getFileName() const ;
+    UString getUStringFileName() const ;
+    void setName(const OCCI_STD_NAMESPACE::string &dirAlias, 
+                 const OCCI_STD_NAMESPACE::string &fileName) ;
+    void setName(const UString &dirAlias, const UString &fileName) ;
+    bool fileExists() const ; 
+    Bfile& operator =(const Bfile &srcBfile) ;
+    bool operator ==(const Bfile &srcBfile) const ;
+    bool operator !=(const Bfile &srcBfile) const ;
+    void setNull() ;
+    bool isNull() const ;
+    bool isInitialized() const;
+    void open() ;
+    void close() ;
+    bool isOpen() const ;
+    unsigned int read(unsigned int  amt, unsigned char *buffer,
+      unsigned int  bufsize, unsigned int offset = 1) const ;
+    Stream* getStream(unsigned int offset = 1,
+      unsigned int amount =0)  ;
+    void closeStream(Stream *stream);
+
+  private:
+
+    //Data Members:
+
+    // pointer to the FILE locator
+    OCIBFileLocator *filep; 
+
+    // pointer to the ConnectionImpl instance
+    const ConnectionImpl *connp; 
+
+    // pointer to the LobStreamImpl instance obtained from this FILE
+    LobStreamImpl *streamp;
+
+    void *bfileExt;
+
+    //Enumerations:
+    enum {MAXDIRNAMELEN = 32, MAXFILENAMELEN = 256};
+
+    //Constructor: 
+    Bfile(const Connection *connectionp, 
+    OCIBFileLocator *locatorp, bool toCopy = true) ;
+  
+    //Methods:
+    OCIBFileLocator* getLocator() const;
+    void do_getDirAlias( void * dirAlias, ub2 * dirAliasLen) const ;
+    void do_getFileName( void * fileName, ub2 * fileNameLen) const ;
+    void do_setName( void * alias, ub2 aliasLen,
+                     void *fileName, ub2 fileNameLen);   
+  // Friends
+  friend class AnyDataImpl;
+  friend class StatementImpl;
+  friend class ResultSetImpl;
+  friend class Blob;
+  friend class Clob;
+  friend class aq::MessageImpl;
+
+  friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void getVector(Statement*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void getVector(ResultSet*, unsigned int , 
+  OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void do_setVectorOfBfile(Statement*, unsigned int, 
+   const OCCI_STD_NAMESPACE::vector<Bfile>&, void *, unsigned int, 
+   void *, unsigned int ) ;
+
+#ifdef ORAXB8_DEFINED
+  friend  void readVectorOfBfiles(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Bfile> &vec,
+          oraub8 *byte_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+#endif
+};
+
+
+#ifdef ORAXB8_DEFINED
+// See the end of this file for implementation of LobRegion
+template < typename lobType > class LobRegion
+{
+  private:
+    lobType     *_primary;
+    oraub8       _primaryOffset;
+    oraub8       _offset;
+    oraub8       _length;
+    OCCI_STD_NAMESPACE::string  _mimeType;
+
+    void         setPrimary(const ConnectionImpl *connp,
+                            OCILobLocator *locator);
+
+  public:
+    LobRegion();
+    ~LobRegion();
+    lobType     *getPrimary();
+    oraub8       getPrimaryOffset();
+    oraub8       getOffset();
+    oraub8       getLength();
+    OCCI_STD_NAMESPACE::string  getMimeType();
+
+  friend class Blob;
+  friend class Clob;
+};
+
+typedef LobRegion<Blob> BlobRegion;
+typedef LobRegion<Clob> ClobRegion;
+#endif
+
+
+class Blob
+{
+  public:
+
+    Blob();
+    Blob(const Connection *connectionp) ;
+    Blob(const Blob &srcBlob) ;
+    ~Blob();
+    unsigned int getChunkSize() const ;
+    unsigned int length() const ;
+    Blob& operator =(const Blob &srcBlob) ;
+    bool operator ==(const Blob &srcBlob) const ;
+    bool operator !=(const Blob &srcBlob) const ;
+    void setNull() ;
+    bool isNull() const ;
+    void setEmpty() ;
+    void setEmpty(const Connection *connectionp) ;
+    bool isInitialized() const;
+    void open(LobOpenMode mode=OCCI_LOB_READWRITE) ;
+    void close() ;
+    bool isOpen() const ;
+    void copy(const Blob &srcBlob, unsigned int numBytes,
+      unsigned int  dstOffset =1, unsigned int srcOffset =1) ;
+    void copy(const Bfile &srcBfile, unsigned int numBytes,
+      unsigned int  dstOffset =1, unsigned int srcOffset =1) ;
+    void append(const Blob &srcBlob) ;
+    unsigned int read(unsigned int  amt, unsigned char *buffer,
+      unsigned int  bufsize, unsigned int offset = 1) const ;
+    unsigned int write(unsigned int amt, unsigned char *buffer,
+      unsigned int bufsize, unsigned int offset = 1) ;
+    unsigned int writeChunk(unsigned int amt, unsigned char *buffer,
+      unsigned int bufsize, unsigned int offset = 1) ;
+    void trim(unsigned int newlen) ;
+    Stream* getStream(unsigned int offset = 1,
+      unsigned int amount =0)  ;
+    void closeStream(Stream *stream);
+    LobOptionValue getOptions(LobOptionType optType);
+    void setOptions(LobOptionType optType, LobOptionValue value);
+    OCCI_STD_NAMESPACE::string getContentType(void);
+    void setContentType(const OCCI_STD_NAMESPACE::string contentType);
+
+    void getDeduplicateRegions(OCCI_STD_NAMESPACE::vector<BlobRegion> &regions);
+  private:
+
+    //Data Members:
+
+    // pointer to the BLOB locator
+    OCIBlobLocator *lobp; 
+
+    // pointer to the ConnectionImpl instance
+    const ConnectionImpl *connp; 
+
+    // pointer to the LobStreamImpl instance obtained from this LOB
+    LobStreamImpl *streamp; 
+
+    //for future use !
+    void *blobExt;
+
+    //Constructor: 
+    Blob(const Connection *connectionp, 
+    OCIBlobLocator *locatorp, bool toCopy=true) ;
+
+    //Methods:
+    OCIBlobLocator* getLocator() const;
+
+  // Friends
+  friend class AnyDataImpl;
+  friend class StatementImpl;
+  friend class ResultSetImpl;
+
+#ifdef ORAXB8_DEFINED
+  friend void 
+    LobRegion<Blob>::setPrimary(const ConnectionImpl *connp,
+                         OCILobLocator *locator);
+#endif
+  friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void getVector(Statement*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void getVector(ResultSet*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void do_setVectorOfBlob(Statement*, unsigned int, 
+  const OCCI_STD_NAMESPACE::vector<Blob>&, void *, 
+  unsigned int, void *, unsigned int ) ;
+#ifdef ORAXB8_DEFINED
+  friend  void readVectorOfBlobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Blob> &vec,
+          oraub8 *byte_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+  friend  void writeVectorOfBlobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Blob> &vec,
+          oraub8 *byte_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+#endif
+};
+
+class Clob
+{
+  public:
+
+    Clob();
+    Clob(const Connection *connectionp) ;
+    Clob(const Clob &srcClob) ;
+    ~Clob();
+    unsigned int getChunkSize() const ;
+    unsigned int length() const ;
+    OCCI_STD_NAMESPACE::string getCharSetId() const;
+    CharSetForm getCharSetForm() const;
+    void setCharSetId( const OCCI_STD_NAMESPACE::string &charset) ;
+    void setCharSetForm( CharSetForm csfrm) ;
+    Clob& operator =(const Clob &srcClob) ;
+    bool operator ==(const Clob &srcClob) const ;
+    bool operator !=(const Clob &srcClob) const ;
+    void setNull() ;
+    bool isNull() const ;
+    void setEmpty() ;
+    void setEmpty(const Connection *connectionp) ;
+    bool isInitialized() const;
+    void open(LobOpenMode mode=OCCI_LOB_READWRITE) ;
+    void close() ;
+    bool isOpen() const ;
+    void copy(const Clob &srcClob, unsigned int numBytes,
+              unsigned int  dstOffset = 1, unsigned int srcOffset = 1) ;
+    void copy(const Bfile &srcBfile, unsigned int numBytes,
+              unsigned int  dstOffset = 1, unsigned int srcOffset = 1) ;
+    void append(const Clob &srcClob) ;
+    unsigned int read(unsigned int  amt, unsigned char *buffer,
+                      unsigned int  bufsize,  unsigned int offset = 1) const;
+    unsigned int read(unsigned int  amt, utext *buffer,
+                      unsigned int  bufsize,  unsigned int offset = 1) const;
+    unsigned int write(unsigned int amt, unsigned char *buffer,
+                       unsigned int bufsize,  unsigned int offset = 1 );
+    unsigned int write(unsigned int amt, utext *buffer,
+                       unsigned int bufsize,  unsigned int offset = 1 );
+    unsigned int writeChunk(unsigned int amt, unsigned char *buffer,
+                            unsigned int bufsize, unsigned int offset = 1 );
+    unsigned int writeChunk(unsigned int amt, utext *buffer,
+                            unsigned int bufsize, unsigned int offset = 1 );
+    void trim(unsigned int newlen) ;
+    Stream* getStream(unsigned int offset = 1,
+      unsigned int amount =0 );
+    void closeStream(Stream *stream);
+    LobOptionValue getOptions(LobOptionType optType);
+    void setOptions(LobOptionType optType, LobOptionValue value);
+    OCCI_STD_NAMESPACE::string getContentType(void);
+    void setContentType(const OCCI_STD_NAMESPACE::string contentType);
+    
+    UString getCharSetIdUString() const;
+    void setCharSetIdUString( const UString &charset) ;
+
+    void getDeduplicateRegions(OCCI_STD_NAMESPACE::vector<ClobRegion> &regions);
+
+  private:
+
+    //Data Members:
+
+    // pointer to the CLOB locator
+    OCIClobLocator *lobp; 
+
+    // pointer to the ConnectionImpl instance
+    const ConnectionImpl *connp; 
+
+    // pointer to the LobStreamImpl instance obtained from this LOB
+    LobStreamImpl *streamp; 
+
+    //charset id
+    ub2 charsetId;
+
+    //charset form
+    CharSetForm charsetForm;
+
+    //for future use !
+    void *clobExt;
+
+    //Constructor: 
+    Clob(const Connection *connectionp, 
+    OCIClobLocator *locatorp, bool toCopy =true ) ;
+
+    //Methods:
+    OCIClobLocator* getLocator() const;
+    unsigned int do_read( unsigned int amt, void *buffer, 
+    unsigned int bufsize, unsigned int offset) const;
+    unsigned int do_write( unsigned int amt, void *buffer, 
+    unsigned int bufsize, unsigned int offset) ;
+    unsigned int do_writeChunk( unsigned int amt, void *buffer, 
+    unsigned int bufsize, unsigned int offset) ;
+   
+  // Friends
+  friend class AnyDataImpl;
+  friend class StatementImpl;
+  friend class ResultSetImpl;
+
+#ifdef ORAXB8_DEFINED
+  friend void 
+    LobRegion<Clob>::setPrimary(const ConnectionImpl *connp,
+                         OCILobLocator *locator);
+#endif
+  friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void getVector(Statement*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void getVector(ResultSet*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void do_setVectorOfClob(Statement*, unsigned int, 
+  const OCCI_STD_NAMESPACE::vector<Clob>&, void *, 
+  unsigned int, void *, unsigned int ) ;
+#ifdef ORAXB8_DEFINED
+  friend  void readVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+  friend  void writeVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          unsigned char *buffers[], oraub8 *buffer_lens);
+  friend  void readVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          utext *buffers[], oraub8 *buffer_lens);
+  friend  void writeVectorOfClobs(const Connection *conn,
+          OCCI_STD_NAMESPACE::vector<Clob> &vec,
+          oraub8 *byte_amts, oraub8 *char_amts, oraub8 *offsets,
+          utext *buffers[], oraub8 *buffer_lens);
+#endif
+};
+
+class Number
+{
+ 
+ public:
+
+ // Constructors
+  /* default constructor added  */
+  Number();
+  Number(const Number &srcNum);
+  Number(long double val) ;
+  Number(double val) ;
+  Number(float val) ;
+  Number(long val) ;
+  Number(int val) ;
+  Number(short val) ;
+  Number(char val) ;
+  Number(signed char val);
+  Number(unsigned long val) ;
+  Number(unsigned int val) ;
+  Number(unsigned short val) ;
+  Number(unsigned char val) ;
+
+  ~Number();
+  // Methods
+  const Number abs() const ;
+  // unary negate
+  const Number operator-() ;
+  // unary increment
+  Number& operator++() ;
+  const Number operator++(int) ;
+  // unary decrement
+  Number& operator--() ;
+  const Number operator--(int) ;
+  // assigment operator
+  Number& operator=(const Number &a);
+  // add and assign
+  Number& operator+=(const Number &a) ;
+  // subtract and assign
+  Number& operator-=(const Number &a) ;
+  // Mulitply an assign
+  Number& operator*=(const Number &a) ;
+   // divide and assign
+  Number& operator/=(const Number &a) ;
+  // Modulo and assign
+  Number& operator%=(const Number &a) ;
+  // casting operators
+  operator long() const;
+  operator int() const;
+  operator short() const;
+  operator char() const;
+  operator signed char() const;
+  operator unsigned long() const;
+  operator unsigned int() const;
+  operator unsigned short() const;
+  operator unsigned char() const;
+  operator long double() const;
+  operator double() const;
+  operator float() const;
+  // Decimal shift
+  const Number shift(int val) const ;
+  // Integer Power
+  const Number intPower(int val) const ;
+  const Number ceil() const ;
+  const Number floor() const ;
+  const Number squareroot() const ;
+  int sign() const ;
+  // conversion routines
+  //  Format Number and return as a OCCI_STD_NAMESPACE::string
+  OCCI_STD_NAMESPACE::string toText(const Environment *envp,
+                const OCCI_STD_NAMESPACE::string &fmt,
+                const OCCI_STD_NAMESPACE::string &nlsParam="") const
+                ;
+  UString toText(const Environment *envp,
+                const UString &fmt,const UString &nlsParam) const
+                ;
+  // Create an Number from formatted text
+  void fromText(const Environment *envp,
+                const OCCI_STD_NAMESPACE::string &number,
+                const OCCI_STD_NAMESPACE::string &fmt, 
+                const OCCI_STD_NAMESPACE::string &nlsParam = "")
+               ;
+  void fromText(const Environment *envp,
+  const UString &number, 
+  const UString &fmt, const UString &nlsParam);
+  void fromBytes(const Bytes &s) ;
+  Bytes toBytes() const;
+  // truncate digits
+  const Number trunc(int decplace) const ;
+   // round to the decplace place.
+  const Number round(int decplace) const ;
+  // returns an Number with digits decimal digits
+  const Number prec(int digits) const ;
+  const Number sin() const ;
+  const Number cos() const ;
+  const Number tan() const ;
+  const Number hypSin() const ;
+  const Number hypCos() const ;
+  const Number hypTan() const ;
+  const Number arcSin() const ;
+  const Number arcCos() const ;
+  const Number arcTan() const ;
+  const Number arcTan2(const Number &val) const;
+  const Number power(const Number &val) const;
+  const Number exp() const ;
+  const Number ln() const ;
+  const Number log(const Number &val) const;
+  bool isNull() const;
+  void setNull();
+ private:
+  /* Private constructor for constructing number from methods inside  */
+  Number(const OCINumber &result);
+  OCINumber getOCINumber() const;
+
+  OCINumber data;
+  /* a flag to indicate if the  Number  is null */
+  bool numberIsNull;
+  void *numberExt;
+
+  // a >= b
+  friend bool operator>=(const Number &a, const Number &b);
+  // a < = b
+  friend bool operator<=(const Number &a, const Number &b);
+  // a > b
+  friend bool operator>(const Number &a, const Number &b);
+  // a < b
+  friend bool operator<(const Number &a, const Number &b);
+
+  friend class IntervalDS;
+  friend class IntervalYM;
+  friend const IntervalYM operator*(const IntervalYM &a,
+  const Number& factor) ;
+  friend const IntervalDS operator*(const IntervalDS &a,
+  const Number& factor) ;
+  friend const IntervalYM operator/(const IntervalYM &a,
+  const Number &factor) ;
+  friend const IntervalDS operator/(const IntervalDS &a,
+  const Number &factor) ;
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend class AnyDataImpl;
+  friend void getVector(const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect);
+  friend void setVector(AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  friend Number MetaData::getNumber(MetaData::AttrId attrid)          const ;
+  friend void getVector(Statement  *stmt, unsigned int paramIndex,
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  friend void do_setVectorOfNumber(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Number> &vect, void *schemaName,
+  unsigned int schemaNameLen,
+  void *typeName, unsigned int typeNameLen);
+  friend void getVector(ResultSet  *rs, unsigned int colIndex,
+  OCCI_STD_NAMESPACE::vector<Number> &vect);
+
+};
+
+class Date
+{
+ public:
+
+  // Constructors
+  Date();
+  Date(const Date &a);
+  Date(const Environment *envp,int year = 1,unsigned int month = 1,
+           unsigned int day = 1,unsigned  int hour = 0,
+           unsigned int minute = 0, unsigned int seconds = 0);
+  ~Date();
+  // Methods
+
+  void setDate(int year = 1,unsigned int month = 1,unsigned int day = 1,
+               unsigned int hour = 0,unsigned int minute = 0,
+               unsigned int seconds = 0);
+  void getDate(int &year,unsigned int &month,unsigned int &day,
+           unsigned int &hour ,unsigned int &min ,unsigned int &sec) const;
+  Bytes toBytes() const ;
+  void fromBytes(const Bytes &byteStream, 
+  const Environment *envp = NULL);
+  OCCI_STD_NAMESPACE::string toText(
+                 const OCCI_STD_NAMESPACE::string &fmt = "",
+                 const OCCI_STD_NAMESPACE::string &nlsParam = "") const;
+  UString toText(
+                 const UString &fmt ,
+                 const UString &nlsParam ) const;
+  void fromText(const OCCI_STD_NAMESPACE::string &datestr,
+                const OCCI_STD_NAMESPACE::string &fmt = "",
+                const OCCI_STD_NAMESPACE::string &nlsParam = "",
+                const Environment *envp = NULL);
+  void fromText(const UString &datestr,
+                const UString &fmt , const UString &nlsParam ,
+                const Environment *envp = NULL);
+  Date toZone(const OCCI_STD_NAMESPACE::string &zone1, 
+              const OCCI_STD_NAMESPACE::string &zone2) const;
+  Date& operator=(const Date &d);
+  Date addMonths(int i) const;
+  Date addDays(int i) const ;
+  Date lastDay() const ;
+  IntervalDS daysBetween(const Date &d) const;
+  Date nextDay(const OCCI_STD_NAMESPACE::string &dow) const;
+  Date nextDay(const UString &dow) const;
+  bool isNull() const;
+  void setNull();
+  static Date getSystemDate(const Environment *envp) ;
+
+ private:
+  OCIDate date;
+  const EnvironmentImpl *envp;
+  bool dateIsNull;
+  void *dateExt;
+
+  /* private constructor */
+  Date(const Environment *env,OCIDate dateval);
+  OCIDate getOCIDate() const;
+  void constructHourAndMinute(sb4 &seconds, sb4 &hours, sb4 &minutes) const;
+  friend bool operator==(const Date &a,const Date &b);
+  friend bool operator>(const Date &a,const Date &b);
+  friend bool operator<(const Date &a,const Date &b);
+  friend bool operator!=(const Date &a,const Date &b);
+  friend bool operator>=(const Date &a,const Date &b);
+  friend bool operator<=(const Date &a,const Date &b);
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend class AnyDataImpl;
+  friend class aq::MessageImpl;
+  friend void getVector(const AnyData &any, 
+                        OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  friend void setVector(AnyData &any, 
+                        const OCCI_STD_NAMESPACE::vector<Date> &vect);
+  friend void getVector(Statement  *stmt, unsigned int paramIndex,
+   OCCI_STD_NAMESPACE::vector<Date> &vect)  ;
+  friend void do_setVectorOfDate(Statement *stmt, unsigned int paramIndex, 
+   const OCCI_STD_NAMESPACE::vector<Date> &vect, void *schemaName,
+   unsigned int schemaNameLen,void *typeName, unsigned int typeNameLen) ;
+  friend void getVector(ResultSet  *rs, unsigned int colIndex, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+
+}; //class Date
+
+class Timestamp
+{
+  public:
+  Timestamp() ;
+
+  Timestamp( const Environment *env, int year=1,
+             unsigned int month=1, unsigned int day=1, unsigned int hour=0,
+             unsigned int min=0 ,unsigned int sec=0, unsigned int fs=0, 
+             int tzhour=0, int tzmin=0) ;
+  Timestamp( const Environment *env, int year,
+             unsigned int month, unsigned int day, unsigned int hour,
+             unsigned int min ,unsigned int sec, unsigned int fs, 
+             const OCCI_STD_NAMESPACE::string &timezone);
+  Timestamp( const Environment *env, int year,
+             unsigned int month, unsigned int day, unsigned int hour,
+             unsigned int min ,unsigned int sec, unsigned int fs, 
+             const UString &timezone);
+  Timestamp( const Timestamp &src) ;
+  ~Timestamp();
+
+  void getTimeZoneOffset( int &hour, int &minute) const ;
+  void getTime( unsigned int &hour, unsigned int &minute,
+  unsigned int &second, unsigned int &fs) const ;
+  void getDate( int &year, unsigned int &month, unsigned int &day )const ;
+  OCCI_STD_NAMESPACE::string toText(const OCCI_STD_NAMESPACE::string &fmt, 
+                     unsigned int fsprec, 
+                     const OCCI_STD_NAMESPACE::string &nlsParam ="") const   ;
+  UString toText(const UString &fmt, 
+                 unsigned int fsprec, const UString &nlsParam ) const   ;
+  void setTimeZoneOffset( int hour,  int minute)  ;
+  void setTime( unsigned int hour, unsigned int minute,
+  unsigned int second, unsigned int fs)  ;
+  void setDate( int year, unsigned int month, unsigned int day ) ;
+  void setNull() ;
+  void fromText( const OCCI_STD_NAMESPACE::string &timestmpStr, 
+                 const OCCI_STD_NAMESPACE::string &fmt ,
+                 const OCCI_STD_NAMESPACE::string &nlsParam= "", 
+                 const Environment *env =NULL);
+  void fromText( const UString &timestmpStr, 
+                 const UString &fmt , const UString &nlsParam, 
+                 const Environment *env =NULL);
+  bool isNull() const;
+  Timestamp & operator =( const Timestamp &src) ;
+  const IntervalYM subYM(const Timestamp& val) const ;
+  const IntervalDS subDS(const Timestamp& val) const ;
+  const Timestamp intervalAdd(const IntervalDS& val) const ;
+  const Timestamp intervalSub(const IntervalDS& val) const ;
+  const Timestamp intervalAdd(const IntervalYM& val) const ;
+  const Timestamp intervalSub(const IntervalYM& val) const ;
+
+  friend bool operator==(const Timestamp &a,const Timestamp &b);
+  friend bool operator>(const Timestamp &a,const Timestamp &b);
+  friend bool operator<(const Timestamp &a,const Timestamp &b);
+  friend bool operator !=(const Timestamp &a,const Timestamp &b);
+  friend bool operator >=(const Timestamp &a,const Timestamp &b);
+  friend bool operator <=(const Timestamp &a,const Timestamp &b);
+
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend class AnyDataImpl;
+
+  private:
+   OCIDateTime *ocidatetime;
+   Environment *env_; 
+   void *timestampExt;
+
+   OCIDateTime *getOCIDateTime() const;
+   void getTZString( OraText *TimeZone, int th, int tm );  
+   Timestamp( Environment *env, OCIDateTime *dt, bool toCopy = true) ;
+   void allocateDataMembers( Environment *env) ;
+   void do_TimestampConstruct( const Environment *env, int year, 
+   unsigned int month, unsigned int day, unsigned int hour, unsigned int min, 
+   unsigned int sec, unsigned int fs, void *tz, int tsize);
+
+   friend  void getVector(const AnyData &any,
+   OCCI_STD_NAMESPACE::vector<Timestamp> &vect);
+   friend  void setVector(AnyData &any, 
+   const OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+   friend Timestamp MetaData::getTimestamp(
+   MetaData::AttrId attrid) const ;
+   friend void getVector(ResultSet  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+   friend void getVector(Statement  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+   friend void do_setVectorOfTimestamp(Statement *stmt,
+   unsigned int paramIndex,
+   const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, 
+   void *schemaName, unsigned int schemaNameLen,
+   void *typeName, unsigned int typeNameLen) ;
+}; // class Timestamp
+
+class IntervalDS
+{
+
+  public:
+  IntervalDS() ;
+  IntervalDS( const Environment *env,int day=0, 
+  int hour=0, int minute=0, int second=0, 
+  int fs=0) ;
+  IntervalDS( const IntervalDS &src) ;
+
+  ~IntervalDS();
+
+  int getDay () const ;
+  int getHour () const ;
+  int getMinute () const ;
+  int getSecond() const ;
+  int getFracSec () const ;
+  void set( int day, int hour, int minute, int second, int fracsec) ;
+  void setNull() ;
+  void fromText( const OCCI_STD_NAMESPACE::string &inpstr,
+  const OCCI_STD_NAMESPACE::string &nlsParam ="",
+  const Environment *env=NULL)  ;
+  OCCI_STD_NAMESPACE::string toText( unsigned int lfprec, unsigned int fsprec,
+  const OCCI_STD_NAMESPACE::string &nlsParam="") const ;
+  bool isNull() const;
+  IntervalDS& operator =( const IntervalDS &src) ;
+  IntervalDS& operator +=( const IntervalDS &a);
+  IntervalDS& operator -=( const IntervalDS &a);
+  IntervalDS& operator *=( const Number &factor);
+  IntervalDS& operator /=( const Number &factor);
+
+  friend bool operator>(const IntervalDS &a,
+  const IntervalDS &b) ;
+  friend bool operator<(const IntervalDS &a,
+  const IntervalDS &b) ;
+  friend bool operator >=( const IntervalDS &a, 
+  const IntervalDS &b);
+  friend bool operator <=( const IntervalDS &a, 
+  const IntervalDS &b);
+  
+  //UTF16 support
+  void fromUText( const UString &inpstr, const Environment *env=NULL );
+  UString toUText( unsigned int lfprec, unsigned int fsprec) const;
+
+  private:
+   OCIInterval *ociinter;
+   OCIEnv *ocienv;
+   void *intervalDSExt;
+
+   IntervalDS( OCIEnv *env, OCIInterval *inter, bool toCopy = true) ;
+   OCIInterval * getOCIInterval() const;
+
+   void allocateDataMembers( OCIEnv *env) ;
+   friend const IntervalDS Timestamp::subDS(
+   const Timestamp& val) const ;
+   friend const Timestamp Timestamp::intervalAdd(
+   const IntervalDS& val) const ;
+   friend const Timestamp Timestamp::intervalSub(
+   const IntervalDS& val) const ;
+   friend class Date;
+   friend void getVector(ResultSet  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+   friend void getVector(Statement  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+   friend void do_setVectorOfIntervalDS(Statement *stmt, 
+   unsigned int paramIndex,
+   const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, 
+   void *schemaName, unsigned int schemaNameLen,
+   void *typeName, unsigned int typeNameLen) ;
+   friend class StatementImpl;
+   friend class ResultSetImpl;
+   friend class AnyDataImpl;
+   friend  void getVector(const AnyData &any,
+   OCCI_STD_NAMESPACE::vector<IntervalDS> &vect);
+   friend  void setVector(AnyData &any,
+   const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+
+ 
+};  //class IntervalDS
+
+class IntervalYM
+{
+
+  public:
+  IntervalYM() ;
+  IntervalYM( const Environment *env,int year=0, int month=0) ;
+  IntervalYM( const IntervalYM &src) ;
+  ~IntervalYM();
+
+  int getYear() const ;
+  int getMonth() const ;
+
+  void set( int year, int month) ;
+  void setNull() ;
+  void fromText( const OCCI_STD_NAMESPACE::string &inpstr, 
+  const OCCI_STD_NAMESPACE::string &nlsParam="",
+  const Environment *env=NULL) ;
+  OCCI_STD_NAMESPACE::string toText( unsigned int lfprec, 
+  const OCCI_STD_NAMESPACE::string &nlsParam="") const;
+  bool isNull() const;
+  IntervalYM & operator =( const IntervalYM &src) ;
+  IntervalYM& operator +=( const IntervalYM &a);
+  IntervalYM& operator -=( const IntervalYM &a);
+  IntervalYM& operator *=( const Number &factor);
+  IntervalYM& operator /=( const Number &factor);
+
+  friend bool operator>(const IntervalYM &a, const IntervalYM &b) ;
+  friend bool operator<( const IntervalYM &a, const IntervalYM &b) ;
+  friend bool operator >=(const IntervalYM &a, const IntervalYM &b);
+  friend bool operator <=(const IntervalYM &a, const IntervalYM &b);
+  
+  //UTF16 support
+  void fromUText( const UString &inpstr, const Environment *env=NULL );
+  UString toUText( unsigned int lfprec ) const;
+
+  private:
+   OCIInterval *ociinter;
+   OCIEnv *ocienv;
+   void *intervalYMExt;
+
+   IntervalYM( OCIEnv *env, OCIInterval *inter, bool toCopy = true) ;
+   OCIInterval *getOCIInterval() const;
+   void allocateDataMembers( OCIEnv *env) ;
+   friend const IntervalYM Timestamp :: subYM(
+   const Timestamp& val) const ;
+   friend const Timestamp Timestamp::intervalAdd(
+   const IntervalYM &val) const ;
+   friend const Timestamp Timestamp::intervalSub(
+   const IntervalYM &val) const ;
+
+   friend void getVector(ResultSet  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+   friend void getVector(Statement  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+   friend void do_setVectorOfIntervalYM(Statement *stmt,
+   unsigned int paramIndex,
+   const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect,
+   void *schemaName, unsigned int schemaNameLen,
+   void *typeName, unsigned int typeNameLen) ;
+
+   friend class StatementImpl;
+   friend class ResultSetImpl;
+   friend class AnyDataImpl;
+   friend  void getVector(const AnyData &any,
+   OCCI_STD_NAMESPACE::vector<IntervalYM> &vect);
+   friend  void setVector(AnyData &any,
+   const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+
+}; //class IntervalYM
+
+
+Number operator+(const Number &a, const Number &b) ;
+Number operator/(const Number &dividend, const Number &divisor) ;
+Number operator*(const Number &a, const Number &b) ;
+Number operator%(const Number &a, const Number &b) ;
+Number operator-(const Number &subtrahend, const Number &subtractor) ;
+bool operator==(const Number &a, const Number &b);
+bool operator!=(const Number &a, const Number &b);
+
+const IntervalYM operator+(const IntervalYM &a, const IntervalYM &b) ;
+const IntervalYM operator-(const IntervalYM &a, const IntervalYM &b) ;
+const IntervalYM operator*(const IntervalYM &a, const Number& factor);
+const IntervalYM operator/(const IntervalYM &a, const Number &factor);
+bool operator==(const IntervalYM &a, const IntervalYM &b) ;
+bool operator!=(const IntervalYM &a, const IntervalYM &b) ;
+
+const IntervalDS operator+(const IntervalDS &a, const IntervalDS &b) ;
+const IntervalDS operator-(const IntervalDS &a, const IntervalDS &b) ;
+const IntervalDS operator*(const IntervalDS &a, const Number& factor);
+const IntervalDS operator/(const IntervalDS &a, const Number &factor);
+bool operator==(const IntervalDS &a, const IntervalDS &b) ;
+bool operator!=(const IntervalDS &a, const IntervalDS &b) ;
+
+
+typedef struct BFloat
+{
+ float value;
+ bool  isNull;
+
+ BFloat()
+ {
+   isNull = false;
+   value = 0.;
+ }
+} BFloat;
+
+typedef struct BDouble
+{
+ double value;
+ bool   isNull;
+
+ BDouble()
+ {
+   isNull = false;
+   value = 0.;
+ }
+} BDouble;
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+ 
+#ifdef ORAXB8_DEFINED
+/* 
+   NAME 
+     Lob Region class
+
+   DESCRIPTION 
+     Contains the implementation of the Lob Region template Class.
+     This class is the underlying implementation for the BlobRegion and
+     ClobRegion classes.
+ 
+   RELATED DOCUMENTS 
+     Functional/Design Specifications:
+       18209 - Next Generation LOBs: API
+       18206 - Next Generation LOBs: Comb. Storage, Compressio & Encryption
+ 
+   EXPORT FUNCTION(S) 
+     LobRegion()  - constructors
+     ~LobRegion() - destructor
+     getPrimary() - Get the Primary Lob object
+     getPrimaryOffset() - Get the offset of this region in the Primary Lob.
+     getOffset() - Get the offset of this region in this lob.
+     getLength() - Get the length of this region
+     getMimeType() - Get the mime type of this region
+
+   PUBLIC IMPLEMENTATION FUNCTION(S)
+
+   INTERNAL FUNCTION(S)
+     none
+
+   EXAMPLES
+
+   NOTES
+*/
+
+/*------------------------------ LobRegion ------------------*/
+/*
+   NAME
+       LobRegion - constructor for the class
+
+   PARAMETERS
+       none
+
+   DESCRIPTION 
+       default constructor
+
+   RETURNS
+       Nothing
+
+   NOTES
+*/
+template <typename lobType>
+LobRegion<lobType>::LobRegion()
+{
+  _primary = (lobType *)0;
+  _primaryOffset = 0;
+  _offset  = 0;
+  _length  = 0;
+}
+
+/*------------------------------ ~LobRegion ------------------*/
+/*
+   NAME
+       ~LobRegion - destructor for the class
+
+   PARAMETERS
+       none
+
+   DESCRIPTION 
+       default constructor
+
+   RETURNS
+       Nothing
+
+   NOTES
+*/
+template <typename lobType> 
+LobRegion<lobType>::~LobRegion()
+{
+  if (_primary != (lobType *)0)
+  {
+    delete _primary;
+  }
+}
+
+template <typename lobType> 
+lobType *LobRegion<lobType>::getPrimary()
+{
+  return _primary;
+}
+
+template <typename lobType>
+oraub8 LobRegion<lobType>::getPrimaryOffset()
+{
+  return _primaryOffset;
+}
+
+template <typename lobType>
+oraub8 LobRegion<lobType>::getOffset()
+{
+  return _offset;
+}
+
+template <typename lobType>
+oraub8 LobRegion<lobType>::getLength()
+{
+  return _length;
+}
+
+template <typename lobType>
+OCCI_STD_NAMESPACE::string LobRegion<lobType>::getMimeType()
+{
+  return _mimeType;
+}
+
+template <typename lobType> 
+void LobRegion<lobType>::setPrimary(const ConnectionImpl *connp,
+                                    OCILobLocator *locator)
+{
+  if (locator != (OCILobLocator *)0)
+  {
+    _primary = new lobType(connp, locator, true);
+  }
+}
+
+#endif /* ORAXB8_DEFINED */
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif                                              /* OCCIDATA_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/sdk/include/occiObjects.h b/sdk/include/occiObjects.h
new file mode 100644
index 0000000..1b301ad
--- /dev/null
+++ b/sdk/include/occiObjects.h
@@ -0,0 +1,910 @@
+/* Copyright (c) 2000, 2007, Oracle. All rights reserved.  */
+
+/* 
+   NAME 
+     occiObjects.h - header file for OCCI object classes
+
+   DESCRIPTION 
+     Class definitions for Ref, RefAny, AnyData
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+     descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCIOBJECTS_ORACLE
+# define OCCIOBJECTS_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+namespace oracle {
+namespace occi {
+struct AnyDataCtx {
+   ConnectionImpl *occiSession;
+   OCIAnyData *anyData;
+   void *objHeader;
+   ub4 errNum;
+};
+typedef struct AnyDataCtx AnyDataCtx;
+
+class PObject
+{
+  public:
+        enum LockOption {OCCI_LOCK_WAIT, OCCI_LOCK_NOWAIT};
+        enum UnpinOption {OCCI_PINCOUNT_DECR, OCCI_PINCOUNT_RESET};
+        static void destroy(void *);
+        static void refresh(void *); 
+        PObject();
+        PObject(const void *ctx);
+        PObject(const PObject& obj);
+        virtual ~PObject();
+        PObject& operator=(const PObject& obj);
+        void *operator new(size_t size);
+        void *operator new(size_t size, const Connection *x,
+                           const OCCI_STD_NAMESPACE::string& tablename, 
+                           const char *typeName);
+        void *operator new(size_t size, const Connection *sess,
+               const OCCI_STD_NAMESPACE::string& tablename,
+               const OCCI_STD_NAMESPACE::string& typName ,
+               const OCCI_STD_NAMESPACE::string& schTabName="",
+               const OCCI_STD_NAMESPACE::string& schTypName = "");
+        void *operator new(size_t size, const Connection *sess,
+               const UString& tablename, const UString &typName,
+               const UString& schTabName, const UString& schTypName);
+        void *operator new(size_t size, void *adctx);
+        void operator delete(void *obj, size_t size);
+        RefAny getRef() const;
+        bool isLocked() const;
+        void unpin(UnpinOption mode=OCCI_PINCOUNT_DECR);
+        void pin();
+        void lock(PObject::LockOption lock_option);
+        void unmark();
+        void flush();
+        void markDelete();
+        void markModified();
+        bool isNull() const;
+        void setNull();
+        const Connection *getConnection() const;
+        virtual OCCI_STD_NAMESPACE::string getSQLTypeName() const = 0;
+        virtual void getSQLTypeName(Environment *env, void **schName,
+                     unsigned int &schNameLen, void **typeName,
+                     unsigned int &typeNameLen) const = 0;
+        void getSQLTypeName(Environment *env, void *(*rSQL)(void *),
+                            void **schname, unsigned int &schnamelen,
+                            void **typname, unsigned int &typnamelen) const;
+        virtual void writeSQL(AnyData& stream) = 0;
+        virtual void readSQL(AnyData& stream) = 0;
+  private:
+       static void initialise( void * obj, const Connection * sess,
+              void *schTabName, unsigned int schTabLen,
+              void *tableName, unsigned int tabLen,
+              void *schTypName, unsigned int schTypLen,
+              void *typeName, unsigned int typLen);
+
+        ConnectionImpl  *occiSession_;
+        void *objHeader_;
+        ub2 customNewed_;
+        enum {CUSTOM_NEWED = 0x5cde};
+        ub2 flags_;
+        enum {NULL_INFO = 0x0001, GARBAGE_COLLECTED = 0x0002,
+              REFRESH_OBJECT = 0x0004,
+              CACHED_OBJECT = 0xBAF8};
+        //check PObject implementation for CACHED_OBJECT flag
+        // for future use 
+        void *pobjectExt;
+        friend class RefImpl;
+};
+
+class AnyData
+{
+    public:
+    ~AnyData();
+    AnyData(void *any) ;
+    AnyData(const Connection *sessp);
+    AnyData(const Connection *sessp, OCIAnyData *any, bool freeImg = true) ; 
+ 
+    AnyData(const AnyData &src);
+    AnyData& operator = (const AnyData &src);
+
+    OCIAnyData* getOCIAnyData() const;
+    const Connection* getConnection() const;
+
+
+    bool isNull() const ;
+    void setNull() ;
+    OCCI_STD_NAMESPACE::string getString() const ;
+    UString getUString() const ;
+    Blob getBlob() const ;
+    Clob getClob() const ;
+    Bfile getBfile() const ;
+    BFloat  getBFloat() const ;
+    BDouble getBDouble() const ;
+    Number getNumber() const ;
+    Bytes getBytes() const ;
+    Date getDate() const ;
+    Timestamp getTimestamp() const ;
+    IntervalYM getIntervalYM() const ;
+    IntervalDS getIntervalDS() const ;
+    PObject *getObject(void *(*rSQL)(void *)) const ;
+    RefAny getRef() const ;
+
+    void setString(const OCCI_STD_NAMESPACE::string &str)  ;
+    void setUString(const UString &str)  ;
+    void setBlob(const Blob &blob) ;
+    void setClob(const Clob &clob) ;
+    void setBfile(const Bfile &bfile) ;
+    void setBFloat(const BFloat &n) ;
+    void setBDouble(const BDouble &n) ;
+    void setNumber(const Number &n) ;
+    void setBytes(const Bytes &bytes) ;
+    void setDate(const Date &date) ;
+    void setTimestamp(const Timestamp &timestamp)  ;
+    void setIntervalYM(const IntervalYM &intervalym)  ;
+    void setIntervalDS(const IntervalDS &intervalds)  ;
+    void setObject(const PObject *objptr) ;
+    void setRef(const RefAny &ref) ;
+
+    void setFromString(const OCCI_STD_NAMESPACE::string &str)  ;
+    void setFromBfile(const Bfile &bfile) ;
+    void setFromBFloat(const BFloat &n) ;
+    void setFromBDouble(const BDouble &n) ;
+    void setFromNumber(const Number &n) ;
+    void setFromBytes(const Bytes &bytes) ;
+    void setFromDate(const Date &date) ;
+    void setFromTimestamp(const Timestamp &timestamp)  ;
+    void setFromIntervalYM(const IntervalYM &intervalym)  ;
+    void setFromIntervalDS(const IntervalDS &intervalds)  ;
+    void setFromObject(const PObject *objptr) ;
+    void setFromRef(const RefAny &ref,
+                    const OCCI_STD_NAMESPACE::string &typname,
+                    const OCCI_STD_NAMESPACE::string &schname) ;
+
+    OCCI_STD_NAMESPACE::string getAsString() const ;
+    Bfile getAsBfile() const ;
+    BFloat  getAsBFloat() const ;
+    BDouble getAsBDouble() const ;
+    Number getAsNumber() const ;
+    Bytes getAsBytes() const ;
+    Date getAsDate() const ;
+    Timestamp getAsTimestamp() const ;
+    IntervalYM getAsIntervalYM() const ;
+    IntervalDS getAsIntervalDS() const ;
+    PObject *getAsObject() const ;
+    RefAny getAsRef() const ;
+
+    TypeCode getType() const;
+    
+    private:
+
+                                 
+    // private data members
+    Ptr<AnyDataImpl> anyDataImplPtr;              
+   
+
+};
+
+template <class T>
+class Ref
+{
+  public:
+
+  Ref();
+  Ref(const T *obj) ;
+  Ref(const RefAny &refAny) ;
+  Ref(const Ref<T> &src) ;
+  Ref(const Connection *sessp, OCIRef *tref, bool copy=TRUE) 
+  ;
+ ~Ref();
+  Ref<T>& operator=(const Ref<T> &src) 
+  ;
+  Ref<T>& operator=(const T *obj) ;
+  Ref<T>& operator=(const RefAny &src);
+  T * operator->() ;
+  T * ptr() ;
+  T & operator *() ;
+  const T * operator->() const;
+  const T * ptr()  const;
+  const T & operator *() const ;
+  void markDelete() ;
+  void unmarkDelete() ;
+  void setNull();
+  bool isNull() const;
+  void clear() ;
+  bool isClear() const;
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &typeName, 
+                   unsigned int depth);
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &schName,
+                   const OCCI_STD_NAMESPACE::string &typeName,
+                   unsigned int depth);
+  void setPrefetch(const UString &schName,
+                   const UString &typeName,
+                   unsigned int depth);
+  void setPrefetch(unsigned int depth) ;
+  void setLock(LockOptions );
+  operator RefAny() const;
+  OCIRef *getRef() const;
+  const Connection *getConnection() const;
+  bool operator == (const Ref<T> &ref) const;
+  bool operator != (const Ref<T> &ref) const;
+  bool operator == (const RefAny &refAnyR) const ;
+  bool operator != (const RefAny &refAnyR) const ;
+  OCIComplexObject *getCor() const;
+  void setPinnedObject(PObject *objPtr); 
+ private:
+
+  RefImpl  *rimplPtr;
+};
+
+
+class RefImpl
+{
+  public:
+
+  RefImpl();
+  RefImpl(PObject *obj) ;
+  RefImpl(const RefAny &refAny) ;
+  RefImpl(const RefImpl &src) ;
+  RefImpl(const Connection *sessp, OCIRef *tref, 
+  bool copy=TRUE) ;
+  ~RefImpl();
+  bool isNull() const ;
+  void setNull() ;
+  void markDelete() ;
+  void unmarkDelete() ;
+  void clear() ;
+  bool isClear() const ;
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &typeName, 
+                   unsigned int depth) ;
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &schName,
+                   const OCCI_STD_NAMESPACE::string &typeName,
+                   unsigned int depth);
+  void setPrefetch(const UString &schName,
+                   const UString &typeName,
+                   unsigned int depth);
+  void setPrefetch(unsigned int depth) ;
+  void setLock(LockOptions lckOption) ;
+  PObject *pin() ;
+  void unpin(PObject *obj) ;
+  void setRefFromObjPtr(const PObject *obj) ;
+  OCIRef* getRef() const;
+  void setRefImpl(RefImpl *rptr);
+  const Connection * getConnection() const;
+  bool operator == (const RefImpl &refI) const ;
+  bool operator == (const RefAny &refAnyR) const ;
+  void assignObj(PObject *newObjPtr) ;
+  void assignRefAny(const RefAny &src) ;
+  // added following methods
+  bool isEqual(PObject *obj);
+  void operator = ( const RefImpl &src);
+  OCIComplexObject *getCor() const;
+  void setPinnedObject( PObject *objPtr);
+ private:
+
+  OCIRef *ref;
+  const ConnectionImpl *sessp;
+  OCIComplexObject *corhp;
+  OCCI_STD_NAMESPACE::list<void *> descriptorList;
+  LockOptions lockOption;
+  // added data member for object header
+  void *objHeader;
+  //common implementation function for setPrefetch
+  void do_setPrefetch(void *schName, unsigned int schNameLen,
+                      void *typeName, unsigned int typeNameLen,
+                      unsigned int depth);
+};
+
+
+class RefAny
+{
+  public:
+
+  RefAny();
+  RefAny (const Connection *sessptr, const OCIRef *ref);
+  RefAny (const Connection *sessptr, const OCIRef *ref, bool isowner);
+  ~RefAny() ;
+  RefAny(const RefAny& src) ;
+  RefAny& operator=(const RefAny& src) ;
+  void markDelete() ;
+  void unmarkDelete() ;
+  void clear() ;
+  bool isNull() const;
+  OCIRef * getRef() const;
+  const Connection * getConnection() const;
+  bool operator == (const RefAny &refAnyR) const;
+  bool operator != (const RefAny &refAnyR) const;
+  bool isOwner() const;
+
+  private:
+
+  OCIRef *ref;
+  const ConnectionImpl *sessp;
+  // for future use
+  void *refanyExt;
+  bool owner;
+
+  friend RefAny MetaData::getRef(MetaData::AttrId) const;
+  friend RefAny PObject::getRef() const;
+  friend class AnyDataImpl;
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend void getVector(const ResultSet  *rs,
+                        unsigned int colIndex,
+                        OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+  friend void getVector(const Statement  *stmt,
+                        unsigned int colIndex,
+                        OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+};
+
+template <class T>
+Ref<T>::Ref()
+{
+   rimplPtr = new RefImpl();
+}
+
+template <class T>
+Ref<T>::Ref(const T *obj)
+{
+   rimplPtr = new RefImpl((PObject *)obj);
+}
+
+template <class T>
+Ref<T>::Ref(const RefAny &refAny)
+
+{
+  rimplPtr = new RefImpl(refAny);
+}
+
+template <class T>
+Ref<T>::Ref(const Ref<T>& src)
+
+{
+    rimplPtr = new RefImpl(*(src.rimplPtr));
+}
+
+template <class T>
+Ref<T>::Ref(const Connection *sessp, OCIRef *tref, bool copy)
+
+{
+   rimplPtr = new RefImpl(sessp, tref, copy);
+}
+
+template <class T>
+Ref<T>::~Ref()
+{
+  delete rimplPtr;
+}
+
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const Ref<T> &src)
+{
+   if (&src == this)
+     return *this;
+   *rimplPtr = *(src.rimplPtr);
+   return *this;
+}
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const T *obj)
+{
+  if (rimplPtr->isEqual((PObject *)obj))
+    return *this;
+  rimplPtr->assignObj((PObject *)obj);
+  return *this;
+}
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const RefAny &src)
+{
+  rimplPtr->assignRefAny(src);
+  return *this;
+}
+
+template <class T>
+T* Ref<T>::operator->()
+{
+  return ((T *)rimplPtr->pin());
+}
+
+template <class T>
+T* Ref<T>::ptr()
+{
+  return ((T *)rimplPtr->pin());
+}
+
+template <class T>
+T& Ref<T>::operator * ()
+{
+  return ((T &)(*(rimplPtr->pin())));
+}
+
+template <class T>
+const T* Ref<T>::operator->() const
+{
+  return ((const T *)rimplPtr->pin());
+}
+
+template <class T>
+const T* Ref<T>::ptr() const
+{
+  return ((const T *)rimplPtr->pin());
+}
+
+template <class T>
+const T& Ref<T>::operator * () const
+{
+  return ((const T &)(*(rimplPtr->pin())));
+}
+
+template <class T>
+void Ref<T>::markDelete ()
+{
+   rimplPtr->markDelete();
+}
+
+template <class T>
+void Ref<T>::unmarkDelete ()
+{
+   rimplPtr->unmarkDelete();
+}
+
+template <class T>
+void Ref<T>::setNull()
+{
+   rimplPtr->setNull();
+}
+
+template <class T>
+bool Ref<T>::isNull() const
+{
+  return rimplPtr->isNull();
+}
+
+template <class T>
+void Ref<T>::clear ()
+{
+   rimplPtr->clear();
+}
+
+template <class T>
+bool Ref<T>::isClear() const
+{
+   return rimplPtr->isClear();
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const OCCI_STD_NAMESPACE::string &typeName,
+unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName,
+unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(schemaName,typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const UString &schemaName,
+const UString &typeName,
+unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(schemaName,typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(depth);
+}
+
+template <class T>
+void Ref<T>::setLock (LockOptions lckOption)
+{
+  rimplPtr->setLock(lckOption);
+}
+
+template <class T>
+OCIRef* Ref<T>::getRef() const
+{
+  return (rimplPtr->getRef());
+}
+
+template<class T>
+const Connection* Ref<T>::getConnection () const
+{
+  return (rimplPtr->getConnection());
+}
+
+template <class T>
+Ref<T>::operator RefAny () const
+{
+  if (isNull())
+    return  RefAny();
+  return (RefAny(rimplPtr->getConnection(), rimplPtr->getRef()));
+}
+
+template <class T>
+bool Ref<T>::operator ==(const Ref<T> &ref) const
+
+{
+  return ( (*rimplPtr) == (*(ref.rimplPtr)) );
+}
+
+template <class T>
+bool Ref<T>::operator !=(const Ref<T> &ref) const
+
+{
+  return ( !((*rimplPtr) == (*(ref.rimplPtr))) );
+}
+
+template <class T>
+bool Ref<T>::operator == (const RefAny & refAnyR) const
+
+{
+  return ( (*rimplPtr) == refAnyR );
+}
+
+template <class T>
+bool Ref<T>::operator != (const RefAny & refAnyR) const
+
+{
+  return ( !((*rimplPtr) == refAnyR ));
+}
+
+template <class T>
+OCIComplexObject * Ref<T>::getCor() const
+{
+  return (rimplPtr->getCor());
+}
+
+template < class T>
+void Ref<T>::setPinnedObject( PObject *objPtr)
+{
+   rimplPtr->setPinnedObject(objPtr);
+}
+
+/*---------------------------------------------------------------------------
+                PROTOTYPES USED BY FUNCTION TEMPLATES
+ ---------------------------------------------------------------------------*/
+  void getVectorOfOCIRefs( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<void *> &vect);
+  void getVectorOfPObjects( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector< PObject* > &vect,
+  void *(*rSQL)(void *))  ;
+  void setVectorOfOCIRefs( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector< OCIInd> &vec_ind) ;
+  void setVectorOfPObjects( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector< PObject* > &vect) ;
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------- getVector for POBject----------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the
+   current position as a vector of PObject
+
+   PARAMETERS
+      any - AnyData
+      vect- reference to vector of PObject (OUT parameter).
+
+   DESCRIPTION
+   Retrieves the attribute in the current position as a vector
+   of PObject
+   The attribute at the current position should be a collection
+   type (varray or nested table). The SQL type of the elements in
+   the collection should be compatible with PObject
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+
+#if defined(WIN32COMMON) || defined(__MVS__)
+// and other platforms that do not support
+// partial function template specialization
+ template <class T>
+ void getVector(const AnyData &any, OCCI_STD_NAMESPACE::vector<T> &vect,
+ void *(*rSQL)(void *))
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   getVectorOfPObjects( any, vec_pobj, rSQL);
+
+   vect.clear();
+   unsigned int size= vec_pobj.size();
+   vect.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vect.push_back( (T)vec_pobj[i] );
+ }
+#else
+ template <class T>
+ void getVector(const AnyData &any, OCCI_STD_NAMESPACE::vector<T*> &vect,
+ void *(*rSQL)(void *)) 
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   getVectorOfPObjects( any, vec_pobj, rSQL);
+
+   vect.clear();
+   unsigned int size= vec_pobj.size();
+   vect.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vect.push_back( (T*)vec_pobj[i] );
+ }
+#endif /* end of #ifdef WIN32COMMON */
+
+ /*------------------- getVector for Ref<T>----------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the
+   current position as a vector of PObject
+
+   PARAMETERS
+      any - AnyData
+      vect- reference to vector of PObject (OUT parameter).
+
+   DESCRIPTION
+   Retrieves the attribute in the current position as a vector
+   of PObject
+   The attribute at the current position should be a collection
+   type (varray or nested table). The SQL type of the elements in
+   the collection should be compatible with PObject
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+#if !defined(WIN32COMMON) && !defined(__MVS__)
+ template <class T>
+ void getVector(const AnyData &any,OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) 
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   getVectorOfOCIRefs( any, vec_ref);
+
+   vect.clear();
+   unsigned int size = vec_ref.size();
+   vect.reserve( size );
+   const Connection *sess = any.getConnection();
+
+   for (unsigned int i=0; i< size; i++)
+   {
+     if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+   }
+ }
+#endif /* end of #ifndef WIN32COMMON  */
+ 
+/*-----------------------setVector for PObject--------------------------*/
+/*
+   NAME
+     setVector - overloaded function. sets the attribute in the current
+   position of anydata with the vector elements.
+
+   PARAMETERS
+      none.
+
+   DESCRIPTION
+      sets the attribute in the current position in anydata with the
+   vector elements.
+  The attribute in the current position of anydata should be a
+  collection type. If the collection type is a varray, the input vector
+  size should be equal to the size of the varray. Also the SQL type of
+  the collection's elements should be compatible with PObject.
+
+   RETURNS
+     nothing.
+
+   NOTES
+     compatible SQL types : SQLT_NTY  (user defined types).
+*/
+#if defined(WIN32COMMON) || defined(__MVS__)
+// and other platforms that do not support
+// partial function template specialization
+
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector<T> &vect) 
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   unsigned int size= vect.size();
+   vec_pobj.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vec_pobj.push_back( vect[i] );
+   setVectorOfPObjects( any, vec_pobj);
+
+ }
+ 
+#else
+
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector<T*> &vect)
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   unsigned int size= vect.size();
+   vec_pobj.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vec_pobj.push_back( vect[i] );
+   setVectorOfPObjects( any, vec_pobj);
+
+ }
+#endif /* end of #ifdef WIN32COMMON */
+
+/*-----------------------setVector for Ref<T>--------------------------*/
+/*
+   NAME
+     setVector - overloaded function. sets the attribute in the current
+   position of anydata with the vector elements.
+
+   PARAMETERS
+      none.
+
+   DESCRIPTION
+      sets the attribute in the current position in anydata with the
+   vector elements.
+  The attribute in the current position of anydata should be a
+  collection type. If the collection type is a varray, the input vector
+  size should be equal to the size of the varray. Also the SQL type of
+  the collection's elements should be compatible with PObject.
+
+   RETURNS
+     nothing.
+
+   NOTES
+     compatible SQL types : SQLT_NTY  (user defined types).
+*/
+#if !defined(WIN32COMMON) && !defined(__MVS__)
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+
+   unsigned int size= vect.size();
+   vec_ref.reserve( size );
+   vec_ind.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+   {
+      vec_ref.push_back( vect[i].getRef() );
+      vec_ind.push_back(vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+   }
+   setVectorOfOCIRefs( any, vec_ref, vec_ind);
+
+ }
+#endif  /* end of #ifndef WIN32COMMON */
+ 
+// Platform independent get/setVectorOfRefs method added 
+// get(set)Vector of Ref<T> and get(set)VectorOfRefs are identical
+// in functionality.
+
+ /*------------------- getVectorOfRefs for Ref<T>----------------------------*/
+/*
+   NAME
+      getVectorOfRefs - overloaded function. Retrieves the attribute in the
+   current position as a vector of PObject
+
+   PARAMETERS
+      any - AnyData
+      vect- reference to vector of PObject (OUT parameter).
+
+   DESCRIPTION
+   Retrieves the attribute in the current position as a vector
+   of PObject
+   The attribute at the current position should be a collection
+   type (varray or nested table). The SQL type of the elements in
+   the collection should be compatible with PObject
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+
+ template <class T>
+ void getVectorOfRefs(const AnyData &any,
+                      OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   getVectorOfOCIRefs( any, vec_ref);
+
+   vect.clear();
+   unsigned int size = vec_ref.size();
+   vect.reserve( size );
+   const Connection *sess = any.getConnection();
+
+   for (unsigned int i=0; i< size; i++)
+   {
+     if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+   }
+ }
+
+/*-----------------------setVectorOfRefs for Ref<T>--------------------------*/
+/*
+   NAME
+     setVectorOfRefs - overloaded function. sets the attribute in the current
+   position of anydata with the vector elements.
+
+   PARAMETERS
+      none.
+
+   DESCRIPTION
+      sets the attribute in the current position in anydata with the
+   vector elements.
+  The attribute in the current position of anydata should be a
+  collection type. If the collection type is a varray, the input vector
+  size should be equal to the size of the varray. Also the SQL type of
+  the collection's elements should be compatible with PObject.
+
+   RETURNS
+     nothing.
+
+   NOTES
+     compatible SQL types : SQLT_NTY  (user defined types).
+*/
+
+ template <class T>
+ void setVectorOfRefs(AnyData &any, 
+                      const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+
+   unsigned int size= vect.size();
+   vec_ref.reserve( size );
+   vec_ind.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+   {
+      vec_ref.push_back( vect[i].getRef() );
+      vec_ind.push_back(vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+   }
+   setVectorOfOCIRefs( any, vec_ref, vec_ind);
+
+ }
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif                                              /* OCCIOBJECTS_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/sdk/include/oci.h b/sdk/include/oci.h
new file mode 100644
index 0000000..3735893
--- /dev/null
+++ b/sdk/include/oci.h
@@ -0,0 +1,3066 @@
+/* Copyright (c) 1995, 2011, Oracle and/or its affiliates. 
+All rights reserved. */
+ 
+/* 
+   NAME 
+     oci.h - V8 Oracle Call Interface public definitions
+
+   DESCRIPTION 
+     This file defines all the constants and structures required by a V8
+     OCI programmer.
+
+   RELATED DOCUMENTS 
+     V8 OCI Functional Specification 
+     Oracle Call Interface Programmer's Guide Vol 1 and 2
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     None
+
+   PRIVATE FUNCTION(S) 
+     None
+ 
+   EXAMPLES 
+ 
+   NOTES 
+
+
+   MODIFIED   (MM/DD/YY)
+   umabhat     05/29/11 - Backport umabhat_bug-10209825 from main
+   slari       03/24/11 - add OCI_ATTR_RESERVED_438 and OCI_ATTR_RESERVED_439
+   rphillip    09/28/10 - Bug 9835605: recnum changes
+   rphillip    08/03/09 - Bug 8720046: add OCI_ATTR_DIRPATH_USE_ACTIVE_TRANS
+   mbastawa    03/15/10 - add OCI_FETCH_RESERVED_6
+   ebatbout    12/28/09 - 8465341: Add OCI_ATTR_DIRPATH_RESERVED_22
+   ssahu       04/15/09 - Add user handle as an attribute to session pool
+                          handle
+   dalpern     03/17/09 - bug 7646876: applying_crossedition_trigger
+   kneel       11/21/08 - bump OCI version to 11.2
+   thoang      09/24/08 - include ocixstream.h 
+   asohi       08/25/08 - Bug 7320582 : AQ dequeue navigation flags fix
+   thoang      08/04/08 - Add XStream attributes 
+   msowdaga    07/23/08 - Add flag OCI_SESSGET_SYSDBA
+   rphillip    03/21/08 - Add partition memory attribute
+   nikeda      04/15/08 - Support OCIP_ATTR_CONTYPE
+   mbastawa    12/24/07 - add server, envhp attributes
+   slynn       03/18/08 - 
+   amullick    02/11/08 - add support for OCILobGet/SetContentType
+   tbhosle     01/07/08 - add OCI_ATTR_SUBSCR_IPADDR
+   nikeda      12/19/07 - Add OCI_SUBSCR_QOS_HAREG
+   rphillip    10/22/07 - Add OCI_ATTR_DIRPATH_NO_INDEX_ERRORS
+   debanerj    12/14/07 - Added OCI_ATTR_RESERVED_38 and OCI_ATTR_RESERVED_39
+   umabhat     09/20/07 - bug6119750 added OCI_FNCODE_APPCTXSET &
+                          OCI_FNCODE_APPCTXCLEARALL
+   debanerj    04/10/07 - XDS Attributes
+   msakayed    05/24/07 - Bug #5095734: add OCI_ATTR_DIRPATH_RESERVED_19
+   schoi       03/02/07 - Get/SetOptions API change
+   ebatbout    03/30/07 - 5598333: Add OCI_ATTR_DIRPATH_RESERVED_18
+   nikeda      03/21/07 - Add OCI_ATTR_RESERVED_37 
+   abande      03/06/07 - Remove attributes for global stmt cache and 
+                          metadata cache
+   rphillip    02/20/07 - Add OCI_ATTR_DIRPATH_RESERVED_17
+   shan        11/16/06 - bug 5595911.
+   msakayed    12/04/06 - Bug #5660845: add OCI_DIRPATH_INPUT_OCI
+   gviswana    10/26/06 - Remove OCI_ATTR_CURRENT_EDITION
+   maramali    09/29/06 - bug 5568492, added OCI_NLS_LOCALE_A2_ISO_2_ORA
+   gviswana    09/29/06 - CURRENT_EDITION -> EDITION
+   aramappa    09/20/06 - Update major and minor version information
+   slynn       07/28/06 - Migrate to new 11g LOB terminiology
+   debanerj    07/20/06 - Add OCI_ATTR_LOBPREFETCH_LENGTH
+   mbastawa    06/25/06 - add OCI_ATTR_RESERVED_36
+   hqian       05/22/06 - 11gR1 proj-18303: add OCI_SYSASM 
+   dkogan      04/06/06 - disable charset validation by default 
+   jhealy      05/15/06 - Add TimesTen OCI adapter. 
+   slynn       06/20/06 - GetSharedRegions
+   rthammai    06/13/06 - add reserved attribute 
+   msakayed    06/15/06 - Project 20586: interval partitioning support 
+   debanerj    10/25/05 - LOB prefetch
+   slynn       05/25/06 - New NG Lob Functionality. 
+   yujwang     05/16/06 - Add OCI_ATTR_RESERVED_33, OCI_ATTR_RESERVED_34
+   abande      04/25/06 - 18297: Add attributes for global stmt cache and 
+                          metadata cache 
+   ssvemuri    04/26/06 - Constants for Query Notification support
+   jgiloni     05/05/06 - Add OCI_ATCH_RESERVED_7 
+   mxyang      02/01/06 - Added OCI_ATTR_CURRENT_EDITION attribute
+   hqian       05/04/06 - new runtime capability attribute for asm volume
+   nikeda      06/06/06 - OCI_TT: Add new OCIP attributes 
+   aramappa    04/17/06 - Added OCI_FNCODE_ARRAYDESCRIPTORALLOC and 
+                          OCI_FNCODE_ARRAYDESCRIPTORFREE 
+   debanerj    05/04/06 - 18313: OCI Net Fusion
+   rupsingh    05/26/06 - 
+   jacao       05/11/06 - 
+   absaxena    04/17/06 - add notification grouping attributes
+   rpingte     02/02/06 - add OCI_ATCH_RESERVED_6
+   rpingte     04/27/06 - Add OCI_ATTR_DRIVER_NAME
+   jawilson    02/14/06 - add OCI_FNCODE_AQENQSTREAM
+   kneel       04/03/06 - Adding support in kjhn for critical severity 
+   rphillip    03/31/06 - Add OCI_ATTR_DIRPATH_RESERVED_14 
+   mxyang      02/01/06 - Added OCI_ATTR_APPLICATION_EDITION attribute
+   rphillip    01/30/06 - Add new DPAPI attrs 
+   ebatbout    11/03/05 - Add direct path support for multiple subtypes
+   porangas    02/22/06 - 5055398: Define OCI_STMT_CALL
+   mbastawa    01/31/06 - add OCI_ATTR_RESERVED_26
+   yohu        01/27/06 - align Execution Modes macros
+   sjanardh    01/25/06 - add OCI_EXEC_RESERVED_6 
+   sichandr    01/18/06 - add OCI_ATTR_XMLTYPE_BINARY_XML 
+   yohu        12/22/05 - add OCI_TRANS_PROMOTE
+   srseshad    09/12/05 - stmtcache: callback 
+   krajan      10/25/05 - Added ENABLE_BEQUEATH attach flag
+   mbastawa    09/16/05 - dbhygiene
+   porangas    07/20/04 - 1175350: adding attribute for ognfd
+   chliang     06/30/05 - add OCI_SUPPRESS_NLS_VALIDATION mode
+   aahluwal    03/15/05 - [Bug 4235014]:add ASM, Preconnect events 
+   ssappara    08/12/04 - Bug3669429 add OCI_ATTR_DESC_SYNBAS
+   absaxena    03/24/05 - remove OCI_AQ_RESERVED_5 
+   mbastawa    03/01/05 - add OCI_EXEC_RESERVED_5 
+   msakayed    02/15/05 - Bug #3147299: Add OCI_ATTR_CURRENT_ERRCOL
+   aahluwal    01/11/05 - [Bug 3944589]: add OCI_AUTH_RESERVED_5 
+   nikeda      11/15/04 - Add OCIP_IIO 
+   rvissapr    11/10/04 - bug 3843644 - isencrypted 
+   hohung      11/22/04 - add OCI_BIND_RESERVED_3
+   cchui       10/25/04 - add OCI_ATTR_PROXY_CLIENT 
+   aahluwal    09/27/04 - add incarnation, reason, cardinality to event handle 
+   msakayed    09/14/04 - column encryption support (project id 5578) 
+   jacao       08/17/04 - Add OCI_ATTR_DB_CHARSET_ID 
+   mhho        08/29/04 - resolve conflicting mode declaration
+   sgollapu    05/28/04 - Add OCI_AUTH_RESERVED_3 
+   mbastawa    08/05/04 - add OCI_ATTR_RESERVED_21
+   ebatbout    07/27/04 - add OCI_ATTR_DIRPATH_RESERVED_9 and move all direct
+                          path attributes into a separate area in this file.
+   clei        06/29/04 - add OCI_ATTR_ENCC_SIZE
+   weiwang     05/06/04 - add OCIAQListenOpts and OCIAQLisMsgProps 
+   weiwang     04/30/04 - add OCI_AQ_RESERVED_5
+   nbhatt      04/27/04 - add new attribute 
+   ssvemuri    06/19/04 -  change notification descriptors and attributes
+   ksurlake    06/01/04 - grabtrans 'ksurlake_txn_skmishra_clone' 
+   ksurlake    05/13/04 - add subscriber handle attributes
+   mbastawa    06/01/04 - add 3 more OCI_FETCH_RESERVED modes
+   chliang     05/28/04 - add nchar literal replacement modes
+   nikeda      05/14/04 - [OLS on RAC] new authentication mode 
+   debanerj    05/17/04 - 13064: add fncodes for LOB array Read and Write
+   nikeda      05/20/04 - [OCI Events] Add incarnation, cardinality,reason 
+   nikeda      05/18/04 - [OCI Events] Add OCI_ATTR_SERVICENAME 
+   nikeda      05/17/04 - Add event handle 
+   nikeda      05/13/04 - [OCI Events] Rename HACBK->EVTCBK, HACTX->EVTCTX 
+   nikeda      05/10/04 - [OCI Events] code review changes 
+   nikeda      04/15/04 - [OCI Events] OCI_SESSRLS_DROPSESS_FORCE 
+   nikeda      04/12/04 - [OCI Events] Add OCI_ATTR_USER_MEMORY 
+   aahluwal    04/12/04 - add OCI_HNDLFR_RESERVED5 
+   vraja       04/28/04 - add options for redo sync on commit 
+   aahluwal    05/29/04 - [OCI Events]: add support for svc, svc member events 
+   nikeda      05/28/04 - grabtrans 'nikeda_oci_events_copy' 
+   nikeda      05/18/04 - [OCI Events] Add OCI_ATTR_SERVICENAME 
+   nikeda      05/17/04 - Add event handle 
+   nikeda      05/13/04 - [OCI Events] Rename HACBK->EVTCBK, HACTX->EVTCTX 
+   nikeda      05/10/04 - [OCI Events] code review changes 
+   nikeda      04/15/04 - [OCI Events] OCI_SESSRLS_DROPSESS_FORCE 
+   nikeda      04/12/04 - [OCI Events] Add OCI_ATTR_USER_MEMORY 
+   aahluwal    04/12/04 - add OCI_HNDLFR_RESERVED5 
+   jciminsk    04/28/04 - merge from RDBMS_MAIN_SOLARIS_040426 
+   jacao       03/06/04 - add OCI_ATTR_CURRENT_SCHEMA 
+   aahluwal    01/20/04 - remove OCI_KEEP_FETCH_STATE
+   aahluwal    03/25/04 - [OCI Events] add OCI_HTYPE_HAEVENT and related attrs 
+   nikeda      03/19/04 - [OCI Events] Add OCI_ATTR_HACBK and OCI_ATTR_HACTX 
+   dfrumkin    12/04/03 - Add database startup/shutdown
+   chliang     12/22/03 - grid/main merge: add OCI_ATTR_RESERVED_20 
+   jciminsk    12/12/03 - merge from RDBMS_MAIN_SOLARIS_031209 
+   sgollapu    09/19/03 - Add fetch modes 
+   sgollapu    07/30/03 - Add TSM attributes
+   sgollapu    06/26/03 - Add OCI_MUTEX_TRY
+   aime        06/23/03 - sync grid with main
+   sgollapu    06/07/03 - Add reserved attribute
+   sgollapu    06/05/03 - Add reserved auth flag
+   rpingte     05/22/03 - Add OCI_ATCH_RESERVED_5
+   sgollapu    05/06/03 - Add TSM attributes
+   sgollapu    04/10/03 - Session migration Flags/interfaces
+   dfrumkin    04/23/04 - add OCI_PREP2_RESERVED_1
+   rpingte     05/06/04 - add major and minor version information
+   bsinha      04/06/04 - add new OCI_TRANS flag
+   chliang     11/26/03 - add OCI_ATTR_RESERVED_19 
+   preilly     10/23/03 - Make OCI_ATTR_DIRPATH_METADATA_BUF private 
+   chliang     08/07/03 - add OCI_ATTR_SKIP_BUFFER
+   srseshad    03/12/03 - convert public oci api to ansi
+   weiwang     05/14/03 - remove iot creation for rule sets
+   rkoti       04/15/03 - [2746515] add fntcodes for Unlimited size LOB 6003
+   tcruanes    05/13/03 - add slave SQL OCI execution mode
+   rkoti       02/21/03 - [2761455] add OCI_FNCODE_AQENQARRAY,
+                          OCI_FNCODE_AQDEQARRAY and update OCI_FNCODE_MAXFCN
+   tkeefe      01/29/03 - bug-2773794: Add new interface for setting Kerb attrs
+   aahluwal    02/06/03 - add OCI_ATTR_TRANSFORMATION_NO
+   weiwang     12/05/02 - add OCI_ATTR_USER_PROPERTY
+   ataracha    01/03/03 - include ocixmldb.h
+   preilly     12/05/02 - Add wait attribute for locking when using dir path
+   tkeefe      01/03/03 - bug-2623771: Added OCI_ATTR_KERBEROS_KEY
+   lchidamb    12/13/02 - end-to-end tracing attributes
+   msakayed    10/28/02 - Bug #2643907: add OCI_ATTR_DIRPATH_SKIPINDEX_METHOD
+   rphillip    11/13/02 - Add OCIP_ATTR_DIRPATH_INDEX
+   sagrawal    10/13/02 - liniting
+   sagrawal    10/03/02 - PL/SQL Compiler warnings
+   jstenois    11/07/02 - remove ocixad.h
+   chliang     10/21/02 - add OCI_ATTR_RESERVED_16,17
+   hsbedi      10/30/02 - grabtrans 'jstenois_fix_xt_convert'
+   aahluwal    10/12/02 - add OCI_ATTR_AQ_NUM_E_ERRORS/OCI_ATTR_AQ_ERROR_INDEX
+   bdagevil    10/21/02 - add SQL analyze internal exec mode
+   csteinba    10/11/02 - add OCI_ATTR_RESERVED_16
+   chliang     10/12/02 - add bind row callback attributes
+   preilly     10/25/02 - Add new reserved parameters
+   tkeefe      10/31/02 - bug-2623771: Added OCI_ATTR_AUDIT_SESSION_ID
+   csteinba    10/04/02 - Add OCI_ATTR_RESERVED_15
+   mhho        10/11/02 - add new credential constant
+   thoang      09/25/02 - Add OCI_XMLTYPE_CREATE_CLOB
+   skaluska    10/07/02 - describe rules objects
+   csteinba    09/16/02 - Remove OCI_CACHE
+   gtarora     10/03/02 - OCI_ATTR_COL_SUBS => OCI_ATTR_OBJ_SUBS
+   msakayed    09/09/02 - Bug #2482469: add OCI_ATTR_DIRPATH_RESERVED_[3-6]
+   aahluwal    08/30/02 - adding dequeue across txn group
+   srseshad    04/24/02 - Add attribute OCI_ATTR_SPOOL_STMTCACHESIZE.
+   ebatbout    07/22/02 - Remove OCI_ATTR_RESERVED_11.
+   abande      01/17/02 - Bug 1788921; Add external attribute.
+   aahluwal    06/04/02 - bug 2360115
+   pbagal      05/24/02 - Incorporate review comments
+   pbagal      05/22/02 - Introduce instance type attribute.
+   whe         07/01/02 - add OCI_BIND_DEFINE_SOFT flags
+   gtarora     07/01/02 - Add OCI_ATTR_COL_SUBS
+   tkeefe      05/30/02 - Add support for new proxy authentication credentials
+   dgprice     12/18/01 - bug 2102779 add reserved force describe
+   schandir    11/19/01 - add/modify modes.
+   schandir    11/15/01 - add OCI_SPC_STMTCACHE.
+   schandir    12/06/01 - change mode value of OCI_SPOOL.
+   msakayed    11/02/01 - Bug #2094292: add OCI_ATTR_DIRPATH_INPUT
+   dsaha       11/09/01 - add OCI_DTYPE_RESERVED1
+   skabraha    11/05/01 - new method flag
+   skabraha    10/25/01 - another flag for XML
+   skabraha    10/11/01 - describe flags for subtypes
+   nbhatt      09/18/01 - new reserved AQ flags
+   celsbern    10/19/01 - merge LOG to MAIN
+   ksurlake    10/12/01 - add OCI_ATTR_RESERVED_13
+   ksurlake    08/13/01 - add OCI_ATTR_RESERVED_12
+   schandir    09/24/01 - Adding stmt caching
+   abande      09/04/01 - Adding session pooling
+   sagrawal    10/23/01 - add new bit for OCIPHandleFree
+   preilly     10/25/01 - Add support for specifying metadata on DirPathCtx
+   skabraha    09/24/01 - describe flags for XML type
+   schandir    09/24/01 - Adding stmt caching
+   abande      09/04/01 - Adding session pooling
+   stakeda     09/17/01 - add OCI_NLS_CHARSET_ID
+   whe         09/19/01 - add OCIXMLType create options
+   rpingte     09/11/01 - add OCI_MUTEX_ENV_ONLY and OCI_NO_MUTEX_STMT
+   cmlim       08/28/01 - mod datecache attrs to use same naming as dpapi attrs
+   wzhang      08/24/01 - Add new keywords for OCINlsNameMap.
+   rphillip    05/02/01 - Add date cache attributes
+   rphillip    08/22/01 - Add new stream version
+   ebatbout    04/13/01 - add definition, OCI_ATTR_RESERVED_11
+   chliang     04/12/01 - add shortnames for newer oci funcation
+   wzhang      04/11/01 - Add new OCI NLS constants.
+   cmlim       04/13/01 - remove attrs not used by dpapi (151 & 152 avail)
+   rkambo      03/23/01 - bugfix 1421793
+   cmlim       04/02/01 - remove OCI_ATTR_DIRPATH_{NESTED_TBL, SUBST_OBJ_TBL}
+                        - note: attribute #s 186 & 205 available
+   whe         03/28/01 - add OCI_AFC_PAD_ON/OFF mode
+   preilly     03/05/01 - Add stream versioning support to DirPath context
+   schandir    12/18/00 - remove attr CONN_INCR_DELAY.
+   schandir    12/12/00 - change mode from OCI_POOL to OCI_CPOOL.
+   cbarclay    01/12/01 - add atribute for OCIP_ATTR_TMZ
+   whe         01/07/01 - add attributes related to UTF16 env mode
+   slari       12/29/00 - add blank line
+   slari       12/28/00 - OCI_ATTR_RESERVED_10
+   whe         12/19/00 - add OCI_ENVCR_RESERVED3
+   rpang       11/29/00 - Added OCI_ATTR_ORA_DEBUG_JDWP attribute
+   cmlim       11/28/00 - support substitutable object tables in dpapi
+   akatti      10/09/00 - [198379]:add OCIRowidToChar
+   sgollapu    10/11/00 - Add OCI_PREP_RESERVED_1
+   sgollapu    08/27/00 - add attribute to get erroneous column
+   sgollapu    07/29/00 - Add snapshot attributes
+   kmohan      09/18/00 - add OCI_FNCODE_LOGON2
+   abrumm      10/08/00 - include ocixad.h
+   mbastawa    10/04/00 - add OCI_ATTR_ROWS_FETCHED
+   nbhatt      08/24/00 - add transformation attribute
+   dmwong      08/22/00 - OCI_ATTR_CID_VALUE -> OCI_ATTR_CLIENT_IDENTIFIER.
+   cmlim       08/30/00 - add OCI_ATTR_DIRPATH_SID
+   dsaha       08/18/00 - add OCI_ATTR_RESERVED_5
+   amangal     08/17/00 - Merge into 8.2 : 1194361
+   slari       08/03/00 - add OCI_ATTR_HANDLE_POSITION
+   dsaha       07/20/00 - 2rt exec
+   sgollapu    07/04/00 - Add virtual session flag
+   cmlim       07/07/00 - add OCI_ATTR_DIRPATH_OID, OCI_ATTR_DIRPATH_NESTED_TBL
+   etucker     07/28/00 - add OCIIntervalFromTZ
+   rwessman    06/26/00 - N-tier: added new credential attributes
+   whe         07/27/00 - add OCI_UTF16 mode
+   vjayaram    07/18/00 - add connection pooling changes
+   etucker     07/12/00 - add dls apis
+   cmlim       07/07/00 - add OCI_ATTR_DIRPATH_OID, OCI_ATTR_DIRPATH_NESTED_TBL
+   sgollapu    07/04/00 - Add virtual session flag
+   najain      05/01/00 - AQ Signature support
+   sgollapu    06/14/00 - Add reserved OCI mode
+   rkambo      06/08/00 - notification presentation support
+   sagrawal    06/04/00 - ref cursor to c
+   ksurlake    06/07/00 - define OCI_POOL
+   mbastawa    06/05/00 - added scrollable cursor attributes
+   weiwang     03/31/00 - add LDAP support
+   whe         05/30/00 - add OCI_ATTR_MAXCHAR_SIZE
+   whe         05/23/00 - validate OCI_NO_CACHE mode
+   dsaha       02/02/00 - Add no-cache attr in statement handle
+   whe         05/23/00 - add OCIP_ICACHE
+   allee       05/17/00 - describe support for JAVA implmented TYPE
+   preilly     05/30/00 - Continue adding support for objects in direct path lo
+   cmlim       05/16/00 - 8.2 dpapi support of ADTs
+   rxgovind    05/04/00 - OCIAnyDataSet changes
+   rkasamse    05/25/00 - add OCIAnyDataCtx
+   rmurthy     04/26/00 - describe support for inheritance
+   ksurlake    04/18/00 - Add credential type
+   whe         05/24/00 - add OCI_ATTR_CHAR_ attrs
+   rkambo      04/19/00 - subscription enhancement
+   rmurthy     04/26/00 - describe support for inheritance
+   delson      03/28/00 - add OCI_ATTR_RESERVED_2
+   abrumm      03/31/00 - external table support
+   rkasamse    03/13/00 - add declarations for OCIAnyData
+   najain      02/24/00 - support for dequeue as select
+   dsaha       03/10/00 - Add OCI_ALWAYS_BLOCKING
+   esoyleme    04/25/00 - separated transactions
+   sgollapu    12/23/99 - OCIServerAttach extensions
+   slari       08/23/99 - add OCI_DTYPE_UCB
+   slari       08/20/99 - add OCI_UCBTYPE_REPLACE
+   hsbedi      08/31/99 - Memory Stats .
+   sgollapu    08/02/99 - oci sql routing
+   slari       08/06/99 - rename values for OCI_SERVER_STATUS
+   slari       08/02/99 - add OCI_ATTR_SERVER_STATUS
+   tnbui       07/28/99 - Remove OCI_DTYPE_TIMESTAMP_ITZ                       
+   amangal     07/19/99 - Merge into 8.1.6 : bug 785797
+   tnbui       07/07/99 - Change ADJUSTMENT modes                              
+   dsaha       07/07/99 - OCI_SAHRED_EXT
+   dmwong      06/08/99 - add OCI_ATTR_APPCTX_*
+   vyanaman    06/23/99 -
+   vyanaman    06/21/99 - Add new OCI Datetime and Interval descriptors
+   esoyleme    06/29/99 - expose MTS performance enhancements                  
+   rshaikh     04/23/99 - add OCI_SQL_VERSION_*
+   tnbui       05/24/99 - Remove OCIAdjStr                                     
+   dsaha       05/21/99 - Add OCI_ADJUST_UNK
+   mluong      05/17/99 - fix merge
+   tnbui       04/05/99 - ADJUSTMENT values
+   abrumm      04/16/99 - dpapi: more attributes
+   dsaha       02/24/99 - Add OCI_SHOW_DML_WARNINGS
+   jiyang      12/07/98 - Add OCI_NLS_DUAL_CURRENCY
+   slari       12/07/98 - change OCI_NOMUTEX to OCI_NO_MUTEX
+   aroy        11/30/98 - change OCI_NOCALLBACK to OCI_NO_UCB
+   aroy        11/13/98 - add env modes to process modes
+   slari       09/08/98 - add OCI_FNCODE_SVC2HST and _SVCRH
+   aroy        09/04/98 - Add OCI_ATTR_MIGSESSION
+   skray       08/14/98 - server groups for session switching
+   mluong      08/11/98 - add back OCI_HTYPE_LAST.
+   aroy        05/25/98 - add process handle type                              
+   aroy        04/06/98 - add shared mode                                      
+   slari       07/13/98 -  merge forward to 8.1.4
+   slari       07/09/98 -  add OCI_BIND_RESERVED_2
+   slari       07/08/98 -  add OCI_EXACT_FETCH_RESERVED_1
+   dsaha       07/07/98 -  Add OCI_PARSE_ONLY
+   dsaha       06/29/98 -  Add OCI_PARSE_ONLY
+   slari       07/01/98 -  add OCI_BIND_RESERVED_2
+   sgollapu    06/25/98 -  Fix bug 683565
+   slari       06/17/98 -  remove OC_FETCH_RESERVED_2
+   slari       06/11/98 -  add OCI_FETCH_RESERVED_1 and 2
+   jhasenbe    05/27/98 -  Remove definitions for U-Calls (Unicode)
+   jiyang      05/18/98 - remove OCI_ATTR_CARTLANG
+   nbhatt      05/20/98 -  OCI_DEQ_REMOVE_NODATA
+   nbhatt      05/19/98 - correct AQ opcode
+   skmishra    05/06/98 - Add precision attribute to Attributes list
+   aroy        04/20/98 - merge forward 8.0.5 -> 8.1.3
+   schandra    05/01/98 - OCI sender id
+   sgollapu    02/19/98 - enhanced array DML
+   nbhatt      05/15/98 -  AQ listen call
+   sgollapu    04/27/98 - more attributes
+   skaluska    04/06/98 - Add OCI_PTYPE_SCHEMA, OCI_PTYPE_DATABASE
+   slari       04/28/98 - add OCI_ATTR_PDPRC
+   lchidamb    05/05/98 - change OCI_NAMESPACE_AQ to 1
+   nbhatt      04/27/98 - AQ Notification Descriptor
+   abrumm      06/24/98 - more direct path attributes
+   abrumm      05/27/98 - OCI direct path interface support
+   abrumm      05/08/98 - OCI direct path interface support
+   lchidamb    03/02/98 - client notification additions
+   kkarun      04/17/98 - Add more Interval functions
+   vyanaman    04/16/98 - Add get/set TZ
+   kkarun      04/14/98 - Add OCI Datetime shortnames
+   vyanaman    04/13/98 - Add OCI DateTime and Interval check error codes
+   kkarun      04/07/98 - Add OCI_DTYPE_DATETIME and OCI_DTYPE_INTERVAL
+   esoyleme    12/15/97 - support failover callback retry
+   esoyleme    04/22/98 - merge support for failover callback retry
+   mluong      04/16/98 - add OCI_FNCODE_LOBLOCATORASSIGN
+   rkasamse    04/17/98 - add short names for OCIPickler(Memory/Ctx) cart servi
+   slari       04/10/98 - add OCI_FNCODE_SVCCTXTOLDA
+   slari       04/09/98 - add OCI_FNCODE_RESET
+   slari       04/07/98 - add OCI_FNCODE_LOBFILEISOPEN
+   slari       04/06/98 - add OCI_FNCODE_LOBOPEN
+   slari       03/20/98 - change OCI_CBTYPE_xxx to OCI_UCBTYPE_xxx
+   slari       03/18/98 - add OCI_FNCODE_MAXFCN
+   slari       02/12/98 - add OCI_ENV_NO_USRCB
+   skabraha    04/09/98 - adding shortnames for OCIFile
+   rhwu        04/03/98 - Add short names for the OCIThread package
+   tanguyen    04/03/98 - add OCI_ATTR_xxxx for type inheritance
+   rkasamse    04/02/98 - add OCI_ATTR_UCI_REFRESH
+   nramakri    04/01/98 - Add short names for the OCIExtract package
+   ewaugh      03/31/98 - Add short names for the OCIFormat package.
+   jhasenbe    04/06/98 - Add definitions for U-Calls (Unicode)
+                          (OCI_TEXT, OCI_UTEXT, OCI_UTEXT4)
+   skmishra    03/03/98 - Add OCI_ATTR_PARSE_ERROR_OFFSET
+   rwessman    03/11/98 - Added OCI_CRED_PROXY for proxy authentication
+   abrumm      03/31/98 - OCI direct path interface support
+   nmallava    03/03/98 - add constants for temp lob apis
+   skotsovo    03/05/98 - resolve merge conflicts
+   skotsovo    02/24/98 - add OCI_DTYPE_LOC
+   skaluska    01/21/98 - Add OCI_ATTR_LTYPE
+   rkasamse    01/06/98 - add OCI_ATTR* for obj cache enhancements
+   dchatter    01/08/98 - more comments
+   skabraha    12/02/97 - moved oci1.h to the front of include files.
+   jiyang      12/18/97 - Add OCI_NLS_MAX_BUFSZ
+   rhwu        12/02/97 - move oci1.h up
+   ewaugh      12/15/97 - Add short names for the OCIFormat package.
+   rkasamse    12/02/97 - Add a constant for memory cartridge services -- OCI_M
+   nmallava    12/31/97 - open/close for internal lobs
+   khnguyen    11/27/97 - add OCI_ATTR_LFPRECISION, OCI_ATTR_FSPRECISION
+   rkasamse    11/03/97 - add types for pickler cartridge services
+   mluong      11/20/97 - changed ubig_ora to ub4 per skotsovo
+   ssamu       11/14/97 - add oci1.h
+   jiyang      11/13/97 - Add NLS service for cartridge
+   esoyleme    12/15/97 - support failover callback retry
+   jwijaya     10/21/97 - change OCILobOffset/Length from ubig_ora to ub4
+   cxcheng     07/28/97 - fix compile with SLSHORTNAME
+   schandra    06/25/97 - AQ OCI interface
+   sgollapu    07/25/97 - Add OCI_ATTR_DESC_PUBLIC
+   cxcheng     06/16/97 - add OCI_ATTR_TDO
+   skotsovo    06/05/97 - add fntcodes for lob buffering subsystem
+   esoyleme    05/13/97 - move failover callback prototype
+   skmishra    05/06/97 - stdc compiler fixes
+   skmishra    04/22/97 - Provide C++ compatibility
+   lchidamb    04/19/97 - add OCI_ATTR_SESSLANG
+   ramkrish    04/15/97 - Add OCI_LOB_BUFFER_(NO)FREE
+   sgollapu    04/18/97 - Add OCI_ATTR_TABLESPACE
+   skaluska    04/17/97 - Add OCI_ATTR_SUB_NAME
+   schandra    04/10/97 - Use long OCI names
+   aroy        03/27/97 - add OCI_DTYPE_FILE
+   sgollapu    03/26/97 - Add OCI_OTYPEs
+   skmishra    04/09/97 - Added constant OCI_ROWID_LEN
+   dchatter    03/21/97 - add attr OCI_ATTR_IN_V8_MODE
+   lchidamb    03/21/97 - add OCI_COMMIT_ON_SUCCESS execution mode
+   skmishra    03/20/97 - Added OCI_ATTR_LOBEMPTY
+   sgollapu    03/19/97 - Add OCI_ATTR_OVRLD_ID
+   aroy        03/17/97 - add postprocessing callback
+   sgollapu    03/15/97 - Add OCI_ATTR_PARAM
+   cxcheng     02/07/97 - change OCI_PTYPE codes for type method for consistenc
+   cxcheng     02/05/97 - add OCI_PTYPE_TYPE_RESULT
+   cxcheng     02/04/97 - rename OCI_PTYPE constants to be more consistent
+   cxcheng     02/03/97 - add OCI_ATTR, OCI_PTYPE contants for describe type
+   esoyleme    01/23/97 - merge neerja callback
+   sgollapu    12/30/96 - Remove OCI_DTYPE_SECURITY
+   asurpur     12/26/96 - CHanging OCI_NO_AUTH to OCI_AUTH
+   sgollapu    12/23/96 - Add more attrs to COL, ARG, and SEQ
+   sgollapu    12/12/96 - Add OCI_DESCRIBE_ONLY
+   slari       12/11/96 - change prototype of OCICallbackInBind
+   nbhatt      12/05/96 - "callback"
+   lchidamb    11/19/96 - handle subclassing
+   sgollapu    11/09/96 - OCI_PATTR_*
+   dchatter    11/04/96 - add attr OCI_ATTR_CHRCNT
+   mluong      11/01/96 - test
+   cxcheng     10/31/96 - add #defines for OCILobLength etc
+   dchatter    10/31/96 - add lob read write call back fp defs
+   dchatter    10/30/96 - more changes
+   rhari       10/30/96 - Include ociextp.h at the very end
+   lchidamb    10/22/96 - add fdo attribute for bind/server handle
+   dchatter    10/22/96 - change attr defn for prefetch parameters & lobs/file
+                          calls
+   slari       10/21/96 - add OCI_ENV_NO_MUTEX
+   rhari       10/25/96 - Include ociextp.h
+   rxgovind    10/25/96 - add OCI_LOBMAXSIZE, remove OCI_FILE_READWRITE
+   sgollapu    10/24/96 - Correct OCILogon and OCILogoff
+   sgollapu    10/24/96 - Correct to OCILogon and OCILogoff
+   sgollapu    10/21/96 - Add ocilon and ociloff
+   skaluska    10/31/96 - Add OCI_PTYPE values
+   sgollapu    10/17/96 - correct OCI_ATTR_SVCCTX to OCI_ATTR_SERVER
+   rwessman    10/16/96 - Added security functions and fixed olint errors.
+   sthakur     10/14/96 - add more COR attributes
+   cxcheng     10/14/96 - re-enable LOB functions
+   sgollapu    10/10/96 - Add ocibdp and ocibdn
+   slari       10/07/96 - add back OCIRowid
+   aroy        10/08/96 -  add typedef ocibfill for PRO*C
+   mluong      10/11/96 - replace OCI_ATTR_CHARSET* with OCI_ATTR_CHARSET_*
+   cxcheng     10/10/96 - temporarily take out #define for lob functions
+   sgollapu    10/02/96 - Rename OCI functions and datatypes
+   skotsovo    10/01/96 - move orl lob fnts to oci
+   aroy        09/10/96 - fix merge errors
+   aroy        08/19/96 - NCHAR support
+   jboonleu    09/05/96 - add OCI attributes for object cache
+   dchatter    08/20/96 - HTYPE ranges from 1-50; DTYPE from 50-255
+   slari       08/06/96 - define OCI_DTYPE_ROWID
+   sthakur     08/14/96 - complex object support
+   schandra    06/17/96 - Convert XA to use new OCI
+   abrik       08/15/96 - OCI_ATTR_HEAPALLOC added
+   aroy        07/17/96 - terminology change: ocilobd => ocilobl
+   aroy        07/03/96 - add lob typedefs for Pro*C
+   slari       06/28/96 - add OCI_ATTR_STMT_TYPE
+   lchidamb    06/26/96 - reorg #ifndef
+   schandra    05/31/96 - attribute types for internal and external client name
+   asurpur     05/30/96 - Changing the value of mode
+   schandra    05/18/96 - OCI_TRANS_TWOPHASE -> 0x00000001 to 0x00100000
+   slari       05/30/96 - add callback function prototypes
+   jbellemo    05/23/96 - remove ociisc
+   schandra    04/23/96 - loosely-coupled branches
+   asurpur     05/15/96 - New mode for ocicpw
+   aroy        04/24/96 - making ocihandles opaque
+   slari       04/18/96 - add missing defines
+   schandra    03/27/96 - V8OCI - add transaction related calls
+   dchatter    04/01/96 - add OCI_FILE options
+   dchatter    03/21/96 - add oci2lda conversion routines
+   dchatter    03/07/96 - add OCI piece definition
+   slari       03/12/96 - add describe attributes
+   slari       03/12/96 - add OCI_OTYPE_QUERY
+   aroy        02/28/96 - Add column attributes
+   slari       02/09/96 - add OCI_OBJECT
+   slari       02/07/96 - add OCI_HYTPE_DSC
+   aroy        01/10/96 - adding function code defines...
+   dchatter    01/03/96 - define OCI_NON_BLOCKING
+   dchatter    01/02/96 - Add Any descriptor
+   dchatter    01/02/96 - Add Select List descriptor
+   dchatter    12/29/95 - V8 OCI definitions
+   dchatter    12/29/95 - Creation
+
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef ORATYPES 
+#include <oratypes.h> 
+#endif
+ 
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+# define OCI_ORACLE
+
+ 
+/*--------------------------------------------------------------------------- 
+ Short names provided for platforms which do not allow extended symbolic names 
+  ---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+/* Translation of the long function/type names to short names for IBM only */
+/* maybe lint will use this too */
+#define OCISessionEnd              ocitac
+#define OCIResultSetToStmt         ocirs2sh
+#define OCISessionBegin            ociauth
+#define OCIServerAttach            ociatch
+#define OCIDescriptorAlloc         ocigdesc
+#define OCIServerDetach            ocidtch
+#define OCIDescriptorFree          ocifdesc
+#define OCIServerVersion           ocivers
+#define OCIDescribeAny             ocidsca
+#define OCIBindDynamic             ocibda
+#define OCIBindByName              ocibdn
+#define OCIBindByPos               ocibdp
+#define OCIErrorGet                ocigdr
+#define OCIBindArrayOfStruct       ocibsa
+#define OCIEnvInit                 ociinit
+#define OCIBindObject              ocibndt
+#define OCIHandleAlloc             ocighndl
+#define OCIHandleFree              ocifhndl
+#define OCIRowidToChar             ociri2c
+#ifdef NEVER
+#define OCIStmtBindByPos           ocibndp
+#define OCIStmtBindByName          ocibndn
+#endif
+#define OCIAttrGet                 ocigattr
+#define OCIDefineByPos             ocidfne
+#define OCIAttrSet                 ocisattr
+#define OCIDefineDynamic           ociddf
+#define OCILdaToSvcCtx             ocild2sv
+#define OCIDefineArrayOfStruct     ocidarr
+#define OCIInitialize              ocipi
+#define OCIDefineObject            ocidndt
+#define OCIStmtExecute             ociexec
+#define OCILobAppend               ocilfap
+#define OCILobOpenFile             ocifopn
+#define OCILobCloseFile            ocifcls
+#define OCILobLocator              ocilobd
+#define OCILobGetDeduplicateRegions ocilgshr
+#define OCILobRegion               ocilregd
+#define OCILobCopy                 ocilfcp
+#define OCILobFileCreate           ocifcrt
+#define OCILobFileDelete           ocifdel
+#define OCILobGetLength            ocilfln
+#define OCILobWrite                ocilfwr
+#define OCILobRead                 ocilfrd
+#define OCILobErase                ocilfer
+#define OCILobTrim                 ocilftr
+#define OCILobSetOptions           ocinglso
+#define OCILobGetOptions           ocinglgo
+#define OCILobFragmentInsert       ocinglfi
+#define OCILobFragmentDelete       ocinglfd
+#define OCILobFragmentMove         ocinglfm
+#define OCILobFragmentReplace      ocinglfr
+#define OCILobSetContentType       ocinglsct
+#define OCILobGetContentType       ocinglgct
+
+#define OCIStmtFetch               ocifch
+#define OCIStmtGetBindInfo         ocigbp
+#define OCIStmtGetPieceInfo        ocigpi
+#define OCIStmtPrepare             ocireq
+#define OCIStmtSetPieceInfo        ocispi
+#define OCISvcCtxToLda             ocisv2ld
+#define OCITransCommit             ocitxcm
+#define OCITransDetach             ocitxdt
+#define OCITransForget             ocitxfgt
+#define OCITransPrepare            ocitxpre
+#define OCITransRollback           ocitxrl
+#define OCIPasswordChange          ocicpw
+#define OCITransStart              ocitxst
+#define OCITransMultiPrepare       ocitxmp
+
+#define OCIBreak                   ocibreak
+#define OCIParamGet                ocigparm
+#define OCIParamSet                ocisparm
+
+#define OCISecurityOpenWallet           ocizwOpenWallet
+#define OCISecurityCloseWallet          ocizwCloseWallet
+#define OCISecurityCreateWallet         ocizwCreateWallet
+#define OCISecurityDestroyWallet        ocizwDestroyWallet
+#define OCISecurityStorePersona         ocizeStorePersona
+#define OCISecurityOpenPersona          ocizeOpenPersona
+#define OCISecurityClosePersona         ocizeClosePersona
+#define OCISecurityRemovePersona        ocizeRemovePersona
+#define OCISecurityCreatePersona        ocizeCreatePersona
+#define OCISecuritySetProtection        ocizeSetProtection
+#define OCISecurityGetProtection        ocizeGetProtection
+#define OCISecurityRemoveIdentity       ociziRemoveIdentity
+#define OCISecurityCreateIdentity       ociziCreateIdentity
+#define OCISecurityAbortIdentity        ociziAbortIdentity
+#define OCISecurityFreeIdentity         ociziFreeIdentity
+#define OCISecurityStoreTrustedIdentity ociziStoreTrustedIdentity
+#define OCISecuritySign                 ocizSign
+#define OCISecuritySignExpansion        ocizxSignExpansion
+#define OCISecurityVerify               ocizVerify
+#define OCISecurityValidate             ocizValidate
+#define OCISecuritySignDetached         ocizsd_SignDetached
+#define OCISecuritySignDetExpansion     ocizxsd_SignDetachedExpansion
+#define OCISecurityVerifyDetached       ocizved_VerifyDetached
+#define OCISecurity_PKEncrypt           ocizkec_PKEncrypt
+#define OCISecurityPKEncryptExpansion   ocizxkec_PKEncryptExpansion
+#define OCISecurityPKDecrypt            ocizkdc_PKDecrypt
+#define OCISecurityEncrypt              ocizEncrypt
+#define OCISecurityEncryptExpansion     ocizxEncryptExpansion
+#define OCISecurityDecrypt              ocizDecrypt
+#define OCISecurityEnvelope             ocizEnvelope
+#define OCISecurityDeEnvelope           ocizDeEnvelope
+#define OCISecurityKeyedHash            ocizKeyedHash
+#define OCISecurityKeyedHashExpansion   ocizxKeyedHashExpansion
+#define OCISecurityHash                 ocizHash
+#define OCISecurityHashExpansion        ocizxHashExpansion
+#define OCISecuritySeedRandom           ocizSeedRandom
+#define OCISecurityRandomBytes          ocizrb_RandomBytes
+#define OCISecurityRandomNumber         ocizrn_RandomNumber
+#define OCISecurityInitBlock            ocizibInitBlock
+#define OCISecurityReuseBlock           ocizrbReuseBlock
+#define OCISecurityPurgeBlock           ocizpbPurgeBlock
+#define OCISecuritySetBlock             ocizsbSetBlock
+#define OCISecurityGetIdentity          ocizgi_GetIdentity
+
+#define OCIExtractInit             ocixeini
+#define OCIExtractTerm             ocixetrm
+#define OCIExtractReset            ocixerst
+#define OCIExtractSetNumKeys       ocixesnk
+#define OCIExtractSetKey           ocixesk
+#define OCIExtractFromFile         ocixeff
+#define OCIExtractFromStr          ocixefs
+#define OCIExtractToInt            ocixeti
+#define OCIExtractToBool           ocixetb
+#define OCIExtractToStr            ocixets
+#define OCIExtractToOCINum         ocixeton
+#define OCIExtractToList           ocixetl
+#define OCIExtractFromList         ocixefl
+
+#define OCIDateTimeGetTime         ocidt01_GetTime
+#define OCIDateTimeGetDate         ocidt02_GetDate
+#define OCIDateTimeGetTimeZoneOffset     ocidt03_GetTZ
+#define OCIDateTimeSysTimeStamp    ocidt07_SysTS
+#define OCIDateTimeAssign          ocidt08_Assign 
+#define OCIDateTimeToText          ocidt09_ToText
+#define OCIDateTimeFromText        ocidt10_FromText
+#define OCIDateTimeCompare         ocidt11_Compare
+#define OCIDateTimeCheck           ocidt12_Check
+#define OCIDateTimeConvert         ocidt13_Convert
+#define OCIDateTimeSubtract        ocidt14_Subtract
+#define OCIDateTimeIntervalAdd     ocidt15_IntervalAdd
+#define OCIDateTimeIntervalSub     ocidt16_IntervalSub
+#define OCIDateTimeGetTimeZoneName ocidt17_Gettzname
+#define OCIDateTimeToArray         ocidt18_ToArray  
+#define OCIDateTimeFromArray       ocidt19_FromArray
+
+#define OCIIntervalSubtract        ociint01_Subtract  
+#define OCIIntervalAdd             ociint02_Add  
+#define OCIIntervalMultiply        ociint03_Multiply  
+#define OCIIntervalDivide          ociint04_Divide  
+#define OCIIntervalCompare         ociint05_Compare  
+#define OCIIntervalFromText        ociint06_FromText  
+#define OCIIntervalToText          ociint07_ToText  
+#define OCIIntervalToNumber        ociint08_ToNumber  
+#define OCIIntervalCheck           ociint09_Check  
+#define OCIIntervalAssign          ociint10_Assign  
+#define OCIIntervalGetYearMonth    ociint11_GetYearMonth
+#define OCIIntervalSetYearMonth    ociint12_SetYearMonth
+#define OCIIntervalGetDaySecond    ociint13_GetDaySecond
+#define OCIIntervalSetDaySecond    ociint14_SetDaySecond
+#define OCIIntervalFromNumber      ociint15_FromNumber
+#define OCIIntervalFromTZ          ociint16_FromTZ 
+
+#define OCIFormatInit              ocixs01_Init
+#define OCIFormatString            ocixs02_Format
+#define OCIFormatTerm              ocixs03_Term
+#define OCIFormatTUb1              ocixs04_TUb1
+#define OCIFormatTUb2              ocixs05_TUb2
+#define OCIFormatTUb4              ocixs06_TUb4
+#define OCIFormatTUword            ocixs07_TUword
+#define OCIFormatTUbig_ora         ocixs08_TUbig_ora
+#define OCIFormatTSb1              ocixs09_TSb1
+#define OCIFormatTSb2              ocixs10_TSb2
+#define OCIFormatTSb4              ocixs11_TSb4
+#define OCIFormatTSword            ocixs12_TSword
+#define OCIFormatTSbig_ora         ocixs13_TSbig_ora
+#define OCIFormatTEb1              ocixs14_TEb1
+#define OCIFormatTEb2              ocixs15_TEb2
+#define OCIFormatTEb4              ocixs16_TEb4
+#define OCIFormatTEword            ocixs17_TEword
+#define OCIFormatTChar             ocixs18_TChar
+#define OCIFormatTText             ocixs19_TText
+#define OCIFormatTDouble           ocixs20_TDouble
+#define OCIFormatTDvoid            ocixs21_TDvoid
+#define OCIFormatTEnd              ocixs22_TEnd
+
+#define OCIFileInit                ocifinit
+#define OCIFileTerm                ocifterm
+#define OCIFileOpen                ocifopen
+#define OCIFileClose               ocifclose
+#define OCIFileRead                ocifread
+#define OCIFileWrite               ocifwrite
+#define OCIFileSeek                ocifseek
+#define OCIFileExists              ocifexists
+#define OCIFileGetLength           ocifglen
+#define OCIFileFlush               ocifflush
+
+
+/* OCIThread short name */
+#define OCIThreadProcessInit       ocitt01_ProcessInit
+#define OCIThreadInit              ocitt02_Init
+#define OCIThreadTerm              ocitt03_Term
+#define OCIThreadIsMulti           ocitt04_IsMulti
+#define OCIThreadMutexInit         ocitt05_MutexInit
+#define OCIThreadMutexDestroy      ocitt06_MutexDestroy
+#define OCIThreadMutexAcquire      ocitt07_MutexAcquire
+#define OCIThreadMutexRelease      ocitt08_MutexRelease
+#define OCIThreadKeyInit           ocitt09_KeyInit
+#define OCIThreadKeyDestroy        ocitt10_KeyDestroy
+#define OCIThreadKeyGet            ocitt11_KeyGet
+#define OCIThreadKeySet            ocitt12_KeySet
+#define OCIThreadIdInit            ocitt13_IdInit
+#define OCIThreadIdDestroy         ocitt14_IdDestroy
+#define OCIThreadIdSet             ocitt15_IdSet
+#define OCIThreadIdSetNull         ocitt16_IdSetNull
+#define OCIThreadIdGet             ocitt17_IdGet
+#define OCIThreadIdSame            ocitt18_IdSame
+#define OCIThreadIdNull            ocitt19_IdNull
+#define OCIThreadHndInit           ocitt20_HndInit
+#define OCIThreadHndDestroy        ocitt21_HndDestroy
+#define OCIThreadCreate            ocitt22_Create
+#define OCIThreadJoin              ocitt23_Join
+#define OCIThreadClose             ocitt24_Close
+#define OCIThreadHandleGet         ocitt25_HandleGet
+
+/* Translation between the old and new datatypes */
+
+#define OCISession                 ociusrh
+#define OCIBind                    ocibndh
+#define OCIDescribe                ocidsch
+#define OCIDefine                  ocidfnh
+#define OCIEnv                     ocienvh
+#define OCIError                   ocierrh
+
+#define OCICPool                   ocicpool
+
+#define OCISPool                   ocispool
+#define OCIAuthInfo                ociauthinfo
+
+
+#define OCILob                     ocilobd
+#define OCILobLength               ocillen
+#define OCILobMode                 ocilmo
+#define OCILobOffset               ociloff
+
+#define OCILobLocator              ocilobd
+#define OCIBlobLocator             ociblobl
+#define OCIClobLocator             ociclobl
+#define OCILobRegion               ocilregd
+#define OCIBFileLocator            ocibfilel
+
+#define OCIParam                   ocipard
+#define OCIResult                  ocirstd
+#define OCISnapshot                ocisnad
+#define OCIServer                  ocisrvh
+#define OCIStmt                    ocistmh
+#define OCISvcCtx                  ocisvch
+#define OCITrans                   ocitxnh
+#define OCICallbackInBind          ocibicfp
+#define OCICallbackOutBind         ocibocfp
+#define OCICallbackDefine          ocidcfp
+#define OCICallbackLobRead         ocilrfp
+#define OCICallbackLobWrite        ocilwfp
+#define OCICallbackLobGetDededuplicateRegions ocilgshr
+#define OCISecurity                ociossh
+#define OCIComplexObject           ocicorh
+#define OCIComplexObjectComp       ocicord
+#define OCIRowid                   ociridd
+
+#define OCIAQDeq                   ociaqdeq                  
+#define OCIAQEnq                   ociaqenq
+#define OCIConnectionPoolCreate    ociconpc
+#define OCIConnectionPoolDestroy   ociconpd
+#define OCIEnvCreate               ocienvct
+#define OCILobAssign               ociloass
+#define OCILobCharSetForm          ocilocfm
+#define OCILobCharSetId            ocilocid
+#define OCILobDisableBuffering     ocilodbf
+#define OCILobEnableBuffering      ociloebf
+#define OCILobFileClose            ocilofcl
+#define OCILobFileCloseAll         ocilofca
+#define OCILobFileExists           ocilofex
+#define OCILobFileGetName          ocilofgn
+#define OCILobFileIsOpen           ocifiopn
+#define OCILobFileOpen             ocilofop
+#define OCILobFileSetName          ocilofsn
+#define OCILobFlushBuffer          ocilofbf
+#define OCILobIsEqual              ociloieq
+#define OCILobLoadFromFile         ocilolff
+#define OCILobLocatorIsInit        ocilolii
+#define OCILobLocatorAssign        ocilolas
+#define OCILogon                   ocilogon
+#define OCILogon2                  ocilgon2
+#define OCILogoff                  ocilgoff
+#endif /* ifdef SLSHORTNAME */
+
+/*--------------------------------------------------------------------------- 
+                     PUBLIC TYPES AND CONSTANTS 
+  ---------------------------------------------------------------------------*/
+
+/*-----------------------------Handle Types----------------------------------*/
+                                           /* handle types range from 1 - 49 */
+#define OCI_HTYPE_FIRST          1             /* start value of handle type */
+#define OCI_HTYPE_ENV            1                     /* environment handle */
+#define OCI_HTYPE_ERROR          2                           /* error handle */
+#define OCI_HTYPE_SVCCTX         3                         /* service handle */
+#define OCI_HTYPE_STMT           4                       /* statement handle */
+#define OCI_HTYPE_BIND           5                            /* bind handle */
+#define OCI_HTYPE_DEFINE         6                          /* define handle */
+#define OCI_HTYPE_DESCRIBE       7                        /* describe handle */
+#define OCI_HTYPE_SERVER         8                          /* server handle */
+#define OCI_HTYPE_SESSION        9                  /* authentication handle */
+#define OCI_HTYPE_AUTHINFO      OCI_HTYPE_SESSION  /* SessionGet auth handle */
+#define OCI_HTYPE_TRANS         10                     /* transaction handle */
+#define OCI_HTYPE_COMPLEXOBJECT 11        /* complex object retrieval handle */
+#define OCI_HTYPE_SECURITY      12                        /* security handle */
+#define OCI_HTYPE_SUBSCRIPTION  13                    /* subscription handle */
+#define OCI_HTYPE_DIRPATH_CTX   14                    /* direct path context */
+#define OCI_HTYPE_DIRPATH_COLUMN_ARRAY 15        /* direct path column array */
+#define OCI_HTYPE_DIRPATH_STREAM       16              /* direct path stream */
+#define OCI_HTYPE_PROC                 17                  /* process handle */
+#define OCI_HTYPE_DIRPATH_FN_CTX       18    /* direct path function context */
+#define OCI_HTYPE_DIRPATH_FN_COL_ARRAY 19          /* dp object column array */
+#define OCI_HTYPE_XADSESSION    20                  /* access driver session */
+#define OCI_HTYPE_XADTABLE      21                    /* access driver table */
+#define OCI_HTYPE_XADFIELD      22                    /* access driver field */
+#define OCI_HTYPE_XADGRANULE    23                  /* access driver granule */
+#define OCI_HTYPE_XADRECORD     24                   /* access driver record */
+#define OCI_HTYPE_XADIO         25                      /* access driver I/O */
+#define OCI_HTYPE_CPOOL         26                 /* connection pool handle */
+#define OCI_HTYPE_SPOOL         27                    /* session pool handle */
+#define OCI_HTYPE_ADMIN         28                           /* admin handle */
+#define OCI_HTYPE_EVENT         29                        /* HA event handle */
+
+#define OCI_HTYPE_LAST          29            /* last value of a handle type */
+
+/*---------------------------------------------------------------------------*/
+
+
+/*-------------------------Descriptor Types----------------------------------*/
+                                    /* descriptor values range from 50 - 255 */
+#define OCI_DTYPE_FIRST 50                 /* start value of descriptor type */
+#define OCI_DTYPE_LOB 50                                     /* lob  locator */
+#define OCI_DTYPE_SNAP 51                             /* snapshot descriptor */
+#define OCI_DTYPE_RSET 52                           /* result set descriptor */
+#define OCI_DTYPE_PARAM 53  /* a parameter descriptor obtained from ocigparm */
+#define OCI_DTYPE_ROWID  54                              /* rowid descriptor */
+#define OCI_DTYPE_COMPLEXOBJECTCOMP  55
+                                      /* complex object retrieval descriptor */
+#define OCI_DTYPE_FILE 56                                /* File Lob locator */
+#define OCI_DTYPE_AQENQ_OPTIONS 57                        /* enqueue options */
+#define OCI_DTYPE_AQDEQ_OPTIONS 58                        /* dequeue options */
+#define OCI_DTYPE_AQMSG_PROPERTIES 59                  /* message properties */
+#define OCI_DTYPE_AQAGENT 60                                     /* aq agent */
+#define OCI_DTYPE_LOCATOR 61                                  /* LOB locator */
+#define OCI_DTYPE_INTERVAL_YM 62                      /* Interval year month */
+#define OCI_DTYPE_INTERVAL_DS 63                      /* Interval day second */
+#define OCI_DTYPE_AQNFY_DESCRIPTOR  64               /* AQ notify descriptor */
+#define OCI_DTYPE_DATE 65                            /* Date */
+#define OCI_DTYPE_TIME 66                            /* Time */
+#define OCI_DTYPE_TIME_TZ 67                         /* Time with timezone */
+#define OCI_DTYPE_TIMESTAMP 68                       /* Timestamp */
+#define OCI_DTYPE_TIMESTAMP_TZ 69                /* Timestamp with timezone */
+#define OCI_DTYPE_TIMESTAMP_LTZ 70             /* Timestamp with local tz */
+#define OCI_DTYPE_UCB           71               /* user callback descriptor */
+#define OCI_DTYPE_SRVDN         72              /* server DN list descriptor */
+#define OCI_DTYPE_SIGNATURE     73                              /* signature */
+#define OCI_DTYPE_RESERVED_1    74              /* reserved for internal use */
+#define OCI_DTYPE_AQLIS_OPTIONS 75                      /* AQ listen options */
+#define OCI_DTYPE_AQLIS_MSG_PROPERTIES 76             /* AQ listen msg props */
+#define OCI_DTYPE_CHDES         77     /* Top level change notification desc */
+#define OCI_DTYPE_TABLE_CHDES   78      /* Table change descriptor           */
+#define OCI_DTYPE_ROW_CHDES     79       /* Row change descriptor            */
+#define OCI_DTYPE_CQDES  80                       /* Query change descriptor */
+#define OCI_DTYPE_LOB_REGION    81            /* LOB Share region descriptor */
+#define OCI_DTYPE_LAST          81        /* last value of a descriptor type */
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------------LOB types ---------------------------------*/
+#define OCI_TEMP_BLOB 1                /* LOB type - BLOB ------------------ */
+#define OCI_TEMP_CLOB 2                /* LOB type - CLOB ------------------ */
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------Object Ptr Types----------------------------------*/
+#define OCI_OTYPE_NAME 1                                      /* object name */
+#define OCI_OTYPE_REF  2                                       /* REF to TDO */
+#define OCI_OTYPE_PTR  3                                       /* PTR to TDO */
+/*---------------------------------------------------------------------------*/
+
+/*=============================Attribute Types===============================*/
+/* 
+   Note: All attributes are global.  New attibutes should be added to the end
+   of the list. Before you add an attribute see if an existing one can be 
+   used for your handle. 
+
+   If you see any holes please use the holes first. 
+ 
+*/
+/*===========================================================================*/
+
+
+#define OCI_ATTR_FNCODE  1                          /* the OCI function code */
+#define OCI_ATTR_OBJECT   2 /* is the environment initialized in object mode */
+#define OCI_ATTR_NONBLOCKING_MODE  3                    /* non blocking mode */
+#define OCI_ATTR_SQLCODE  4                                  /* the SQL verb */
+#define OCI_ATTR_ENV  5                            /* the environment handle */
+#define OCI_ATTR_SERVER 6                               /* the server handle */
+#define OCI_ATTR_SESSION 7                        /* the user session handle */
+#define OCI_ATTR_TRANS   8                         /* the transaction handle */
+#define OCI_ATTR_ROW_COUNT   9                  /* the rows processed so far */
+#define OCI_ATTR_SQLFNCODE 10               /* the SQL verb of the statement */
+#define OCI_ATTR_PREFETCH_ROWS  11    /* sets the number of rows to prefetch */
+#define OCI_ATTR_NESTED_PREFETCH_ROWS 12 /* the prefetch rows of nested table*/
+#define OCI_ATTR_PREFETCH_MEMORY 13         /* memory limit for rows fetched */
+#define OCI_ATTR_NESTED_PREFETCH_MEMORY 14   /* memory limit for nested rows */
+#define OCI_ATTR_CHAR_COUNT  15 
+                    /* this specifies the bind and define size in characters */
+#define OCI_ATTR_PDSCL   16                          /* packed decimal scale */
+#define OCI_ATTR_FSPRECISION OCI_ATTR_PDSCL   
+                                          /* fs prec for datetime data types */
+#define OCI_ATTR_PDPRC   17                         /* packed decimal format */
+#define OCI_ATTR_LFPRECISION OCI_ATTR_PDPRC 
+                                          /* fs prec for datetime data types */
+#define OCI_ATTR_PARAM_COUNT 18       /* number of column in the select list */
+#define OCI_ATTR_ROWID   19                                     /* the rowid */
+#define OCI_ATTR_CHARSET  20                      /* the character set value */
+#define OCI_ATTR_NCHAR   21                                    /* NCHAR type */
+#define OCI_ATTR_USERNAME 22                           /* username attribute */
+#define OCI_ATTR_PASSWORD 23                           /* password attribute */
+#define OCI_ATTR_STMT_TYPE   24                            /* statement type */
+#define OCI_ATTR_INTERNAL_NAME   25             /* user friendly global name */
+#define OCI_ATTR_EXTERNAL_NAME   26      /* the internal name for global txn */
+#define OCI_ATTR_XID     27           /* XOPEN defined global transaction id */
+#define OCI_ATTR_TRANS_LOCK 28                                            /* */
+#define OCI_ATTR_TRANS_NAME 29    /* string to identify a global transaction */
+#define OCI_ATTR_HEAPALLOC 30                /* memory allocated on the heap */
+#define OCI_ATTR_CHARSET_ID 31                           /* Character Set ID */
+#define OCI_ATTR_CHARSET_FORM 32                       /* Character Set Form */
+#define OCI_ATTR_MAXDATA_SIZE 33       /* Maximumsize of data on the server  */
+#define OCI_ATTR_CACHE_OPT_SIZE 34              /* object cache optimal size */
+#define OCI_ATTR_CACHE_MAX_SIZE 35   /* object cache maximum size percentage */
+#define OCI_ATTR_PINOPTION 36             /* object cache default pin option */
+#define OCI_ATTR_ALLOC_DURATION 37
+                                 /* object cache default allocation duration */
+#define OCI_ATTR_PIN_DURATION 38        /* object cache default pin duration */
+#define OCI_ATTR_FDO          39       /* Format Descriptor object attribute */
+#define OCI_ATTR_POSTPROCESSING_CALLBACK 40
+                                         /* Callback to process outbind data */
+#define OCI_ATTR_POSTPROCESSING_CONTEXT 41
+                                 /* Callback context to process outbind data */
+#define OCI_ATTR_ROWS_RETURNED 42
+               /* Number of rows returned in current iter - for Bind handles */
+#define OCI_ATTR_FOCBK        43              /* Failover Callback attribute */
+#define OCI_ATTR_IN_V8_MODE   44 /* is the server/service context in V8 mode */
+#define OCI_ATTR_LOBEMPTY     45                              /* empty lob ? */
+#define OCI_ATTR_SESSLANG     46                  /* session language handle */
+
+#define OCI_ATTR_VISIBILITY             47                     /* visibility */
+#define OCI_ATTR_RELATIVE_MSGID         48            /* relative message id */
+#define OCI_ATTR_SEQUENCE_DEVIATION     49             /* sequence deviation */
+
+#define OCI_ATTR_CONSUMER_NAME          50                  /* consumer name */
+#define OCI_ATTR_DEQ_MODE               51                   /* dequeue mode */
+#define OCI_ATTR_NAVIGATION             52                     /* navigation */
+#define OCI_ATTR_WAIT                   53                           /* wait */
+#define OCI_ATTR_DEQ_MSGID              54             /* dequeue message id */
+
+#define OCI_ATTR_PRIORITY               55                       /* priority */
+#define OCI_ATTR_DELAY                  56                          /* delay */
+#define OCI_ATTR_EXPIRATION             57                     /* expiration */
+#define OCI_ATTR_CORRELATION            58                 /* correlation id */
+#define OCI_ATTR_ATTEMPTS               59                  /* # of attempts */
+#define OCI_ATTR_RECIPIENT_LIST         60                 /* recipient list */
+#define OCI_ATTR_EXCEPTION_QUEUE        61           /* exception queue name */
+#define OCI_ATTR_ENQ_TIME               62 /* enqueue time (only OCIAttrGet) */
+#define OCI_ATTR_MSG_STATE              63/* message state (only OCIAttrGet) */
+                                                   /* NOTE: 64-66 used below */
+#define OCI_ATTR_AGENT_NAME             64                     /* agent name */
+#define OCI_ATTR_AGENT_ADDRESS          65                  /* agent address */
+#define OCI_ATTR_AGENT_PROTOCOL         66                 /* agent protocol */
+#define OCI_ATTR_USER_PROPERTY          67                  /* user property */
+#define OCI_ATTR_SENDER_ID              68                      /* sender id */
+#define OCI_ATTR_ORIGINAL_MSGID         69            /* original message id */
+
+#define OCI_ATTR_QUEUE_NAME             70                     /* queue name */
+#define OCI_ATTR_NFY_MSGID              71                     /* message id */
+#define OCI_ATTR_MSG_PROP               72             /* message properties */
+
+#define OCI_ATTR_NUM_DML_ERRORS         73       /* num of errs in array DML */
+#define OCI_ATTR_DML_ROW_OFFSET         74        /* row offset in the array */
+
+              /* AQ array error handling uses DML method of accessing errors */
+#define OCI_ATTR_AQ_NUM_ERRORS          OCI_ATTR_NUM_DML_ERRORS
+#define OCI_ATTR_AQ_ERROR_INDEX         OCI_ATTR_DML_ROW_OFFSET
+
+#define OCI_ATTR_DATEFORMAT             75     /* default date format string */
+#define OCI_ATTR_BUF_ADDR               76                 /* buffer address */
+#define OCI_ATTR_BUF_SIZE               77                    /* buffer size */
+
+/* For values 78 - 80, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_NUM_ROWS               81 /* number of rows in column array */
+                                  /* NOTE that OCI_ATTR_NUM_COLS is a column
+                                   * array attribute too.
+                                   */
+#define OCI_ATTR_COL_COUNT              82        /* columns of column array
+                                                     processed so far.       */
+#define OCI_ATTR_STREAM_OFFSET          83  /* str off of last row processed */
+#define OCI_ATTR_SHARED_HEAPALLOC       84    /* Shared Heap Allocation Size */
+
+#define OCI_ATTR_SERVER_GROUP           85              /* server group name */
+
+#define OCI_ATTR_MIGSESSION             86   /* migratable session attribute */
+
+#define OCI_ATTR_NOCACHE                87                 /* Temporary LOBs */
+
+#define OCI_ATTR_MEMPOOL_SIZE           88                      /* Pool Size */
+#define OCI_ATTR_MEMPOOL_INSTNAME       89                  /* Instance name */
+#define OCI_ATTR_MEMPOOL_APPNAME        90               /* Application name */
+#define OCI_ATTR_MEMPOOL_HOMENAME       91            /* Home Directory name */
+#define OCI_ATTR_MEMPOOL_MODEL          92     /* Pool Model (proc,thrd,both)*/
+#define OCI_ATTR_MODES                  93                          /* Modes */
+
+#define OCI_ATTR_SUBSCR_NAME            94           /* name of subscription */
+#define OCI_ATTR_SUBSCR_CALLBACK        95            /* associated callback */
+#define OCI_ATTR_SUBSCR_CTX             96    /* associated callback context */
+#define OCI_ATTR_SUBSCR_PAYLOAD         97             /* associated payload */
+#define OCI_ATTR_SUBSCR_NAMESPACE       98           /* associated namespace */
+
+#define OCI_ATTR_PROXY_CREDENTIALS      99         /* Proxy user credentials */
+#define OCI_ATTR_INITIAL_CLIENT_ROLES  100       /* Initial client role list */
+
+#define OCI_ATTR_UNK              101                   /* unknown attribute */
+#define OCI_ATTR_NUM_COLS         102                   /* number of columns */
+#define OCI_ATTR_LIST_COLUMNS     103        /* parameter of the column list */
+#define OCI_ATTR_RDBA             104           /* DBA of the segment header */
+#define OCI_ATTR_CLUSTERED        105      /* whether the table is clustered */
+#define OCI_ATTR_PARTITIONED      106    /* whether the table is partitioned */
+#define OCI_ATTR_INDEX_ONLY       107     /* whether the table is index only */
+#define OCI_ATTR_LIST_ARGUMENTS   108      /* parameter of the argument list */
+#define OCI_ATTR_LIST_SUBPROGRAMS 109    /* parameter of the subprogram list */
+#define OCI_ATTR_REF_TDO          110          /* REF to the type descriptor */
+#define OCI_ATTR_LINK             111              /* the database link name */
+#define OCI_ATTR_MIN              112                       /* minimum value */
+#define OCI_ATTR_MAX              113                       /* maximum value */
+#define OCI_ATTR_INCR             114                     /* increment value */
+#define OCI_ATTR_CACHE            115   /* number of sequence numbers cached */
+#define OCI_ATTR_ORDER            116     /* whether the sequence is ordered */
+#define OCI_ATTR_HW_MARK          117                     /* high-water mark */
+#define OCI_ATTR_TYPE_SCHEMA      118                  /* type's schema name */
+#define OCI_ATTR_TIMESTAMP        119             /* timestamp of the object */
+#define OCI_ATTR_NUM_ATTRS        120                /* number of sttributes */
+#define OCI_ATTR_NUM_PARAMS       121                /* number of parameters */
+#define OCI_ATTR_OBJID            122       /* object id for a table or view */
+#define OCI_ATTR_PTYPE            123           /* type of info described by */
+#define OCI_ATTR_PARAM            124                /* parameter descriptor */
+#define OCI_ATTR_OVERLOAD_ID      125     /* overload ID for funcs and procs */
+#define OCI_ATTR_TABLESPACE       126                    /* table name space */
+#define OCI_ATTR_TDO              127                       /* TDO of a type */
+#define OCI_ATTR_LTYPE            128                           /* list type */
+#define OCI_ATTR_PARSE_ERROR_OFFSET 129                /* Parse Error offset */
+#define OCI_ATTR_IS_TEMPORARY     130          /* whether table is temporary */
+#define OCI_ATTR_IS_TYPED         131              /* whether table is typed */
+#define OCI_ATTR_DURATION         132         /* duration of temporary table */
+#define OCI_ATTR_IS_INVOKER_RIGHTS 133                  /* is invoker rights */
+#define OCI_ATTR_OBJ_NAME         134           /* top level schema obj name */
+#define OCI_ATTR_OBJ_SCHEMA       135                         /* schema name */
+#define OCI_ATTR_OBJ_ID           136          /* top level schema object id */
+
+/* For values 137 - 141, see DirPathAPI attribute section in this file */
+
+
+#define OCI_ATTR_TRANS_TIMEOUT              142       /* transaction timeout */
+#define OCI_ATTR_SERVER_STATUS              143/* state of the server handle */
+#define OCI_ATTR_STATEMENT                  144 /* statement txt in stmt hdl */
+
+/* For value 145, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_DEQCOND                    146         /* dequeue condition */
+#define OCI_ATTR_RESERVED_2                 147                  /* reserved */
+
+  
+#define OCI_ATTR_SUBSCR_RECPT               148 /* recepient of subscription */
+#define OCI_ATTR_SUBSCR_RECPTPROTO          149    /* protocol for recepient */
+
+/* For values 150 - 151, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_LDAP_HOST       153              /* LDAP host to connect to */
+#define OCI_ATTR_LDAP_PORT       154              /* LDAP port to connect to */
+#define OCI_ATTR_BIND_DN         155                              /* bind DN */
+#define OCI_ATTR_LDAP_CRED       156       /* credentials to connect to LDAP */
+#define OCI_ATTR_WALL_LOC        157               /* client wallet location */
+#define OCI_ATTR_LDAP_AUTH       158           /* LDAP authentication method */
+#define OCI_ATTR_LDAP_CTX        159        /* LDAP adminstration context DN */
+#define OCI_ATTR_SERVER_DNS      160      /* list of registration server DNs */
+
+#define OCI_ATTR_DN_COUNT        161             /* the number of server DNs */
+#define OCI_ATTR_SERVER_DN       162                  /* server DN attribute */
+
+#define OCI_ATTR_MAXCHAR_SIZE               163     /* max char size of data */
+
+#define OCI_ATTR_CURRENT_POSITION           164 /* for scrollable result sets*/
+
+/* Added to get attributes for ref cursor to statement handle */
+#define OCI_ATTR_RESERVED_3                 165                  /* reserved */
+#define OCI_ATTR_RESERVED_4                 166                  /* reserved */
+
+/* For value 167, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_DIGEST_ALGO                168          /* digest algorithm */
+#define OCI_ATTR_CERTIFICATE                169               /* certificate */
+#define OCI_ATTR_SIGNATURE_ALGO             170       /* signature algorithm */
+#define OCI_ATTR_CANONICAL_ALGO             171    /* canonicalization algo. */
+#define OCI_ATTR_PRIVATE_KEY                172               /* private key */
+#define OCI_ATTR_DIGEST_VALUE               173              /* digest value */
+#define OCI_ATTR_SIGNATURE_VAL              174           /* signature value */
+#define OCI_ATTR_SIGNATURE                  175                 /* signature */
+
+/* attributes for setting OCI stmt caching specifics in svchp */
+#define OCI_ATTR_STMTCACHESIZE              176     /* size of the stm cache */
+
+/* --------------------------- Connection Pool Attributes ------------------ */
+#define OCI_ATTR_CONN_NOWAIT               178
+#define OCI_ATTR_CONN_BUSY_COUNT            179
+#define OCI_ATTR_CONN_OPEN_COUNT            180
+#define OCI_ATTR_CONN_TIMEOUT               181
+#define OCI_ATTR_STMT_STATE                 182
+#define OCI_ATTR_CONN_MIN                   183
+#define OCI_ATTR_CONN_MAX                   184
+#define OCI_ATTR_CONN_INCR                  185
+
+/* For value 187, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_NUM_OPEN_STMTS             188     /* open stmts in session */
+#define OCI_ATTR_DESCRIBE_NATIVE            189  /* get native info via desc */
+
+#define OCI_ATTR_BIND_COUNT                 190   /* number of bind postions */
+#define OCI_ATTR_HANDLE_POSITION            191 /* pos of bind/define handle */
+#define OCI_ATTR_RESERVED_5                 192                 /* reserverd */
+#define OCI_ATTR_SERVER_BUSY                193 /* call in progress on server*/
+
+/* For value 194, see DirPathAPI attribute section in this file */
+
+/* notification presentation for recipient */
+#define OCI_ATTR_SUBSCR_RECPTPRES           195
+#define OCI_ATTR_TRANSFORMATION             196 /* AQ message transformation */
+
+#define OCI_ATTR_ROWS_FETCHED               197 /* rows fetched in last call */
+
+/* --------------------------- Snapshot attributes ------------------------- */
+#define OCI_ATTR_SCN_BASE                   198             /* snapshot base */
+#define OCI_ATTR_SCN_WRAP                   199             /* snapshot wrap */
+
+/* --------------------------- Miscellanous attributes --------------------- */
+#define OCI_ATTR_RESERVED_6                 200                  /* reserved */
+#define OCI_ATTR_READONLY_TXN               201           /* txn is readonly */
+#define OCI_ATTR_RESERVED_7                 202                  /* reserved */
+#define OCI_ATTR_ERRONEOUS_COLUMN           203 /* position of erroneous col */
+#define OCI_ATTR_RESERVED_8                 204                  /* reserved */
+#define OCI_ATTR_ASM_VOL_SPRT               205     /* ASM volume supported? */
+
+/* For value 206, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_INST_TYPE                  207      /* oracle instance type */
+/******USED attribute 208 for  OCI_ATTR_SPOOL_STMTCACHESIZE*******************/
+
+#define OCI_ATTR_ENV_UTF16                  209     /* is env in utf16 mode? */
+#define OCI_ATTR_RESERVED_9                 210                  /* reserved */
+#define OCI_ATTR_RESERVED_10                211                  /* reserved */
+
+/* For values 212 and 213, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_RESERVED_12                214                  /* reserved */
+#define OCI_ATTR_RESERVED_13                215                  /* reserved */
+#define OCI_ATTR_IS_EXTERNAL                216 /* whether table is external */
+
+
+/* -------------------------- Statement Handle Attributes ------------------ */
+
+#define OCI_ATTR_RESERVED_15                217                  /* reserved */
+#define OCI_ATTR_STMT_IS_RETURNING          218 /* stmt has returning clause */
+#define OCI_ATTR_RESERVED_16                219                  /* reserved */
+#define OCI_ATTR_RESERVED_17                220                  /* reserved */
+#define OCI_ATTR_RESERVED_18                221                  /* reserved */
+
+/* --------------------------- session attributes ---------------------------*/
+#define OCI_ATTR_RESERVED_19                222                  /* reserved */
+#define OCI_ATTR_RESERVED_20                223                  /* reserved */
+#define OCI_ATTR_CURRENT_SCHEMA             224            /* Current Schema */
+#define OCI_ATTR_RESERVED_21                415                  /* reserved */
+
+/* ------------------------- notification subscription ----------------------*/
+#define OCI_ATTR_SUBSCR_QOSFLAGS            225                 /* QOS flags */
+#define OCI_ATTR_SUBSCR_PAYLOADCBK          226          /* Payload callback */
+#define OCI_ATTR_SUBSCR_TIMEOUT             227                   /* Timeout */
+#define OCI_ATTR_SUBSCR_NAMESPACE_CTX       228         /* Namespace context */
+#define OCI_ATTR_SUBSCR_CQ_QOSFLAGS         229
+                              /* change notification (CQ) specific QOS flags */
+#define OCI_ATTR_SUBSCR_CQ_REGID            230
+                                      /* change notification registration id */
+#define OCI_ATTR_SUBSCR_NTFN_GROUPING_CLASS        231/* ntfn grouping class */
+#define OCI_ATTR_SUBSCR_NTFN_GROUPING_VALUE        232/* ntfn grouping value */
+#define OCI_ATTR_SUBSCR_NTFN_GROUPING_TYPE         233 /* ntfn grouping type */
+#define OCI_ATTR_SUBSCR_NTFN_GROUPING_START_TIME   234/* ntfn grp start time */
+#define OCI_ATTR_SUBSCR_NTFN_GROUPING_REPEAT_COUNT 235 /* ntfn grp rep count */
+#define OCI_ATTR_AQ_NTFN_GROUPING_MSGID_ARRAY      236 /* aq grp msgid array */
+#define OCI_ATTR_AQ_NTFN_GROUPING_COUNT            237  /* ntfns recd in grp */
+
+/* ----------------------- row callback attributes ------------------------- */
+#define OCI_ATTR_BIND_ROWCBK                301         /* bind row callback */
+#define OCI_ATTR_BIND_ROWCTX                302 /* ctx for bind row callback */
+#define OCI_ATTR_SKIP_BUFFER                303  /* skip buffer in array ops */
+
+/* ----------------------- XStream API attributes -------------------------- */
+#define OCI_ATTR_XSTREAM_ACK_INTERVAL       350      /* XStream ack interval */
+#define OCI_ATTR_XSTREAM_IDLE_TIMEOUT       351      /* XStream idle timeout */
+
+/*-----  Db Change Notification (CQ) statement handle attributes------------ */
+#define OCI_ATTR_CQ_QUERYID               304
+/* ------------- DB Change Notification reg handle attributes ---------------*/
+#define OCI_ATTR_CHNF_TABLENAMES          401 /* out: array of table names   */
+#define OCI_ATTR_CHNF_ROWIDS              402     /* in: rowids needed */ 
+#define OCI_ATTR_CHNF_OPERATIONS          403
+                                        /* in: notification operation filter*/ 
+#define OCI_ATTR_CHNF_CHANGELAG           404
+                                           /* txn lag between notifications  */
+
+/* DB Change: Notification Descriptor attributes -----------------------*/
+#define OCI_ATTR_CHDES_DBNAME            405    /* source database    */
+#define OCI_ATTR_CHDES_NFYTYPE           406    /* notification type flags */
+#define OCI_ATTR_CHDES_XID               407    /* XID  of the transaction */
+#define OCI_ATTR_CHDES_TABLE_CHANGES     408/* array of table chg descriptors*/
+
+#define OCI_ATTR_CHDES_TABLE_NAME        409    /* table name */
+#define OCI_ATTR_CHDES_TABLE_OPFLAGS     410    /* table operation flags */
+#define OCI_ATTR_CHDES_TABLE_ROW_CHANGES 411   /* array of changed rows   */
+#define OCI_ATTR_CHDES_ROW_ROWID         412   /* rowid of changed row    */
+#define OCI_ATTR_CHDES_ROW_OPFLAGS       413   /* row operation flags     */
+
+/* Statement handle attribute for db change notification */
+#define OCI_ATTR_CHNF_REGHANDLE          414   /* IN: subscription handle  */
+#define OCI_ATTR_NETWORK_FILE_DESC       415   /* network file descriptor */
+
+/* client name for single session proxy */
+#define OCI_ATTR_PROXY_CLIENT            416
+
+/* 415 is already taken - see OCI_ATTR_RESERVED_21 */
+
+/* TDE attributes on the Table */
+#define OCI_ATTR_TABLE_ENC         417/* does table have any encrypt columns */
+#define OCI_ATTR_TABLE_ENC_ALG     418         /* Table encryption Algorithm */
+#define OCI_ATTR_TABLE_ENC_ALG_ID  419 /* Internal Id of encryption Algorithm*/
+
+/* -------- Attributes related to Statement cache callback ----------------- */
+#define OCI_ATTR_STMTCACHE_CBKCTX           420    /* opaque context on stmt */
+#define OCI_ATTR_STMTCACHE_CBK              421 /* callback fn for stmtcache */
+
+/*---------------- Query change descriptor attributes -----------------------*/
+#define OCI_ATTR_CQDES_OPERATION 422
+#define OCI_ATTR_CQDES_TABLE_CHANGES 423
+#define OCI_ATTR_CQDES_QUERYID 424
+
+
+#define OCI_ATTR_CHDES_QUERIES 425 /* Top level change desc array of queries */
+  
+/* Please use from 143 */
+
+/* -------- Internal statement attributes ------- */
+#define OCI_ATTR_RESERVED_26                422      
+
+/* 424 is used by OCI_ATTR_DRIVER_NAME */
+/* --------- Attributes added to support server side session pool ---------- */
+#define OCI_ATTR_CONNECTION_CLASS  425
+#define OCI_ATTR_PURITY            426
+
+#define OCI_ATTR_PURITY_DEFAULT    0x00
+#define OCI_ATTR_PURITY_NEW        0x01
+#define OCI_ATTR_PURITY_SELF       0x02
+
+/* -------- Attributes for Times Ten --------------------------*/
+#define OCI_ATTR_RESERVED_28               426                   /* reserved */
+#define OCI_ATTR_RESERVED_29               427                   /* reserved */
+#define OCI_ATTR_RESERVED_30               428                   /* reserved */
+#define OCI_ATTR_RESERVED_31               429                   /* reserved */
+#define OCI_ATTR_RESERVED_32               430                   /* reserved */
+#define OCI_ATTR_RESERVED_41               454                   /* reserved */
+
+
+/* ----------- Reserve internal attributes for workload replay  ------------ */
+#define OCI_ATTR_RESERVED_33               433
+#define OCI_ATTR_RESERVED_34               434
+
+/* statement attribute */
+#define OCI_ATTR_RESERVED_36               444
+
+/* -------- Attributes for Network Session Time Out--------------------------*/
+#define OCI_ATTR_SEND_TIMEOUT               435           /* NS send timeout */
+#define OCI_ATTR_RECEIVE_TIMEOUT            436        /* NS receive timeout */
+
+/*--------- Attributes related to LOB prefetch------------------------------ */
+#define OCI_ATTR_DEFAULT_LOBPREFETCH_SIZE     438   /* default prefetch size */
+#define OCI_ATTR_LOBPREFETCH_SIZE             439           /* prefetch size */
+#define OCI_ATTR_LOBPREFETCH_LENGTH           440 /* prefetch length & chunk */
+
+/*--------- Attributes related to LOB Deduplicate Regions ------------------ */
+#define OCI_ATTR_LOB_REGION_PRIMARY       442         /* Primary LOB Locator */
+#define OCI_ATTR_LOB_REGION_PRIMOFF       443     /* Offset into Primary LOB */ 
+#define OCI_ATTR_LOB_REGION_OFFSET        445               /* Region Offset */
+#define OCI_ATTR_LOB_REGION_LENGTH        446   /* Region Length Bytes/Chars */
+#define OCI_ATTR_LOB_REGION_MIME          447            /* Region mime type */
+
+/*--------------------Attribute to fetch ROWID ------------------------------*/
+#define OCI_ATTR_FETCH_ROWID                 448
+
+/* server attribute */
+#define OCI_ATTR_RESERVED_37              449
+
+/*------------------- Client Internal Attributes -----------------------*/
+#define OCI_ATTR_RESERVED_38           450
+#define OCI_ATTR_RESERVED_39           451
+
+/* --------------- ip address attribute in environment handle -------------- */
+#define OCI_ATTR_SUBSCR_IPADDR         452       /* ip address to listen on  */
+
+/* server attribute */
+#define OCI_ATTR_RESERVED_40           453  
+
+/* ------------- round trip callback attributes in the process  handle ----- */
+#define OCI_ATTR_RESERVED_458          458                       /* reserved */
+#define OCI_ATTR_RESERVED_459          459                       /* reserved */
+
+/* DB Change: Event types ---------------*/
+#define OCI_EVENT_NONE 0x0                                           /* None */
+#define OCI_EVENT_STARTUP 0x1                            /* Startup database */
+#define OCI_EVENT_SHUTDOWN 0x2                          /* Shutdown database */
+#define OCI_EVENT_SHUTDOWN_ANY 0x3                       /* Startup instance */
+#define OCI_EVENT_DROP_DB 0x4                            /* Drop database    */
+#define OCI_EVENT_DEREG 0x5                     /* Subscription deregistered */
+#define OCI_EVENT_OBJCHANGE 0x6                /* Object change notification */
+#define OCI_EVENT_QUERYCHANGE 0x7                     /* query result change */
+
+/* DB Change: Operation types -----------*/
+#define OCI_OPCODE_ALLROWS 0x1                      /* all rows invalidated  */
+#define OCI_OPCODE_ALLOPS 0x0                /* interested in all operations */
+#define OCI_OPCODE_INSERT 0x2                                     /*  INSERT */
+#define OCI_OPCODE_UPDATE 0x4                                     /*  UPDATE */
+#define OCI_OPCODE_DELETE 0x8                                      /* DELETE */
+#define OCI_OPCODE_ALTER 0x10                                       /* ALTER */
+#define OCI_OPCODE_DROP 0x20                                   /* DROP TABLE */
+#define OCI_OPCODE_UNKNOWN 0x40                           /* GENERIC/ UNKNOWN*/
+
+/* -------- client side character and national character set ids ----------- */
+#define OCI_ATTR_ENV_CHARSET_ID   OCI_ATTR_CHARSET_ID   /* charset id in env */
+#define OCI_ATTR_ENV_NCHARSET_ID  OCI_ATTR_NCHARSET_ID /* ncharset id in env */
+
+/* ----------------------- ha event callback attributes -------------------- */
+#define OCI_ATTR_EVTCBK                     304               /* ha callback */
+#define OCI_ATTR_EVTCTX                     305       /* ctx for ha callback */
+
+/* ------------------ User memory attributes (all handles) ----------------- */
+#define OCI_ATTR_USER_MEMORY               306     /* pointer to user memory */
+
+/* ------- unauthorised access and user action auditing banners ------------ */
+#define OCI_ATTR_ACCESS_BANNER              307             /* access banner */
+#define OCI_ATTR_AUDIT_BANNER               308              /* audit banner */
+
+/* ----------------- port no attribute in environment  handle  ------------- */
+#define OCI_ATTR_SUBSCR_PORTNO              390  /* port no to listen        */
+
+#define OCI_ATTR_RESERVED_35                437
+
+/*------------- Supported Values for protocol for recepient -----------------*/
+#define OCI_SUBSCR_PROTO_OCI                0                         /* oci */
+#define OCI_SUBSCR_PROTO_MAIL               1                        /* mail */
+#define OCI_SUBSCR_PROTO_SERVER             2                      /* server */
+#define OCI_SUBSCR_PROTO_HTTP               3                        /* http */
+#define OCI_SUBSCR_PROTO_MAX                4       /* max current protocols */
+
+/*------------- Supported Values for presentation for recepient -------------*/
+#define OCI_SUBSCR_PRES_DEFAULT             0                     /* default */
+#define OCI_SUBSCR_PRES_XML                 1                         /* xml */
+#define OCI_SUBSCR_PRES_MAX                 2   /* max current presentations */
+
+/*------------- Supported QOS values for notification registrations ---------*/
+#define OCI_SUBSCR_QOS_RELIABLE             0x01                 /* reliable */
+#define OCI_SUBSCR_QOS_PAYLOAD              0x02         /* payload delivery */
+#define OCI_SUBSCR_QOS_REPLICATE            0x04    /* replicate to director */
+#define OCI_SUBSCR_QOS_SECURE               0x08  /* secure payload delivery */
+#define OCI_SUBSCR_QOS_PURGE_ON_NTFN        0x10      /* purge on first ntfn */
+#define OCI_SUBSCR_QOS_MULTICBK             0x20  /* multi instance callback */
+                                         /* 0x40 is used for a internal flag */
+#define OCI_SUBSCR_QOS_HAREG                0x80                   /* HA reg */
+
+/* ----QOS flags specific to change notification/ continuous queries CQ -----*/
+#define OCI_SUBSCR_CQ_QOS_QUERY  0x01            /* query level notification */
+#define OCI_SUBSCR_CQ_QOS_BEST_EFFORT 0x02       /* best effort notification */
+#define OCI_SUBSCR_CQ_QOS_CLQRYCACHE 0x04            /* client query caching */
+
+/*------------- Supported Values for notification grouping class ------------*/
+#define OCI_SUBSCR_NTFN_GROUPING_CLASS_TIME 1                        /* time */
+
+/*------------- Supported Values for notification grouping type -------------*/
+#define OCI_SUBSCR_NTFN_GROUPING_TYPE_SUMMARY 1                   /* summary */
+#define OCI_SUBSCR_NTFN_GROUPING_TYPE_LAST    2                      /* last */
+
+/* ----- Temporary attribute value for UCS2/UTF16 character set ID -------- */ 
+#define OCI_UCS2ID            1000                        /* UCS2 charset ID */
+#define OCI_UTF16ID           1000                       /* UTF16 charset ID */
+
+/*============================== End OCI Attribute Types ====================*/
+
+/*---------------- Server Handle Attribute Values ---------------------------*/
+
+/* OCI_ATTR_SERVER_STATUS */
+#define OCI_SERVER_NOT_CONNECTED        0x0 
+#define OCI_SERVER_NORMAL               0x1 
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- Supported Namespaces  ---------------------------*/
+#define OCI_SUBSCR_NAMESPACE_ANONYMOUS   0            /* Anonymous Namespace */
+#define OCI_SUBSCR_NAMESPACE_AQ          1                /* Advanced Queues */
+#define OCI_SUBSCR_NAMESPACE_DBCHANGE    2            /* change notification */
+#define OCI_SUBSCR_NAMESPACE_MAX         3          /* Max Name Space Number */
+
+
+/*-------------------------Credential Types----------------------------------*/
+#define OCI_CRED_RDBMS      1                  /* database username/password */
+#define OCI_CRED_EXT        2             /* externally provided credentials */
+#define OCI_CRED_PROXY      3                        /* proxy authentication */
+#define OCI_CRED_RESERVED_1 4                                    /* reserved */
+#define OCI_CRED_RESERVED_2 5                                    /* reserved */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Error Return Values--------------------------------*/
+#define OCI_SUCCESS 0                      /* maps to SQL_SUCCESS of SAG CLI */
+#define OCI_SUCCESS_WITH_INFO 1             /* maps to SQL_SUCCESS_WITH_INFO */
+#define OCI_RESERVED_FOR_INT_USE 200                            /* reserved */ 
+#define OCI_NO_DATA 100                               /* maps to SQL_NO_DATA */
+#define OCI_ERROR -1                                    /* maps to SQL_ERROR */
+#define OCI_INVALID_HANDLE -2                  /* maps to SQL_INVALID_HANDLE */
+#define OCI_NEED_DATA 99                            /* maps to SQL_NEED_DATA */
+#define OCI_STILL_EXECUTING -3123                   /* OCI would block error */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------- User Callback Return Values -------------------------*/
+#define OCI_CONTINUE -24200    /* Continue with the body of the OCI function */
+#define OCI_ROWCBK_DONE   -24201              /* done with user row callback */
+/*---------------------------------------------------------------------------*/
+
+/*------------------DateTime and Interval check Error codes------------------*/
+
+/* DateTime Error Codes used by OCIDateTimeCheck() */
+#define   OCI_DT_INVALID_DAY         0x1                          /* Bad day */
+#define   OCI_DT_DAY_BELOW_VALID     0x2      /* Bad DAy Low/high bit (1=low)*/
+#define   OCI_DT_INVALID_MONTH       0x4                       /*  Bad MOnth */
+#define   OCI_DT_MONTH_BELOW_VALID   0x8   /* Bad MOnth Low/high bit (1=low) */
+#define   OCI_DT_INVALID_YEAR        0x10                        /* Bad YeaR */
+#define   OCI_DT_YEAR_BELOW_VALID    0x20  /*  Bad YeaR Low/high bit (1=low) */
+#define   OCI_DT_INVALID_HOUR        0x40                       /*  Bad HouR */
+#define   OCI_DT_HOUR_BELOW_VALID    0x80   /* Bad HouR Low/high bit (1=low) */
+#define   OCI_DT_INVALID_MINUTE      0x100                     /* Bad MiNute */
+#define   OCI_DT_MINUTE_BELOW_VALID  0x200 /*Bad MiNute Low/high bit (1=low) */
+#define   OCI_DT_INVALID_SECOND      0x400                    /*  Bad SeCond */
+#define   OCI_DT_SECOND_BELOW_VALID  0x800  /*bad second Low/high bit (1=low)*/
+#define   OCI_DT_DAY_MISSING_FROM_1582 0x1000     
+                                 /*  Day is one of those "missing" from 1582 */
+#define   OCI_DT_YEAR_ZERO           0x2000       /* Year may not equal zero */
+#define   OCI_DT_INVALID_TIMEZONE    0x4000                 /*  Bad Timezone */
+#define   OCI_DT_INVALID_FORMAT      0x8000         /* Bad date format input */
+
+
+/* Interval Error Codes used by OCIInterCheck() */
+#define   OCI_INTER_INVALID_DAY         0x1                       /* Bad day */
+#define   OCI_INTER_DAY_BELOW_VALID     0x2  /* Bad DAy Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_MONTH       0x4                     /* Bad MOnth */
+#define   OCI_INTER_MONTH_BELOW_VALID   0x8 /*Bad MOnth Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_YEAR        0x10                     /* Bad YeaR */
+#define   OCI_INTER_YEAR_BELOW_VALID    0x20 /*Bad YeaR Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_HOUR        0x40                     /* Bad HouR */
+#define   OCI_INTER_HOUR_BELOW_VALID    0x80 /*Bad HouR Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_MINUTE      0x100                  /* Bad MiNute */
+#define   OCI_INTER_MINUTE_BELOW_VALID  0x200 
+                                            /*Bad MiNute Low/high bit(1=low) */
+#define   OCI_INTER_INVALID_SECOND      0x400                  /* Bad SeCond */
+#define   OCI_INTER_SECOND_BELOW_VALID  0x800   
+                                            /*bad second Low/high bit(1=low) */
+#define   OCI_INTER_INVALID_FRACSEC     0x1000      /* Bad Fractional second */
+#define   OCI_INTER_FRACSEC_BELOW_VALID 0x2000  
+                                           /* Bad fractional second Low/High */
+
+
+/*------------------------Parsing Syntax Types-------------------------------*/
+#define OCI_V7_SYNTAX 2       /* V815 language - for backwards compatibility */
+#define OCI_V8_SYNTAX 3       /* V815 language - for backwards compatibility */
+#define OCI_NTV_SYNTAX 1    /* Use what so ever is the native lang of server */
+                     /* these values must match the values defined in kpul.h */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------(Scrollable Cursor) Fetch Options------------------- 
+ * For non-scrollable cursor, the only valid (and default) orientation is 
+ * OCI_FETCH_NEXT
+ */
+#define OCI_FETCH_CURRENT    0x00000001      /* refetching current position  */
+#define OCI_FETCH_NEXT       0x00000002                          /* next row */
+#define OCI_FETCH_FIRST      0x00000004       /* first row of the result set */
+#define OCI_FETCH_LAST       0x00000008    /* the last row of the result set */
+#define OCI_FETCH_PRIOR      0x00000010  /* previous row relative to current */
+#define OCI_FETCH_ABSOLUTE   0x00000020        /* absolute offset from first */
+#define OCI_FETCH_RELATIVE   0x00000040        /* offset relative to current */
+#define OCI_FETCH_RESERVED_1 0x00000080                          /* reserved */
+#define OCI_FETCH_RESERVED_2 0x00000100                          /* reserved */
+#define OCI_FETCH_RESERVED_3 0x00000200                          /* reserved */
+#define OCI_FETCH_RESERVED_4 0x00000400                          /* reserved */
+#define OCI_FETCH_RESERVED_5 0x00000800                          /* reserved */
+#define OCI_FETCH_RESERVED_6 0x00001000                          /* reserved */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Bind and Define Options----------------------------*/
+#define OCI_SB2_IND_PTR       0x00000001                           /* unused */
+#define OCI_DATA_AT_EXEC      0x00000002             /* data at execute time */
+#define OCI_DYNAMIC_FETCH     0x00000002                /* fetch dynamically */
+#define OCI_PIECEWISE         0x00000004          /* piecewise DMLs or fetch */
+#define OCI_DEFINE_RESERVED_1 0x00000008                         /* reserved */
+#define OCI_BIND_RESERVED_2   0x00000010                         /* reserved */
+#define OCI_DEFINE_RESERVED_2 0x00000020                         /* reserved */
+#define OCI_BIND_SOFT         0x00000040              /* soft bind or define */
+#define OCI_DEFINE_SOFT       0x00000080              /* soft bind or define */
+#define OCI_BIND_RESERVED_3   0x00000100                         /* reserved */
+#define OCI_IOV               0x00000200   /* For scatter gather bind/define */
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------------  Various Modes ------------------------------*/
+#define OCI_DEFAULT         0x00000000 
+                          /* the default value for parameters and attributes */
+/*-------------OCIInitialize Modes / OCICreateEnvironment Modes -------------*/
+#define OCI_THREADED        0x00000001      /* appl. in threaded environment */
+#define OCI_OBJECT          0x00000002  /* application in object environment */
+#define OCI_EVENTS          0x00000004  /* application is enabled for events */
+#define OCI_RESERVED1       0x00000008                           /* reserved */
+#define OCI_SHARED          0x00000010  /* the application is in shared mode */
+#define OCI_RESERVED2       0x00000020                           /* reserved */
+/* The following *TWO* are only valid for OCICreateEnvironment call */
+#define OCI_NO_UCB          0x00000040 /* No user callback called during ini */
+#define OCI_NO_MUTEX        0x00000080 /* the environment handle will not be */
+                                         /*  protected by a mutex internally */
+#define OCI_SHARED_EXT      0x00000100              /* Used for shared forms */
+/************************** 0x00000200 free **********************************/
+#define OCI_ALWAYS_BLOCKING 0x00000400    /* all connections always blocking */
+/************************** 0x00000800 free **********************************/
+#define OCI_USE_LDAP        0x00001000            /* allow  LDAP connections */
+#define OCI_REG_LDAPONLY    0x00002000              /* only register to LDAP */
+#define OCI_UTF16           0x00004000        /* mode for all UTF16 metadata */
+#define OCI_AFC_PAD_ON      0x00008000 
+                             /* turn on AFC blank padding when rlenp present */
+#define OCI_ENVCR_RESERVED3 0x00010000                           /* reserved */
+#define OCI_NEW_LENGTH_SEMANTICS  0x00020000   /* adopt new length semantics */
+       /* the new length semantics, always bytes, is used by OCIEnvNlsCreate */
+#define OCI_NO_MUTEX_STMT   0x00040000           /* Do not mutex stmt handle */
+#define OCI_MUTEX_ENV_ONLY  0x00080000  /* Mutex only the environment handle */
+#define OCI_SUPPRESS_NLS_VALIDATION   0x00100000  /* suppress nls validation */
+  /* nls validation suppression is on by default;
+     use OCI_ENABLE_NLS_VALIDATION to disable it */
+#define OCI_MUTEX_TRY                 0x00200000    /* try and acquire mutex */
+#define OCI_NCHAR_LITERAL_REPLACE_ON  0x00400000 /* nchar literal replace on */
+#define OCI_NCHAR_LITERAL_REPLACE_OFF 0x00800000 /* nchar literal replace off*/
+#define OCI_ENABLE_NLS_VALIDATION     0x01000000    /* enable nls validation */
+#define OCI_ENVCR_RESERVED4           0x02000000                 /* reserved */
+
+/*---------------------------------------------------------------------------*/
+/*------------------------OCIConnectionpoolCreate Modes----------------------*/
+
+#define OCI_CPOOL_REINITIALIZE 0x111
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------------- OCILogon2 Modes -------------------------*/
+
+#define OCI_LOGON2_SPOOL       0x0001     /* Use session pool */
+#define OCI_LOGON2_CPOOL       OCI_CPOOL  /* Use connection pool */
+#define OCI_LOGON2_STMTCACHE   0x0004     /* Use Stmt Caching */
+#define OCI_LOGON2_PROXY       0x0008     /* Proxy authentiaction */
+
+/*---------------------------------------------------------------------------*/
+/*------------------------- OCISessionPoolCreate Modes ----------------------*/
+
+#define OCI_SPC_REINITIALIZE 0x0001   /* Reinitialize the session pool */
+#define OCI_SPC_HOMOGENEOUS  0x0002   /* Session pool is homogeneneous */
+#define OCI_SPC_STMTCACHE    0x0004   /* Session pool has stmt cache */
+#define OCI_SPC_NO_RLB       0x0008 /* Do not enable Runtime load balancing. */ 
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------- OCISessionGet Modes ---------------------------*/
+
+#define OCI_SESSGET_SPOOL      0x0001     /* SessionGet called in SPOOL mode */
+#define OCI_SESSGET_CPOOL      OCI_CPOOL  /* SessionGet called in CPOOL mode */
+#define OCI_SESSGET_STMTCACHE  0x0004                 /* Use statement cache */
+#define OCI_SESSGET_CREDPROXY  0x0008     /* SessionGet called in proxy mode */
+#define OCI_SESSGET_CREDEXT    0x0010     
+#define OCI_SESSGET_SPOOL_MATCHANY 0x0020
+#define OCI_SESSGET_PURITY_NEW     0x0040 
+#define OCI_SESSGET_PURITY_SELF    0x0080 
+#define OCI_SESSGET_SYSDBA    0x0100    /* SessionGet with SYSDBA privileges */
+
+/*---------------------------------------------------------------------------*/
+/*------------------------ATTR Values for Session Pool-----------------------*/
+/* Attribute values for OCI_ATTR_SPOOL_GETMODE */
+#define OCI_SPOOL_ATTRVAL_WAIT     0         /* block till you get a session */
+#define OCI_SPOOL_ATTRVAL_NOWAIT   1    /* error out if no session avaliable */
+#define OCI_SPOOL_ATTRVAL_FORCEGET 2  /* get session even if max is exceeded */
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------- OCISessionRelease Modes -----------------------*/
+
+#define OCI_SESSRLS_DROPSESS 0x0001                    /* Drop the Session */
+#define OCI_SESSRLS_RETAG    0x0002                   /* Retag the session */
+
+/*---------------------------------------------------------------------------*/
+/*----------------------- OCISessionPoolDestroy Modes -----------------------*/
+
+#define OCI_SPD_FORCE        0x0001       /* Force the sessions to terminate. 
+                                             Even if there are some busy 
+                                             sessions close them */
+ 
+/*---------------------------------------------------------------------------*/
+/*----------------------------- Statement States ----------------------------*/
+
+#define OCI_STMT_STATE_INITIALIZED  0x0001
+#define OCI_STMT_STATE_EXECUTED     0x0002
+#define OCI_STMT_STATE_END_OF_FETCH 0x0003
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------------- OCIMemStats Modes ---------------------------*/
+#define OCI_MEM_INIT        0x01 
+#define OCI_MEM_CLN         0x02 
+#define OCI_MEM_FLUSH       0x04 
+#define OCI_DUMP_HEAP       0x80
+
+#define OCI_CLIENT_STATS    0x10 
+#define OCI_SERVER_STATS    0x20 
+
+/*----------------------------- OCIEnvInit Modes ----------------------------*/
+/* NOTE: NO NEW MODES SHOULD BE ADDED HERE BECAUSE THE RECOMMENDED METHOD 
+ * IS TO USE THE NEW OCICreateEnvironment MODES.
+ */
+#define OCI_ENV_NO_UCB 0x01         /* A user callback will not be called in
+                                       OCIEnvInit() */
+#define OCI_ENV_NO_MUTEX 0x08 /* the environment handle will not be protected
+                                 by a mutex internally */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Prepare Modes ------------------------------------*/
+#define OCI_NO_SHARING        0x01      /* turn off statement handle sharing */
+#define OCI_PREP_RESERVED_1   0x02                               /* reserved */
+#define OCI_PREP_AFC_PAD_ON   0x04          /* turn on blank padding for AFC */
+#define OCI_PREP_AFC_PAD_OFF  0x08         /* turn off blank padding for AFC */
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------- Execution Modes -----------------------------------*/
+#define OCI_BATCH_MODE             0x00000001 /* batch the oci stmt for exec */
+#define OCI_EXACT_FETCH            0x00000002  /* fetch exact rows specified */
+/* #define                         0x00000004                      available */
+#define OCI_STMT_SCROLLABLE_READONLY \
+                                   0x00000008 /* if result set is scrollable */
+#define OCI_DESCRIBE_ONLY          0x00000010 /* only describe the statement */
+#define OCI_COMMIT_ON_SUCCESS      0x00000020  /* commit, if successful exec */
+#define OCI_NON_BLOCKING           0x00000040                /* non-blocking */
+#define OCI_BATCH_ERRORS           0x00000080  /* batch errors in array dmls */
+#define OCI_PARSE_ONLY             0x00000100    /* only parse the statement */
+#define OCI_EXACT_FETCH_RESERVED_1 0x00000200                    /* reserved */
+#define OCI_SHOW_DML_WARNINGS      0x00000400   
+         /* return OCI_SUCCESS_WITH_INFO for delete/update w/no where clause */
+#define OCI_EXEC_RESERVED_2        0x00000800                    /* reserved */
+#define OCI_DESC_RESERVED_1        0x00001000                    /* reserved */
+#define OCI_EXEC_RESERVED_3        0x00002000                    /* reserved */
+#define OCI_EXEC_RESERVED_4        0x00004000                    /* reserved */
+#define OCI_EXEC_RESERVED_5        0x00008000                    /* reserved */
+#define OCI_EXEC_RESERVED_6        0x00010000                    /* reserved */
+#define OCI_RESULT_CACHE           0x00020000   /* hint to use query caching */
+#define OCI_NO_RESULT_CACHE        0x00040000  /*hint to bypass query caching*/
+#define OCI_EXEC_RESERVED_7        0x00080000                    /* reserved */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Authentication Modes-------------------------------*/
+#define OCI_MIGRATE         0x00000001            /* migratable auth context */
+#define OCI_SYSDBA          0x00000002           /* for SYSDBA authorization */
+#define OCI_SYSOPER         0x00000004          /* for SYSOPER authorization */
+#define OCI_PRELIM_AUTH     0x00000008      /* for preliminary authorization */
+#define OCIP_ICACHE         0x00000010             /* Private OCI cache mode */
+#define OCI_AUTH_RESERVED_1 0x00000020                           /* reserved */
+#define OCI_STMT_CACHE      0x00000040            /* enable OCI Stmt Caching */
+#define OCI_STATELESS_CALL  0x00000080         /* stateless at call boundary */
+#define OCI_STATELESS_TXN   0x00000100          /* stateless at txn boundary */
+#define OCI_STATELESS_APP   0x00000200    /* stateless at user-specified pts */
+#define OCI_AUTH_RESERVED_2 0x00000400                           /* reserved */
+#define OCI_AUTH_RESERVED_3 0x00000800                           /* reserved */
+#define OCI_AUTH_RESERVED_4 0x00001000                           /* reserved */
+#define OCI_AUTH_RESERVED_5 0x00002000                           /* reserved */
+#define OCI_SYSASM          0x00008000           /* for SYSASM authorization */
+#define OCI_AUTH_RESERVED_6 0x00010000                           /* reserved */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Session End Modes----------------------------------*/
+#define OCI_SESSEND_RESERVED_1 0x0001                            /* reserved */
+#define OCI_SESSEND_RESERVED_2 0x0002                            /* reserved */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Attach Modes---------------------------------------*/
+
+/* The following attach modes are the same as the UPI modes defined in 
+ * UPIDEF.H.  Do not use these values externally.
+ */
+
+#define OCI_FASTPATH         0x0010              /* Attach in fast path mode */
+#define OCI_ATCH_RESERVED_1  0x0020                              /* reserved */
+#define OCI_ATCH_RESERVED_2  0x0080                              /* reserved */
+#define OCI_ATCH_RESERVED_3  0x0100                              /* reserved */
+#define OCI_CPOOL            0x0200  /* Attach using server handle from pool */
+#define OCI_ATCH_RESERVED_4  0x0400                              /* reserved */
+#define OCI_ATCH_RESERVED_5  0x2000                              /* reserved */
+#define OCI_ATCH_ENABLE_BEQ  0x4000        /* Allow bequeath connect strings */
+#define OCI_ATCH_RESERVED_6  0x8000                              /* reserved */
+#define OCI_ATCH_RESERVED_7  0x10000                              /* reserved */
+#define OCI_ATCH_RESERVED_8  0x20000                             /* reserved */
+
+#define OCI_SRVATCH_RESERVED5 0x01000000                         /* reserved */
+#define OCI_SRVATCH_RESERVED6 0x02000000                         /* reserved */
+
+/*---------------------OCIStmtPrepare2 Modes---------------------------------*/
+#define OCI_PREP2_CACHE_SEARCHONLY    0x0010                  /* ONly Search */
+#define OCI_PREP2_GET_PLSQL_WARNINGS  0x0020         /* Get PL/SQL warnings  */
+#define OCI_PREP2_RESERVED_1          0x0040                     /* reserved */
+
+/*---------------------OCIStmtRelease Modes----------------------------------*/
+#define OCI_STRLS_CACHE_DELETE      0x0010              /* Delete from Cache */
+
+/*---------------------OCIHanlde Mgmt Misc Modes-----------------------------*/
+#define OCI_STM_RESERVED4   0x00100000                           /* reserved */
+
+/*-----------------------------End Various Modes ----------------------------*/
+
+/*------------------------Piece Information----------------------------------*/
+#define OCI_PARAM_IN 0x01                                    /* in parameter */
+#define OCI_PARAM_OUT 0x02                                  /* out parameter */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Transaction Start Flags --------------------------*/
+/* NOTE: OCI_TRANS_JOIN and OCI_TRANS_NOMIGRATE not supported in 8.0.X       */
+#define OCI_TRANS_NEW          0x00000001 /* start a new local or global txn */
+#define OCI_TRANS_JOIN         0x00000002     /* join an existing global txn */
+#define OCI_TRANS_RESUME       0x00000004    /* resume the global txn branch */
+#define OCI_TRANS_PROMOTE      0x00000008 /* promote the local txn to global */
+#define OCI_TRANS_STARTMASK    0x000000ff  /* mask for start operation flags */
+
+#define OCI_TRANS_READONLY     0x00000100            /* start a readonly txn */
+#define OCI_TRANS_READWRITE    0x00000200          /* start a read-write txn */
+#define OCI_TRANS_SERIALIZABLE 0x00000400        /* start a serializable txn */
+#define OCI_TRANS_ISOLMASK     0x0000ff00  /* mask for start isolation flags */
+
+#define OCI_TRANS_LOOSE        0x00010000        /* a loosely coupled branch */
+#define OCI_TRANS_TIGHT        0x00020000        /* a tightly coupled branch */
+#define OCI_TRANS_TYPEMASK     0x000f0000      /* mask for branch type flags */
+
+#define OCI_TRANS_NOMIGRATE    0x00100000      /* non migratable transaction */
+#define OCI_TRANS_SEPARABLE    0x00200000  /* separable transaction (8.1.6+) */
+#define OCI_TRANS_OTSRESUME    0x00400000      /* OTS resuming a transaction */
+#define OCI_TRANS_OTHRMASK     0xfff00000      /* mask for other start flags */
+
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Transaction End Flags ----------------------------*/
+#define OCI_TRANS_TWOPHASE      0x01000000           /* use two phase commit */
+#define OCI_TRANS_WRITEBATCH    0x00000001  /* force cmt-redo for local txns */
+#define OCI_TRANS_WRITEIMMED    0x00000002              /* no force cmt-redo */
+#define OCI_TRANS_WRITEWAIT     0x00000004               /* no sync cmt-redo */
+#define OCI_TRANS_WRITENOWAIT   0x00000008   /* sync cmt-redo for local txns */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- AQ Constants ------------------------------------
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ * The following constants must match the PL/SQL dbms_aq constants
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ */
+/* ------------------------- Visibility flags -------------------------------*/
+#define OCI_ENQ_IMMEDIATE       1   /* enqueue is an independent transaction */
+#define OCI_ENQ_ON_COMMIT       2  /* enqueue is part of current transaction */
+
+/* ----------------------- Dequeue mode flags -------------------------------*/
+#define OCI_DEQ_BROWSE          1   /* read message without acquiring a lock */
+#define OCI_DEQ_LOCKED          2   /* read and obtain write lock on message */
+#define OCI_DEQ_REMOVE          3          /* read the message and delete it */
+#define OCI_DEQ_REMOVE_NODATA   4    /* delete message w'o returning payload */
+#define OCI_DEQ_GETSIG          5                      /* get signature only */
+
+/* ----------------- Dequeue navigation flags -------------------------------*/
+#define OCI_DEQ_FIRST_MSG        1     /* get first message at head of queue */
+#define OCI_DEQ_NEXT_MSG         3         /* next message that is available */
+#define OCI_DEQ_NEXT_TRANSACTION 2    /* get first message of next txn group */
+#define OCI_DEQ_FIRST_MSG_MULTI_GROUP 4 
+                 /* start from first message and array deq across txn groups */
+#define OCI_DEQ_MULT_TRANSACTION 5        /* array dequeue across txn groups */
+#define OCI_DEQ_NEXT_MSG_MULTI_GROUP OCI_DEQ_MULT_TRANSACTION 
+                                          /* array dequeue across txn groups */
+
+/* ----------------- Dequeue Option Reserved flags ------------------------- */
+#define OCI_DEQ_RESERVED_1      0x000001
+
+/* --------------------- Message states -------------------------------------*/
+#define OCI_MSG_WAITING         1 /* the message delay has not yet completed */
+#define OCI_MSG_READY           0    /* the message is ready to be processed */
+#define OCI_MSG_PROCESSED       2          /* the message has been processed */
+#define OCI_MSG_EXPIRED         3    /* message has moved to exception queue */
+
+/* --------------------- Sequence deviation ---------------------------------*/
+#define OCI_ENQ_BEFORE          2  /* enqueue message before another message */
+#define OCI_ENQ_TOP             3     /* enqueue message before all messages */
+
+/* ------------------------- Visibility flags -------------------------------*/
+#define OCI_DEQ_IMMEDIATE       1   /* dequeue is an independent transaction */
+#define OCI_DEQ_ON_COMMIT       2  /* dequeue is part of current transaction */
+
+/* ------------------------ Wait --------------------------------------------*/
+#define OCI_DEQ_WAIT_FOREVER    -1   /* wait forever if no message available */
+#define OCI_NTFN_GROUPING_FOREVER -1  /* send grouping notifications forever */
+#define OCI_DEQ_NO_WAIT         0  /* do not wait if no message is available */
+
+#define OCI_FLOW_CONTROL_NO_TIMEOUT      -1
+                           /* streaming enqueue: no timeout for flow control */
+
+/* ------------------------ Delay -------------------------------------------*/
+#define OCI_MSG_NO_DELAY        0        /* message is available immediately */
+
+/* ------------------------- Expiration -------------------------------------*/
+#define OCI_MSG_NO_EXPIRATION -1                /* message will never expire */
+
+#define OCI_MSG_PERSISTENT_OR_BUFFERED   3
+#define OCI_MSG_BUFFERED                 2
+#define OCI_MSG_PERSISTENT               1
+
+/* ----------------------- Reserved/AQE pisdef flags ------------------------*/
+/* see aqeflg defines in kwqp.h */
+#define OCI_AQ_RESERVED_1      0x0002
+#define OCI_AQ_RESERVED_2      0x0004
+#define OCI_AQ_RESERVED_3      0x0008
+#define OCI_AQ_RESERVED_4      0x0010
+
+#define OCI_AQ_STREAMING_FLAG  0x02000000
+
+/* ------------------------------ Replay Info -------------------------------*/
+#define OCI_AQ_LAST_ENQUEUED     0
+#define OCI_AQ_LAST_ACKNOWLEDGED 1
+
+/* -------------------------- END AQ Constants ----------------------------- */
+
+/* --------------------END DateTime and Interval Constants ------------------*/
+
+/*-----------------------Object Types----------------------------------------*/
+/*-----------Object Types **** Not to be Used **** --------------------------*/
+/* Deprecated */
+#define OCI_OTYPE_UNK           0
+#define OCI_OTYPE_TABLE         1
+#define OCI_OTYPE_VIEW          2
+#define OCI_OTYPE_SYN           3
+#define OCI_OTYPE_PROC          4
+#define OCI_OTYPE_FUNC          5
+#define OCI_OTYPE_PKG           6
+#define OCI_OTYPE_STMT          7
+/*---------------------------------------------------------------------------*/
+
+/*=======================Describe Handle Parameter Attributes ===============*/
+/* 
+   These attributes are orthogonal to the other set of attributes defined 
+   above.  These attrubutes are to be used only for the describe handle. 
+*/
+/*===========================================================================*/
+/* Attributes common to Columns and Stored Procs */
+#define OCI_ATTR_DATA_SIZE      1                /* maximum size of the data */
+#define OCI_ATTR_DATA_TYPE      2     /* the SQL type of the column/argument */
+#define OCI_ATTR_DISP_SIZE      3                        /* the display size */
+#define OCI_ATTR_NAME           4         /* the name of the column/argument */
+#define OCI_ATTR_PRECISION      5                /* precision if number type */
+#define OCI_ATTR_SCALE          6                    /* scale if number type */
+#define OCI_ATTR_IS_NULL        7                            /* is it null ? */
+#define OCI_ATTR_TYPE_NAME      8
+  /* name of the named data type or a package name for package private types */
+#define OCI_ATTR_SCHEMA_NAME    9             /* the schema name */
+#define OCI_ATTR_SUB_NAME       10      /* type name if package private type */
+#define OCI_ATTR_POSITION       11
+                    /* relative position of col/arg in the list of cols/args */
+/* complex object retrieval parameter attributes */
+#define OCI_ATTR_COMPLEXOBJECTCOMP_TYPE         50 
+#define OCI_ATTR_COMPLEXOBJECTCOMP_TYPE_LEVEL   51
+#define OCI_ATTR_COMPLEXOBJECT_LEVEL            52
+#define OCI_ATTR_COMPLEXOBJECT_COLL_OUTOFLINE   53
+
+/* Only Columns */
+#define OCI_ATTR_DISP_NAME      100                      /* the display name */
+#define OCI_ATTR_ENCC_SIZE      101                   /* encrypted data size */
+#define OCI_ATTR_COL_ENC        102                 /* column is encrypted ? */
+#define OCI_ATTR_COL_ENC_SALT   103          /* is encrypted column salted ? */
+
+/*Only Stored Procs */
+#define OCI_ATTR_OVERLOAD       210           /* is this position overloaded */
+#define OCI_ATTR_LEVEL          211            /* level for structured types */
+#define OCI_ATTR_HAS_DEFAULT    212                   /* has a default value */
+#define OCI_ATTR_IOMODE         213                         /* in, out inout */
+#define OCI_ATTR_RADIX          214                       /* returns a radix */
+#define OCI_ATTR_NUM_ARGS       215             /* total number of arguments */
+
+/* only named type attributes */
+#define OCI_ATTR_TYPECODE                  216       /* object or collection */
+#define OCI_ATTR_COLLECTION_TYPECODE       217     /* varray or nested table */
+#define OCI_ATTR_VERSION                   218      /* user assigned version */
+#define OCI_ATTR_IS_INCOMPLETE_TYPE        219 /* is this an incomplete type */
+#define OCI_ATTR_IS_SYSTEM_TYPE            220              /* a system type */
+#define OCI_ATTR_IS_PREDEFINED_TYPE        221          /* a predefined type */
+#define OCI_ATTR_IS_TRANSIENT_TYPE         222           /* a transient type */
+#define OCI_ATTR_IS_SYSTEM_GENERATED_TYPE  223      /* system generated type */
+#define OCI_ATTR_HAS_NESTED_TABLE          224 /* contains nested table attr */
+#define OCI_ATTR_HAS_LOB                   225        /* has a lob attribute */
+#define OCI_ATTR_HAS_FILE                  226       /* has a file attribute */
+#define OCI_ATTR_COLLECTION_ELEMENT        227 /* has a collection attribute */
+#define OCI_ATTR_NUM_TYPE_ATTRS            228  /* number of attribute types */
+#define OCI_ATTR_LIST_TYPE_ATTRS           229    /* list of type attributes */
+#define OCI_ATTR_NUM_TYPE_METHODS          230     /* number of type methods */
+#define OCI_ATTR_LIST_TYPE_METHODS         231       /* list of type methods */
+#define OCI_ATTR_MAP_METHOD                232         /* map method of type */
+#define OCI_ATTR_ORDER_METHOD              233       /* order method of type */
+
+/* only collection element */
+#define OCI_ATTR_NUM_ELEMS                 234         /* number of elements */
+
+/* only type methods */
+#define OCI_ATTR_ENCAPSULATION             235        /* encapsulation level */
+#define OCI_ATTR_IS_SELFISH                236             /* method selfish */
+#define OCI_ATTR_IS_VIRTUAL                237                    /* virtual */
+#define OCI_ATTR_IS_INLINE                 238                     /* inline */
+#define OCI_ATTR_IS_CONSTANT               239                   /* constant */
+#define OCI_ATTR_HAS_RESULT                240                 /* has result */
+#define OCI_ATTR_IS_CONSTRUCTOR            241                /* constructor */
+#define OCI_ATTR_IS_DESTRUCTOR             242                 /* destructor */
+#define OCI_ATTR_IS_OPERATOR               243                   /* operator */
+#define OCI_ATTR_IS_MAP                    244               /* a map method */
+#define OCI_ATTR_IS_ORDER                  245               /* order method */
+#define OCI_ATTR_IS_RNDS                   246  /* read no data state method */
+#define OCI_ATTR_IS_RNPS                   247      /* read no process state */
+#define OCI_ATTR_IS_WNDS                   248 /* write no data state method */
+#define OCI_ATTR_IS_WNPS                   249     /* write no process state */
+
+#define OCI_ATTR_DESC_PUBLIC               250              /* public object */
+
+/* Object Cache Enhancements : attributes for User Constructed Instances     */
+#define OCI_ATTR_CACHE_CLIENT_CONTEXT      251
+#define OCI_ATTR_UCI_CONSTRUCT             252
+#define OCI_ATTR_UCI_DESTRUCT              253
+#define OCI_ATTR_UCI_COPY                  254
+#define OCI_ATTR_UCI_PICKLE                255
+#define OCI_ATTR_UCI_UNPICKLE              256
+#define OCI_ATTR_UCI_REFRESH               257
+
+/* for type inheritance */
+#define OCI_ATTR_IS_SUBTYPE                258
+#define OCI_ATTR_SUPERTYPE_SCHEMA_NAME     259
+#define OCI_ATTR_SUPERTYPE_NAME            260
+
+/* for schemas */
+#define OCI_ATTR_LIST_OBJECTS              261  /* list of objects in schema */
+
+/* for database */
+#define OCI_ATTR_NCHARSET_ID               262                /* char set id */
+#define OCI_ATTR_LIST_SCHEMAS              263            /* list of schemas */
+#define OCI_ATTR_MAX_PROC_LEN              264       /* max procedure length */
+#define OCI_ATTR_MAX_COLUMN_LEN            265     /* max column name length */
+#define OCI_ATTR_CURSOR_COMMIT_BEHAVIOR    266     /* cursor commit behavior */
+#define OCI_ATTR_MAX_CATALOG_NAMELEN       267         /* catalog namelength */
+#define OCI_ATTR_CATALOG_LOCATION          268           /* catalog location */
+#define OCI_ATTR_SAVEPOINT_SUPPORT         269          /* savepoint support */
+#define OCI_ATTR_NOWAIT_SUPPORT            270             /* nowait support */
+#define OCI_ATTR_AUTOCOMMIT_DDL            271             /* autocommit DDL */
+#define OCI_ATTR_LOCKING_MODE              272               /* locking mode */
+
+/* for externally initialized context */
+#define OCI_ATTR_APPCTX_SIZE               273 /* count of context to be init*/
+#define OCI_ATTR_APPCTX_LIST               274 /* count of context to be init*/
+#define OCI_ATTR_APPCTX_NAME               275 /* name  of context to be init*/
+#define OCI_ATTR_APPCTX_ATTR               276 /* attr  of context to be init*/
+#define OCI_ATTR_APPCTX_VALUE              277 /* value of context to be init*/
+
+/* for client id propagation */
+#define OCI_ATTR_CLIENT_IDENTIFIER         278   /* value of client id to set*/
+
+/* for inheritance - part 2 */
+#define OCI_ATTR_IS_FINAL_TYPE             279            /* is final type ? */
+#define OCI_ATTR_IS_INSTANTIABLE_TYPE      280     /* is instantiable type ? */
+#define OCI_ATTR_IS_FINAL_METHOD           281          /* is final method ? */
+#define OCI_ATTR_IS_INSTANTIABLE_METHOD    282   /* is instantiable method ? */
+#define OCI_ATTR_IS_OVERRIDING_METHOD      283     /* is overriding method ? */
+
+#define OCI_ATTR_DESC_SYNBASE              284   /* Describe the base object */
+
+
+#define OCI_ATTR_CHAR_USED                 285      /* char length semantics */
+#define OCI_ATTR_CHAR_SIZE                 286                /* char length */
+
+/* SQLJ support */
+#define OCI_ATTR_IS_JAVA_TYPE              287 /* is java implemented type ? */
+
+/* N-Tier support */
+#define OCI_ATTR_DISTINGUISHED_NAME        300        /* use DN as user name */
+#define OCI_ATTR_KERBEROS_TICKET           301   /* Kerberos ticket as cred. */
+ 
+/* for multilanguage debugging */
+#define OCI_ATTR_ORA_DEBUG_JDWP            302   /* ORA_DEBUG_JDWP attribute */
+
+#define OCI_ATTR_EDITION                   288                /* ORA_EDITION */
+
+#define OCI_ATTR_RESERVED_14               303                   /* reserved */
+
+
+/*---------------------------End Describe Handle Attributes -----------------*/
+
+/* For values 303 - 307, see DirPathAPI attribute section in this file */
+
+/* ----------------------- Session Pool Attributes ------------------------- */
+#define OCI_ATTR_SPOOL_TIMEOUT              308           /* session timeout */
+#define OCI_ATTR_SPOOL_GETMODE              309          /* session get mode */
+#define OCI_ATTR_SPOOL_BUSY_COUNT           310        /* busy session count */
+#define OCI_ATTR_SPOOL_OPEN_COUNT           311        /* open session count */
+#define OCI_ATTR_SPOOL_MIN                  312         /* min session count */
+#define OCI_ATTR_SPOOL_MAX                  313         /* max session count */
+#define OCI_ATTR_SPOOL_INCR                 314   /* session increment count */
+#define OCI_ATTR_SPOOL_STMTCACHESIZE        208   /*Stmt cache size of pool  */
+#define OCI_ATTR_SPOOL_AUTH                 460 /* Auth handle on pool handle*/
+/*------------------------------End Session Pool Attributes -----------------*/
+/*---------------------------- For XML Types ------------------------------- */
+/* For table, view and column */
+#define OCI_ATTR_IS_XMLTYPE          315         /* Is the type an XML type? */
+#define OCI_ATTR_XMLSCHEMA_NAME      316               /* Name of XML Schema */
+#define OCI_ATTR_XMLELEMENT_NAME     317              /* Name of XML Element */
+#define OCI_ATTR_XMLSQLTYPSCH_NAME   318    /* SQL type's schema for XML Ele */
+#define OCI_ATTR_XMLSQLTYPE_NAME     319     /* Name of SQL type for XML Ele */
+#define OCI_ATTR_XMLTYPE_STORED_OBJ  320       /* XML type stored as object? */
+#define OCI_ATTR_XMLTYPE_BINARY_XML  422       /* XML type stored as binary? */
+
+/*---------------------------- For Subtypes ------------------------------- */
+/* For type */
+#define OCI_ATTR_HAS_SUBTYPES        321                    /* Has subtypes? */
+#define OCI_ATTR_NUM_SUBTYPES        322               /* Number of subtypes */
+#define OCI_ATTR_LIST_SUBTYPES       323                 /* List of subtypes */
+
+/* XML flag */
+#define OCI_ATTR_XML_HRCHY_ENABLED   324               /* hierarchy enabled? */
+
+/* Method flag */
+#define OCI_ATTR_IS_OVERRIDDEN_METHOD 325           /* Method is overridden? */
+
+/* For values 326 - 335, see DirPathAPI attribute section in this file */
+
+/*------------- Attributes for 10i Distributed Objects ----------------------*/
+#define OCI_ATTR_OBJ_SUBS                   336 /* obj col/tab substitutable */
+
+/* For values 337 - 338, see DirPathAPI attribute section in this file */
+
+/*---------- Attributes for 10i XADFIELD (NLS language, territory -----------*/
+#define OCI_ATTR_XADFIELD_RESERVED_1        339                  /* reserved */
+#define OCI_ATTR_XADFIELD_RESERVED_2        340                  /* reserved */
+/*------------- Kerberos Secure Client Identifier ---------------------------*/
+#define OCI_ATTR_KERBEROS_CID               341 /* Kerberos db service ticket*/
+
+
+/*------------------------ Attributes for Rules objects ---------------------*/
+#define OCI_ATTR_CONDITION                  342            /* rule condition */
+#define OCI_ATTR_COMMENT                    343                   /* comment */
+#define OCI_ATTR_VALUE                      344             /* Anydata value */
+#define OCI_ATTR_EVAL_CONTEXT_OWNER         345        /* eval context owner */
+#define OCI_ATTR_EVAL_CONTEXT_NAME          346         /* eval context name */
+#define OCI_ATTR_EVALUATION_FUNCTION        347        /* eval function name */
+#define OCI_ATTR_VAR_TYPE                   348             /* variable type */
+#define OCI_ATTR_VAR_VALUE_FUNCTION         349   /* variable value function */
+#define OCI_ATTR_VAR_METHOD_FUNCTION        350  /* variable method function */
+#define OCI_ATTR_ACTION_CONTEXT             351            /* action context */
+#define OCI_ATTR_LIST_TABLE_ALIASES         352     /* list of table aliases */
+#define OCI_ATTR_LIST_VARIABLE_TYPES        353    /* list of variable types */
+#define OCI_ATTR_TABLE_NAME                 356                /* table name */
+
+/* For values 357 - 359, see DirPathAPI attribute section in this file */
+
+#define OCI_ATTR_MESSAGE_CSCN               360              /* message cscn */
+#define OCI_ATTR_MESSAGE_DSCN               361              /* message dscn */
+
+/*--------------------- Audit Session ID ------------------------------------*/
+#define OCI_ATTR_AUDIT_SESSION_ID           362          /* Audit session ID */
+
+/*--------------------- Kerberos TGT Keys -----------------------------------*/
+#define OCI_ATTR_KERBEROS_KEY               363  /* n-tier Kerberos cred key */
+#define OCI_ATTR_KERBEROS_CID_KEY           364    /* SCID Kerberos cred key */
+
+
+#define OCI_ATTR_TRANSACTION_NO             365         /* AQ enq txn number */
+
+/*----------------------- Attributes for End To End Tracing -----------------*/
+#define OCI_ATTR_MODULE                     366        /* module for tracing */
+#define OCI_ATTR_ACTION                     367        /* action for tracing */
+#define OCI_ATTR_CLIENT_INFO                368               /* client info */
+#define OCI_ATTR_COLLECT_CALL_TIME          369         /* collect call time */
+#define OCI_ATTR_CALL_TIME                  370         /* extract call time */
+#define OCI_ATTR_ECONTEXT_ID                371      /* execution-id context */
+#define OCI_ATTR_ECONTEXT_SEQ               372  /*execution-id sequence num */
+
+
+/*------------------------------ Session attributes -------------------------*/
+#define OCI_ATTR_SESSION_STATE              373             /* session state */
+#define OCI_SESSION_STATELESS  1                             /* valid states */
+#define OCI_SESSION_STATEFUL   2
+
+#define OCI_ATTR_SESSION_STATETYPE          374        /* session state type */
+#define OCI_SESSION_STATELESS_DEF  0                    /* valid state types */
+#define OCI_SESSION_STATELESS_CAL  1
+#define OCI_SESSION_STATELESS_TXN  2
+#define OCI_SESSION_STATELESS_APP  3
+
+#define OCI_ATTR_SESSION_STATE_CLEARED      376     /* session state cleared */
+#define OCI_ATTR_SESSION_MIGRATED           377       /* did session migrate */
+#define OCI_ATTR_SESSION_PRESERVE_STATE     388    /* preserve session state */
+#define OCI_ATTR_DRIVER_NAME                424               /* Driver Name */
+
+/* -------------------------- Admin Handle Attributes ---------------------- */
+
+#define OCI_ATTR_ADMIN_PFILE                389    /* client-side param file */
+
+/*----------------------- Attributes for End To End Tracing -----------------*/
+/* -------------------------- HA Event Handle Attributes ------------------- */
+
+#define OCI_ATTR_HOSTNAME         390                /* SYS_CONTEXT hostname */
+#define OCI_ATTR_DBNAME           391                  /* SYS_CONTEXT dbname */
+#define OCI_ATTR_INSTNAME         392           /* SYS_CONTEXT instance name */
+#define OCI_ATTR_SERVICENAME      393            /* SYS_CONTEXT service name */
+#define OCI_ATTR_INSTSTARTTIME    394      /* v$instance instance start time */
+#define OCI_ATTR_HA_TIMESTAMP     395                          /* event time */
+#define OCI_ATTR_RESERVED_22      396                            /* reserved */
+#define OCI_ATTR_RESERVED_23      397                            /* reserved */
+#define OCI_ATTR_RESERVED_24      398                            /* reserved */
+#define OCI_ATTR_DBDOMAIN         399                           /* db domain */
+#define OCI_ATTR_RESERVED_27      425                            /* reserved */
+
+#define OCI_ATTR_EVENTTYPE        400                          /* event type */
+#define OCI_EVENTTYPE_HA            0  /* valid value for OCI_ATTR_EVENTTYPE */
+
+#define OCI_ATTR_HA_SOURCE        401
+/* valid values for OCI_ATTR_HA_SOURCE */
+#define OCI_HA_SOURCE_INSTANCE            0 
+#define OCI_HA_SOURCE_DATABASE            1
+#define OCI_HA_SOURCE_NODE                2
+#define OCI_HA_SOURCE_SERVICE             3
+#define OCI_HA_SOURCE_SERVICE_MEMBER      4
+#define OCI_HA_SOURCE_ASM_INSTANCE        5
+#define OCI_HA_SOURCE_SERVICE_PRECONNECT  6
+
+#define OCI_ATTR_HA_STATUS        402
+#define OCI_HA_STATUS_DOWN          0 /* valid values for OCI_ATTR_HA_STATUS */
+#define OCI_HA_STATUS_UP            1
+
+#define OCI_ATTR_HA_SRVFIRST      403
+
+#define OCI_ATTR_HA_SRVNEXT       404
+/* ------------------------- Server Handle Attributes -----------------------*/
+
+#define OCI_ATTR_TAF_ENABLED      405
+
+/* Extra notification attributes */
+#define OCI_ATTR_NFY_FLAGS        406 
+
+#define OCI_ATTR_MSG_DELIVERY_MODE 407        /* msg delivery mode */
+#define OCI_ATTR_DB_CHARSET_ID     416       /* database charset ID */
+#define OCI_ATTR_DB_NCHARSET_ID    417       /* database ncharset ID */
+#define OCI_ATTR_RESERVED_25       418                           /* reserved */
+
+#define OCI_ATTR_FLOW_CONTROL_TIMEOUT       423  /* AQ: flow control timeout */
+/*---------------------------------------------------------------------------*/
+/* ------------------DirPathAPI attribute Section----------------------------*/
+/* All DirPathAPI attributes are in this section of the file.  Existing      */
+/* attributes prior to this section being created are assigned values < 2000 */
+/* Add new DirPathAPI attributes to this section and their assigned value    */
+/* should be whatever the last entry is + 1.                                 */
+
+/*------------- Supported Values for Direct Path Stream Version -------------*/
+#define OCI_DIRPATH_STREAM_VERSION_1        100
+#define OCI_DIRPATH_STREAM_VERSION_2        200
+#define OCI_DIRPATH_STREAM_VERSION_3        300                   /* default */
+
+
+#define OCI_ATTR_DIRPATH_MODE           78  /* mode of direct path operation */
+#define OCI_ATTR_DIRPATH_NOLOG          79               /* nologging option */
+#define OCI_ATTR_DIRPATH_PARALLEL       80     /* parallel (temp seg) option */
+
+#define OCI_ATTR_DIRPATH_SORTED_INDEX    137 /* index that data is sorted on */
+
+            /* direct path index maint method (see oci8dp.h) */
+#define OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD 138
+
+    /* parallel load: db file, initial and next extent sizes */
+
+#define OCI_ATTR_DIRPATH_FILE               139      /* DB file to load into */
+#define OCI_ATTR_DIRPATH_STORAGE_INITIAL    140       /* initial extent size */
+#define OCI_ATTR_DIRPATH_STORAGE_NEXT       141          /* next extent size */
+            /* direct path index maint method (see oci8dp.h) */
+#define OCI_ATTR_DIRPATH_SKIPINDEX_METHOD   145
+
+    /* 8.2 dpapi support of ADTs */
+#define OCI_ATTR_DIRPATH_EXPR_TYPE  150        /* expr type of OCI_ATTR_NAME */
+
+/* For the direct path API there are three data formats:
+ * TEXT   - used mainly by SQL*Loader, data is in textual form
+ * STREAM - used by datapump, data is in stream loadable form
+ * OCI    - used by OCI programs utilizing the DpApi, data is in binary form
+ */
+#define OCI_ATTR_DIRPATH_INPUT         151 
+#define OCI_DIRPATH_INPUT_TEXT        0x01                           /* text */
+#define OCI_DIRPATH_INPUT_STREAM      0x02              /* stream (datapump) */
+#define OCI_DIRPATH_INPUT_OCI         0x04                   /* binary (oci) */
+#define OCI_DIRPATH_INPUT_UNKNOWN     0x08
+
+#define OCI_ATTR_DIRPATH_FN_CTX             167  /* fn ctx ADT attrs or args */
+
+#define OCI_ATTR_DIRPATH_OID                187   /* loading into an OID col */
+#define OCI_ATTR_DIRPATH_SID                194   /* loading into an SID col */
+#define OCI_ATTR_DIRPATH_OBJ_CONSTR         206 /* obj type of subst obj tbl */
+
+/* Attr to allow setting of the stream version PRIOR to calling Prepare */
+#define OCI_ATTR_DIRPATH_STREAM_VERSION     212      /* version of the stream*/
+
+#define OCIP_ATTR_DIRPATH_VARRAY_INDEX      213       /* varray index column */
+
+/*------------- Supported Values for Direct Path Date cache -----------------*/
+#define OCI_ATTR_DIRPATH_DCACHE_NUM         303        /* date cache entries */
+#define OCI_ATTR_DIRPATH_DCACHE_SIZE        304          /* date cache limit */
+#define OCI_ATTR_DIRPATH_DCACHE_MISSES      305         /* date cache misses */
+#define OCI_ATTR_DIRPATH_DCACHE_HITS        306           /* date cache hits */
+#define OCI_ATTR_DIRPATH_DCACHE_DISABLE     307 /* on set: disable datecache 
+                                                * on overflow.
+                                                * on get: datecache disabled? 
+                                                * could be due to overflow
+                                                * or others                  */
+
+/*------------- Attributes for 10i Updates to the DirPath API ---------------*/
+#define OCI_ATTR_DIRPATH_RESERVED_7         326                 /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_8         327                 /* reserved */
+#define OCI_ATTR_DIRPATH_CONVERT            328 /* stream conversion needed? */
+#define OCI_ATTR_DIRPATH_BADROW             329        /* info about bad row */
+#define OCI_ATTR_DIRPATH_BADROW_LENGTH      330    /* length of bad row info */
+#define OCI_ATTR_DIRPATH_WRITE_ORDER        331         /* column fill order */
+#define OCI_ATTR_DIRPATH_GRANULE_SIZE       332   /* granule size for unload */
+#define OCI_ATTR_DIRPATH_GRANULE_OFFSET     333    /* offset to last granule */
+#define OCI_ATTR_DIRPATH_RESERVED_1         334                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_2         335                  /* reserved */
+
+/*------ Attributes for 10i DirPathAPI conversion (NLS lang, terr, cs) ------*/
+#define OCI_ATTR_DIRPATH_RESERVED_3         337                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_4         338                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_5         357                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_6         358                  /* reserved */
+
+#define OCI_ATTR_DIRPATH_LOCK_WAIT          359    /* wait for lock in dpapi */
+
+#define OCI_ATTR_DIRPATH_RESERVED_9        2000                  /* reserved */
+
+/*------ Attribute for 10iR2 for column encryption for Direct Path API ------*/
+#define OCI_ATTR_DIRPATH_RESERVED_10       2001                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_11       2002                  /* reserved */
+
+/*------ Attribute to determine last column successfully converted ----------*/
+#define OCI_ATTR_CURRENT_ERRCOL            2003      /* current error column */
+
+  /*--Attributes for 11gR1 for multiple subtype support in Direct Path API - */
+#define OCI_ATTR_DIRPATH_SUBTYPE_INDEX     2004  /* sbtyp indx for attribute */
+
+#define OCI_ATTR_DIRPATH_RESERVED_12       2005                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_13       2006                  /* reserver */
+
+  /*--Attribute for partitioning constraint optimization in Direct Path API  */
+#define OCI_ATTR_DIRPATH_RESERVED_14       2007                  /* reserved */
+
+  /*--Attribute for interval partitioning in Direct Path API  */
+#define OCI_ATTR_DIRPATH_RESERVED_15       2008                  /* reserved */
+
+  /*--Attribute for interval partitioning in Direct Path API  */
+#define OCI_ATTR_DIRPATH_RESERVED_16       2009                  /* reserved */
+
+/*--Attribute for allowing parallel lob loads in Direct Path API */
+#define OCI_ATTR_DIRPATH_RESERVED_17       2010                  /* reserved */
+
+/*--Attribute for process order number of table being loaded/unloaded        */
+#define OCI_ATTR_DIRPATH_RESERVED_18       2011                  /* reserved */
+
+#define OCI_ATTR_DIRPATH_RESERVED_19       2012                  /* reserved */
+
+#define OCI_ATTR_DIRPATH_NO_INDEX_ERRORS   2013                  /* reserved */
+
+/*--Attribute for private sqlldr no index errors                             */
+#define OCI_ATTR_DIRPATH_RESERVED_20       2014                  /* reserved */
+
+/*--Attribute for private sqlldr partition memory limit                      */
+#define OCI_ATTR_DIRPATH_RESERVED_21       2015                  /* reserved */
+
+#define OCI_ATTR_DIRPATH_RESERVED_22       2016                  /* reserved */
+
+/*--Attribute to use caller's transaction rather than starting on in kpodpp  */
+#define OCI_ATTR_DIRPATH_USE_ACTIVE_TRANS  2017                  /* reserved */
+
+/*--Attribute  for recnum column                                             */
+#define OCI_ATTR_DIRPATH_RESERVED_23       2018                  /* reserved */
+
+/* Add DirPathAPI attributes above.  Next value to be assigned is 2019      */
+
+
+
+/* ------------------End of DirPathAPI attribute Section --------------------*/
+/*---------------------------------------------------------------------------*/
+
+
+/*---------------- Describe Handle Parameter Attribute Values ---------------*/
+
+/* OCI_ATTR_CURSOR_COMMIT_BEHAVIOR */
+#define OCI_CURSOR_OPEN   0 
+#define OCI_CURSOR_CLOSED 1
+
+/* OCI_ATTR_CATALOG_LOCATION */
+#define OCI_CL_START 0
+#define OCI_CL_END   1
+
+/* OCI_ATTR_SAVEPOINT_SUPPORT */
+#define OCI_SP_SUPPORTED   0
+#define OCI_SP_UNSUPPORTED 1
+
+/* OCI_ATTR_NOWAIT_SUPPORT */
+#define OCI_NW_SUPPORTED   0
+#define OCI_NW_UNSUPPORTED 1
+
+/* OCI_ATTR_AUTOCOMMIT_DDL */
+#define OCI_AC_DDL    0
+#define OCI_NO_AC_DDL 1
+
+/* OCI_ATTR_LOCKING_MODE */
+#define OCI_LOCK_IMMEDIATE 0
+#define OCI_LOCK_DELAYED   1
+
+/* ------------------- Instance type attribute values -----------------------*/
+#define OCI_INSTANCE_TYPE_UNKNOWN  0
+#define OCI_INSTANCE_TYPE_RDBMS    1
+#define OCI_INSTANCE_TYPE_OSM      2
+
+/* ---------------- ASM Volume Device Support attribute values --------------*/
+#define OCI_ASM_VOLUME_UNSUPPORTED 0
+#define OCI_ASM_VOLUME_SUPPORTED   1
+
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------OCIPasswordChange-------------------------------*/
+#define OCI_AUTH         0x08        /* Change the password but do not login */
+
+
+/*------------------------Other Constants------------------------------------*/
+#define OCI_MAX_FNS   100                     /* max number of OCI Functions */
+#define OCI_SQLSTATE_SIZE 5  
+#define OCI_ERROR_MAXMSG_SIZE   1024         /* max size of an error message */
+#define OCI_ERROR_MAXMSG_SIZE2  3072 /* new len max size of an error message */
+#define OCI_LOBMAXSIZE MINUB4MAXVAL                 /* maximum lob data size */
+#define OCI_ROWID_LEN             23
+#define OCI_LOB_CONTENTTYPE_MAXSIZE 128  /* max size of securefile contenttype */
+#define OCI_LOB_CONTENTTYPE_MAXBYTESIZE  OCI_LOB_CONTENTTYPE_MAXSIZE 
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Fail Over Events ---------------------------------*/
+#define OCI_FO_END          0x00000001
+#define OCI_FO_ABORT        0x00000002   
+#define OCI_FO_REAUTH       0x00000004
+#define OCI_FO_BEGIN        0x00000008 
+#define OCI_FO_ERROR        0x00000010
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Fail Over Callback Return Codes ------------------*/
+#define OCI_FO_RETRY        25410
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- Fail Over Types ---------------------------------*/
+#define OCI_FO_NONE           0x00000001
+#define OCI_FO_SESSION        0x00000002
+#define OCI_FO_SELECT         0x00000004
+#define OCI_FO_TXNAL          0x00000008
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------Function Codes--------------------------------------*/
+#define OCI_FNCODE_INITIALIZE     1                         /* OCIInitialize */
+#define OCI_FNCODE_HANDLEALLOC  2                          /* OCIHandleAlloc */
+#define OCI_FNCODE_HANDLEFREE  3                            /* OCIHandleFree */
+#define OCI_FNCODE_DESCRIPTORALLOC  4                  /* OCIDescriptorAlloc */
+#define OCI_FNCODE_DESCRIPTORFREE  5                    /* OCIDescriptorFree */
+#define OCI_FNCODE_ENVINIT   6                                 /* OCIEnvInit */
+#define OCI_FNCODE_SERVERATTACH   7                       /* OCIServerAttach */
+#define OCI_FNCODE_SERVERDETACH   8                       /* OCIServerDetach */
+/* unused         9 */ 
+#define OCI_FNCODE_SESSIONBEGIN  10                       /* OCISessionBegin */
+#define OCI_FNCODE_SESSIONEND   11                          /* OCISessionEnd */
+#define OCI_FNCODE_PASSWORDCHANGE   12                  /* OCIPasswordChange */
+#define OCI_FNCODE_STMTPREPARE   13                        /* OCIStmtPrepare */
+                                                      /* unused       14- 16 */
+#define OCI_FNCODE_BINDDYNAMIC   17                        /* OCIBindDynamic */
+#define OCI_FNCODE_BINDOBJECT  18                           /* OCIBindObject */
+                                                                /* 19 unused */
+#define OCI_FNCODE_BINDARRAYOFSTRUCT   20            /* OCIBindArrayOfStruct */
+#define OCI_FNCODE_STMTEXECUTE  21                         /* OCIStmtExecute */
+                                                             /* unused 22-24 */
+#define OCI_FNCODE_DEFINEOBJECT  25                       /* OCIDefineObject */
+#define OCI_FNCODE_DEFINEDYNAMIC   26                    /* OCIDefineDynamic */
+#define OCI_FNCODE_DEFINEARRAYOFSTRUCT  27         /* OCIDefineArrayOfStruct */
+#define OCI_FNCODE_STMTFETCH   28                            /* OCIStmtFetch */
+#define OCI_FNCODE_STMTGETBIND   29                    /* OCIStmtGetBindInfo */
+                                                            /* 30, 31 unused */
+#define OCI_FNCODE_DESCRIBEANY  32                         /* OCIDescribeAny */
+#define OCI_FNCODE_TRANSSTART  33                           /* OCITransStart */
+#define OCI_FNCODE_TRANSDETACH  34                         /* OCITransDetach */
+#define OCI_FNCODE_TRANSCOMMIT  35                         /* OCITransCommit */
+                                                                /* 36 unused */
+#define OCI_FNCODE_ERRORGET   37                              /* OCIErrorGet */
+#define OCI_FNCODE_LOBOPENFILE  38                         /* OCILobFileOpen */
+#define OCI_FNCODE_LOBCLOSEFILE  39                       /* OCILobFileClose */
+                                             /* 40 was LOBCREATEFILE, unused */
+                                         /* 41 was OCILobFileDelete, unused  */
+#define OCI_FNCODE_LOBCOPY  42                                 /* OCILobCopy */
+#define OCI_FNCODE_LOBAPPEND  43                             /* OCILobAppend */
+#define OCI_FNCODE_LOBERASE  44                               /* OCILobErase */
+#define OCI_FNCODE_LOBLENGTH  45                          /* OCILobGetLength */
+#define OCI_FNCODE_LOBTRIM  46                                 /* OCILobTrim */
+#define OCI_FNCODE_LOBREAD  47                                 /* OCILobRead */
+#define OCI_FNCODE_LOBWRITE  48                               /* OCILobWrite */
+                                                                /* 49 unused */
+#define OCI_FNCODE_SVCCTXBREAK 50                                /* OCIBreak */
+#define OCI_FNCODE_SERVERVERSION  51                     /* OCIServerVersion */
+
+#define OCI_FNCODE_KERBATTRSET 52                          /* OCIKerbAttrSet */
+
+/* unused 53 */
+
+#define OCI_FNCODE_ATTRGET 54                                  /* OCIAttrGet */
+#define OCI_FNCODE_ATTRSET 55                                  /* OCIAttrSet */
+#define OCI_FNCODE_PARAMSET 56                                /* OCIParamSet */
+#define OCI_FNCODE_PARAMGET 57                                /* OCIParamGet */
+#define OCI_FNCODE_STMTGETPIECEINFO   58              /* OCIStmtGetPieceInfo */
+#define OCI_FNCODE_LDATOSVCCTX 59                          /* OCILdaToSvcCtx */
+                                                                /* 60 unused */
+#define OCI_FNCODE_STMTSETPIECEINFO   61              /* OCIStmtSetPieceInfo */
+#define OCI_FNCODE_TRANSFORGET 62                          /* OCITransForget */
+#define OCI_FNCODE_TRANSPREPARE 63                        /* OCITransPrepare */
+#define OCI_FNCODE_TRANSROLLBACK  64                     /* OCITransRollback */
+#define OCI_FNCODE_DEFINEBYPOS 65                          /* OCIDefineByPos */
+#define OCI_FNCODE_BINDBYPOS 66                              /* OCIBindByPos */
+#define OCI_FNCODE_BINDBYNAME 67                            /* OCIBindByName */
+#define OCI_FNCODE_LOBASSIGN  68                             /* OCILobAssign */
+#define OCI_FNCODE_LOBISEQUAL  69                           /* OCILobIsEqual */
+#define OCI_FNCODE_LOBISINIT  70                      /* OCILobLocatorIsInit */
+
+#define OCI_FNCODE_LOBENABLEBUFFERING  71           /* OCILobEnableBuffering */
+#define OCI_FNCODE_LOBCHARSETID  72                       /* OCILobCharSetID */
+#define OCI_FNCODE_LOBCHARSETFORM  73                   /* OCILobCharSetForm */
+#define OCI_FNCODE_LOBFILESETNAME  74                   /* OCILobFileSetName */
+#define OCI_FNCODE_LOBFILEGETNAME  75                   /* OCILobFileGetName */
+#define OCI_FNCODE_LOGON 76                                      /* OCILogon */
+#define OCI_FNCODE_LOGOFF 77                                    /* OCILogoff */
+#define OCI_FNCODE_LOBDISABLEBUFFERING 78          /* OCILobDisableBuffering */
+#define OCI_FNCODE_LOBFLUSHBUFFER 79                    /* OCILobFlushBuffer */
+#define OCI_FNCODE_LOBLOADFROMFILE 80                  /* OCILobLoadFromFile */
+
+#define OCI_FNCODE_LOBOPEN  81                                 /* OCILobOpen */
+#define OCI_FNCODE_LOBCLOSE  82                               /* OCILobClose */
+#define OCI_FNCODE_LOBISOPEN  83                             /* OCILobIsOpen */
+#define OCI_FNCODE_LOBFILEISOPEN  84                     /* OCILobFileIsOpen */
+#define OCI_FNCODE_LOBFILEEXISTS  85                     /* OCILobFileExists */
+#define OCI_FNCODE_LOBFILECLOSEALL  86                 /* OCILobFileCloseAll */
+#define OCI_FNCODE_LOBCREATETEMP  87                /* OCILobCreateTemporary */
+#define OCI_FNCODE_LOBFREETEMP  88                    /* OCILobFreeTemporary */
+#define OCI_FNCODE_LOBISTEMP  89                        /* OCILobIsTemporary */
+
+#define OCI_FNCODE_AQENQ  90                                     /* OCIAQEnq */
+#define OCI_FNCODE_AQDEQ  91                                     /* OCIAQDeq */
+#define OCI_FNCODE_RESET  92                                     /* OCIReset */
+#define OCI_FNCODE_SVCCTXTOLDA  93                         /* OCISvcCtxToLda */
+#define OCI_FNCODE_LOBLOCATORASSIGN 94                /* OCILobLocatorAssign */
+
+#define OCI_FNCODE_UBINDBYNAME 95
+
+#define OCI_FNCODE_AQLISTEN  96                               /* OCIAQListen */
+
+#define OCI_FNCODE_SVC2HST 97                                    /* reserved */
+#define OCI_FNCODE_SVCRH   98                                    /* reserved */
+                           /* 97 and 98 are reserved for Oracle internal use */
+
+#define OCI_FNCODE_TRANSMULTIPREPARE   99            /* OCITransMultiPrepare */
+
+#define OCI_FNCODE_CPOOLCREATE  100               /* OCIConnectionPoolCreate */
+#define OCI_FNCODE_CPOOLDESTROY 101              /* OCIConnectionPoolDestroy */
+#define OCI_FNCODE_LOGON2 102                                   /* OCILogon2 */
+#define OCI_FNCODE_ROWIDTOCHAR  103                        /* OCIRowidToChar */
+
+#define OCI_FNCODE_SPOOLCREATE  104                  /* OCISessionPoolCreate */
+#define OCI_FNCODE_SPOOLDESTROY 105                 /* OCISessionPoolDestroy */
+#define OCI_FNCODE_SESSIONGET   106                         /* OCISessionGet */
+#define OCI_FNCODE_SESSIONRELEASE 107                   /* OCISessionRelease */
+#define OCI_FNCODE_STMTPREPARE2 108                       /* OCIStmtPrepare2 */
+#define OCI_FNCODE_STMTRELEASE 109                         /* OCIStmtRelease */
+#define OCI_FNCODE_AQENQARRAY  110                          /* OCIAQEnqArray */
+#define OCI_FNCODE_AQDEQARRAY  111                          /* OCIAQDeqArray */
+#define OCI_FNCODE_LOBCOPY2    112                            /* OCILobCopy2 */
+#define OCI_FNCODE_LOBERASE2   113                           /* OCILobErase2 */
+#define OCI_FNCODE_LOBLENGTH2  114                       /* OCILobGetLength2 */
+#define OCI_FNCODE_LOBLOADFROMFILE2  115              /* OCILobLoadFromFile2 */
+#define OCI_FNCODE_LOBREAD2    116                            /* OCILobRead2 */
+#define OCI_FNCODE_LOBTRIM2    117                            /* OCILobTrim2 */
+#define OCI_FNCODE_LOBWRITE2   118                           /* OCILobWrite2 */
+#define OCI_FNCODE_LOBGETSTORAGELIMIT 119           /* OCILobGetStorageLimit */
+#define OCI_FNCODE_DBSTARTUP 120                             /* OCIDBStartup */
+#define OCI_FNCODE_DBSHUTDOWN 121                           /* OCIDBShutdown */
+#define OCI_FNCODE_LOBARRAYREAD       122                 /* OCILobArrayRead */
+#define OCI_FNCODE_LOBARRAYWRITE      123                /* OCILobArrayWrite */
+#define OCI_FNCODE_AQENQSTREAM        124               /* OCIAQEnqStreaming */
+#define OCI_FNCODE_AQGETREPLAY        125              /* OCIAQGetReplayInfo */
+#define OCI_FNCODE_AQRESETREPLAY      126            /* OCIAQResetReplayInfo */
+#define OCI_FNCODE_ARRAYDESCRIPTORALLOC 127        /*OCIArrayDescriptorAlloc */
+#define OCI_FNCODE_ARRAYDESCRIPTORFREE  128       /* OCIArrayDescriptorFree  */
+#define OCI_FNCODE_LOBGETOPT        129                /* OCILobGetCptions */
+#define OCI_FNCODE_LOBSETOPT        130                /* OCILobSetCptions */
+#define OCI_FNCODE_LOBFRAGINS       131           /* OCILobFragementInsert */
+#define OCI_FNCODE_LOBFRAGDEL       132           /* OCILobFragementDelete */
+#define OCI_FNCODE_LOBFRAGMOV       133             /* OCILobFragementMove */
+#define OCI_FNCODE_LOBFRAGREP       134          /* OCILobFragementReplace */
+#define OCI_FNCODE_LOBGETDEDUPLICATEREGIONS 135/* OCILobGetDeduplicateRegions */
+#define OCI_FNCODE_APPCTXSET        136        /* OCIAppCtxSet */
+#define OCI_FNCODE_APPCTXCLEARALL   137         /* OCIAppCtxClearAll */
+
+#define OCI_FNCODE_LOBGETCONTENTTYPE 138             /* OCILobGetContentType */
+#define OCI_FNCODE_LOBSETCONTENTTYPE 139             /* OCILobSetContentType */
+#define OCI_FNCODE_MAXFCN            139        /* maximum OCI function code */
+
+/*---------------Statement Cache callback modes-----------------------------*/
+#define OCI_CBK_STMTCACHE_STMTPURGE  0x01
+
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------Handle Definitions----------------------------------*/
+typedef struct OCIEnv           OCIEnv;            /* OCI environment handle */
+typedef struct OCIError         OCIError;                /* OCI error handle */
+typedef struct OCISvcCtx        OCISvcCtx;             /* OCI service handle */
+typedef struct OCIStmt          OCIStmt;             /* OCI statement handle */
+typedef struct OCIBind          OCIBind;                  /* OCI bind handle */
+typedef struct OCIDefine        OCIDefine;              /* OCI Define handle */
+typedef struct OCIDescribe      OCIDescribe;          /* OCI Describe handle */
+typedef struct OCIServer        OCIServer;              /* OCI Server handle */
+typedef struct OCISession       OCISession;     /* OCI Authentication handle */
+typedef struct OCIComplexObject OCIComplexObject;          /* OCI COR handle */
+typedef struct OCITrans         OCITrans;          /* OCI Transaction handle */
+typedef struct OCISecurity      OCISecurity;          /* OCI Security handle */
+typedef struct OCISubscription  OCISubscription;      /* subscription handle */
+
+typedef struct OCICPool         OCICPool;          /* connection pool handle */
+typedef struct OCISPool         OCISPool;             /* session pool handle */
+typedef struct OCIAuthInfo      OCIAuthInfo;                  /* auth handle */
+typedef struct OCIAdmin         OCIAdmin;                    /* admin handle */
+typedef struct OCIEvent         OCIEvent;                 /* HA event handle */
+
+/*-----------------------Descriptor Definitions------------------------------*/
+typedef struct OCISnapshot      OCISnapshot;      /* OCI snapshot descriptor */
+typedef struct OCIResult        OCIResult;      /* OCI Result Set Descriptor */
+typedef struct OCILobLocator    OCILobLocator; /* OCI Lob Locator descriptor */
+typedef struct OCILobRegion     OCILobRegion;  /* OCI Lob Regions descriptor */
+typedef struct OCIParam         OCIParam;        /* OCI PARameter descriptor */
+typedef struct OCIComplexObjectComp OCIComplexObjectComp;
+                                                       /* OCI COR descriptor */
+typedef struct OCIRowid OCIRowid;                    /* OCI ROWID descriptor */
+
+typedef struct OCIDateTime OCIDateTime;           /* OCI DateTime descriptor */
+typedef struct OCIInterval OCIInterval;           /* OCI Interval descriptor */
+
+typedef struct OCIUcb           OCIUcb;      /* OCI User Callback descriptor */
+typedef struct OCIServerDNs     OCIServerDNs;    /* OCI server DN descriptor */
+
+/*-------------------------- AQ Descriptors ---------------------------------*/
+typedef struct OCIAQEnqOptions    OCIAQEnqOptions; /* AQ Enqueue Options hdl */
+typedef struct OCIAQDeqOptions    OCIAQDeqOptions; /* AQ Dequeue Options hdl */
+typedef struct OCIAQMsgProperties OCIAQMsgProperties;  /* AQ Mesg Properties */
+typedef struct OCIAQAgent         OCIAQAgent;         /* AQ Agent descriptor */
+typedef struct OCIAQNfyDescriptor OCIAQNfyDescriptor;   /* AQ Nfy descriptor */
+typedef struct OCIAQSignature     OCIAQSignature;            /* AQ Siganture */
+typedef struct OCIAQListenOpts    OCIAQListenOpts;      /* AQ listen options */
+typedef struct OCIAQLisMsgProps   OCIAQLisMsgProps;   /* AQ listen msg props */
+
+/*---------------------------------------------------------------------------*/
+ 
+/* Lob typedefs for Pro*C */
+typedef struct OCILobLocator OCIClobLocator;    /* OCI Character LOB Locator */
+typedef struct OCILobLocator OCIBlobLocator;       /* OCI Binary LOB Locator */
+typedef struct OCILobLocator OCIBFileLocator; /* OCI Binary LOB File Locator */
+/*---------------------------------------------------------------------------*/
+
+/* Undefined value for tz in interval types*/
+#define OCI_INTHR_UNK 24
+
+  /* These defined adjustment values */
+#define OCI_ADJUST_UNK            10
+#define OCI_ORACLE_DATE           0
+#define OCI_ANSI_DATE             1
+
+/*------------------------ Lob-specific Definitions -------------------------*/
+
+/*
+ * ociloff - OCI Lob OFFset
+ *
+ * The offset in the lob data.  The offset is specified in terms of bytes for
+ * BLOBs and BFILes.  Character offsets are used for CLOBs, NCLOBs.
+ * The maximum size of internal lob data is 4 gigabytes.  FILE LOB 
+ * size is limited by the operating system.
+ */
+typedef ub4 OCILobOffset;
+
+/*
+ * ocillen - OCI Lob LENgth (of lob data)
+ *
+ * Specifies the length of lob data in bytes for BLOBs and BFILes and in 
+ * characters for CLOBs, NCLOBs.  The maximum length of internal lob
+ * data is 4 gigabytes.  The length of FILE LOBs is limited only by the
+ * operating system.
+ */
+typedef ub4 OCILobLength;
+/*
+ * ocilmo - OCI Lob open MOdes
+ *
+ * The mode specifies the planned operations that will be performed on the
+ * FILE lob data.  The FILE lob can be opened in read-only mode only.
+ * 
+ * In the future, we may include read/write, append and truncate modes.  Append
+ * is equivalent to read/write mode except that the FILE is positioned for
+ * writing to the end.  Truncate is equivalent to read/write mode except that
+ * the FILE LOB data is first truncated to a length of 0 before use.
+ */
+enum OCILobMode
+{
+  OCI_LOBMODE_READONLY = 1,                                     /* read-only */
+  OCI_LOBMODE_READWRITE = 2             /* read_write for internal lobs only */
+};
+typedef enum OCILobMode OCILobMode;
+
+/*---------------------------------------------------------------------------*/
+
+
+/*----------------------------Piece Definitions------------------------------*/
+
+/* if ocidef.h is being included in the app, ocidef.h should precede oci.h */
+
+/* 
+ * since clients may  use oci.h, ocidef.h and ocidfn.h the following defines
+ * need to be guarded, usually internal clients
+ */
+
+#ifndef OCI_FLAGS
+#define OCI_FLAGS
+#define OCI_ONE_PIECE 0                                         /* one piece */
+#define OCI_FIRST_PIECE 1                                 /* the first piece */
+#define OCI_NEXT_PIECE 2                          /* the next of many pieces */
+#define OCI_LAST_PIECE 3                                   /* the last piece */
+#endif
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- FILE open modes -------------------------------*/
+#define OCI_FILE_READONLY 1             /* readonly mode open for FILE types */
+/*---------------------------------------------------------------------------*/
+/*--------------------------- LOB open modes --------------------------------*/
+#define OCI_LOB_READONLY 1              /* readonly mode open for ILOB types */
+#define OCI_LOB_READWRITE 2                /* read write mode open for ILOBs */
+#define OCI_LOB_WRITEONLY     3         /* Writeonly mode open for ILOB types*/
+#define OCI_LOB_APPENDONLY    4       /* Appendonly mode open for ILOB types */
+#define OCI_LOB_FULLOVERWRITE 5                 /* Completely overwrite ILOB */
+#define OCI_LOB_FULLREAD      6                 /* Doing a Full Read of ILOB */
+
+/*----------------------- LOB Buffering Flush Flags -------------------------*/
+#define OCI_LOB_BUFFER_FREE   1 
+#define OCI_LOB_BUFFER_NOFREE 2
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------LOB Option Types -------------------------------*/
+#define OCI_LOB_OPT_COMPRESS     1                    /* SECUREFILE Compress */
+#define OCI_LOB_OPT_ENCRYPT      2                     /* SECUREFILE Encrypt */
+#define OCI_LOB_OPT_DEDUPLICATE  4                 /* SECUREFILE Deduplicate */
+#define OCI_LOB_OPT_ALLOCSIZE    8             /* SECUREFILE Allocation Size */
+#define OCI_LOB_OPT_CONTENTTYPE 16                /* SECUREFILE Content Type */
+#define OCI_LOB_OPT_MODTIME     32           /* SECUREFILE Modification Time */
+
+/*------------------------   LOB Option Values ------------------------------*/
+/* Compression */
+#define OCI_LOB_COMPRESS_OFF  0                           /* Compression off */
+#define OCI_LOB_COMPRESS_ON   1                            /* Compression on */
+/* Encryption */
+#define OCI_LOB_ENCRYPT_OFF   0                            /* Encryption Off */
+#define OCI_LOB_ENCRYPT_ON    2                             /* Encryption On */
+/* Deduplciate */
+#define OCI_LOB_DEDUPLICATE_OFF 0                         /* Deduplicate Off */
+#define OCI_LOB_DEDUPLICATE_ON  4                        /* Deduplicate Lobs */
+
+/*--------------------------- OCI Statement Types ---------------------------*/
+
+#define  OCI_STMT_UNKNOWN 0                             /* Unknown statement */
+#define  OCI_STMT_SELECT  1                              /* select statement */
+#define  OCI_STMT_UPDATE  2                              /* update statement */
+#define  OCI_STMT_DELETE  3                              /* delete statement */
+#define  OCI_STMT_INSERT  4                              /* Insert Statement */
+#define  OCI_STMT_CREATE  5                              /* create statement */
+#define  OCI_STMT_DROP    6                                /* drop statement */
+#define  OCI_STMT_ALTER   7                               /* alter statement */
+#define  OCI_STMT_BEGIN   8                   /* begin ... (pl/sql statement)*/
+#define  OCI_STMT_DECLARE 9                /* declare .. (pl/sql statement ) */
+#define  OCI_STMT_CALL    10                      /* corresponds to kpu call */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCI Parameter Types ---------------------------*/
+#define OCI_PTYPE_UNK                 0                         /* unknown   */
+#define OCI_PTYPE_TABLE               1                         /* table     */
+#define OCI_PTYPE_VIEW                2                         /* view      */
+#define OCI_PTYPE_PROC                3                         /* procedure */
+#define OCI_PTYPE_FUNC                4                         /* function  */
+#define OCI_PTYPE_PKG                 5                         /* package   */
+#define OCI_PTYPE_TYPE                6                 /* user-defined type */
+#define OCI_PTYPE_SYN                 7                         /* synonym   */
+#define OCI_PTYPE_SEQ                 8                         /* sequence  */
+#define OCI_PTYPE_COL                 9                         /* column    */
+#define OCI_PTYPE_ARG                 10                        /* argument  */
+#define OCI_PTYPE_LIST                11                        /* list      */
+#define OCI_PTYPE_TYPE_ATTR           12    /* user-defined type's attribute */
+#define OCI_PTYPE_TYPE_COLL           13        /* collection type's element */
+#define OCI_PTYPE_TYPE_METHOD         14       /* user-defined type's method */
+#define OCI_PTYPE_TYPE_ARG            15   /* user-defined type method's arg */
+#define OCI_PTYPE_TYPE_RESULT         16/* user-defined type method's result */
+#define OCI_PTYPE_SCHEMA              17                           /* schema */
+#define OCI_PTYPE_DATABASE            18                         /* database */
+#define OCI_PTYPE_RULE                19                             /* rule */
+#define OCI_PTYPE_RULE_SET            20                         /* rule set */
+#define OCI_PTYPE_EVALUATION_CONTEXT  21               /* evaluation context */
+#define OCI_PTYPE_TABLE_ALIAS         22                      /* table alias */
+#define OCI_PTYPE_VARIABLE_TYPE       23                    /* variable type */
+#define OCI_PTYPE_NAME_VALUE          24                  /* name value pair */
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------------- OCI List Types ------------------------------*/
+#define OCI_LTYPE_UNK           0                               /* unknown   */
+#define OCI_LTYPE_COLUMN        1                             /* column list */
+#define OCI_LTYPE_ARG_PROC      2                 /* procedure argument list */
+#define OCI_LTYPE_ARG_FUNC      3                  /* function argument list */
+#define OCI_LTYPE_SUBPRG        4                         /* subprogram list */
+#define OCI_LTYPE_TYPE_ATTR     5                          /* type attribute */
+#define OCI_LTYPE_TYPE_METHOD   6                             /* type method */
+#define OCI_LTYPE_TYPE_ARG_PROC 7    /* type method w/o result argument list */
+#define OCI_LTYPE_TYPE_ARG_FUNC 8      /* type method w/result argument list */
+#define OCI_LTYPE_SCH_OBJ       9                      /* schema object list */
+#define OCI_LTYPE_DB_SCH        10                   /* database schema list */
+#define OCI_LTYPE_TYPE_SUBTYPE  11                           /* subtype list */
+#define OCI_LTYPE_TABLE_ALIAS   12                       /* table alias list */
+#define OCI_LTYPE_VARIABLE_TYPE 13                     /* variable type list */
+#define OCI_LTYPE_NAME_VALUE    14                        /* name value list */
+
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------- Memory Cartridge Services ---------------------*/
+#define OCI_MEMORY_CLEARED  1
+
+/*-------------------------- Pickler Cartridge Services ---------------------*/
+typedef struct OCIPicklerTdsCtx OCIPicklerTdsCtx;
+typedef struct OCIPicklerTds OCIPicklerTds;
+typedef struct OCIPicklerImage OCIPicklerImage;
+typedef struct OCIPicklerFdo OCIPicklerFdo;
+typedef ub4 OCIPicklerTdsElement;
+
+typedef struct OCIAnyData OCIAnyData;
+
+typedef struct OCIAnyDataSet OCIAnyDataSet;
+typedef struct OCIAnyDataCtx OCIAnyDataCtx;
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- User Callback Constants -----------------------*/
+#define OCI_UCBTYPE_ENTRY       1                          /* entry callback */
+#define OCI_UCBTYPE_EXIT        2                           /* exit callback */
+#define OCI_UCBTYPE_REPLACE     3                    /* replacement callback */
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------- NLS service type and constance ----------------------*/
+#define OCI_NLS_DAYNAME1      1                    /* Native name for Monday */
+#define OCI_NLS_DAYNAME2      2                   /* Native name for Tuesday */
+#define OCI_NLS_DAYNAME3      3                 /* Native name for Wednesday */
+#define OCI_NLS_DAYNAME4      4                  /* Native name for Thursday */
+#define OCI_NLS_DAYNAME5      5                    /* Native name for Friday */
+#define OCI_NLS_DAYNAME6      6              /* Native name for for Saturday */
+#define OCI_NLS_DAYNAME7      7                /* Native name for for Sunday */
+#define OCI_NLS_ABDAYNAME1    8        /* Native abbreviated name for Monday */
+#define OCI_NLS_ABDAYNAME2    9       /* Native abbreviated name for Tuesday */
+#define OCI_NLS_ABDAYNAME3    10    /* Native abbreviated name for Wednesday */
+#define OCI_NLS_ABDAYNAME4    11     /* Native abbreviated name for Thursday */
+#define OCI_NLS_ABDAYNAME5    12       /* Native abbreviated name for Friday */
+#define OCI_NLS_ABDAYNAME6    13 /* Native abbreviated name for for Saturday */
+#define OCI_NLS_ABDAYNAME7    14   /* Native abbreviated name for for Sunday */
+#define OCI_NLS_MONTHNAME1    15                  /* Native name for January */
+#define OCI_NLS_MONTHNAME2    16                 /* Native name for February */
+#define OCI_NLS_MONTHNAME3    17                    /* Native name for March */
+#define OCI_NLS_MONTHNAME4    18                    /* Native name for April */
+#define OCI_NLS_MONTHNAME5    19                      /* Native name for May */
+#define OCI_NLS_MONTHNAME6    20                     /* Native name for June */
+#define OCI_NLS_MONTHNAME7    21                     /* Native name for July */
+#define OCI_NLS_MONTHNAME8    22                   /* Native name for August */
+#define OCI_NLS_MONTHNAME9    23                /* Native name for September */
+#define OCI_NLS_MONTHNAME10   24                  /* Native name for October */
+#define OCI_NLS_MONTHNAME11   25                 /* Native name for November */
+#define OCI_NLS_MONTHNAME12   26                 /* Native name for December */
+#define OCI_NLS_ABMONTHNAME1  27      /* Native abbreviated name for January */
+#define OCI_NLS_ABMONTHNAME2  28     /* Native abbreviated name for February */
+#define OCI_NLS_ABMONTHNAME3  29        /* Native abbreviated name for March */
+#define OCI_NLS_ABMONTHNAME4  30        /* Native abbreviated name for April */
+#define OCI_NLS_ABMONTHNAME5  31          /* Native abbreviated name for May */
+#define OCI_NLS_ABMONTHNAME6  32         /* Native abbreviated name for June */
+#define OCI_NLS_ABMONTHNAME7  33         /* Native abbreviated name for July */
+#define OCI_NLS_ABMONTHNAME8  34       /* Native abbreviated name for August */
+#define OCI_NLS_ABMONTHNAME9  35    /* Native abbreviated name for September */
+#define OCI_NLS_ABMONTHNAME10 36      /* Native abbreviated name for October */
+#define OCI_NLS_ABMONTHNAME11 37     /* Native abbreviated name for November */
+#define OCI_NLS_ABMONTHNAME12 38     /* Native abbreviated name for December */
+#define OCI_NLS_YES           39   /* Native string for affirmative response */
+#define OCI_NLS_NO            40                 /* Native negative response */
+#define OCI_NLS_AM            41           /* Native equivalent string of AM */
+#define OCI_NLS_PM            42           /* Native equivalent string of PM */
+#define OCI_NLS_AD            43           /* Native equivalent string of AD */
+#define OCI_NLS_BC            44           /* Native equivalent string of BC */
+#define OCI_NLS_DECIMAL       45                        /* decimal character */
+#define OCI_NLS_GROUP         46                          /* group separator */
+#define OCI_NLS_DEBIT         47                   /* Native symbol of debit */
+#define OCI_NLS_CREDIT        48                  /* Native sumbol of credit */
+#define OCI_NLS_DATEFORMAT    49                       /* Oracle date format */
+#define OCI_NLS_INT_CURRENCY  50            /* International currency symbol */
+#define OCI_NLS_LOC_CURRENCY  51                   /* Locale currency symbol */
+#define OCI_NLS_LANGUAGE      52                            /* Language name */
+#define OCI_NLS_ABLANGUAGE    53           /* Abbreviation for language name */
+#define OCI_NLS_TERRITORY     54                           /* Territory name */
+#define OCI_NLS_CHARACTER_SET 55                       /* Character set name */
+#define OCI_NLS_LINGUISTIC_NAME    56                     /* Linguistic name */
+#define OCI_NLS_CALENDAR      57                            /* Calendar name */
+#define OCI_NLS_DUAL_CURRENCY 78                     /* Dual currency symbol */
+#define OCI_NLS_WRITINGDIR    79               /* Language writing direction */
+#define OCI_NLS_ABTERRITORY   80                   /* Territory Abbreviation */
+#define OCI_NLS_DDATEFORMAT   81               /* Oracle default date format */
+#define OCI_NLS_DTIMEFORMAT   82               /* Oracle default time format */
+#define OCI_NLS_SFDATEFORMAT  83       /* Local string formatted date format */
+#define OCI_NLS_SFTIMEFORMAT  84       /* Local string formatted time format */
+#define OCI_NLS_NUMGROUPING   85                   /* Number grouping fields */
+#define OCI_NLS_LISTSEP       86                           /* List separator */
+#define OCI_NLS_MONDECIMAL    87               /* Monetary decimal character */
+#define OCI_NLS_MONGROUP      88                 /* Monetary group separator */
+#define OCI_NLS_MONGROUPING   89                 /* Monetary grouping fields */
+#define OCI_NLS_INT_CURRENCYSEP 90       /* International currency separator */
+#define OCI_NLS_CHARSET_MAXBYTESZ 91     /* Maximum character byte size      */
+#define OCI_NLS_CHARSET_FIXEDWIDTH 92    /* Fixed-width charset byte size    */
+#define OCI_NLS_CHARSET_ID    93                         /* Character set id */
+#define OCI_NLS_NCHARSET_ID   94                        /* NCharacter set id */
+
+#define OCI_NLS_MAXBUFSZ   100 /* Max buffer size may need for OCINlsGetInfo */
+
+#define OCI_NLS_BINARY            0x1           /* for the binary comparison */
+#define OCI_NLS_LINGUISTIC        0x2           /* for linguistic comparison */
+#define OCI_NLS_CASE_INSENSITIVE  0x10    /* for case-insensitive comparison */
+
+#define OCI_NLS_UPPERCASE         0x20               /* convert to uppercase */
+#define OCI_NLS_LOWERCASE         0x40               /* convert to lowercase */
+
+#define OCI_NLS_CS_IANA_TO_ORA   0   /* Map charset name from IANA to Oracle */
+#define OCI_NLS_CS_ORA_TO_IANA   1   /* Map charset name from Oracle to IANA */
+#define OCI_NLS_LANG_ISO_TO_ORA  2   /* Map language name from ISO to Oracle */
+#define OCI_NLS_LANG_ORA_TO_ISO  3   /* Map language name from Oracle to ISO */
+#define OCI_NLS_TERR_ISO_TO_ORA  4   /* Map territory name from ISO to Oracle*/
+#define OCI_NLS_TERR_ORA_TO_ISO  5   /* Map territory name from Oracle to ISO*/
+#define OCI_NLS_TERR_ISO3_TO_ORA 6   /* Map territory name from 3-letter ISO */
+                                     /* abbreviation to Oracle               */
+#define OCI_NLS_TERR_ORA_TO_ISO3 7   /* Map territory name from Oracle to    */
+                                     /* 3-letter ISO abbreviation            */
+#define OCI_NLS_LOCALE_A2_ISO_TO_ORA 8
+                                      /*Map locale name from A2 ISO to oracle*/
+#define OCI_NLS_LOCALE_A2_ORA_TO_ISO 9
+                                      /*Map locale name from oracle to A2 ISO*/
+
+typedef struct OCIMsg  OCIMsg;
+typedef ub4            OCIWchar;
+
+#define OCI_XMLTYPE_CREATE_OCISTRING 1
+#define OCI_XMLTYPE_CREATE_CLOB      2
+#define OCI_XMLTYPE_CREATE_BLOB      3
+
+/*------------------------- Kerber Authentication Modes ---------------------*/
+#define OCI_KERBCRED_PROXY               1 /* Apply Kerberos Creds for Proxy */
+#define OCI_KERBCRED_CLIENT_IDENTIFIER   2/*Apply Creds for Secure Client ID */
+
+/*------------------------- Database Startup Flags --------------------------*/
+#define OCI_DBSTARTUPFLAG_FORCE 0x00000001  /* Abort running instance, start */
+#define OCI_DBSTARTUPFLAG_RESTRICT 0x00000002      /* Restrict access to DBA */
+
+/*------------------------- Database Shutdown Modes -------------------------*/
+#define OCI_DBSHUTDOWN_TRANSACTIONAL      1 /* Wait for all the transactions */
+#define OCI_DBSHUTDOWN_TRANSACTIONAL_LOCAL 2  /* Wait for local transactions */
+#define OCI_DBSHUTDOWN_IMMEDIATE           3      /* Terminate and roll back */
+#define OCI_DBSHUTDOWN_ABORT              4 /* Terminate and don't roll back */
+#define OCI_DBSHUTDOWN_FINAL              5              /* Orderly shutdown */
+
+/*------------------------- Version information -----------------------------*/
+#define OCI_MAJOR_VERSION  11                       /* Major release version */
+#define OCI_MINOR_VERSION  2                        /* Minor release version */
+
+/*---------------------- OCIIOV structure definitions -----------------------*/
+struct OCIIOV
+{
+ void     *bfp;                            /* The Pointer to the data buffer */
+ ub4       bfl;                                 /* Length of the Data Buffer */
+};
+typedef struct OCIIOV OCIIOV;
+
+/*--------------------------------------------------------------------------- 
+                     PRIVATE TYPES AND CONSTANTS 
+  ---------------------------------------------------------------------------*/
+ 
+/* None */
+
+/*--------------------------------------------------------------------------- 
+                           PUBLIC FUNCTIONS 
+  ---------------------------------------------------------------------------*/
+
+/* see ociap.h or ocikp.h */
+ 
+/*--------------------------------------------------------------------------- 
+                          PRIVATE FUNCTIONS 
+  ---------------------------------------------------------------------------*/
+
+/* None */
+
+ 
+#endif                                              /* OCI_ORACLE */
+
+
+/* more includes */
+
+#ifndef OCI1_ORACLE
+#include <oci1.h>
+#endif
+
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+
+#ifndef ORI_ORACLE
+#include <ori.h>
+#endif
+
+#ifndef ORL_ORACLE
+#include <orl.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+#include <ociapr.h>
+#include <ociap.h>
+
+#ifndef OCIXMLDB_ORACLE
+#include <ocixmldb.h>
+#endif
+
+#ifndef OCI8DP_ORACLE
+#include <oci8dp.h>         /* interface definitions for the direct path api */
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+#ifndef OCIXSTREAM_ORACLE
+#include <ocixstream.h>
+#endif
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
diff --git a/sdk/include/oci1.h b/sdk/include/oci1.h
new file mode 100755
index 0000000..8c59c94
--- /dev/null
+++ b/sdk/include/oci1.h
@@ -0,0 +1,182 @@
+
+/* Copyright (c) 1997, 2005, Oracle. All rights reserved.  */
+ 
+/* NOTE:  See 'header_template.doc' in the 'doc' dve under the 'forms' 
+      directory for the header file template that includes instructions. 
+*/
+ 
+/* 
+   NAME 
+     oci1.h - Cartridge Service definitions
+
+   DESCRIPTION 
+     <short description of component this file declares/defines> 
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     <list of external functions declared/defined - with one-line descriptions>
+
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   mbastawa    09/16/05 - dbhygiene
+   dmukhin     06/29/05 - ANSI prototypes; miscellaneous cleanup 
+   nramakri    01/16/98 - remove #ifdef NEVER clause
+   ewaugh      12/18/97 - Turn type wrappers into functions.
+   skabraha    12/02/97 - Adding data structures & constants for OCIFile
+   rhwu        12/02/97 - OCI Thread
+   nramakri    12/15/97 - move to core4
+   ewaugh      12/11/97 - add OCIFormat package constants
+   ssamu       12/10/97 - do not include s.h
+   nramakri    11/19/97 - add OCIExtract definitions
+   ssamu       11/14/97 - creation
+
+*/
+
+
+#ifndef OCI1_ORACLE
+# define OCI1_ORACLE
+
+# ifndef ORATYPES
+#  include <oratypes.h>
+# endif
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/* Constants required by the OCIFormat package. */
+
+#define OCIFormatUb1(variable)      OCIFormatTUb1(),      &(variable)
+#define OCIFormatUb2(variable)      OCIFormatTUb2(),      &(variable)
+#define OCIFormatUb4(variable)      OCIFormatTUb4(),      &(variable)
+#define OCIFormatUword(variable)    OCIFormatTUword(),    &(variable)
+#define OCIFormatUbig_ora(variable) OCIFormatTUbig_ora(), &(variable)
+#define OCIFormatSb1(variable)      OCIFormatTSb1(),      &(variable)
+#define OCIFormatSb2(variable)      OCIFormatTSb2(),      &(variable)
+#define OCIFormatSb4(variable)      OCIFormatTSb4(),      &(variable)
+#define OCIFormatSword(variable)    OCIFormatTSword(),    &(variable)
+#define OCIFormatSbig_ora(variable) OCIFormatTSbig_ora(), &(variable)
+#define OCIFormatEb1(variable)      OCIFormatTEb1(),      &(variable)
+#define OCIFormatEb2(variable)      OCIFormatTEb2(),      &(variable)
+#define OCIFormatEb4(variable)      OCIFormatTEb4(),      &(variable)
+#define OCIFormatEword(variable)    OCIFormatTEword(),    &(variable)
+#define OCIFormatChar(variable)     OCIFormatTChar(),     &(variable)
+#define OCIFormatText(variable)     OCIFormatTText(),      (variable)
+#define OCIFormatDouble(variable)   OCIFormatTDouble(),   &(variable)
+#define OCIFormatDvoid(variable)    OCIFormatTDvoid(),     (variable)
+#define OCIFormatEnd                OCIFormatTEnd()
+
+#define OCIFormatDP 6
+
+
+/*----------------- Public Constants for OCIFile -------------------------*/
+
+/* flags for open.*/
+/* flags for mode */
+#define OCI_FILE_READ_ONLY         1   /* open for read only */
+#define OCI_FILE_WRITE_ONLY        2   /* open for write only */
+#define OCI_FILE_READ_WRITE        3   /* open for read & write */
+/* flags for create */
+#define OCI_FILE_EXIST             0   /* the file should exist */
+#define OCI_FILE_CREATE            1   /* create if the file doesn't exist */
+#define OCI_FILE_EXCL              2   /* the file should not exist */
+#define OCI_FILE_TRUNCATE          4   /* create if the file doesn't exist, 
+                                          else truncate file the file to 0 */
+#define OCI_FILE_APPEND            8   /* open the file in append mode */
+
+/* flags for seek */
+#define OCI_FILE_SEEK_BEGINNING    1  /* seek from the beginning of the file */
+#define OCI_FILE_SEEK_CURRENT      2  /* seek from the current position */
+#define OCI_FILE_SEEK_END          3  /* seek from the end of the file */
+
+#define OCI_FILE_FORWARD     1     /* seek forward              */
+#define OCI_FILE_BACKWARD    2     /* seek backward             */
+
+/* file type */
+#define   OCI_FILE_BIN      0    /* binary file */
+#define   OCI_FILE_TEXT     1    /* text file */
+#define   OCI_FILE_STDIN    2    /* standard i/p */
+#define   OCI_FILE_STDOUT   3    /* standard o/p */
+#define   OCI_FILE_STDERR   4    /* standard error */
+
+/* Represents an open file */
+typedef struct OCIFileObject OCIFileObject;
+
+
+/*--------------------- OCI Thread Object Definitions------------------------*/
+
+/* OCIThread Context */
+typedef struct OCIThreadContext OCIThreadContext;
+
+/* OCIThread Mutual Exclusion Lock */
+typedef struct OCIThreadMutex   OCIThreadMutex; 
+
+/* OCIThread Key for Thread-Specific Data */
+typedef struct OCIThreadKey     OCIThreadKey;  
+
+/* OCIThread Thread ID */
+typedef struct OCIThreadId      OCIThreadId;  
+
+/* OCIThread Thread Handle */
+typedef struct OCIThreadHandle  OCIThreadHandle;  
+
+
+/*-------------------- OCI Thread Callback Function Pointers ----------------*/
+
+/* OCIThread Key Destructor Function Type */
+typedef void (*OCIThreadKeyDestFunc)( void  * );
+
+
+/* Flags passed into OCIExtractFromXXX routines to direct processing         */
+#define OCI_EXTRACT_CASE_SENSITIVE     0x1 /* matching is case sensitive     */
+#define OCI_EXTRACT_UNIQUE_ABBREVS     0x2 /* unique abbreviations for keys
+                                              are allowed                    */
+#define OCI_EXTRACT_APPEND_VALUES      0x4 /* if multiple values for a key
+                                              exist, this determines if the 
+                                              new value should be appended 
+                                              to (or replace) the current 
+                                              list of values                 */
+
+/* Constants passed into OCIExtractSetKey routine */
+#define OCI_EXTRACT_MULTIPLE           0x8 /* key can accept multiple values */
+#define OCI_EXTRACT_TYPE_BOOLEAN         1 /* key type is boolean            */
+#define OCI_EXTRACT_TYPE_STRING          2 /* key type is string             */
+#define OCI_EXTRACT_TYPE_INTEGER         3 /* key type is integer            */
+#define OCI_EXTRACT_TYPE_OCINUM          4 /* key type is ocinum             */
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#endif                                              /* OCI1_ORACLE */
diff --git a/sdk/include/oci8dp.h b/sdk/include/oci8dp.h
new file mode 100644
index 0000000..d73258c
--- /dev/null
+++ b/sdk/include/oci8dp.h
@@ -0,0 +1,317 @@
+/*
+ * 
+ */
+
+/* Copyright (c) 1998, 2005, Oracle. All rights reserved.  */
+ 
+/* 
+   NAME 
+     oci8dp.h - OCI: Direct Path API interface prototypes.
+
+   DESCRIPTION 
+     Public types, constants, and interfaces to the direct path API.
+
+   RELATED DOCUMENTS 
+ 
+   NOTES
+     This file is not directly included by the application, this file
+     is included by "oci.h", which the application should include.
+
+   MODIFIED   (MM/DD/YY)
+   dmukhin     06/29/05 - ANSI prototypes; miscellaneous cleanup 
+   rphillip    02/27/04 - Add OCI_DIRPATH_COL_ERROR 
+   srseshad    03/12/03 - convert oci public api to ansi
+   msakayed    10/28/02 - Bug #2643907: add OCI_ATTR_DIRPATH_SKIPINDEX_METHOD
+   cmlim       04/13/01 - remove OCIDirPathStreamToStream - not used by dpapi
+   cmlim       04/02/01 - OCI_DIRPATH_EXPR_OPQ_SQL_FN to OCI_DIRPATH_EXPR_SQL
+   ebatbout    01/22/01 - PARTIAL value for OCIDirPathDataSave action parameter
+   cmlim       07/20/00 - support opaques/sql strings in 8.2 dpapi
+   cmlim       08/14/00 - support refs in 8.2 dpapi
+   cmlim       04/17/00 - add defines for OCIDirPathFuncCtx handle & OCI_ATTR_D
+   whe         09/01/99 - 976457:check __cplusplus for C++ code
+   abrumm      04/16/99 - dpapi: more attributes
+   abrumm      02/26/99 - add defines for DataSave action
+   abrumm      10/04/98 - clen must be a ub4
+   abrumm      05/27/98 - add column array flag values
+   abrumm      05/12/98 - direct path api support
+   abrumm      03/31/98 - OCI direct path interface support
+   abrumm      03/18/98 - Creation
+
+*/
+
+#ifndef OCI8DP_ORACLE
+# define OCI8DP_ORACLE
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/*----- Handles and descriptors for direct path operations (OCIDirPath*) ----*/
+
+typedef struct OCIDirPathCtx      OCIDirPathCtx;                  /* context */
+typedef struct OCIDirPathFuncCtx  OCIDirPathFuncCtx;     /* function context */
+typedef struct OCIDirPathColArray OCIDirPathColArray;        /* column array */
+typedef struct OCIDirPathStream   OCIDirPathStream;                /* stream */
+typedef struct OCIDirPathDesc     OCIDirPathDesc;  /* direct path descriptor */
+
+                 /*----- Defines for Direct Path Options -----*/
+
+                 /* values for OCI_ATTR_DIRPATH_MODE attribute */
+#define OCI_DIRPATH_LOAD         1             /* direct path load operation */
+#define OCI_DIRPATH_UNLOAD       2           /* direct path unload operation */
+#define OCI_DIRPATH_CONVERT      3     /* direct path convert only operation */
+
+    /*----- values for OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD attribute -----*/
+#define OCI_DIRPATH_INDEX_MAINT_SINGLE_ROW     1
+
+/* Note that there are two attributes dealing with index maintenance -
+ * OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD and OCI_ATTR_DIRPATH_SKIPINDEX_METHOD.
+ * OCI_ATTR_DIRPATH_SKIPINDEX_METHOD exists to isolate the behavior for
+ * skipping index maintenance since maintenance of unusable indexes is 
+ * orthogonal to that of single row insertion.
+ * For backwards compatibility we still allow users to specify skip
+ * methods in OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD so make sure the
+ * enumerations for the two attributes are distinct.
+ */
+    /*----- values for OCI_ATTR_DIRPATH_SKIPINDEX_METHOD attribute -----*/
+#define OCI_DIRPATH_INDEX_MAINT_SKIP_UNUSABLE       2
+#define OCI_DIRPATH_INDEX_MAINT_DONT_SKIP_UNUSABLE  3
+#define OCI_DIRPATH_INDEX_MAINT_SKIP_ALL            4
+
+           /* values for OCI_ATTR_STATE attribute of OCIDirPathCtx */
+#define OCI_DIRPATH_NORMAL       1     /* can accept rows, last row complete */
+#define OCI_DIRPATH_PARTIAL      2                   /* last row was partial */
+#define OCI_DIRPATH_NOT_PREPARED 3    /* direct path context is not prepared */
+
+     /*----- values for cflg argument to OCIDirpathColArrayEntrySet -----*/
+#define OCI_DIRPATH_COL_COMPLETE 0                /* column data is complete */
+#define OCI_DIRPATH_COL_NULL     1                         /* column is null */
+#define OCI_DIRPATH_COL_PARTIAL  2                 /* column data is partial */
+#define OCI_DIRPATH_COL_ERROR    3               /* column error, ignore row */
+          /*----- values for action parameter to OCIDirPathDataSave -----*/
+#define OCI_DIRPATH_DATASAVE_SAVEONLY 0              /* data save point only */
+#define OCI_DIRPATH_DATASAVE_FINISH   1           /* execute finishing logic */
+/* save portion of input data (before space error occurred) and finish */
+#define OCI_DIRPATH_DATASAVE_PARTIAL  2       
+
+  /*- OCI_ATTR_DIRPATH_EXPR_TYPE values (describes OCI_ATTR_NAME expr type) -*/
+#define OCI_DIRPATH_EXPR_OBJ_CONSTR  1      /* NAME is an object constructor */
+#define OCI_DIRPATH_EXPR_SQL         2  /* NAME is an opaque or sql function */
+#define OCI_DIRPATH_EXPR_REF_TBLNAME 3 /* NAME is table name if ref is scoped*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------------ OCIDirPathCtx Operations -------------------------*/
+
+/*
+  NAME
+    OCIDirPathAbort - OCI: Abort a direct path operation.
+
+  DESCRIPTION
+    Aborts a direct path operation.  Upon successful completion
+    the direct path context is no longer valid.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathAbort( OCIDirPathCtx *dpctx, OCIError *errhp );
+
+/*
+  NAME
+    OCIDirPathDataSave - OCI: Execute a data save point.
+
+  DESCRIPTION
+    Successful return of this function indicates that a data save
+    point has been executed.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathDataSave( OCIDirPathCtx *dpctx, OCIError *errhp, ub4 action );
+
+/*
+  NAME
+    OCIDirPathFinish - OCI: Finish a direct path operation.
+
+  DESCRIPTION
+    Finishes a direct path operation.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathFinish( OCIDirPathCtx *dpctx, OCIError  *errhp );
+
+/*
+  NAME
+    OCIDirPathFlushRow - OCI: Flush a partial row from the server.
+
+  DESCRIPTION
+    Flushes a partially loaded row from the server.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathFlushRow( OCIDirPathCtx *dpctx, OCIError  *errhp );
+
+/*
+  NAME
+    OCIDirPathPrepare - OCI: Prepare a direct path operation.
+
+  DESCRIPTION
+    Prepares a table/partition for a direct path operation.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathPrepare( OCIDirPathCtx *dpctx, OCISvcCtx *svchp,
+                      OCIError  *errhp );
+
+/*
+  NAME
+    OCIDirPathLoadStream - OCI: Load a direct path stream.
+
+  DESCRIPTION
+    Load a direct path stream to the object associated with
+    the direct path context.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathLoadStream( OCIDirPathCtx *dpctx, OCIDirPathStream *dpstr,
+                         OCIError      *errhp );
+
+
+/*---------------------- OCIDirPathColArray Operations ----------------------*/
+
+/*
+  NAME
+    OCIDirPathColArrayEntryGet - OCI:  Get column array entry.
+
+  DESCRIPTION
+    Column array function which is used to get a specified entry in
+    a column array.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayEntryGet( OCIDirPathColArray *dpca, OCIError *errhp,
+                              ub4 rownum, ub2 colIdx, ub1 **cvalpp, ub4 *clenp,
+                              ub1 *cflgp );
+
+/*
+  NAME
+    OCIDirPathColArrayEntrySet - OCI:  Set column array entry.
+
+  DESCRIPTION
+    Column array function which is used to set a specified entry in
+    a column array.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayEntrySet( OCIDirPathColArray *dpca, OCIError *errhp,
+                               ub4 rownum, ub2 colIdx, ub1 *cvalp, ub4 clen,
+                               ub1 cflg );
+
+/*
+  NAME
+    OCIDirPathColArrayRowGet - OCI:  Get column array row pointers.
+
+  DESCRIPTION
+    Column array function which is used to get the base row pointers
+    for a specified row in a column array.
+    To be used in lieu of OCIDirPathColArrayEntryGet() and
+    OCIDirPathColArrayEntrySet().
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayRowGet( OCIDirPathColArray *dpca, OCIError *errhp,
+                         ub4 rownum, ub1 ***cvalppp, ub4 **clenpp,
+                         ub1 **cflgpp );
+
+/*
+  NAME
+    OCIDirPathColArrayReset - OCI: Reset Column Array State
+
+  DESCRIPTION
+    Function which resets the column array state.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+    Resetting the column array state is necessary when piecing in a large
+    column and an error occurs in the middle of loading the column.
+ */
+sword
+OCIDirPathColArrayReset( OCIDirPathColArray *dpca, OCIError *errhp );
+
+/*
+  NAME
+    OCIDirPathColArrayToStream - OCI: Convert Column Array to Stream Format.
+
+  DESCRIPTION
+    Convert from column array format to stream format which is suitable
+    for loading via OCIDirPathLoadStream().
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayToStream( OCIDirPathColArray *dpca,  OCIDirPathCtx *dpctx,
+                               OCIDirPathStream   *dpstr, OCIError      *errhp,
+                               ub4 rowcnt, ub4 rowoff );
+
+
+
+/*----------------------- OCIDirPathStream Operations -----------------------*/
+
+/*
+  NAME
+    OCIDirPathStreamReset - OCI:
+
+  DESCRIPTION
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathStreamReset( OCIDirPathStream *dpstr, OCIError *errhp );
+
+#endif                                              /* OCI8DP_ORACLE */
diff --git a/sdk/include/ociap.h b/sdk/include/ociap.h
new file mode 100644
index 0000000..10d9f89
--- /dev/null
+++ b/sdk/include/ociap.h
@@ -0,0 +1,11129 @@
+/* Copyright (c) 1996, 2011, Oracle and/or its affiliates. 
+All rights reserved. */
+ 
+/* 
+   NAME 
+     ociap.h 
+
+   DESCRIPTION 
+     Oracle Call Interface - Ansi Prototypes
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+    OCIAttrGet
+    OCIAttrSet
+    OCIBindArrayOfStruct
+    OCIBindByName
+    OCIBindByPos
+    OCIBindDynamic
+    OCIBindObject
+    OCIBreak
+    OCIConnectionPoolCreate
+    OCISessionPoolCreate
+    OCISessionGet
+    OCISessionRelease
+    OCIDateTimeAssign
+    OCIDateTimeCheck
+    OCIDateTimeCompare
+    OCIDateTimeConvert
+    OCIDateTimeFromText
+    OCIDateTimeGetDate
+    OCIDateTimeGetTime
+    OCIDateTimeGetTime
+    OCIDateTimeGetTimeZoneOffset
+    OCIDateTimeSysTimeStamp
+    OCIDateTimeIntervalAdd
+    OCIDateTimeIntervalSub
+    OCIDateTimeConstruct
+    OCIDateTimeSubtract
+    OCIDateTimeToText
+    OCIDateTimeGetTimeZoneName
+    OCIDateTimeToArray
+    OCIDateTimeFromArray
+    OCIRowidToChar
+    OCIDefineArrayOfStruct
+    OCIDefineByPos
+    OCIDefineDynamic
+    OCIDefineObject
+    OCIDescAlloc
+    OCIDescFree
+    OCIDescribeAny
+    OCIEnvCreate
+    OCIEnvNlsCreate
+    OCIEnvInit
+    OCIErrorGet
+    OCIExtractSetKey
+    OCIExtractFromFile
+    OCIIntervalSubtract
+    OCIIntervalMultiply
+    OCIIntervalToNumber
+    OCIIntervalToText
+    OCIIntervalFromTZ
+    OCIKerbAttrSet
+    OCILdaToSvcCtx
+    OCILobAppend
+    OCILobAssign
+    OCILobCharSetForm
+    OCILobCharSetId
+    OCILobCopy
+    OCILobCreateTemporary
+    OCILobDisableBuffering
+    OCILobEnableBuffering
+    OCILobErase
+    OCILobOpen
+    OCILobClose
+    OCILobFileClose
+    OCILobFileCLoseAll
+    OCILobFileExists
+    OCILobFileGetName
+    OCILobFileIsOpen
+    OCILobFileOpen
+    OCILobFileSetName
+    OCILobFlushBuffer
+    OCILobFreeTemporary
+    OCILobGetChunkSize
+    OCILobGetLength
+    OCILobIsEqual
+    OCILobIsTemporary
+    OCILobLoadFromFile
+    OCILobLocatorAssign
+    OCILobLocatorIsInit
+    OCILobRead
+    OCILobTrim
+    OCILobWrite
+    OCILobWriteAppend
+    OCILobGetStorageLimit
+    OCILobGetOptions
+    OCILobSetOptions
+    OCILobGetContentType
+    OCILobSetContentType
+    OCILogoff
+    OCILogon
+    OCILogon2
+    OCIMemoryFree
+    OCIParamGet
+    OCIParamGet
+    OCIPasswordChange
+    OCIReset
+    OCIResultSetToStmt
+    OCIServerAttach
+    OCIServerDetach
+    OCIServerVersion
+    OCISessionBegin
+    OCISessionEnd
+    OCIStmtExecute
+    OCIStmtFetch
+    OCIStmtFetch2
+    OCIStmtGetPieceInfo
+    OCIStmtPrepare
+    OCIStmtPrepare2
+    OCIStmtRelease
+    OCIStmtSetPieceInfo
+    OCIFormatString
+    OCISvcCtxToLda
+    OCITransCommit
+    OCITransDetach
+    OCITransForget
+    OCITransMultiPrepare
+    OCITransPrepare
+    OCITransRollback
+    OCITransStart
+    OCIInitialize
+    OCIEnvCreate
+    OCIEnvNlsCreate
+    OCIFEnvCreate
+    OCIHandleAlloc
+    OCIDescriptorAlloc
+    OCIDescriptorFree
+    OCIArrayDescriptorAlloc
+    OCIArrayDescriptorFree
+    OCIEnvInit
+    OCIServerAttach
+    OCISessionBegin
+    OCISessionEnd
+    OCILogon
+    OCILogon2
+    OCIPasswordChange
+    OCIStmtPrepare
+    OCIStmtPrepare2
+    OCIStmtRelease
+    OCIBindByPos
+    OCIBindByName
+    OCIBindObject
+    OCIBindDynamic
+    OCIBindArrayOfStruct
+    OCIStmtGetPieceInfo
+    OCIStmtSetPieceInfo
+    OCIStmtExecute
+    OCIDefineByPos
+    OCIDefineObject
+    OCIDefineDynamic
+    OCIRowidToChar
+    OCIDefineArrayOfStruct
+    OCIStmtFetch
+    OCIStmtFetch2
+    OCIStmtGetBindInfo
+    OCIDescribeAny
+    OCIParamGet
+    OCIParamSet
+    OCITransStart
+    OCITransMultiPrepare
+    OCIErrorGet
+    OCILobAppend
+    OCILobAssign
+    OCILobCharSetForm
+    OCILobCharSetId
+    OCILobCopy
+    OCILobCreateTemporary
+    OCILobClose
+    OCILobDisableBuffering
+    OCILobEnableBuffering
+    OCILobErase
+    OCILobFileClose
+    OCILobFileExists
+    OCILobFileGetName
+    OCILobFileIsOpen
+    OCILobFileOpen
+    OCILobFileSetName
+    OCILobFlushBuffer
+    OCILobFreeTemporary
+    OCILobGetChunkSize
+    OCILobGetLength
+    OCILobIsEqual
+    OCILobIsOpen
+    OCILobIsTemporary
+    OCILobLoadFromFile
+    OCILobLocatorAssign
+    OCILobLocatorIsInit
+    OCILobOpen
+    OCILobRead
+    OCILobTrim
+    OCILobWrite
+    OCILobWriteAppend
+    OCIServerVersion
+    OCIServerRelease
+    OCIAttrGet
+    OCIAttrSet
+    OCIUserCallbackRegister
+    OCIUserCallbackGet
+    OCISharedLibInit
+    OCIFileExists
+    OCIFileGetLength
+    OCIFileOpen
+    OCIFileRead
+    OCIFileSeek
+    OCIFileWrite
+    OCILobCopy2
+    OCILobErase2
+    OCILobGetLength2
+    OCILobLoadFromFile2
+    OCILobRead2
+    OCILobArrayRead
+    OCILobTrim2
+    OCILobWrite2
+    OCILobArrayWrite
+    OCILobWriteAppend2
+    OCILobGetStorageLimit
+    OCISecurityOpenWallet
+    OCISecurityCloseWallet
+    OCISecurityCreateWallet
+    OCISecurityDestroyWallet
+    OCISecurityStorePersona
+    OCISecurityOpenPersona
+    OCISecurityClosePersona
+    OCISecurityRemovePersona
+    OCISecurityCreatePersona
+    OCISecuritySetProtection
+    OCISecurityGetProtection
+    OCISecurityRemoveIdentity
+    OCISecurityCreateIdentity
+    OCISecurityAbortIdentity
+    OCISecurityFreeIdentity
+    OCISecurityStoreTrustedIdentity
+    OCISecuritySign
+    OCISecuritySignExpansion
+    OCISecurityVerify
+    OCISecurityValidate
+    OCISecuritySignDetached
+    OCISecuritySignDetExpansion
+    OCISecurityVerifyDetached
+    OCISecurity_PKEncrypt
+    OCISecurityPKEncryptExpansion
+    OCISecurityPKDecrypt
+    OCISecurityEncrypt
+    OCISecurityEncryptExpansion
+    OCISecurityDecrypt
+    OCISecurityEnvelope
+    OCISecurityDeEnvelope
+    OCISecurityKeyedHash
+    OCISecurityKeyedHashExpansion
+    OCISecurityHash
+    OCISecurityHashExpansion
+    OCISecuritySeedRandom
+    OCISecurityRandomBytes
+    OCISecurityRandomNumber
+    OCISecurityInitBlock
+    OCISecurityReuseBlock
+    OCISecurityPurgeBlock
+    OCISecuritySetBlock
+    OCISecurityGetIdentity
+    OCIAQEnq
+    OCIAQDeq
+    OCIAQEnqArray
+    OCIAQEnqStreaming
+    OCIAQDeqArray
+    OCIAQListen
+    OCIAQListen2
+    OCIExtractSetKey
+    OCIExtractFromFile
+    OCIExtractToInt
+    OCIExtractToBool
+    OCIExtractToStr
+    OCIExtractToOCINum
+    OCIExtractFromList
+    OCIMemoryAlloc
+    OCIMemoryResize
+    OCIContextSetValue
+    OCIContextGetValue
+    OCIContextClearValue
+    OCIMemorySetCurrentIDs
+    OCIPicklerTdsCtxInit
+    OCIPicklerTdsInit
+    OCIPicklerTdsCreateElementNumber
+    OCIPicklerTdsCreateElementChar
+    OCIPicklerTdsCreateElementVarchar
+    OCIPicklerTdsCreateElementRaw
+    OCIPicklerTdsCreateElement
+    OCIPicklerTdsAddAttr
+    OCIPicklerTdsGenerate
+    OCIPicklerTdsGetAttr
+    OCIPicklerFdoInit
+    OCIPicklerFdoFree
+    OCIPicklerImageInit
+    OCIPicklerImageFree
+    OCIPicklerImageAddScalar
+    OCIPicklerImageAddNullScalar
+    OCIPicklerImageGenerate
+    OCIPicklerImageGetScalarSize
+    OCIPicklerImageGetScalar
+    OCIPicklerImageCollBegin
+    OCIPicklerImageCollAddScalar
+    OCIPicklerImageCollEnd
+    OCIPicklerImageCollBeginScan
+    OCIPicklerImageCollGetScalarSize
+    OCIPicklerImageCollGetScalar
+    OCIAnyDataGetType
+    OCIAnyDataIsNull
+    OCIAnyDataConvert
+    OCIAnyDataBeginCreate
+    OCIAnyDataAttrSet
+    OCIAnyDataCollAddElem
+    OCIAnyDataEndCreate
+    OCIAnyDataAccess
+    OCIAnyDataGetCurrAttrNum
+    OCIAnyDataAttrGet
+    OCIAnyDataCollGetElem
+    OCIPicklerTdsCtxInit
+    OCIPicklerTdsInit
+    OCIPicklerTdsCreateElementNumber
+    OCIPicklerTdsCreateElementChar
+    OCIPicklerTdsCreateElementVarchar
+    OCIPicklerTdsCreateElementRaw
+    OCIPicklerTdsCreateElement
+    OCIPicklerTdsAddAttr
+    OCIPicklerTdsGenerate
+    OCIPicklerTdsGetAttr
+    OCIPicklerFdoInit
+    OCIPicklerFdoFree
+    OCIPicklerImageInit
+    OCIPicklerImageFree
+    OCIPicklerImageAddScalar
+    OCIPicklerImageAddNullScalar
+    OCIPicklerImageGenerate
+    OCIPicklerImageGetScalarSize
+    OCIPicklerImageGetScalar
+    OCIPicklerImageCollBegin
+    OCIPicklerImageCollAddScalar
+    OCIPicklerImageCollEnd
+    OCIPicklerImageCollBeginScan
+    OCIPicklerImageCollGetScalarSize
+    OCIPicklerImageCollGetScalar
+    OCIAnyDataGetType
+    OCIAnyDataIsNull
+    OCIAnyDataConvert
+    OCIAnyDataBeginCreate
+    OCIAnyDataAttrSet
+    OCIAnyDataCollAddElem
+    OCIAnyDataEndCreate
+    OCIAnyDataAccess
+    OCIAnyDataGetCurrAttrNum
+    OCIAnyDataAttrGet
+    OCIAnyDataCollGetElem
+    OCIPicklerTdsCtxInit
+    OCIPicklerTdsInit
+    OCIPicklerTdsCreateElementNumber
+    OCIPicklerTdsCreateElementChar
+    OCIPicklerTdsCreateElementVarchar
+    OCIPicklerTdsCreateElementRaw
+    OCIPicklerTdsCreateElement
+    OCIPicklerTdsAddAttr
+    OCIPicklerTdsGenerate
+    OCIPicklerTdsGetAttr
+    OCIPicklerFdoInit
+    OCIPicklerFdoFree
+    OCIPicklerImageInit
+    OCIPicklerImageFree
+    OCIPicklerImageAddScalar
+    OCIPicklerImageAddNullScalar
+    OCIPicklerImageGenerate
+    OCIPicklerImageGetScalarSize
+    OCIPicklerImageGetScalar
+    OCIPicklerImageCollBegin
+    OCIPicklerImageCollAddScalar
+    OCIPicklerImageCollEnd
+    OCIPicklerImageCollBeginScan
+    OCIPicklerImageCollGetScalarSize
+    OCIPicklerImageCollGetScalar
+    OCIAnyDataGetType
+    OCIAnyDataIsNull
+    OCIAnyDataConvert
+    OCIAnyDataBeginCreate
+    OCIAnyDataAttrSet
+    OCIAnyDataCollAddElem
+    OCIAnyDataEndCreate
+    OCIAnyDataAccess
+    OCIAnyDataGetCurrAttrNum
+    OCIAnyDataAttrGet
+    OCIAnyDataCollGetElem
+    OCIAnyDataSetBeginCreate
+    OCIAnyDataSetDestroy
+    OCIAnyDataSetAddInstance
+    OCIAnyDataSetEndCreate
+    OCIAnyDataSetGetType
+    OCIAnyDataSetGetCount
+    OCIAnyDataSetGetInstance
+    OCIFormatString
+    OCINlsGetInfo
+    OCINlsNameMap
+    OCIMultiByteToWideChar
+    OCIMultiByteInSizeToWideChar
+    OCIWideCharToMultiByte
+    OCIWideCharInSizeToMultiByte
+    OCIWideCharStrcmp
+    OCIWideCharStrncmp
+    OCIWideCharStrcat
+    *OCIWideCharStrchr
+    OCIWideCharStrcpy
+    OCIWideCharStrncat
+    OCIWideCharStrncpy
+    *OCIWideCharStrrchr
+    OCIWideCharStrCaseConversion
+    OCIMultiByteStrcmp
+    OCIMultiByteStrncmp
+    OCIMultiByteStrcat
+    OCIMultiByteStrcpy
+    OCIMultiByteStrncat
+    OCIMultiByteStrncpy
+    OCIMultiByteStrnDisplayLength
+    OCIMultiByteStrCaseConversion
+    OCICharSetToUnicode
+    OCIUnicodeToCharSet
+    OCINlsCharSetConvert
+    OCINlsEnvironmentVariableGet
+    OCIMessageOpen
+    OCIMessageGet
+    OCIThreadMutexInit
+    OCIThreadMutexDestroy
+    OCIThreadMutexAcquire
+    OCIThreadMutexRelease
+    OCIThreadKeyInit
+    OCIThreadKeyDestroy
+    OCIThreadKeyGet
+    OCIThreadKeySet
+    OCIThreadIdSet
+    OCIThreadIdSetNull
+    OCIThreadIdGet
+    OCIThreadIdSame
+    OCIThreadIdNull
+    OCIThreadHndInit
+    OCIThreadHndDestroy
+    OCIThreadCreate
+    OCIThreadHandleGet
+    OCIThreadMutexInit
+    OCIThreadMutexDestroy
+    OCIThreadMutexAcquire
+    OCIThreadMutexRelease
+    OCIThreadKeyInit
+    OCIThreadKeyDestroy
+    OCIThreadKeyGet
+    OCIThreadKeySet
+    OCIThreadIdSet
+    OCIThreadIdSame
+    OCIThreadIdNull
+    OCIThreadCreate
+    OCISubscriptionRegister
+    OCISubscriptionPost
+    OCISubscriptionUnRegister
+    OCISubscriptionDisable
+    OCISubscriptionEnable
+    OCIDateTimeGetTime
+    OCIDateTimeGetDate
+    OCIDateTimeGetTimeZoneOffset
+    OCIDateTimeConstruct
+    OCIDateTimeSysTimeStamp
+    OCIDateTimeAssign
+    OCIDateTimeToText
+    OCIDateTimeFromText
+    OCIDateTimeCompare
+    OCIDateTimeCheck
+    OCIDateTimeConvert
+    OCIDateTimeSubtract
+    OCIDateTimeIntervalAdd
+    OCIDateTimeIntervalSub
+    OCIIntervalSubtract
+    OCIIntervalAdd
+    OCIIntervalMultiply
+    OCIIntervalDivide
+    OCIIntervalCompare
+    OCIIntervalFromNumber
+    OCIIntervalFromText
+    OCIIntervalToText
+    OCIIntervalToNumber
+    OCIIntervalCheck
+    OCIIntervalAssign
+    OCIIntervalSetYearMonth
+    OCIIntervalGetYearMonth
+    OCIIntervalSetDaySecond
+    OCIIntervalGetDaySecond
+    OCIDateTimeToArray
+    OCIDateTimeFromArray
+    OCIDateTimeGetTimeZoneName
+    OCIIntervalFromTZ
+    OCIConnectionPoolCreate
+    OCIConnectionPoolDestroy
+    OCISessionPoolCreate
+    OCISessionPoolDestroy
+    OCISessionGet
+    OCISessionRelease
+    OCIAppCtxSet
+    OCIAppCtxClearAll
+    OCIMemStats
+    OCIKerbAttrSet
+    OCIDBStartup
+    OCIDBShutdown
+    OCIClientVersion
+    OCIInitEventHandle
+    OCIStmtBindByPos
+    OCIStmtBindByName
+
+   PRIVATE FUNCTION(S)
+
+   EXAMPLES
+
+   NOTES
+
+   MODIFIED   (MM/DD/YY)
+   slari       03/24/11 - OCIRoundTripCallback
+   slynn       03/18/08 - OCILobSet/SetContenttype->OCILobGet/SetContentType
+   amullick    02/11/08 - add OCILobGet/SetContenttype APIs
+   schoi       02/27/07 - OCILobGet/SetOptions API change
+   slynn       07/28/06 - Migrate to new 11g LOB terminology 
+   hqian       05/22/06 - add OCI_SYSASM 
+   slynn       06/21/06 - Add Lob Get Shared Regions Functionality
+   slynn       05/25/06 - New NG Lob Functionality. 
+   jawilson    05/22/06 - add TDO out parameter for streaming enq callback 
+   aramappa    01/19/06 - Added OCIArrayDescriptorAlloc,
+                          OCIArrayDescriptorFree 
+   jawilson    02/09/06 - add OCIAQEnqStreaming 
+   mxu         03/08/06 - Fix bug 5037807 
+   srseshad    09/12/05 - stmtcache: callback 
+   mbastawa    09/16/05 - dbhygiene
+   dmukhin     06/29/05 - ANSI prototypes; miscellaneous cleanup 
+   nbhatt      06/17/04 - merge conflicts 
+   nbhatt      05/24/04 - merge conflicts 
+   weiwang     05/06/04 - add OCIAQListen2 
+   rvissapr    06/21/04 - add OCIAppCtx API 
+   debanerj    05/17/04 - 13064: LOB array Read and Write
+   aahluwal    06/02/04 - [OCI Events]: add OCIInitEventHandle
+   nikeda      05/28/04 - grabtrans 'nikeda_oci_events_copy' 
+   nikeda      05/13/04 - [OCI Events] Rename HACBK->EVTCBK, HACTX->EVTCTX 
+   nikeda      05/10/04 - [OCI Events] code review changes 
+   aahluwal    04/09/04 - [OCI Events]: add OCIHAServerHandleGet
+   nikeda      03/18/04 - [OCI Events] New Server Handle Callback 
+   dfrumkin    12/04/03 - Add OCIDBStartup, OCIDBShutdown 
+   jciminsk    12/12/03 - merge from RDBMS_MAIN_SOLARIS_031209 
+   sgollapu    06/26/03 - Change OCIPing prototype
+   sgollapu    05/05/03 - Add OCIPing
+   debanerj    01/16/03 - Bug 2753018: Lob Locator parameter for 
+                          OCILobGetStorageLimit
+   rpingte     05/06/04 - add OCIClientVersion
+   debanerj    08/26/03 - 6003: Lob interface changes
+   sgollapu    06/23/03 - Add OCIPing
+   debanerj    01/16/03 - Bug 2753018: Lob Locator parameter for 
+                          OCILobGetStorageLimit
+   tkeefe      02/17/03 - bug-2773794: Add new interface for setting Kerb attrs
+   ataracha    01/03/03 - Move OCIXMLType functions to ocixml.h
+   akatti      11/28/02 - [2521361]:add OCIRowidToChar prototype
+   chliang     10/23/02 - add OCIFetchRowCallback
+   cparampa    10/13/02 - Fix the prototype of OCIAQListen(ansi prototype)
+   chliang     10/12/02 - add OCIBindRowCallback
+   debanerj    09/30/02 - Unlimited size LOB 6003
+   thoang      09/25/02 - Add csid to XMLType create functions
+   thoang      04/19/02 - Add OCIXMLTypeGetNS
+   aahluwal    08/09/02 - adding OCIAQDeqArray
+   aahluwal    06/03/02 - bug 2360115
+   skabraha    04/16/02 - fix compiler warnings
+   sichandr    02/12/02 - fix OCIXMLTypeExists
+   gayyappa    02/01/02 - fix 2210776 : change Dom to DOM 
+   sichandr    10/24/01 - OCISvcCtx for XMLType create routines
+   schandir    09/14/01 - Add prototypes for Stmt Caching
+   abande      09/04/01 - Add Prototypes for Session Pooling Methods
+   stakeda     09/12/01 - add OCINlsCharSetConvert
+   whe         08/28/01 - add OCIEnvNlsCreate
+   wzhang      08/22/01 - Add OCINlsCharSetNameToId.
+   whe         10/05/01 - add prototype for OCIXMLType functions
+   mdmehta     04/06/01 - Bug 1683763, OCIDateTimeToText: buf_size to ub4*
+   schandir    12/12/00 - modify the ociconnectionpoolcreate() interface.
+   porangas    12/04/00 - Forward merge bug#974710 to 9i
+   rpingte     11/29/00 - Fix bug# 1485795.
+   gtarora     11/30/00 - fix comment for OCILobIsTemporary
+   akatti      11/07/00 - [1198379]:add OCIRowidToChar
+   bpalaval    10/15/00 - Forward merge 892654.
+   kmohan      09/18/00 - add OCILogon2
+   etucker     07/28/00 - add OCIIntervalFromTZ
+   vjayaram    07/18/00 - add connection pooling changes
+   etucker     07/13/00 - add dls apis for oci
+   hmasaki     07/05/00 - fix 1230846: forward merge into 8.2
+   mbastawa    06/05/00 - add OCIStmtFetch2
+   rxgovind    06/07/00 - update OCIAnyData interfaces
+   rxgovind    05/04/00 - add OCIAnyDataSet interfaces
+   rkasamse    05/01/00 - remove attrno from OCIAnyDataAttrGet
+   rkasamse    03/13/00 - add prototype s for OCCIAnyData
+   slari       09/01/99 - remove OCIEnvCallback
+   slari       08/23/99 - add OCIUcb in user callback functions
+   dsaha       07/07/99 - Add OCIFEnvCreate for forms
+   vyanaman    06/21/99 - Change OCI DateTime/Interval APIs.
+   esoyleme    07/01/99 - expose MTS performance enhancements                  
+   whe         06/14/99 - bug727872:add CONST to match definitions
+   kkarun      02/23/99 - Fix OCIDateTime APIs
+   jiyang      12/07/98 - Add comments for OCI_NLS_DUAL_CURRENCY
+   aroy        12/01/98 - add OCIEnvCreate
+   slari       11/23/98 - use ORASTDARG
+   slari       11/21/98 - replace ellipsis by arglist in OCIUserCallback
+   thchang     10/20/98 - correct comment on OCILobCreateTemporary
+   slari       09/08/98 - allow envh to receive error info also in CallbackReg/
+   kkarun      09/02/98 - Change const to CONST
+   aroy        08/04/98 - add OCITerminate calls                               
+   nramakri    06/25/98 - remove CONST from some OCIPickler APIs
+   jiyang      06/22/98 - Fix a lint error
+   nmallava    06/08/98 - ociistemporary -> envhp
+   jhasenbe    05/27/98 - Remove definitions for U-Calls (Unicode)
+   nmallava    05/18/98 - add comments
+   sgollapu    05/19/98 - Change text to OraText
+   aroy        04/20/98 - merge forward 8.0.5 -> 8.1.3
+   nbhatt      05/14/98 -  aq listen call
+   lchidamb    03/02/98 - Client Notification prototypes
+   vyanaman    04/19/98 - System Timestamp
+   kkarun      04/17/98 - Add more Interval functions
+   vyanaman    04/17/98 - Fix min (proc error)
+   vyanaman    04/16/98 - Add get/set TZ
+   kkarun      04/13/98 - Add Datetime prototypes
+   rkasamse    04/13/98 - change OCIEnv* to dvoid* for context/memory cart serv
+   rkasamse    04/15/98 - chage pickler cart interface
+   slari       03/20/98 - change proto of OCIUserCallback
+   slari       02/17/98 - add OCIUserCallback
+   jiyang      04/02/98 - Accept both env and user handles for NLS
+   rkasamse    03/20/98 - remove prototypes for OCIMemoryDuration* functions.
+   tsaulys     03/20/98 - use environment or session handle
+   nmallava    04/09/98 - OCILobLocatorAssign
+   nmallava    04/07/98 - lobgetchunksize and writeappend apis
+   jhasenbe    04/06/98 - Add new interfaces for Unicode support
+   nmallava    03/17/98 - add interfaces
+   nmallava    03/16/98 - add open/close apis
+   nmallava    03/10/98 - add temporary lobs apis
+   sgollapu    07/10/97 - Add OCIReset
+   sgollapu    02/09/98 - OCI non-blocking
+   nramakri    01/16/98 - remove #ifdef NEVER clause for OCIExtract
+   rmurthy     01/08/98 - OCIContextGenerateKey: change ub1 to ub4
+   ewaugh      12/18/97 - Turn type wrappers into functions.
+   skabraha    12/02/97 - adding OCIFile functions
+   rhwu        12/02/97 - add OCI Thread
+   nramakri    12/15/97 - move to core4
+   nramakri    12/11/97 - modify OCIExtract prototype
+   ewaugh      12/10/97 - add OCIFormat prototypes
+   nmallava    12/17/97 - Add ilob open and close apis
+   rkasamse    12/03/97 - Change some of the function names for pickler cartrid
+   nramakri    11/12/97 - add OCIExtract prototypes
+   rkasamse    11/21/97 - add prototypes for memory cartridge services and cont
+   rkasamse    11/03/97 - Add pickler cartridge interfaces.
+   jiyang      11/11/97 - Add NLS service for cartridge
+   tanguyen    08/19/97 -
+   cxcheng     07/30/97 - replace OCISvcCtx with OCISvcCtx
+   schandra    06/25/97 - AQ OCI interface
+   bnainani    07/21/97 - add prototypes for Oracle XA extensions
+   esoyleme    05/13/97 - move failover callback prototype
+   skmishra    05/06/97 - stdc compiler fixes
+   skmishra    04/24/97 - C++ Compatibility changes
+   skotsovo    04/21/97 - make lob parameter names consistent
+   rwhitman    04/16/97 - Fix LOB prototypes - Olint OCI 8.0.3
+   ramkrish    04/15/97 - Add free flag to OCILobFlushBuffer
+   dchatter    04/10/97 - add nzt.h inclusion
+   cxcheng     04/09/97 - change objnamp from CONST text* to dvoid*
+   cxcheng     04/08/97 - fix prototype of OCIDescribeAny()
+   skotsovo    03/31/97 - remove OCILobLocatorSize
+   skotsovo    03/27/97 - add OCILobLoadFromFile
+   bcchang     02/18/97 - Fix syntax error
+   dchatter    01/13/97 - fix comments on LOB calls
+   aroy        01/10/97 - remove ocilobfilecreate delete
+   sgollapu    12/27/96 - Correct OCILogon prototype
+   dchatter    01/04/97 - comments to describe the functions
+   sgollapu    11/25/96 - Change OCILobFileIsExistent
+   schandra    11/18/96 - Remove xa.h include
+   sgollapu    11/09/96 - Change prototype of OCIDescribeAny
+   dchatter    10/31/96 - delete CONST from lob write cb fn
+   dchatter    10/30/96 - more changes
+   dchatter    10/26/96 - lob/file long name corrections
+   slari       10/16/96 - delete unused calls
+   rwessman    10/29/96 - Fixed OCISecurityGetIdentity prototype
+   bcchang     10/25/96 - Fix syntax error
+   sgollapu    10/22/96 - Add OCILogon and OCILogoff
+   rwessman    10/16/96 - Added cryptographic and digital signature functions
+   sgollapu    10/10/96 - Add ocibdp and ocibdn
+   rxgovind    10/07/96 - add oci file calls
+   skotsovo    10/01/96 - move orl lob fnts to oci
+   skotsovo    09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+   aroy        08/29/96 - change prototype for Nchar Lob support
+   dchatter    08/21/96 - OCIResultSetToStmt prototype change
+   sthakur     08/14/96 - add OCIParamSet
+   schandra    07/26/96 - TX OCI return values - sb4->sword
+   aroy        07/17/96 - terminology change: OCILobLocator => OCILobLocator
+   dchatter    07/01/96 - create ANSI prototypes
+   dchatter    07/01/96 - Creation
+
+*/
+
+ 
+#ifndef OCIAP_ORACLE
+# define OCIAP_ORACLE
+
+# ifndef ORATYPES 
+#  include <oratypes.h> 
+# endif 
+ 
+#ifndef ORASTDARG
+#include <stdarg.h>
+#define ORASTDARG
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef NZT_ORACLE
+#include <nzt.h>
+#endif /* NZT_ORACLE */
+ 
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+Note: the descriptions of the functions are alphabetically arranged. Please 
+maintain the arrangement when adding a new function description. The actual 
+prototypes are below this comment section and donot follow any alphabetical 
+ordering. 
+
+
+--------------------------------OCIAttrGet------------------------------------
+
+OCIAttrGet()
+Name
+OCI Attribute Get
+Purpose
+This call is used to get a particular attribute of a handle. 
+Syntax
+sword OCIAttrGet ( const void    *trgthndlp,
+                 ub4            trghndltyp,
+                 void          *attributep,
+                 ub4            *sizep,
+                 ub4            attrtype,
+                 OCIError       *errhp );
+Comments
+This call is used to get a particular attribute of a handle.
+See Appendix B,  "Handle Attributes",  for a list of handle types and their 
+readable attributes.
+Parameters
+trgthndlp (IN) - is the pointer to a handle type. 
+trghndltyp (IN) - is the handle type. 
+attributep (OUT) - is a pointer to the storage for an attribute value. The 
+attribute value is filled in. 
+sizep (OUT) - is the size of the attribute value. 
+This can be passed in as NULL for most parameters as the size is well known. 
+For text* parameters, a pointer to a ub4 must be passed in to get the length 
+of the string. 
+attrtype (IN) - is the type of attribute.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrSet()
+
+--------------------------------OCIAttrSet------------------------------------
+
+
+OCIAttrSet()
+Name
+OCI Attribute Set
+Purpose
+This call is used to set a particular attribute of a handle or a descriptor. 
+Syntax
+sword OCIAttrSet ( void       *trgthndlp,
+                 ub4         trghndltyp,
+                 void       *attributep,
+                 ub4         size,
+                 ub4         attrtype,
+                 OCIError    *errhp );
+Comments
+This call is used to set a particular attribute of a handle or a descriptor. 
+See Appendix B for a list of handle types and their writeable attributes.
+Parameters
+trghndlp (IN/OUT) - the pointer to a handle type whose attribute gets 
+modified. 
+trghndltyp (IN/OUT) - is the handle type. 
+attributep (IN) - a pointer to an attribute value. 
+The attribute value is copied into the target handle. If the attribute value 
+is a pointer, then only the pointer is copied, not the contents of the pointer.
+size (IN) - is the size of an attribute value. This can be passed in as 0 for 
+most attributes as the size is already known by the OCI library. For text*
+attributes, a ub4 must be passed in set to the length of the string. 
+attrtype (IN) - the type of attribute being set.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIAttrGet()
+
+
+
+--------------------------------OCIBindArrayOfStruct--------------------------
+
+
+
+OCIBindArrayOfStruct()
+Name
+OCI Bind for Array of Structures
+Purpose
+This call sets up the skip parameters for a static array bind.
+Syntax
+sword OCIBindArrayOfStruct ( OCIBind     *bindp,
+                           OCIError    *errhp,
+                           ub4         pvskip, 
+                           ub4         indskip, 
+                           ub4         alskip, 
+                           ub4         rcskip );
+Comments
+This call sets up the skip parameters necessary for a static array bind.
+This call follows a call to OCIBindByName() or OCIBindByPos(). The bind 
+handle returned by that initial bind call is used as a parameter for the 
+OCIBindArrayOfStruct() call.
+For information about skip parameters, see the section "Arrays of Structures" 
+on page 4-16.
+Parameters
+bindp (IN) - the handle to a bind structure. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value. 
+indskip (IN) - skip parameter for the next indicator value or structure. 
+alskip (IN) - skip parameter for the next actual length value. 
+rcskip (IN) - skip parameter for the next column-level return code value. 
+Related Functions
+OCIAttrGet()
+
+
+--------------------------------OCIBindByName---------------------------------
+
+OCIBindByName()
+Name
+OCI Bind by Name
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByName (
+              OCIStmt       *stmtp, 
+              OCIBind       **bindp,
+              OCIError      *errhp,
+              const OraText    *placeholder,
+              sb4           placeh_len,
+              void         *valuep,
+              sb4           value_sz,
+              ub2           dty,
+              void         *indp,
+              ub2           *alenp,
+              ub2           *rcodep,
+              ub4           maxarr_len,
+              ub4           *curelep, 
+              ub4           mode ); 
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information 
+for this particular input value. The handle is feed implicitly when the 
+statement handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+placeholder (IN) - the placeholder attributes are specified by name if 
+ocibindn() is being called.
+placeh_len (IN) - the length of the placeholder name specified in placeholder.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is
+the maximum size of any element possible with the actual sizes being specified 
+in the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). 
+Ignored for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic(). 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindByPos-----------------------------------
+
+
+OCIBindByPos()
+Name
+OCI Bind by Position
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByPos ( 
+              OCIStmt      *stmtp, 
+              OCIBind      **bindp,
+              OCIError     *errhp,
+              ub4          position,
+              void        *valuep,
+              sb4          value_sz,
+              ub2          dty,
+              void        *indp,
+              ub2          *alenp,
+              ub2          *rcodep,
+              ub4          maxarr_len,
+              ub4          *curelep, 
+              ub4          mode);
+
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information 
+for this particular input value. The handle is feed implicitly when the 
+statement handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+position (IN) - the placeholder attributes are specified by position if 
+ocibindp() is being called.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is
+the maximum size of any element possible with the actual sizes being specified
+in the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). Ignored 
+for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic() . 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindDynamic---------------------------------
+
+OCIBindDynamic()
+Name
+OCI Bind Dynamic Attributes
+Purpose
+This call is used to register user callbacks for dynamic data allocation. 
+Syntax
+sword OCIBindDynamic( OCIBind     *bindp,
+                    OCIError    *errhp,
+                    void       *ictxp, 
+                    OCICallbackInBind         (icbfp)(
+                                void            *ictxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                void            **bufpp,
+                                ub4              *alenp,
+                                ub1              *piecep, 
+                                void            **indp ),
+                    void       *octxp,
+                    OCICallbackOutBind         (ocbfp)(
+                                void            *octxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                void            **bufp, 
+                                ub4              **alenpp,
+                                ub1              *piecep,
+                                void            **indpp, 
+                                ub2              **rcodepp)   );
+Comments
+This call is used to register user-defined callback functions for providing 
+data for an UPDATE or INSERT if OCI_DATA_AT_EXEC mode was specified in a 
+previous call to OCIBindByName() or OCIBindByPos(). 
+The callback function pointers must return OCI_CONTINUE if it the call is 
+successful. Any return code other than OCI_CONTINUE signals that the client 
+wishes to abort processing immediately.
+For more information about the OCI_DATA_AT_EXEC mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+bindp (IN/OUT) - a bind handle returned by a call to OCIBindByName() or 
+OCIBindByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ictxp (IN) - the context pointer required by the call back function icbfp. 
+icbfp (IN) - the callback function which returns a pointer to the IN bind 
+value or piece at run time. The callback takes in the following parameters. 
+ictxp (IN/OUT) - the context pointer for this callback function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. 1 based not 
+greater than curele parameter of the bind call. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and may not be greater than curele parameter of the bind call. 
+bufpp (OUT) - the pointer to the buffer. 
+piecep (OUT) - which piece of the bind value. This can be one of the 
+following values - OCI_ONE_PIECE, OCI_FIRST_PIECE, 
+OCI_NEXT_PIECE and OCI_LAST_PIECE.
+indp (OUT) - contains the indicator value. This is apointer to either an 
+sb2 value or a pointer to an indicator structure for binding named data 
+types. 
+indszp (OUT) - contains the indicator value size. A pointer containing 
+the size of either an sb2 or an indicator structure pointer. 
+octxp (IN) - the context pointer required by the callback function ocbfp. 
+ocbfp (IN) - the callback function which returns a pointer to the OUT bind 
+value or piece at run time. The callback takes in the following parameters. 
+octxp (IN/OUT) - the context pointer for this call back function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and must not be greater than curele parameter of the bind call. 
+bufpp (OUT) - a pointer to a buffer to write the bind value/piece. 
+buflp (OUT) - returns the buffer size. 
+alenpp (OUT) - a pointer to a storage for OCI to fill in the size of the bind 
+value/piece after it has been read. 
+piecep (IN/OUT) - which piece of the bind value. It will be set by the 
+library to be one of the following values - OCI_ONE_PIECE or 
+OCI_NEXT_PIECE. The callback function can leave it unchanged or set 
+it to OCI_FIRST_PIECE or OCI_LAST_PIECE. By default - 
+OCI_ONE_PIECE. 
+indpp (OUT) - returns a pointer to contain the indicator value which 
+either an sb2 value or a pointer to an indicator structure for named data 
+types. 
+indszpp (OUT) - returns a pointer to return the size of the indicator 
+value which is either size of an sb2 or size of an indicator structure. 
+rcodepp (OUT) - returns a pointer to contains the return code. 
+Related Functions
+OCIAttrGet()
+
+
+---------------------------------OCIBindObject--------------------------------
+
+
+OCIBindObject()
+Name
+OCI Bind Object
+Purpose
+This function sets up additional attributes which are required for a named 
+data type (object)  bind.
+Syntax
+sword OCIBindObject ( OCIBind          *bindp,
+                    OCIError         *errhp, 
+                    const OCIType    *type,
+                    void            **pgvpp, 
+                    ub4              *pvszsp, 
+                    void            **indpp, 
+                    ub4              *indszp, );
+Comments
+This function sets up additional attributes which binding a named data type 
+or a REF. An error will be returned if this function is called when the OCI 
+environment has been initialized in non-object mode. 
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+If the OCI_DATA_AT_EXEC mode was specified in ocibindn() or ocibindp(), the 
+pointers to the IN buffers are obtained either using the callback icbfp 
+registered in the OCIBindDynamic() call or by the OCIStmtSetPieceInfo() call. 
+The buffers are dynamically allocated for the OUT data and the pointers to 
+these buffers are returned either by calling ocbfp() registered by the 
+OCIBindDynamic() or by setting the pointer to the buffer in the buffer passed 
+in by OCIStmtSetPieceInfo() called when OCIStmtExecute() returned 
+OCI_NEED_DATA. The memory of these client library- allocated buffers must be 
+freed when not in use anymore by using the OCIObjectFreee() call.
+Parameters
+bindp ( IN/OUT) - the bind handle returned by the call to OCIBindByName() 
+or OCIBindByPos(). 
+errhp ( IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type ( IN) - points to the TDO which describes the type of the program 
+variable being bound. Retrieved by calling OCITypeByName().
+pgvpp ( IN/OUT) - points to a pointer to the program variable buffer. For an 
+array, pgvpp points to an array of pointers. When the bind variable is also an 
+OUT variable, the OUT Named Data Type value or REF is allocated 
+(unpickled) in the Object Cache, and a pointer to the value or REF is returned,
+At the end of execute, when all OUT values have been received, pgvpp points 
+to an array of pointer(s) to these newly allocated named data types in the 
+object cache. 
+pgvpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the Named 
+Data Type buffers are requested at runtime. For static array binds, skip 
+factors may be specified using the OCIBindArrayOfStruct() call. The skip 
+factors are used to compute the address of the next pointer to the value, the 
+indicator structure and their sizes.
+pvszsp ( IN/OUT) - points to the size of the program variable. The size of the 
+named data type is not required on input. For an array, pvszsp is an array of 
+ub4s. On return, for OUT bind variables, this points to size(s) of the Named 
+Data Types and REFs received. pvszsp is ignored if the OCI_DATA_AT_EXEC 
+mode is set. Then the size of the buffer is taken at runtime.
+indpp ( IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array 
+of pointers. When the bind variable is also an OUT bind variable, memory is 
+allocated in the object cache, to store the unpickled OUT indicator values. At 
+the end of the execute when all OUT values have been received, indpp points 
+to the pointer(s) to these newly allocated indicator structure(s). 
+indpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+is requested at runtime.
+indszp ( IN/OUT) - points to the size of the IN indicator structure program 
+variable. For an array, it is an array of sb2s. On return for OUT bind 
+variables, this points to size(s) of the received OUT indicator structures.
+indszp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+size is requested at runtime.
+Related Functions
+OCIAttrGet()
+
+
+
+----------------------------------OCIBreak------------------------------------
+
+
+OCIBreak()
+Name
+OCI Break
+Purpose
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server .
+Syntax
+sword OCIBreak ( void      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server. It is normally used 
+to stop a long-running OCI call being processed on the server.
+This call can take either the service context handle or the server context 
+handle as a parameter to identify the function to be aborted.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+-----------------------------OCIConnectionPoolCreate --------------------------
+Name:
+OCIConnectionPoolCreate
+
+Purpose:
+Creates the connections in the pool
+
+Syntax:
+OCIConnectionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+                         OraText **poolName, sb4 *poolNameLen, 
+                         const Oratext *dblink, sb4 dblinkLen,
+                         ub4 connMin, ub4 connMax, ub4 connIncr,
+                         const OraText *poolUsername, sb4 poolUserLen,
+                         const OraText *poolPassword, sb4 poolPassLen, 
+                         ub4 mode)
+Comments:
+This call is used to create a connection pool. conn_min connections
+to the database are started on calling OCIConnectionPoolCreate.
+
+Parameters:
+envhp (IN/OUT)  - A pointer to the environment where the Conencton Pool
+                  is to be created
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+poolName (OUT) - The connection pool name. 
+poolNameLen (OUT) - The length of the connection pool name 
+dblink (IN/OUT) - Specifies the database(server) to connect. This will also
+                  be used as the default pool name.
+dblinkLen (IN)  - The length of the string pointed to by dblink.
+connMin (IN)    - Specifies the minimum number of connections in the
+                  Connection Pool at any instant.
+                  connMin number of connections are started when
+                  OCIConnectionPoolCreate() is called.
+connMax (IN)    - Specifies the maximum number of connections that can be
+                  opened to the database. Once this value is reached, no
+                  more connections are opened.
+connIncr (IN)   - Allows application to set the next increment for
+                  connections to be opened to the database if the current
+                  number of connections are less than conn_max.
+poolUsername (IN/OUT) - Connection pooling requires an implicit proxy
+                         session and this attribute provides a username
+                         for that session.
+poolUserLen (IN) - This represents the length of pool_username.
+poolPassword (IN/OUT) - The password for the parameter pool_username passed
+                        above.
+poolPassLen (IN) - This represents the length of pool_password.
+
+mode (IN) - The modes supported are OCI_DEFAULT and 
+OCI_CPOOL_REINITIALIZE 
+
+Related Functions
+OCIConnectionPoolDestroy()
+
+---------------------------------------------------------------------------
+
+----------------------------OCIConnectionPoolDestroy-------------------------
+Name:
+OCIConnectionPoolDestroy
+
+Purpose:
+Terminates the connections in the pool
+
+Syntax:
+OCIConnectionPoolDestroy (OCICPool *poolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+On calling OCIConnectionPoolDestroy, all the open connections in the pool
+are closed and the pool is destroyed.
+
+Parameters:
+poolhp (IN/OUT) - An initialiazed pool handle.
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+mode (IN)       - Currently, OCIConnectionPoolDestroy() will support only
+                  the OCI_DEFAULT mode.
+
+Related Functions:
+OCIConnectionPoolCreate()
+
+-----------------------------------------------------------------------------
+----------------------------OCISessionPoolCreate-----------------------------
+Name: 
+OCISessionPoolCreate
+
+Purpose:
+Creates the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISpool *spoolhp, 
+                      OraText **poolName, ub4 *poolNameLen, 
+                      const OraText *connStr, ub4 connStrLen,
+                      ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                      OraText *userid,  ub4 useridLen,
+                      OraText *password, ub4 passwordLen,
+                      ub4 mode)
+
+Comments:
+When OCISessionPoolCreate is called, a session pool is initialized for
+the associated environment and the database specified by the
+connStr parameter. This pool is named uniquely and the name
+is returned to the user in the poolname parameter.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment handle in which the session
+                 pool needs to be created.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+spoolhp (IN/OUT) - A pointer to the session pool handle that is created.
+poolName (OUT) - Session pool name returned to the user.
+poolNameLen (OUT) - Length of the PoolName
+connStr (IN) - The TNS alias of the database to connect to.
+connStrLen (IN) - Length of the connStr.
+sessMin (IN) - Specifies the minimum number of sessions in the Session Pool.
+               These are the number of sessions opened in the beginning, if
+               in Homogeneous mode. Else, the parameter is ignored.
+sessMax (IN) - Specifies the maximum number of sessions in the Session Pool.
+               Once this value is reached, no more sessions are opened,
+               unless the OCI_ATTR_SPOOL_FORCEGET is set.
+userid (IN) - Specifies the userid with which to start up the sessions.
+useridLen (IN) - Length of userid.
+password (IN) - Specifies the password for the corresponding userid.
+passwordLen (IN) - Specifies the length of the password
+mode(IN) - May be OCI_DEFAULT, OCI_SPC_SPOOL_REINITIALIZE, or
+           OCI_SPC_SPOOL_HOMOGENEOUS.
+
+Returns:
+SUCCESS - If pool could be allocated and created successfully.
+ERROR - If above conditions could not be met.
+
+Related Functions:
+OCISessionPoolDestroy()
+-----------------------------------------------------------------------------
+-----------------------------OCISessionPoolDestroy---------------------------
+Name:
+OCISessionPoolDestroy
+
+Purpose:
+Terminates all the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolDestroy (OCISPool *spoolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+spoolhp (IN/OUT) - The pool handle of the session pool to be destroyed.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently only OCI_DEFAULT mode is supported.
+
+Returns:
+SUCCESS - All the sessions could be closed.
+ERROR - If the above condition is not met.
+
+Related Functions:
+OCISessionPoolCreate()
+-----------------------------------------------------------------------------
+-------------------------------OCISessionGet---------------------------------
+Name:
+OCISessionGet
+
+Purpose:
+Get a session. This could be from a session pool, connection pool or
+a new standalone session.
+
+Syntax:
+sword OCISessionGet(OCIenv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                    OCIAuthInfo *authhp,
+                    OraText *poolName, ub4 poolName_len,
+                    const OraText *tagInfo, ub4 tagInfo_len,
+                    OraText **retTagInfo, ub4 *retTagInfo_len,
+                    boolean *found,
+                    ub4 mode)
+
+Comments:
+envhp (IN/OUT) - OCI environment handle.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+svchp (IN/OUT) - Address of an OCI service context pointer. This will be
+                 filled with a server and session handle, attached to the
+                 pool.
+authhp (IN/OUT) - OCI Authentication Information handle.
+poolName (IN) - This indicates the session/connection pool to get the
+                session/connection from in the OCI_SPOOL/OCI_CPOOL mode.
+                In the OCI_DEFAULT mode it refers to the connect string.
+poolName_len (IN) - length of poolName.
+tagInfo (IN) - indicates the tag of the session that the user wants. If the
+                   user wants a default session, he must specify a NULL here.
+                   Only used for Session Pooling.
+tagInfo_len (IN) - the length of tagInfo.
+retTagInfo (OUT) - This indicates the type of session that is returned to
+                   the user. Only used for Session Pooling.
+retTagInfo_len (OUT) - the length of retTagInfo.
+found (OUT) - set to true if the user gets a session he had requested, else
+              set to false. Only used for Session Pooling.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_CRED_PROXY and
+            OCI_GET_SPOOL_MATCHANY, OCI_SPOOL and OCI_CPOOL. OCI_SPOOL and
+            OCI_CPOOL are mutually exclusive.
+
+Returns:
+SUCCESS -  if a session was successfully returned into svchp.
+SUCCESS_WITH_INFO - if a session was successfully returned into svchp and the
+                    total number of sessions > maxsessions. Only valid for
+                    Session Pooling.
+ERROR - If a session could not be retrieved.
+
+Related Functions:
+OCISessionRelease()
+-----------------------------------------------------------------------------
+---------------------------OCISessionRelease---------------------------------
+Name:
+OCISessionRelease
+
+Purpose:
+Release the session.
+
+Syntax:
+sword OCISessionRelease ( OCISvcCtx *svchp, OCIError *errhp,
+                          OraText *tag, ub4 tag_len,
+                          ub4 mode);
+
+Comments:
+svchp (IN/OUT) - The service context associated with the session/connection.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+tag (IN) - Only used for Session Pooling.
+           This parameter will be ignored unless mode OCI_RLS_SPOOL_RETAG is
+           specified. In this case, the session is labelled with this tag and
+           returned to the pool. If this is NULL, then the session is untagged.
+tag_len (IN) - Length of the tag. This is ignored unless mode 
+               OCI_RLS_SPOOL_RETAG is set.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_RLS_SPOOL_DROPSESS,
+            OCI_RLS_SPOOL_RETAG. The last 2 are only valid for Session Pooling.
+            When OCI_RLS_SPOOL_DROPSESS is specified, the session
+            will be removed from the session pool. If OCI_RLS_SPOOL_RETAG 
+            is set, the tag on the session will be altered. If this mode is 
+            not set, the tag and tag_len parameters will be ignored.
+
+Returns:
+ERROR - If the session could not be released successfully.
+SUCCESS - In all other cases.
+
+Related Functions:
+OCISessionGet().
+-----------------------------------------------------------------------------
+------------------------------OCIDateTimeAssign --------------------------
+sword OCIDateTimeAssign(void *hndl, OCIError *err, const OCIDateTime *from, 
+                        OCIDateTime *to);
+NAME: OCIDateTimeAssign - OCIDateTime Assignment
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+from (IN) - datetime to be assigned
+to (OUT) - lhs of assignment
+DESCRIPTION:
+        Performs date assignment. The type of the output will be same as that
+        of input
+
+------------------------------OCIDateTimeCheck----------------------------
+sword OCIDateTimeCheck(void *hndl, OCIError *err, const OCIDateTime *date, 
+                 ub4 *valid );
+NAME: OCIDateTimeCheck - OCIDateTime CHecK if the given date is valid
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - date to be checked
+valid (OUT) -  returns zero for a valid date, otherwise 
+                the ORed combination of all error bits specified below:
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_DATE_INVALID_DAY         0x1             Bad day
+   OCI_DATE_DAY_BELOW_VALID     0x2             Bad DAy Low/high bit (1=low)
+   OCI_DATE_INVALID_MONTH       0x4             Bad MOnth
+   OCI_DATE_MONTH_BELOW_VALID   0x8             Bad MOnth Low/high bit (1=low)
+   OCI_DATE_INVALID_YEAR        0x10            Bad YeaR
+   OCI_DATE_YEAR_BELOW_VALID    0x20            Bad YeaR Low/high bit (1=low)
+   OCI_DATE_INVALID_HOUR        0x40            Bad HouR
+   OCI_DATE_HOUR_BELOW_VALID    0x80            Bad HouR Low/high bit (1=low)
+   OCI_DATE_INVALID_MINUTE      0x100           Bad MiNute
+   OCI_DATE_MINUTE_BELOW_VALID  0x200           Bad MiNute Low/high bit (1=low)
+   OCI_DATE_INVALID_SECOND      0x400           Bad SeCond
+   OCI_DATE_SECOND_BELOW_VALID  0x800           bad second Low/high bit (1=low)
+   OCI_DATE_DAY_MISSING_FROM_1582 0x1000        Day is one of those "missing"
+                                                from 1582
+   OCI_DATE_YEAR_ZERO           0x2000          Year may not equal zero
+   OCI_DATE_INVALID_TIMEZONE    0x4000          Bad Timezone
+   OCI_DATE_INVALID_FORMAT      0x8000          Bad date format input
+
+   So, for example, if the date passed in was 2/0/1990 25:61:10 in
+   (month/day/year hours:minutes:seconds format), the error returned
+   would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+   OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+DESCRIPTION:
+        Check if the given date is valid.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'date' and 'valid' pointers are NULL pointers
+
+------------------------------- OCIDateTimeCompare----------------------------
+sword OCIDateTimeCompare(void *hndl, OCIError *err, const OCIDateTime *date1, 
+                     const OCIDateTime *date2,  sword *result );
+NAME: OCIDateTimeCompare - OCIDateTime CoMPare dates
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date1, date2 (IN) - dates to be compared
+result (OUT) - comparison result, 0 if equal, -1 if date1 < date2, 
+                1 if date1 > date2
+DESCRIPTION:
+The function OCIDateCompare compares two dates. It returns -1 if 
+date1 is smaller than date2, 0 if they are equal, and 1 if date1 is 
+greater than date2.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          input dates are not mutually comparable
+
+------------------------------OCIDateTimeConvert----------------------
+sword OCIDateTimeConvert(void *hndl, OCIError *err, OCIDateTime *indate, 
+                                OCIDateTime *outdate);
+NAME: OCIDateTimeConvert - Conversion between different DATETIME types
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate (IN) - pointer to input date
+outdate (OUT) - pointer to output datetime 
+DESCRIPTION: Converts one datetime type to another. The result type is
+       the type of the 'outdate' descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            conversion not possible.
+   
+---------------------------- OCIDateTimeFromText-----------------------
+sword OCIDateTimeFromText(void *hndl, OCIError *err, const OraText *date_str, 
+             size_t d_str_length, const OraText *fmt, ub1 fmt_length,
+             const OraText *lang_name, size_t lang_length, OCIDateTime *date );
+NAME: OCIDateTimeFromText - OCIDateTime convert String FROM Date
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+                    conversion takes place in session NLS_LANGUAGE and
+                    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date_str (IN) - input string to be converted to Oracle date
+d_str_length (IN) - size of the input string, if the length is -1
+                then 'date_str' is treated as a null terminated  string
+fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+                the string is expected to be in the default format for
+                the datetime type.
+fmt_length (IN) - length of the 'fmt' parameter
+lang_name (IN) - language in which the names and abbreviations of
+                days and months are specified, if null i.e. (OraText *)0,
+                the default language of session is used, 
+lang_length (IN) - length of the 'lang_name' parameter
+date (OUT) - given string converted to date
+DESCRIPTION:
+        Converts the given string to Oracle datetime type set in the 
+        OCIDateTime descriptor according to the specified format. Refer to 
+        "TO_DATE" conversion function described in "Oracle SQL Language 
+        Reference Manual" for a description of format.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid format
+          unknown language
+          invalid input string
+
+--------------------------- OCIDateTimeGetDate-------------------------
+sword OCIDateTimeGetDate(void *hndl, OCIError *err,  const OCIDateTime *date, 
+                           sb2 *year, ub1 *month, ub1 *day );
+NAME: OCIDateTimeGetDate - OCIDateTime Get Date (year, month, day)  
+                                portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+year      (OUT) - year value
+month     (OUT) - month value
+day       (OUT) - day value
+
+--------------------------- OCIDateTimeGetTime ------------------------
+sword OCIDateTimeGetTime(void *hndl, OCIError *err, OCIDateTime *datetime,
+                 ub1 *hour, ub1 *minute, ub1 *sec, ub4 *fsec);
+NAME: OCIDateTimeGetTime - OCIDateTime Get Time (hour, min, second, 
+                        fractional second)  of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - hour value
+minute       (OUT) - minute value
+sec       (OUT) - second value
+fsec      (OUT) - Fractional Second value
+
+--------------------------- OCIDateTimeGetTimeZoneOffset ----------------------
+sword OCIDateTimeGetTimeZoneOffset(void *hndl,OCIError *err,const 
+              OCIDateTime *datetime,sb1 *hour,sb1  *minute);
+
+NAME: OCIDateTimeGetTimeZoneOffset - OCIDateTime Get TimeZone (hour, minute)  
+                         portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - TimeZone Hour value
+minute     (OUT) - TimeZone Minute value
+
+--------------------------- OCIDateTimeSysTimeStamp---------------------
+sword OCIDateTimeSysTimeStamp(void *hndl, OCIError *err, 
+              OCIDateTime *sys_date );
+ 
+NAME: OCIDateTimeSysTimeStamp - Returns system date/time as a TimeStamp with 
+                      timezone
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+sys_date (OUT) - Pointer to output timestamp
+ 
+DESCRIPTION: 
+        Gets the system current date and time as a timestamp with timezone
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+------------------------------OCIDateTimeIntervalAdd----------------------
+sword OCIDateTimeIntervalAdd(void *hndl, OCIError *err, OCIDateTime *datetime,
+         OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalAdd - Adds an interval to datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+                                will be of same type as input datetime
+DESCRIPTION: 
+        Adds an interval to a datetime to produce a resulting datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if:
+                resulting date is before Jan 1, -4713
+                resulting date is after Dec 31, 9999
+
+------------------------------OCIDateTimeIntervalSub----------------------
+sword OCIDateTimeIntervalSub(void *hndl, OCIError *err, OCIDateTime *datetime,
+              OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalSub - Subtracts an interval from a datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+                                will be of same type as input datetime
+DESCRIPTION: 
+        Subtracts an interval from a datetime and stores the result in a
+        datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if:
+                resulting date is before Jan 1, -4713
+                resulting date is after Dec 31, 9999
+
+--------------------------- OCIDateTimeConstruct-------------------------
+sword OCIDateTimeConstruct(void  *hndl,OCIError *err,OCIDateTime *datetime,
+               sb2 year,ub1 month,ub1 day,ub1 hour,ub1 min,ub1 sec,ub4 fsec,
+               OraText  *timezone,size_t timezone_length);
+
+NAME: OCIDateTimeConstruct - Construct an OCIDateTime. Only the relevant
+       fields for the OCIDateTime descriptor types are used.
+PARAMETERS:
+        hndl (IN) - Session/Env handle. 
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        datetime (IN) - Pointer to OCIDateTime 
+        year      (IN) - year value
+        month     (IN) - month value
+        day       (IN) - day value        
+        hour      (IN) - hour value
+        min       (IN) - minute value
+        sec       (IN) - second value
+        fsec      (IN) - Fractional Second value
+        timezone  (IN) - Timezone string
+        timezone_length(IN) - Length of timezone string
+
+DESCRIPTION:
+       Constructs a DateTime descriptor. The type of the datetime is the
+       type of the OCIDateTime descriptor. Only the relevant fields based
+       on the type are used. For Types with timezone, the date and time
+       fields are assumed to be in the local time of the specified timezone.
+       If timezone is not specified, then session default timezone is
+       assumed.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR if datetime is not valid.
+
+------------------------------OCIDateTimeSubtract-----------------------
+sword OCIDateTimeSubtract(void *hndl, OCIError *err, OCIDateTime *indate1, 
+                OCIDateTime *indate2, OCIInterval *inter);
+NAME: OCIDateTimeSubtract - subtracts two datetimes to return an interval
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate1(IN) - pointer to subtrahend
+indate2(IN) - pointer to minuend
+inter  (OUT) - pointer to output interval
+DESCRIPTION: 
+        Takes two datetimes as input and stores their difference in an 
+        interval. The type of the interval is the type of the 'inter'
+        descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+           datetimes are not comparable.
+
+--------------------------- OCIDateTimeToText--------------------------
+sword OCIDateTimeToText(void *hndl, OCIError *err, const OCIDateTime *date, 
+                        const OraText *fmt, ub1 fmt_length, ub1 fsprec, 
+                        const OraText *lang_name, size_t lang_length, 
+                        ub4 *buf_size, OraText *buf );
+NAME: OCIDateTimeToText - OCIDateTime convert date TO String 
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+                    conversion takes place in session NLS_LANGUAGE and
+                    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - Oracle datetime to be converted
+fmt (IN) - conversion format, if null string pointer (OraText*)0, then
+                the date is converted to a character string in the
+                default format for that type.
+fmt_length (IN) - length of the 'fmt' parameter
+fsprec (IN) - specifies the fractional second precision in which the
+               fractional seconds is returned.
+lang_name (IN) - specifies the language in which the names and 
+                abbreviations of months and days are returned;
+                default language of session is used if 'lang_name' 
+                is null i.e. (OraText *)0
+lang_length (IN) - length of the 'nls_params' parameter
+buf_size (IN/OUT) - size of the buffer; size of the resulting string
+                is returned via this parameter
+buf (OUT) - buffer into which the converted string is placed
+DESCRIPTION:
+        Converts the given date to a string according to the specified format.
+        Refer to "TO_DATE" conversion function described in
+        "Oracle SQL Language Reference Manual" for a description of format
+        and NLS arguments. The converted null-terminated date string is
+        stored in the buffer 'buf'.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          buffer too small
+          invalid format
+          unknown language
+          overflow error
+
+----------------------------OCIDateTimeGetTimeZoneName------------------------
+sword OCIDateTimeGetTimeZoneName(void *hndl, 
+                                 OCIError *err,
+                                 const OCIDateTime *datetime,
+                                 ub1 *buf,
+                                 ub4 *buflen);
+NAME OCIDateTimeGetTimeZoneName - OCI DateTime Get the Time Zone Name
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)   - Pointer to an OCIDateTime.
+buf (OUT)       - User allocated storage for name string.
+buflen (IN/OUT) - length of buf on input, length of name on out
+DESCRIPTION:
+        Returns either the timezone region name or the absolute hour and minute
+        offset. If the DateTime was created with a region id then the region 
+        name will be returned in the buf.  If the region id is zero, then the 
+        hour and minute offset is returned as "[-]HH:MM".
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+---------------------------------OCIDateTimeToArray----------------------------
+sword OCIDateTimeToArray(void *hndl, 
+                         OCIError *err,
+                         const OCIDateTime *datetime,
+                         const OCIInterval *reftz,
+                         ub1 *outarray,
+                         ub4 *len
+                         ub1 *fsprec);
+NAME OCIDateTimeToArray - OCI DateTime convert To Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)   - Pointer to OCIDateTime to be converted.
+outarray (OUT)  - Result array storage
+len (OUT)        - pointer to  length of outarray.
+fsprec (IN)     - Number of fractional seconds digits.
+DESCRIPTION:
+        Returns an array representing the input DateTime descriptor.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+--------------------------------OCIDateTimeFromArray---------------------------
+sword OCIDateTimeFromArray(void *hndl, 
+                         OCIError *err,
+                         ub1 *inarray,
+                         ub4 len
+                         ub1 type
+                         OCIDateTime *datetime,
+                         OCIInterval *reftz,
+                         ub1 fsprec);
+NAME OCIDateTimeFromArray - OCI DateTime convert From Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+inarray (IN)   - Pointer to input array representtion of DateTime
+len (IN)       - len of inarray.
+type (IN)      - One of SQLT_DATE, SQLT_TIME, SQLT_TIME_TZ, SQLT_TIMESTAMP,
+                 SQLT_TIMESTAMP_TZ, or SQLT_TIMESTAMP_LTZ.
+datetime (OUT) - Pointer to the result OCIDateTime.
+reftz (IN)     - timezone interval used with SQLT_TIMESTAMP_LTZ.
+fsprec (IN)    - fractionl seconds digits of precision (0-9).
+DESCRIPTION:
+        Returns a pointer to an OCIDateTime of type type converted from 
+        the inarray.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+----------------------------------OCIRowidToChar-----------------------------
+Name
+OCIRowidToChar
+
+Purpose
+Converts physical/logical (universal) ROWID to chracter extended (Base 64) 
+representation into user provided buffer outbfp of length outbflp. After 
+execution outbflp contains amount of bytes converted.In case of truncation 
+error, outbflp contains required size to make this conversion successful
+and returns ORA-1405.
+
+Syntax
+sword OCIRowidToChar( OCIRowid *rowidDesc, 
+                      OraText *outbfp, 
+                      ub2 *outbflp, 
+                      OCIError *errhp)
+
+Comments
+After this conversion, ROWID in character format can be bound using
+OCIBindByPos or OCIBindByName call and used to query a row at a
+desired ROWID. 
+
+Parameters
+rowidDesc (IN)   - rowid DESCriptor which is allocated from OCIDescritorAlloc
+                   and populated by a prior SQL statement execution
+outbfp (OUT)     - pointer to the buffer where converted rowid in character 
+                   representation is stored after successful execution.
+outbflp (IN/OUT) - pointer to output buffer length variable.
+                   Before execution (IN mode) *outbflp contains the size of
+                   outbfp, after execution (OUT mode) *outbflp contains amount
+                   of bytes converted. In an event of truncation during 
+                   conversion *outbflp contains the required length to make
+                   conversion successful.
+errhp (IN/OUT)   - an error handle which can be passed to OCIErrorGet() for
+                   diagnostic information in the event of an error.
+
+------------------------------OCIDefineArrayOfStruct--------------------------
+
+
+OCIDefineArrayOfStruct()
+Name
+OCI Define for Array of Structures
+Purpose
+This call specifies additional attributes necessary for a static array define.
+Syntax
+sword OCIDefineArrayOfStruct ( OCIDefine   *defnp,
+                             OCIError    *errhp,
+                             ub4         pvskip, 
+                             ub4         indskip, 
+                             ub4         rlskip,
+                             ub4         rcskip );
+Comments
+This call specifies additional attributes necessary for an array define, 
+used in an array of structures (multi-row, multi-column) fetch.
+For more information about skip parameters, see the section "Skip Parameters" 
+on page 4-17.
+Parameters
+defnp (IN) - the handle to the define structure which was returned by a call 
+to OCIDefineByPos().
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator location. 
+rlskip (IN) - skip parameter for the next return length value.
+rcskip (IN) - skip parameter for the next return code.
+Related Functions
+OCIAttrGet()
+
+
+
+
+
+OCIDefineByPos()
+Name
+OCI Define By Position
+Purpose
+Associates an item in a select-list with the type and output data buffer. 
+Syntax
+sb4 OCIDefineByPos ( 
+              OCIStmt     *stmtp, 
+              OCIDefine   **defnp,
+              OCIError    *errhp,
+              ub4         position,
+              void       *valuep,
+              sb4         value_sz,
+              ub2         dty,
+              void       *indp,
+              ub2         *rlenp,
+              ub2         *rcodep,
+              ub4         mode );
+Comments
+This call defines an output buffer which will receive data retreived from 
+Oracle. The define is a local step which is necessary when a SELECT statement 
+returns data to your OCI application.
+This call also implicitly allocates the define handle for the select-list item.
+Defining attributes of a column for a fetch is done in one or more calls. The 
+first call is to OCIDefineByPos(), which defines the minimal attributes 
+required to specify the fetch. 
+This call takes as a parameter a define handle, which must have been 
+previously allocated with a call to OCIHandleAlloc().
+Following the call to OCIDefineByPos() additional define calls may be 
+necessary for certain data types or fetch modes:
+A call to OCIDefineArrayOfStruct() is necessary to set up skip parameters 
+for an array fetch of multiple columns.
+A call to OCIDefineObject() is necessary to set up the appropriate 
+attributes of a named data type fetch. In this case the data buffer pointer 
+in ocidefn() is ignored.
+Both OCIDefineArrayOfStruct() and OCIDefineObject() must be called 
+after ocidefn() in order to fetch multiple rows with a column of named 
+data types.
+For a LOB define, the buffer pointer must be a lob locator of type 
+OCILobLocator , allocated by the OCIDescAlloc() call. LOB locators, and not 
+LOB values, are always returned for a LOB column. LOB values can then be 
+fetched using OCI LOB calls on the fetched locator.
+For NCHAR (fixed and varying length), the buffer pointer must point to an 
+array of bytes sufficient for holding the required NCHAR characters. 
+Nested table columns are defined and fetched like any other named data type. 
+If the mode parameter is this call is set to OCI_DYNAMIC_FETCH, the client 
+application can fetch data dynamically at runtime.
+Runtime data can be provided in one of two ways:
+callbacks using a user-defined function which must be registered with a 
+subsequent call to OCIDefineDynamic(). When the client library needs a 
+buffer to return the fetched data, the callback will be invoked and the 
+runtime buffers provided will return a piece or the whole data. 
+a polling mechanism using calls supplied by the OCI. This mode is 
+assumed if no callbacks are defined. In this case, the fetch call returns the 
+OCI_NEED_DATA error code, and a piecewise polling method is used 
+to provide the data.
+Related Functions: For more information about using the 
+OCI_DYNAMIC_FETCH mode, see the section "Runtime Data 
+Allocation and Piecewise Operations" on page 5-16 of Volume 1..
+For more information about the define step, see the section "Defining" 
+on page 2-30.
+Parameters
+stmtp (IN) - a handle to the requested SQL query operation.
+defnp (IN/OUT) - a pointer to a pointer to a define handle which is implicitly 
+allocated by this call.  This handle is used to  store the define information 
+for this column.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+position (IN) - the position of this value in the select list. Positions are 
+1-based and are numbered from left to right. For example, in the SELECT 
+statement
+SELECT empno, ssn, mgrno FROM employees;
+empno is at position 1, ssn is at position 2, and mgrno is at position 3.
+valuep (IN/OUT) - a pointer to a buffer or an array of buffers of the type 
+specified in the dty parameter. A number of buffers can be specified when 
+results for more than one row are desired in a single fetch call.
+value_sz (IN) - the size of each valuep buffer in bytes. If the data is stored 
+internally in VARCHAR2 format, the number of characters desired, if different 
+from the buffer size in bytes, may be additionally specified by the using 
+OCIAttrSet(). 
+In an NLS conversion environment, a truncation error will be generated if the 
+number of bytes specified is insufficient to handle the number of characters 
+desired.
+dty (IN) - the data type. Named data type (SQLT_NTY) and REF (SQLT_REF) 
+are valid only if the environment has been intialized with in object mode. 
+indp - pointer to an indicator variable or array. For scalar data types, 
+pointer to sb2 or an array of sb2s. Ignored for named data types. For named 
+data types, a pointer to a named data type indicator structure or an array of 
+named data type indicator structures is associated by a subsequent 
+OCIDefineObject() call. 
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+rlenp (IN/OUT) - pointer to array of length of data fetched. Each element in 
+rlenp is the length of the data in the corresponding element in the row after 
+the fetch. 
+rcodep (OUT) - pointer to array of column-level return codes
+mode (IN) - the valid modes are:
+OCI_DEFAULT. This is the default mode.
+OCI_DYNAMIC_FETCH. For applications requiring dynamically 
+allocated data at the time of fetch, this mode must be used. The user may 
+additionally call OCIDefineDynamic() to set up a callback function that 
+will be invoked to receive the dynamically allocated buffers and to set 
+up the memory allocate/free callbacks and the context for the callbacks. 
+valuep and value_sz are ignored in this mode. 
+Related Functions
+OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()
+
+
+
+
+OCIDefineDynamic()
+Name
+OCI Define Dynamic Fetch Attributes
+Purpose
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode was selected in OCIDefineByPos(). 
+Syntax
+sword OCIDefineDynamic( OCIDefine   *defnp,
+                      OCIError    *errhp,
+                      void       *octxp, 
+                      OCICallbackDefine (ocbfp)(
+                                  void             *octxp,
+                                  OCIDefine         *defnp,
+                                  ub4               iter, 
+                                  void             **bufpp,
+                                  ub4               **alenpp,
+                                  ub1               *piecep,
+                                  void             **indpp,
+                                  ub2               **rcodep)  );
+Comments
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode has been selected in a call to 
+OCIDefineByPos(). 
+When the OCI_DYNAMIC_FETCH mode is selected, buffers will be 
+dynamically allocated for REF, and named data type, values to receive the 
+data. The pointers to these buffers will be returned. 
+If OCI_DYNAMIC_FETCH mode was selected, and the call to 
+OCIDefineDynamic() is skipped, then the application can fetch data piecewise 
+using OCI calls.
+For more information about OCI_DYNAMIC_FETCH mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+defnp (IN/OUT) - the handle to a define structure returned by a call to 
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+octxp (IN) - points to a context for the callback function. 
+ocbfp (IN) - points to a callback function. This is invoked at runtime to get 
+a pointer to the buffer into which the fetched data or a piece of it will be 
+retreived. The callback also specifies the indicator, the return code and the 
+lengths of the data piece and indicator. The callback has the following 
+parameters:
+octxp (IN) - a context pointer passed as an argument to all the callback 
+functions.
+defnp (IN) - the define handle.
+iter (IN) - which row of this current fetch.
+bufpp (OUT) - returns a pointer to a buffer to store the column value, ie. 
+*bufp points to some appropriate storage for the column value.
+alenpp (OUT) - returns a pointer to the length of the buffer. *alenpp 
+contains the size of the buffer after return from callback. Gets set to 
+actual data size after fetch.
+piecep (IN/OUT) - returns a piece value, as follows:
+The IN value can be OCI_ONE_PIECE, OCI_FIRST_PIECE or 
+OCI_NEXT_PIECE.
+The OUT value can be OCI_ONE_PIECE if the IN value was 
+OCI_ONE_PIECE.
+The OUT value can be OCI_ONE_PIECE or OCI_FIRST_PIECE if 
+the IN value was OCI_FIRST_PIECE.
+The OUT value can only be OCI_NEXT_PIECE or 
+OCI_LAST_PIECE if the IN value was OCI_NEXT_PIECE. 
+indpp (IN) - indicator variable pointer
+rcodep (IN) - return code variable pointer
+Related Functions
+OCIAttrGet()
+OCIDefineObject()
+
+
+
+
+OCIDefineObject()
+Name
+OCI Define Named Data Type attributes
+Purpose
+Sets up additional attributes necessary for a Named Data Type define.
+Syntax
+sword OCIDefineObject ( OCIDefine       *defnp,
+                      OCIError        *errhp,
+                      const OCIType   *type,
+                      void           **pgvpp, 
+                      ub4             *pvszsp, 
+                      void           **indpp, 
+                      ub4             *indszp );
+Comments
+This call sets up additional attributes necessary for a Named Data Type define.
+An error will be returned if this function is called when the OCI environment 
+has been initialized in non-Object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+See the description of OCIInitialize() on page 13 - 43 for more information 
+about initializing the OCI process environment.
+Parameters
+defnp (IN/OUT) - a define handle previously allocated in a call to 
+OCIDefineByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type (IN, optional) - points to the Type Descriptor Object (TDO) which 
+describes the type of the program variable. Only used for program variables 
+of type SQLT_NTY. This parameter is optional, and may be passed as NULL 
+if it is not being used.
+pgvpp (IN/OUT) - points to a pointer to a program variable buffer. For an 
+array, pgvpp points to an array of pointers. Memory for the fetched named data 
+type instance(s) is dynamically allocated in the object cache. At the end of 
+the fetch when all the values have been received, pgvpp points to the 
+pointer(s) to these newly allocated named data type instance(s). The 
+application must call OCIObjectMarkDel() to deallocate the named data type 
+instance(s) when they are no longer needed. 
+pvszsp (IN/OUT) - points to the size of the program variable. For an array, it 
+is an array of ub4s. On return points to the size(s) of unpickled fetched 
+values.
+indpp (IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array 
+of pointers. Memory is allocated to store the indicator structures in the 
+object cache. At the end of the fetch when all values have been received, 
+indpp points to the pointer(s) to these newly allocated indicator structure(s).
+indszp (IN/OUT) - points to the size(s) of the indicator structure program 
+variable. For an array, it is an array of ub4s. On return points to the size(s)
+of the unpickled fetched indicator values.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIDescAlloc()
+Name
+OCI Get DESCriptor or lob locator
+Purpose
+Allocates storage to hold certain data types. The descriptors can be used as 
+bind or define variables.
+Syntax
+sword OCIDescAlloc ( const void   *parenth,
+                   void         **descpp, 
+                   ub4           type,
+                   size_t        xtramem_sz,
+                   void         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL descriptor or LOB locator is returned 
+on success. No diagnostics are available on error.
+This call returns OCI_SUCCESS if successful, or OCI_INVALID_HANDLE if 
+an out-of-memory error occurs. 
+Parameters
+parenth (IN) - an environment handle. 
+descpp (OUT) - returns a descriptor or LOB locator of desired type. 
+type (IN) - specifies the type of descriptor or LOB locator to be allocated. 
+The specific types are:
+OCI_DTYPE_SNAP - specifies generation of snapshot descriptor of C 
+type - OCISnapshot
+OCI_DTYPE_LOB - specifies generation of a LOB data type locator of C 
+type - OCILobLocator
+OCI_DTYPE_RSET - specifies generation of a descriptor of C type 
+OCIResult that references a result set (a number of rows as a result of a 
+query). This descriptor is bound to a bind variable of data type 
+SQLT_RSET (result set). The descriptor has to be converted into a 
+statement handle using a function - OCIResultSetToStmt() - which can 
+then be passed to OCIDefineByPos() and OCIStmtFetch() to retrieve the 
+rows of the result set.
+OCI_DTYPE_ROWID - specifies generation of a ROWID descriptor of C 
+type OCIRowid.
+OCI_DTYPE_COMPLEXOBJECTCOMP - specifies generation of a 
+complex object retrieval descriptor of C type 
+OCIComplexObjectComp.
+xtramemsz (IN) - specifies an amount of user memory to be allocated for use 
+by the application. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIDescFree()
+
+
+
+
+OCIDescFree()
+Name
+OCI Free DESCriptor
+Purpose
+Deallocates a previously allocated descriptor.
+Syntax
+sword OCIDescFree ( void    *descp,
+                  ub4      type);
+Comments
+This call frees up storage associated with the descriptor, corresponding to the
+type specified in type. Returns OCI_SUCCESS or OCI_INVALID_HANDLE. 
+All descriptors must be explicitly deallocated. OCI will not deallocate a 
+descriptor if the environment handle is deallocated.
+Parameters
+descp (IN) - an allocated descriptor. 
+type (IN) - specifies the type of storage to be freed. The specific types are: 
+OCI_DTYPE_SNAP - snapshot descriptor
+OCI_DTYPE_LOB - a LOB data type descriptor
+OCI_DTYPE_RSET - a descriptor that references a result set (a number 
+of rows as a result of a query).
+OCI_DTYPE_ROWID - a ROWID descriptor
+OCI_DTYPE_COMPLEXOBJECTCOMP - a complex object retrieval 
+descriptor
+Related Functions
+OCIDescAlloc()
+
+
+
+OCIDescribeAny()
+Name
+OCI DeSCribe Any
+Purpose
+Describes existing schema objects.
+Syntax
+sword OCIDescribeAny ( OCISvcCtx     *svchp,
+                     OCIError      *errhp,
+                     void         *objptr,
+                     ub4           objnm_len,
+                     ub1           objptr_typ,
+                     ub1           info_level,
+                     ub1           objtype,
+                     OCIDesc       *dschp );
+Comments
+This is a generic describe call that describes existing schema objects: tables,
+views, synonyms, procedures, functions, packages, sequences, and types. As a 
+result of this call, the describe handle is populated with the object-specific 
+attributes which can be obtained through an OCIAttrGet() call.
+An OCIParamGet() on the describe handle returns a parameter descriptor for a 
+specified position. Parameter positions begin with 1. Calling OCIAttrGet() on 
+the parameter descriptor returns the specific attributes of a stored procedure 
+or function parameter or a table column descriptor as the case may be. 
+These subsequent calls do not need an extra round trip to the server because 
+the entire schema object description cached on the client side by 
+OCIDescribeAny(). Calling OCIAttrGet() on the describe handle can also return 
+the total number of positions.
+See the section "Describing" on page 2-33 for more information about describe 
+operations.
+Parameters
+TO BE UPDATED
+svchp (IN/OUT) - a service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+objptr (IN) - the name of the object (a null-terminated string) to be 
+described. Only procedure or function names are valid when connected to an 
+Oracle7 Server.
+objptr_len (IN) - the length of the string. Must be non-zero.
+objptr_typ (IN) - Must be OCI_OTYPE_NAME, OCI_OTYPE_REF, or OCI_OTYPE_PTR.
+info_level (IN) - reserved for future extensions. Pass OCI_DEFAULT.
+objtype (IN/OUT) - object type.
+dschp (IN/OUT) - a describe handle that is populated with describe 
+information about the object after the call.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIEnvCreate()
+Name
+OCI ENVironment CREATE
+Purpose
+This function creates and initializes an environment for the rest of
+the OCI functions to work under.  This call is a replacement for both
+the OCIInitialize and OCIEnvInit calls.
+Syntax
+sword OCIEnvCreate  ( OCIEnv        **envhpp, 
+                      ub4           mode, 
+                      const void   *ctxp, 
+                      const void   *(*malocfp) 
+                                    (void *ctxp, 
+                                        size_t size), 
+                      const void   *(*ralocfp) 
+                                    (void *ctxp, 
+                                       void *memptr, 
+                                       size_t newsize), 
+                      const void    (*mfreefp) 
+                                    ( void *ctxp, 
+                                       void *memptr))
+                      size_t    xtramemsz,
+                      void     **usrmempp );
+ 
+Comments
+This call creates an environment for all the OCI calls using the modes
+specified by the user. This call can be used instead of the two calls
+OCIInitialize and OCIEnvInit. This function returns an environment handle
+which is then used by the remaining OCI functions. There can be multiple
+environments in OCI each with its own environment modes.  This function 
+also performs any process level initialization if required by any mode.
+For example if the user wants to initialize an environment as OCI_THREADED,
+then all libraries that are used by OCI are also initialized in the
+threaded mode. 
+
+This call should be invoked before anny other OCI call and should be used
+instead of the OCIInitialize and OCIEnvInit calls. This is the recommended
+call, although OCIInitialize and OCIEnvInit calls will still be supported
+for backward compatibility. 
+ 
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+
+Example
+
+Related Functions
+OCIInitialize, OCIEnvInit
+
+OCIEnvNlsCreate()
+Name
+OCI ENVironment CREATE with NLS info
+Purpose
+This function does almost everything OCIEnvCreate does, plus enabling setting
+of charset and ncharset programmatically, except OCI_UTF16 mode.
+Syntax
+sword OCIEnvNlsCreate(OCIEnv        **envhpp,
+                      ub4           mode,
+                      void         *ctxp,
+                      void         *(*malocfp)
+                                    (void *ctxp,
+                                        size_t size),
+                      void         *(*ralocfp)
+                                    (void *ctxp,
+                                       void *memptr,
+                                       size_t newsize),
+                      void          (*mfreefp)
+                                    (void *ctxp,
+                                       void *memptr),
+                      size_t        xtramemsz,
+                      void         **usrmempp,
+                      ub2           charset,
+                      ub2           ncharset)
+Comments
+The charset and ncharset must be both zero or non-zero.
+The parameters have the same meaning as the ones in OCIEnvCreate().
+When charset or ncharset is non-zero, the corresponding character set will
+be used to replace the ones specified in NLS_LANG or NLS_NCHAR. Moreover,
+OCI_UTF16ID is allowed to be set as charset and ncharset.
+On the other hand, OCI_UTF16 mode is deprecated with this function. 
+Applications can achieve the same effects by setting 
+both charset and ncharset as OCI_UTF16ID.
+
+
+OCIEnvInit()
+Name
+OCI INITialize environment
+Purpose
+This call initializes the OCI environment handle.
+Syntax
+sword OCIEnvInit ( OCIEnv    **envp,
+                 ub4       mode,
+                 size_t    xtramemsz,
+                 void     **usrmempp );
+Comments
+Initializes the OCI environment handle. No changes are done on an initialized 
+handle. If OCI_ERROR or OCI_SUCCESS_WITH_INFO is returned, the 
+environment handle can be used to obtain ORACLE specific errors and 
+diagnostics.
+This call is processed locally, without a server round-trip.
+Parameters
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of an environment mode. The only valid 
+mode is OCI_DEFAULT for default mode
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+Example
+See the description of OCISessionBegin() on page 13-84 for an example showing 
+the use of OCIEnvInit(). 
+Related Functions
+
+
+
+
+OCIErrorGet()
+Name
+OCI Get Diagnostic Record
+Purpose
+Returns an error message in the buffer provided and an ORACLE error.
+Syntax
+sword OCIErrorGet ( void      *hndlp, 
+                  ub4        recordno,
+                  OraText       *sqlstate,
+                  ub4        *errcodep, 
+                  OraText       *bufp,
+                  ub4        bufsiz,
+                  ub4        type );
+Comments
+Returns an error message in the buffer provided and an ORACLE error. 
+Currently does not support SQL state. This call can be called a multiple 
+number of times if there are more than one diagnostic record for an error.
+The error handle is originally allocated with a call to OCIHandleAlloc().
+Parameters
+hndlp (IN) - the error handle, in most cases, or the environment handle (for 
+errors on OCIEnvInit(), OCIHandleAlloc()).
+recordno (IN) - indicates the status record from which the application seeks 
+info. Starts from 1. 
+sqlstate (OUT) - Not supported in Version 8.0.
+errcodep (OUT) - an ORACLE Error is returned.
+bufp (OUT) - the error message text is returned.
+bufsiz (IN) - the size of the buffer provide to get the error message.
+type (IN) - the type of the handle.
+Related Functions
+OCIHandleAlloc()
+
+OCIExtractInit
+Name
+OCI Extract Initialize 
+Purpose
+This function initializes the parameter manager. 
+Syntax
+sword OCIExtractInit(void *hndl, OCIError *err);
+Comments
+It must be called before calling any other parameter manager routine. The NLS 
+information is stored inside the parameter manager context and used in 
+subsequent calls to OCIExtract routines.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractTerm()
+
+OCIExtractTerm
+Name
+OCI Extract Terminate
+Purpose
+This function releases all dynamically allocated storage and may perform 
+other internal bookkeeping functions.
+Syntax
+sword OCIExtractTerm(void *hndl, OCIError *err);
+Comments
+It must be called when the parameter manager is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractInit()
+
+OCIExtractReset
+Name
+OCI Extract Reset
+Purpose
+The memory currently used for parameter storage, key definition storage, and 
+parameter value lists is freed and the structure is reinitialized.
+Syntax
+sword OCIExtractReset(void *hndl, OCIError *err);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+
+OCIExtractSetNumKeys
+Name
+OCI Extract Set Number of Keys
+Purpose
+Informs the parameter manager of the number of keys that will be registered.
+Syntax
+sword OCIExtractSetNumKeys(void *hndl, OCIError *err, uword numkeys);
+Comments
+This routine must be called prior to the first call of OCIExtractSetKey().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (IN) - The number of keys that will be registered with 
+               OCIExtractSetKey().
+Related Functions
+OCIExtractSetKey()
+
+OCIExtractSetKey
+Name
+OCI Extract Set Key definition
+Purpose
+Registers information about a key with the parameter manager.
+Syntax
+sword OCIExtractSetKey(void *hndl, OCIError *err, const OraText *name, 
+                       ub1 type, ub4 flag, const void *defval,
+                       const sb4 *intrange, const OraText *const *strlist);
+Comments
+This routine must be called after calling OCIExtractSetKey() and before 
+calling OCIExtractFromFile() or OCIExtractFromStr().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (IN) - The name of the key.
+type (IN) - The type of the key (OCI_EXTRACT_TYPE_INTEGER, 
+            OCI_EXTRACT_TYPE_OCINUM, OCI_EXTRACT_TYPE_STRING, or 
+            OCI_EXTRACT_TYPE_BOOLEAN).
+flag (IN) - Set to OCI_EXTRACT_MULTIPLE if the key can take multiple values 
+            or 0 otherwise.
+defval (IN) - Set to the default value for the key.  May be NULL if there is 
+               no default.  A string default must be a (text*) type, an 
+               integer default must be an (sb4*) type, and a boolean default 
+               must be a (ub1*) type.
+intrange (IN) - Starting and ending values for the allowable range of integer 
+                values.  May be NULL if the key is not an integer type or if 
+                all integer values are acceptable.
+strlist (IN) - List of all acceptable text strings for the key.  May be NULL 
+               if the key is not a string type or if all text values are 
+               acceptable.
+Related Functions
+OCIExtractSetNumKeys()
+
+OCIExtractFromFile
+Name
+OCI Extract parameters From File
+Purpose
+The keys and their values in the given file are processed. 
+Syntax
+sword OCIExtractFromFile(void *hndl, OCIError *err, ub4 flag, 
+                         OraText *filename);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+filename (IN) - Null-terminated filename string.
+Related Functions
+
+OCIExtractFromStr
+Name
+OCI Extract parameters From String
+Purpose
+The keys and their values in the given string are processed. 
+Syntax
+sword OCIExtractFromStr(void *hndl, OCIError *err, ub4 flag, OraText *input);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+input (IN) - Null-terminated input string.
+Related Functions
+
+OCIExtractToInt
+Name
+OCI Extract To Integer
+Purpose
+Gets the integer value for the specified key.
+Syntax
+sword OCIExtractToInt(void *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, sb4 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual integer value.
+Related Functions
+
+OCIExtractToBool
+Name
+OCI Extract To Boolean
+Purpose
+Gets the boolean value for the specified key. 
+Syntax
+sword OCIExtractToBool(void *hndl, OCIError *err, OraText *keyname, 
+                       uword valno, ub1 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual boolean value.
+Related Functions
+
+OCIExtractToStr
+Name
+OCI Extract To String
+Purpose
+Gets the string value for the specified key.
+Syntax
+sword OCIExtractToStr(void *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, OraText *retval, uword buflen);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual null-terminated string value.
+buflen (IN) - The length of the buffer for retval.
+Related Functions
+
+Note: The following OCIExtract functions are unavailable in this release
+
+OCIExtractToOCINum
+Name
+OCI Extract To OCI Number
+Purpose
+Gets the OCINumber value for the specified key.
+Syntax
+sword OCIExtractToOCINum(void *hndl, OCIError *err, OraText *keyname, 
+                         uword valno, OCINumber *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual OCINumber value.
+Related Functions
+
+OCIExtractToList
+Name
+OCI Extract To parameter List
+Purpose
+Generates a list of parameters from the parameter structures that are stored 
+in memory. 
+Syntax
+sword OCIExtractToList(void *hndl, OCIError *err, uword *numkeys);
+Comments
+Must be called before OCIExtractValues() is called.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (OUT) - Number of distinct keys stored in memory.
+Related Functions
+OCIExtractFromList()
+
+OCIExtractFromList
+Name
+OCI Extract From parameter List
+Purpose
+Generates a list of values for the a parameter in the parameter list.
+Syntax
+sword OCIExtractFromList(void *hndl, OCIError *err, uword index, 
+                         OraText *name, ub1 *type, uword *numvals, 
+                         void ***values);
+Comments
+Parameters are specified by an index. OCIExtractToList() must be called prior 
+to calling this routine to generate the parameter list from the parameter 
+structures that are stored in memory. 
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (OUT) - Name of the key for the current parameter.
+type (OUT) - Type of the current parameter (OCI_EXTRACT_TYPE_STRING, 
+             OCI_EXTRACT_TYPE_INTEGER, OCI_EXTRACT_TYPE_OCINUM, or 
+             OCI_EXTRACT_TYPE_BOOLEAN)
+numvals (OUT) - Number of values for this parameter.
+values (OUT) - The values for this parameter.
+Related Functions
+OCIExtractToList()
+
+
+************************  OCIFileClose() ***********************************
+ 
+Name
+ OCIFileClose - Oracle Call Interface FILE i/o CLOSE
+
+Purpose
+ Close a previously opened file.
+
+Syntax
+ sword OCIFileClose ( void             *hndl, 
+                      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ This function will close a previously opened file. If the function succeeds
+ then OCI_SUCCESS will be returned, else OCI_ERROR. 
+ 
+Parameters
+ hndl  (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen.  
+
+
+
+********************* OCIFileExists() **************************************
+
+Name
+ OCIFileExists - Oracle Call Interface FILE i/o EXIST
+
+Purpose
+ Check to see if the file exists.
+
+Syntax
+ sword OCIFileExists ( void           *hndl, 
+                      OCIError         *err, 
+                      OraText          *filename,
+                      OraText          *path,
+                      ub1              *flag )
+
+Comments
+ This function will set the flag to TRUE if the file exists else it will
+ be set to FALSE.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR. 
+
+Parameters
+ hndl(IN) - OCI environment or session handle
+ err(OUT) - OCI error handle
+ filename(IN) - filename
+ path(IN) - path of the file
+ flag(OUT) - whether the file exists or not
+
+Related Functions.
+ None.
+     
+
+ **************************** OCIFileFlush() ******************************
+
+
+Name
+ OCIFileFlush - Oracle Call Interface File i/o FLUSH
+
+Purpose
+ Flush the buffers associated with the file to the disk.
+
+Syntax
+ sword OCIFileFlush ( void             *hndl, 
+                      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters 
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen, OCIFileWrite
+
+
+
+ *************************** OCIFileGetLength() ****************************
+
+Name
+ OCIFileGetLength - Oracle Call Interface FILE i/o GET file LENGTH
+
+Purpose
+ Get the length of a file.
+
+Syntax
+ OCIFileGetLength(void           *hndl, 
+                  OCIError        *err,
+                  OraText         *filename,
+                  OraText         *path,
+                  ubig_ora        *lenp )
+
+Comments
+ The length of the file will be returned in lenp.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filename (IN) - file name.
+ path (IN) - path of the file.
+ lenp (OUT) - On output, it is the length of the file in bytes.
+ is the number of bytes in the file.
+
+Related Functions
+ None.
+
+
+
+******************************** OCIFileInit() *****************************
+   
+Name
+ OCIFileInit - Oracle Call Interface FILE i/o INITialize
+
+Purpose
+ Initialize the OCI File I/O package and create the OCIFile context.
+
+Syntax
+ sword OCIFileInit ( void *hndl, 
+                     OCIError *err)
+
+Comments
+ This function should be called before any of the OCIFile functions are
+ used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileTerm
+     
+
+
+********************************* OCIFileOpen() *****************************
+
+Name
+ OCIFileOpen - Oracle Call Interface File i/o OPEN
+
+Purpose
+     Open a file.
+
+Syntax
+ sword OCIFileOpen ( void               *hndl, 
+                     OCIError            *err,
+                     OCIFileObject      **filep,
+                     OraText             *filename,
+                     OraText             *path,
+                     ub4                  mode,
+                     ub4                  create, 
+                     ub4                  type )
+
+Comments
+ OCIFileOpen returns a handle to the open file in filep if the file is
+ successfully opened. 
+ If one wants to use the standard file objects (stdin, stdout & stderr)
+ then OCIFileOpen whould be called with the type filed containing the 
+ appropriate type (see the parameter type). If any of the standard files 
+ are specified then filename, path, mode and create are ignored.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (OUT) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (OUT) - the file object to be returned.
+ filename (IN) - file name (NULL terminated string).
+ path (IN) - path of the file (NULL terminated string).
+ mode - mode in which to open the file (valid modes are OCI_FILE_READONLY,
+ OCI_FILE_WRITEONLY, OCI_FILE_READ_WRITE).
+ create - should the file be created if it does not exist. Valid values
+ are: 
+     OCI_FILE_TRUNCATE - create a file regardless of whether or not it exists. 
+                        If the file already exists overwrite it.
+     OCI_FILE_EXIST - open it if it exists, else fail.
+     OCI_FILE_EXCL - fail if the file exists, else create.
+     OCI_FILE_CREATE - open the file if it exists, and create it if it doesn't.
+     OCI_FILE_APPEND - set the file pointer to the end of the file prior to 
+                      writing(this flag can be OR'ed with OCI_FILE_EXIST or
+                      OCI_FILE_CREATE).
+type - file type. Valid values are OCI_FILE_TEXT, OCI_FILE_BIN, 
+       OCI_FILE_STDIN, OCI_FILE_STDOUT and OCI_FILE_STDERR.
+       If any of the standard files are specified then filename, path, mode
+       and create are ignored.
+
+Related Functions.
+ OCIFileClose
+
+
+
+************************** OCIFileRead() ************************************
+   
+Name
+ OCIFileRead - Oracle Call Interface FILE i/o READ
+
+Purpose
+ Read from a file into a buffer.
+
+Syntax
+ sword OCIFileRead ( void            *hndl, 
+                     OCIError         *err,
+                     OCIFileObject    *filep,
+                     void            *bufp,
+                     ub4               bufl,
+                     ub4              *bytesread )
+
+Comments
+ Upto bufl bytes from the file will be read into bufp. The user should
+ allocate memory for the buffer.
+ The number of bytes read would be in bytesread.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a File Object that uniquely references the file.
+ bufp (IN) - the pointer to a buffer into which the data will be read. The 
+ length of the allocated memory is assumed to be bufl. 
+ bufl - the length of the buffer in bytes. 
+ bytesread (OUT) - the number of bytes read.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileWrite
+
+
+
+****************************** OCIFileSeek() ******************************
+
+Name
+ OCIFileSeek - Oracle Call Interface FILE i/o SEEK
+
+Purpose
+ Perfom a seek to a byte position.
+
+Syntax
+ sword OCIFileSeek ( void           *hndl, 
+                     OCIError        *err,  
+                     OCIFileObject   *filep,
+                     uword            origin,
+                     ubig_ora         offset,
+                     sb1              dir)
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ origin - The starting point we want to seek from. NOTE: The starting 
+ point may be OCI_FILE_SEEK_BEGINNING (beginning), OCI_FILE_SEEK_CURRENT 
+ (current position), or OCI_FILE_SEEK_END (end of file). 
+ offset - The number of bytes from the origin we want to start reading from. 
+ dir - The direction we want to go from the origin. NOTE: The direction 
+ can be either OCI_FILE_FORWARD or OCI_FILE_BACKWARD. 
+ 
+Related Function
+ OCIFileOpen, OCIFileRead, OCIFileWrite
+
+
+
+*************************** OCIFileTerm() **********************************
+
+Name
+ OCIFileTerm - Oracle Call Interface FILE i/o TERMinate
+
+Purpose
+ Terminate the OCI File I/O package and destroy the OCI File context.
+
+Syntax
+ sword OCIFileTerm ( void *hndl, 
+                     OCIError *err )
+
+Comments
+ After this function has been called no OCIFile function should be used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure. 
+  
+Related Functions 
+ OCIFileInit   
+ 
+
+********************************* OCIFileWrite() **************************** 
+
+Name 
+ OCIFileWrite - Oracle Call Interface FILE i/o WRITE
+
+Purpose
+  Write data from buffer into a file.
+
+Syntax
+ sword OCIFileWrite ( void            *hndl, 
+                      OCIError         *err,  
+                      OCIFileObject    *filep,
+                      void            *bufp, 
+                      ub4               buflen
+                      ub4              *byteswritten )
+
+Comments
+ The number of bytes written will be in *byteswritten.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ bufp (IN) - the pointer to a buffer from which the data will be written. 
+ The length of the allocated memory is assumed to be the value passed
+ in bufl. 
+ bufl - the length of the buffer in bytes.
+ byteswritten (OUT) - the number of bytes written.
+ 
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileRead 
+
+
+
+
+
+OCIHandleAlloc() 
+Name
+OCI Get HaNDLe
+Purpose
+This call returns a pointer to an allocated and initialized handle.
+Syntax
+sword OCIHandleAlloc ( const void   *parenth,
+                     void         **hndlpp, 
+                     ub4           type, 
+                     size_t        xtramem_sz,
+                     void         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL handle is returned on success. Bind 
+handle and define handles are allocated with respect to a statement handle. All
+other handles are allocated with respect to an environment handle which is 
+passed in as a parent handle.
+No diagnostics are available on error. This call returns OCI_SUCCESS if 
+successful, or OCI_INVALID_HANDLE if an out-of-memory error occurs.
+Handles must be allocated using OCIHandleAlloc() before they can be passed 
+into an OCI call.
+Parameters
+parenth (IN) - an environment or a statement handle. 
+hndlpp (OUT) - returns a handle to a handle type. 
+type (IN) - specifies the type of handle to be allocated. The specific types 
+are: 
+OCI_HTYPE_ERROR - specifies generation of an error report handle of 
+C type OCIError
+OCI_HTYPE_SVCCTX - specifies generation of a service context handle 
+of C type OCISvcCtx
+OCI_HTYPE_STMT - specifies generation of a statement (application 
+request) handle of C type OCIStmt
+OCI_HTYPE_BIND - specifies generation of a bind information handle 
+of C type OCIBind
+OCI_HTYPE_DEFINE - specifies generation of a column definition 
+handle of C type OCIDefine
+OCI_HTYPE_DESCRIBE  - specifies generation of a select list 
+description handle of C type OCIDesc
+OCI_HTYPE_SERVER - specifies generation of a server context handle 
+of C type OCIServer
+OCI_HTYPE_SESSION - specifies generation of an authentication 
+context handle of C type OCISession
+OCI_HTYPE_TRANS - specifies generation of a transaction context
+handle of C type OCITrans
+OCI_HTYPE_COMPLEXOBJECT - specifies generation of a complex 
+object retrieval handle of C type OCIComplexObject
+OCI_HTYPE_SECURITY - specifies generation of a security handle of C 
+type OCISecurity
+xtramem_sz (IN) - specifies an amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIHandleFree()
+
+
+
+OCIHandleFree()
+Name
+OCI Free HaNDLe
+Purpose
+This call explicitly deallocates a handle.
+Syntax
+sword OCIHandleFree ( void     *hndlp,
+                    ub4       type);
+Comments
+This call frees up storage associated with a handle, corresponding to the type 
+specified in the type parameter.
+This call returns either OCI_SUCCESS or OCI_INVALID_HANDLE.
+All handles must be explicitly deallocated. OCI will not deallocate a child 
+handle if the parent is deallocated.
+Parameters
+hndlp (IN) - an opaque pointer to some storage.
+type (IN) - specifies the type of storage to be allocated. The specific types 
+are:
+OCI_HTYPE_ENV - an environment handle
+OCI_HTYPE_ERROR - an error report handle
+OCI_HTYPE_SVCCTX - a service context handle
+OCI_HTYPE_STMT - a statement (application request) handle
+OCI_HTYPE_BIND - a bind information handle
+OCI_HTYPE_DEFINE - a column definition handle
+OCI_HTYPE_DESCRIBE  - a select list description handle
+OCI_HTYPE_SERVER - a server handle
+OCI_HTYPE_SESSION - a user authentication handle
+OCI_HTYPE_TRANS - a transaction handle
+OCI_HTYPE_COMPLEXOBJECT - a complex object retrieval handle
+OCI_HTYPE_SECURITY - a security handle
+Related Functions
+OCIHandleAlloc()
+
+
+
+
+OCIInitialize()
+Name
+OCI Process Initialize
+Purpose
+Initializes the OCI process environment.
+Syntax
+sword OCIInitialize ( ub4           mode,
+                    const void   *ctxp, 
+                    const void   *(*malocfp) 
+                                  ( void *ctxp,
+                                    size_t size ),
+                    const void   *(*ralocfp)
+                                  ( void *ctxp,
+                                    void *memp,
+                                    size_t newsize ),
+                    const void    (*mfreefp)
+                                  ( void *ctxp,
+                                    void *memptr ));
+Comments
+This call initializes the OCI process environment.
+OCIInitialize() must be invoked before any other OCI call. 
+Parameters
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIInitialize().
+Related Functions
+
+-------------------------------OCITerminate------------------------------------
+
+OCITerminate()
+Name
+OCI process Terminate
+Purpose
+Do cleanup before process termination
+Syntax
+sword OCITerminate (ub4 mode);
+
+Comments
+This call performs  OCI related clean up before the OCI process terminates.
+If the process is running in shared mode then the OCI process is disconnected
+from the shared memory subsystem.
+
+OCITerminate() should be the last OCI call in any process.
+
+Parameters
+mode (IN) - specifies different termination modes.
+
+OCI_DEFAULT - default mode.
+
+Example
+
+Related Functions
+OCIInitialize()
+
+------------------------ OCIAppCtxSet--------------------------------------
+Name
+OCI Application context Set
+Purpose
+Set an attribute and its value for a particular application context 
+     namespace
+Syntax
+ (sword) OCIAppCtxSet((void *) sesshndl, (void *)nsptr,(ub4) nsptrlen,
+                     (void *)attrptr, (ub4) attrptrlen, (void *)valueptr,
+                     (ub4) valueptrlen,  errhp, (ub4)mode);
+
+Comments
+Please note that the information set on the session handle is sent to the
+server during the next OCIStatementExecute or OCISessionBegin.
+
+This information is cleared from the session handle, once the information 
+ has been sent over to the server,and should be setup again if needed.
+
+Parameters
+ sesshndl   (IN/OUT) - Pointer to a session handle
+ nsptr      (IN)     - Pointer to namespace string
+ nsptrlen   (IN)     - length of the nsptr
+ attrptr    (IN)     - Pointer to attribute string
+ attrptrlen (IN)     - length of the attrptr
+ valueptr   (IN)     - Pointer to value string
+ valueptrlen(IN)     - length of the valueptr
+ errhp      (OUT)    - Error from the API
+ mode       (IN)     - mode of operation (OCI_DEFAULT)
+
+Returns
+ error if any 
+Example
+
+Related Functions
+   OCIAppCtxClearAll
+
+
+------------------------ OCIAppCtxClearAll---------------------------------
+Name
+ OCI Application Context Clear all attributes in a namespace
+Purpose
+ To clear the  values all attributes in a namespace
+Syntax
+ (sword) OCIAppCtxClearAll((void *) sesshndl, (void *)nsptr, (ub4) nsptrlen,
+              (OCIError *)errhp, (ub4)mode);
+
+Comments
+This will clean up the context information on the server side during the
+next piggy-back to the server.
+
+Parameters
+ sesshndl (IN/OUT) - Pointer to a session handle
+ nsptr    (IN)     - Pointer to namespace string where the values of all
+                     attributes are cleared
+ nsptrlen (IN)     - length of the nsptr
+ errhp    (OUT)    - Error from the API 
+ mode     (IN)     - mode of operation (OCI_DEFAULT)
+Example
+
+Returns
+ error if any
+
+Related Functions
+ OCIAppCtxSet
+---------------------- OCIIntervalAssign --------------------------------- 
+sword OCIIntervalAssign(void *hndl, OCIError *err, 
+                    const OCIInterval *inpinter, OCIInterval *outinter );
+
+  DESCRIPTION
+    Copies one interval to another to create a replica
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpinter - Input Interval 
+    (OUT) outinter - Output Interval 
+  RETURNS
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_SUCCESS otherwise
+
+ ---------------------- OCIIntervalCheck ------------------------------------ 
+sword OCIIntervalCheck(void *hndl, OCIError *err, const OCIInterval *interval,
+                         ub4 *valid );
+
+  DESCRIPTION
+    Checks the validity of an interval
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  interval - Interval to be checked 
+    (OUT) valid     - Zero if the interval is valid, else returns an Ored
+        combination of the following codes.
+
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_INTER_INVALID_DAY         0x1           Bad day
+   OCI_INTER_DAY_BELOW_VALID     0x2           Bad DAy Low/high bit (1=low)
+   OCI_INTER_INVALID_MONTH       0x4           Bad MOnth
+   OCI_INTER_MONTH_BELOW_VALID   0x8           Bad MOnth Low/high bit (1=low)
+   OCI_INTER_INVALID_YEAR        0x10          Bad YeaR
+   OCI_INTER_YEAR_BELOW_VALID    0x20          Bad YeaR Low/high bit (1=low)
+   OCI_INTER_INVALID_HOUR        0x40          Bad HouR
+   OCI_INTER_HOUR_BELOW_VALID    0x80          Bad HouR Low/high bit (1=low)
+   OCI_INTER_INVALID_MINUTE      0x100         Bad MiNute
+   OCI_INTER_MINUTE_BELOW_VALID  0x200         Bad MiNute Low/high bit(1=low)
+   OCI_INTER_INVALID_SECOND      0x400         Bad SeCond
+   OCI_INTER_SECOND_BELOW_VALID  0x800         bad second Low/high bit(1=low)
+   OCI_INTER_INVALID_FRACSEC     0x1000        Bad Fractional second
+   OCI_INTER_FRACSEC_BELOW_VALID 0x2000        Bad fractional second Low/High
+
+        
+  RETURNS
+    OCI_SUCCESS if interval is okay
+    OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalCompare ----------------------------------- 
+sword OCIIntervalCompare(void *hndl, OCIError *err, OCIInterval *inter1, 
+                        OCIInterval *inter2, sword *result );
+
+  DESCRIPTION
+        Compares two intervals, returns 0 if equal, -1 if inter1 < inter2, 
+        1 if inter1 > inter2
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     inter1  (IN)   - Interval to be compared 
+     inter2  (IN)   - Interval to be compared 
+     result  (OUT)  -   comparison result, 0 if equal, -1 if inter1 < inter2, 
+                        1 if inter1 > inter2
+
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if 
+        the two input datetimes are not mutually comparable.
+
+---------------------- OCIIntervalDivide ------------------------------------ 
+sword OCIIntervalDivide(void *hndl, OCIError *err, OCIInterval *dividend, 
+                OCINumber *divisor, OCIInterval *result );
+ 
+  DESCRIPTION
+     Divides an interval by an Oracle Number to produce an interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     dividend  (IN)   - Interval to be divided 
+     divisor   (IN)   - Oracle Number dividing `dividend' 
+     result    (OUT)  - resulting interval (dividend / divisor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalFromNumber -------------------- 
+sword OCIIntervalFromNumber(void *hndl, OCIError *err, 
+               OCIInterval *inter, OCINumber *number);
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (OUT)  interval - Interval to be converted 
+    (IN) number - Oracle number result  (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_SUCCESS on success 
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR on error.
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+ ---------------------- OCIIntervalFromText --------------------------------- 
+sword OCIIntervalFromText( void *hndl, OCIError *err, const OraText *inpstr, 
+                size_t str_len, OCIInterval *result );
+
+  DESCRIPTION
+    Given an interval string produce the interval represented by the string.
+    The type of the interval is the type of the 'result' descriptor.
+  PARAMETERS
+
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpstr - Input string 
+    (IN)  str_len - Length of input string 
+    (OUT) result - Resultant interval 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR if
+        there are too many fields in the literal string
+        the year is out of range (-4713 to 9999)
+        if the month is out of range (1 to 12)
+        if the day of month is out of range (1 to 28...31)
+        if hour is not in range (0 to 23)
+        if hour is not in range (0 to 11)
+        if minute is not in range (0 to 59)
+        if seconds in minute not in range (0 to 59)
+        if seconds in day not in range (0 to 86399)
+        if the interval is invalid
+
+
+ ---------------------- OCIIntervalGetDaySecond -------------------- 
+
+  DESCRIPTION
+     Gets values of day second interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (OUT) - number of days
+        hour    (OUT) - number of hours
+        min     (OUT) - number of mins
+        sec     (OUT) - number of secs
+        fsec    (OUT) - number of fractional seconds
+        result     (IN)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalGetYearMonth -------------------- 
+
+  DESCRIPTION
+     Gets year month from an interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        year    (OUT)   - year value
+        month   (OUT)   - month value
+        result     (IN)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+
+-------------------------- OCIIntervalAdd ------------------------------
+sword OCIIntervalAdd(void *hndl, OCIError *err, OCIInterval *addend1, 
+                        OCIInterval *addend2, OCIInterval *result );
+NAME OCIIntervalAdd - Adds two intervals 
+PARAMETERS
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+addend1  (IN)   - Interval to be added 
+addend2  (IN)   - Interval to be added 
+result   (OUT)  - resulting interval (addend1 + addend2) 
+DESCRIPTION
+     Adds two intervals to produce a resulting interval
+RETURNS
+     OCI_SUCCESS on success
+     OCI_ERROR if:
+        the two input intervals are not mutually comparable.
+        the resulting year would go above SB4MAXVAL
+        the resulting year would go below SB4MINVAL
+     OCI_INVALID_HANDLE if 'err' is NULL.
+NOTES
+     The two input intervals must be mutually comparable
+
+ ---------------------- OCIIntervalSubtract ------------------------------- 
+sword OCIIntervalSubtract(void *hndl, OCIError *err, OCIInterval *minuend, 
+                            OCIInterval *subtrahend, OCIInterval *result );
+NAME - OCIIntervalSubtract - subtracts two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+minuend    (IN)   - interval to be subtracted from 
+subtrahend (IN)   - interval subtracted from minuend 
+result     (OUT)  - resulting interval (minuend - subtrahend) 
+DESCRIPTION
+     Subtracts two intervals and stores the result in an interval
+RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if:
+           the two input intervals are not mutually comparable.
+           the resulting leading field would go below SB4MINVAL 
+           the resulting leading field would go above SB4MAXVAL
+
+---------------------- OCIIntervalMultiply --------------------------------- 
+sword OCIIntervalMultiply(void *hndl, OCIError *err, const OCIInterval *inter,
+                        OCINumber *nfactor, OCIInterval *result );
+
+  DESCRIPTION
+     Multiplies an interval by an Oracle Number to produce an interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     inter  (IN)   - Interval to be multiplied 
+     nfactor  (IN)   - Oracle Number to be multiplied 
+     result   (OUT)  - resulting interval (ifactor * nfactor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if:
+        the resulting year would go above SB4MAXVAL
+        the resulting year would go below SB4MINVAL
+
+
+ ---------------------- OCIIntervalSetDaySecond -------------------- 
+
+  DESCRIPTION
+     Sets day second interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (IN) - number of days
+        hour    (IN) - number of hours
+        min     (IN) - number of mins
+        sec     (IN) - number of secs
+        fsec    (IN) - number of fractional seconds
+        result     (OUT)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalSetYearMonth -------------------- 
+
+  DESCRIPTION
+     Sets year month interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        year    (IN)   - year value
+        month   (IN)   - month value
+        result     (OUT)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+----------------------- OCIIntervalToNumber ---------------------------------
+sword OCIIntervalToNumber(void *hndl, OCIError *err, const OCIInterval *inter,
+                          OCINumber *number);
+
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inter - Interval to be converted 
+    (OUT) number - Oracle number result  (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_SUCCESS on success 
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+------------------------------- OCIIntervalToText -------------------------
+sword OCIIntervalToText( void *hndl, OCIError *err, const OCIInterval *inter,
+                        ub1 lfprec, ub1 fsprec, OraText *buffer, 
+                        size_t buflen, size_t *resultlen );
+
+  DESCRIPTION
+    Given an interval, produces a string representing the interval.
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inter - Interval to be converted 
+    (IN)  lfprec  - Leading field precision. Number of digits used to
+                represent the leading field.
+    (IN)  fsprec  - Fractional second precision of the interval. Number of
+                digits used to represent the fractional seconds.
+    (OUT) buffer - buffer to hold result 
+    (IN)  buflen - length of above buffer 
+    (OUT) resultlen - length of result placed into buffer 
+ 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR 
+        if the buffer is not large enough to hold the result
+  NOTES
+    The interval literal will be output as `year' or `[year-]month' for
+    YEAR-MONTH intervals and as `seconds' or `minutes[:seconds]' or
+    `hours[:minutes[:seconds]]' or `days[ hours[:minutes[:seconds]]]' for
+    DAY-TIME intervals (where optional fields are surrounded by brackets).
+
+ ---------------------- OCIIntervalFromTZ -------------------- 
+sword OCIIntervalFromTZ(void *hndl, OCIError *err, const oratext *inpstring,
+                        size_t str_len, OCIInterval *result);
+
+  DESCRIPTION
+    Retuns an OCI_DTYPE_INTERVAL_DS OCIInterval with the region id (if
+    the region is specified in the input string) set and the current
+    absolute offset or an absolut offset with the region id set to 0.
+  PARAMETERS
+    hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    inpstring (IN) - pointer to the input string
+    str_len (IN) - inpstring length
+    result - Output Interval 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR on error
+        Bad interval type
+        Timezone errors
+  NOTES
+     The input string must be of the form [+/-]TZH:TZM or 'TZR [TZD]'
+
+ ----------------------- OCIKerbAttrSet ---------------------
+sword OCIKerbAttrSet(OCISession *trgthndlp, ub4 auth_mode, 
+                     ub1 *ftgt_ticket, ub4 ftgt_ticket_len, 
+                     ub1 *ftgt_sesskey, ub4 ftgt_sesskey_len, 
+                     ub2 ftgt_keytype, ub4 ftgt_ticket_flags, 
+                     sb4 ftgt_auth_time, sb4 ftgt_start_time, 
+                     sb4 ftgt_end_time, sb4 ftgt_renew_time, 
+                     oratext *ftgt_principal, ub4 ftgt_principal_len,
+                     oratext *ftgt_realm, ub4 ftgt_realm_len, 
+                     OCIError *errhp);
+
+  DESCRIPTION
+    This call sets the attributes required for Kerberos authentication
+    on the user handle.
+
+  PARAMETERS
+    trgthndlp (IN) - The pointer to a user handle.
+    auth_mode (IN) - Indicates what type of Kerberos credentials should
+                    be set. Options are:
+
+                    OCI_KERBCRED_PROXY 
+                                       - Set Kerberos credentials for use with
+                                          proxy authentication.
+                    OCI_KERBCRED_CLIENT_IDENTIFIER 
+                                         - Set Kerberos credentials for use
+                                           with secure client identifier.
+
+    ftgt_ticket (IN) - Forwardable Ticket Granting Ticket (FTGT).
+    ftgt_ticket_len (IN) - Length of FTGT.
+    ftgt_sesskey(IN) - Session Key associated with FTGT.
+    ftgt_sesskey_len (IN) - Length of session key.
+    ftgt_keytype (IN) -  Type of encryption key used to encrypt FTGT.
+    ftgt_ticket_flags (IN) - Flags associated with  encryption of FTGT.
+    ftgt_auth_time (IN) - Authentication time compatible with that in FTGT.
+    ftgt_start_time (IN) - Start time compatible with that indicated in FTGT.
+    ftgt_end_time (IN) - End time compatible with that indicated in FTGT.
+    ftgt_renew_time (IN) - Renew time compatible with that indicated in FTGT.
+    ftgt_principal (IN) - Client principal name from FTGT.
+    ftgt_principal_len (IN) - Length of client principal name.
+    ftgt_realm (IN) - Client realm name from FTGT.
+    ftgt_realm_len (IN) - Client realm name length.
+    errhp (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_ERROR on error
+  NOTES
+
+OCILdaToSvcCtx()
+Name
+OCI toggle version 7 Lda_Def to SerVice context handle
+Purpose
+Converts a V7 Lda_Def to a V8 service context handle.
+Syntax
+sword OCILdaToSvcCtx ( OCISvcCtx  **svchpp,
+                     OCIError   *errhp,
+                     Lda_Def    *ldap );
+Comments
+Converts a V7 Lda_Def to a V8 service context handle. The action of this call 
+can be reversed by passing the resulting service context handle to the 
+OCISvcCtxToLda() function.
+Parameters
+svchpp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+ldap (IN/OUT) - the V7 logon data area returned by OCISvcCtxToLda() from 
+this service context.
+Related Functions
+OCISvcCtxToLda()
+
+
+
+
+OCILobAppend()
+
+Name
+OCI Lob APpend
+
+Purpose
+Appends a LOB value at the end of another LOB. 
+
+Syntax
+sword OCILobAppend ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp );
+Comments
+Appends a LOB value at the end of LOB. The data is 
+copied from the source to the destination at the end of the destination. The 
+source and the destination must already exist. The destination LOB is 
+extended to accommodate the newly written data.
+
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+
+Related Functions
+OCILobTrim()
+OCIErrorGet()
+OCILobWrite()
+OCILobCopy()
+
+
+
+OCILobAssign()
+
+Name
+OCI Lob ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobAssign ( OCIEnv                *envhp, 
+                     OCIError              *errhp, 
+                     const OCILobLocator   *src_locp, 
+                     OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For 
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note: The only difference between this and OCILobLocatorAssign is that this
+takes an environment handle whereas OCILobLocatorAssign takes an OCI service
+handle
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobLocatorAssign()
+
+
+OCILobCharSetForm()
+
+Name
+OCI Lob Get Character Set Form
+
+Purpose
+Gets the LOB locator's character set fpr,, if any.
+
+Syntax
+sword OCILobCharSetForm ( OCIEnv                    *envhp, 
+                          OCIError                  *errhp, 
+                          const OCILobLocator       *locp, 
+                          ub1                       *csfrm );
+
+Comments
+Returns the character set form of the input LOB locator in the csfrm output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set form.
+csfrm(OUT) - character set form of the input LOB locator.  If the input 
+locator is for a BLOB or a BFILE, csfrm is set to 0 since there is no concept 
+of a character set for binary LOBs/FILEs.  The caller must allocate space for 
+the csfrm (ub1) and not write into the space.
+See also
+OCIErrorGet(), OCILobCharSetId(), OCILobLocatorIsInit
+
+
+
+OCILobCharSetId()
+
+Name
+OCI Lob get Character Set IDentifier
+
+Purpose
+Gets the LOB locator's character set ID, if any.
+
+Syntax
+sword OCILobCharSetId ( OCIEnv                    *envhp, 
+                        OCIError                  *errhp, 
+                        const OCILobLocator       *locp, 
+                        ub2                       *csid );
+
+Comments
+Returns the character set ID of the input LOB locator in the cid output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set ID.
+csid (OUT) - character set ID of the input LOB locator.  If the input locator 
+is for a BLOB or a BFILE, csid is set to 0 since there is no concept of a 
+character set for binary LOBs/FILEs.  The caller must allocate space for the 
+character set id of type ub2 and not write into the space.
+
+See also
+OCIErrorGet(), OCILobCharSetForm(), OCILobLocatorIsInit()
+
+
+
+OCILobCopy()
+
+Name
+OCI Lob Copy
+
+Purpose
+Copies a portion of a LOB value into another LOB value.
+
+Syntax
+sword OCILobCopy ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp,
+                   ub4              amount,
+                   ub4              dst_offset,
+                   ub4              src_offset );
+
+Comments
+Copies a portion of a LOB value into another LOB as specified. The data 
+is copied from the source to the destination. The source (src_locp) and the 
+destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+amount (IN) - the number of character or bytes, as appropriate, to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB, for binary LOBs it is the number of bytes. Starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim()
+
+OCILobCreateTemporary()
+
+Name
+OCI Lob Create Temporary
+
+Purpose
+Create a Temporary Lob
+
+Syntax
+sword OCILobCreateTemporary(OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration);
+
+
+Comments
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator which points to the temporary Lob
+csid (IN) - the character set id
+csfrm(IN) - the character set form
+lobtype (IN) - the lob type - one of the three constants OCI_TEMP_BLOB, 
+               OCI_TEMP_CLOB and OCI_TEMP_NCLOB
+cache(IN)-  TRUE if the temporary LOB goes through the cache; FALSE, if not.
+duration(IN)- duration of the temporary LOB; Can be a valid duration id or one 
+              of the values: OCI_DURATION_SESSION, OCI_DURATION_CALL
+              Note: OCI_DURATION_TRANSACTION is NOT supported in 8.1
+Related functions
+OCILobFreeTemporary()
+OCILobIsTemporary()
+
+OCILobDisableBuffering()
+
+Name
+OCI Lob Disable Buffering
+
+Purpose
+Disable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobDisableBuffering ( OCISvcCtx      *svchp,
+                               OCIError       *errhp,
+                               OCILobLocator  *locp);
+
+Comments
+
+Disable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is *not* used.  Note that this call does *not*
+implicitly flush the changes made in the buffering subsystem.  The 
+user must explicitly call OCILobFlushBuffer() to do this.
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobEnableBuffering()
+OCIErrorGet()
+OCILobFlushBuffer()
+
+
+
+
+OCILobEnableBuffering()
+
+Name
+OCI Lob Enable Buffering
+
+Purpose
+Enable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobEnableBuffering ( OCISvcCtx      *svchp,
+                              OCIError       *errhp,
+                              OCILobLocator  *locp);
+
+Comments
+
+Enable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is used.  
+
+Once lob buffering is enabled for a locator, if that locator is passed to 
+one of the following routines, an error is returned:
+        OCILobCopy, OCILobAppend, OCILobErase, OCILobGetLength, OCILobTrim
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+OCILobFlushBuffer()
+
+
+
+
+OCILobErase()
+
+Name
+OCI Lob ERase
+
+Purpose
+Erases a specified portion of the LOB data starting at a specified offset.
+
+Syntax
+sword OCILobErase ( OCISvcCtx       *svchp,
+                  OCIError        *errhp,
+                  OCILobLocator   *locp,
+                  ub4             *amount,
+                  ub4             offset );
+
+Comments
+Erases a specified portion of the LOB data starting at a specified offset.
+The actual number of characters/bytes erased is returned. The actual number 
+of characters/bytes and the requested number of characters/bytes will differ 
+if the end of the LOB data is reached before erasing the requested number of 
+characters/bytes.
+If a section of data from the middle of the LOB data is erased, a hole is 
+created. When data from that hole is read, 0's are returned. If the LOB is
+NULL, this routine will indicate that 0 characters/bytes were erased.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - the LOB for which to erase a section of data.
+amount (IN/OUT) - On IN, the number of characters/bytes to erase. On OUT, 
+the actual number of characters/bytes erased.
+offset (IN) - absolute offset from the beginning of the LOB data from which 
+to start erasing data. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobRead(), OCILobWrite()
+
+OCILobOpen()
+
+Name
+OCI Lob Open
+
+Purpose
+Opens an internal or external Lob.
+
+Syntax
+sword OCILobOpen( OCISvcCtx        *svchp,
+                  OCIError         *errhp,
+                  OCILobLocator    *locp,
+                  ub1               mode );
+
+Comments
+It is an error if the same lob is opened more than once in
+the same transaction. Lobs are opened implicitly if they are
+not opened before using them. A LOB has to be closed before
+the transaction commits else the transaction is rolled back.
+Open locators are closed if the transaction aborts. Multiple 
+users can open the same lob on different locators.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - locator points to the LOB to be opened
+mode (IN) - mode in which to open the lob. The valid modes are
+read-only - OCI_FILE_READONLY, read-write - OCI_FILE_READWRITE 
+
+OCILobClose()
+
+Name
+OCI Lob Close
+
+Purpose
+Closes an open internal or external Lob.
+
+Syntax
+sword OCILobClose( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp );
+
+
+Comments
+It is an error if the lob is not open at this time. All LOBs
+that have been opened in a transaction have to be closed 
+before the transaction commits, else the transaction gets
+rolled back.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp  (IN)  - A locator that was opened using OCILobOpen()
+
+
+OCILobFileClose()
+
+Name
+OCI Lob File CLoSe
+
+Purpose
+Closes a previously opened FILE.
+
+Syntax
+sword OCILobFileClose ( OCISvcCtx            *svchp,
+                        OCIError             *errhp,
+                        OCILobLocator        *filep );
+
+Comments
+Closes a previously opened FILE. It is an error if this function is called for
+an internal LOB. No error is returned if the FILE exists but is not opened.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - a pointer to a FILE locator to be closed.
+
+See Also
+OCIErrorGet(), OCILobFileOpen(), OCILobFileCloseAll(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileCloseAll()
+
+Name
+OCI LOB FILE Close All
+
+Purpose
+Closes all open FILEs on a given service context.
+
+Syntax
+sword OCILobFileCLoseAll ( OCISvcCtx *svchp, 
+                           OCIError  *errhp );
+
+Comments
+Closes all open FILEs on a given service context.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+
+See also
+OCILobFileClose(),
+OCIErrorGet(), OCILobFileOpen(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileExists()
+
+Name
+OCI LOB FILE exists
+
+Purpose
+Tests to see if the FILE exists on the server
+
+Syntax
+sword OCILobFileExists ( OCISvcCtx     *svchp,
+                         OCIError      *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if a FILE exists for on the server.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, 
+it is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator that refers to the file.
+flag (OUT) - returns TRUE if the FILE exists; FALSE if it does not.
+
+See also
+OCIErrorGet, CREATE DIRECTORY (DDL)
+
+
+
+
+OCILobFileGetName()
+
+Name
+OCI LOB FILE Get file Name
+
+Purpose
+Gets the FILE locator's directory alias and file name.
+
+Syntax
+sword OCILobFileGetName ( OCIEnv                   *envhp,
+                          OCIError                 *errhp, 
+                          const OCILobLocator      *filep, 
+                          OraText                     *dir_alias,
+                          ub2                      *d_length, 
+                          OraText                     *filename, 
+                          ub2                      *f_length );
+
+Comments
+Returns the directory alias and file name associated with this file locator.  
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) -The OCI error handle. If there is an error, it is recorded in 
+errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filep (IN) - FILE locator for which to get the directory alias and file name.
+dir_alias (OUT) - buffer into which the directory alias name is placed. The 
+caller must allocate enough space for the directory alias name and must not 
+write into the space.
+d_length (IN/OUT)                 
+        - IN: length of the input dir_alias string;
+        - OUT: length of the returned dir_alias string.
+filename (OUT) - buffer into which the file name is placed. The caller must 
+allocate enough space for the file name and must not write into the space.
+f_length (IN/OUT) 
+        - IN: length of the input filename string;
+         - OUT: lenght of the returned filename string.
+
+See also
+OCILobFileSetName(), OCIErrorGet()
+
+
+
+
+OCILobFileIsOpen()
+
+Name
+OCI LOB FILE Is Open?
+
+Purpose
+Tests to see if the FILE is open
+
+Syntax
+sword OCILobFileIsOpen ( OCISvcCtx *svchp,
+                         OCIError  *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if the FILE on the server is open for a given LobLocator.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator being examined. If the input file 
+locator was never passed to OCILobFileOpen(), the file is considered not to 
+be opened by this locator. However, a different locator may have opened the 
+file. More than one file opens can be performed on the same file using 
+different locators.
+flag (OUT) - returns TRUE if the FILE is opened using this locator; FALSE if 
+it is not. 
+
+See also
+OCIErrorGet, OCILobFileOpen, OCILobFileClose, OCILobFileCloseAll, CREATE 
+DIRECTORY SQL command
+
+
+OCILobFileOpen()
+
+Name
+OCI LOB FILE open
+
+Purpose
+Opens a FILE for read-only access
+
+Syntax
+sword OCILobFileOpen ( OCISvcCtx            *svchp,
+                     OCIError             *errhp,
+                     OCILobLocator        *filep,
+                     ub1                  mode );
+
+Comments
+Opens a FILE. The FILE can be opened for read-only access only. FILEs may not 
+be written to throough ORACLE.
+
+Parameters 
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - the FILE to open. Error if the locator does not refer to a 
+FILE. 
+mode (IN) - mode in which to open the file. The only valid mode is 
+read-only - OCI_FILE_READONLY. 
+
+See Also
+OCILobFileClose, OCIErrorGet, OCILobFileCloseAll, OCILobFileIsOpen, 
+OCILobFileSetName, CREATE DIRECTORY 
+
+
+
+
+OCILobFileSetName()
+
+Name
+OCI Lob File Set NaMe
+
+Purpose
+Sets directory alias and file name in the FILE locator.
+
+Syntax
+sword OCILobFileSetName ( OCIEnv             *envhp,
+                          OCIError           *errhp,
+                          OCILobLocator      **filepp,
+                          OraText               *dir_alias,
+                          ub2                d_length, 
+                          OraText               *filename, 
+                          ub2                f_length );
+Comments
+Sets the directory alias and file name in the LOB file locator.  
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filepp (IN/OUT) - FILE locator for which to set the directory alias name.
+The caller must have already allocated space for the locator by calling
+OCIDescriptorAlloc().
+dir_alias (IN) - buffer that contains the directory alias name to set in the 
+locator.
+d_length (IN) - length of the input dir_alias parameter.
+filename (IN) - buffer that contains the file name is placed.
+f_length (IN) - length of the input filename parameter.
+See also
+OCILobFileGetName, OCIErrorGet, CREATE DIRECTORY
+
+
+
+
+OCILobFlushBuffer()
+
+Name
+OCI Lob Flush all Buffers for this lob.
+
+Purpose
+Flush/write all buffers for this lob to the server.
+
+
+Syntax
+sword OCILobFlushBuffer ( OCISvcCtx       *svchp,
+                          OCIError        *errhp,
+                          OCILobLocator   *locp,
+                          ub4              flag);
+
+Comments
+
+Flushes to the server, changes made to the buffering subsystem that 
+are associated with the lob referenced by the input locator.  This 
+routine will actually write the data in the buffer to the lob in 
+the database.  Lob buffering must have already been enabled for the 
+input lob locator.
+
+This routine, by default, does not free the buffer resources for
+reallocation to another buffered LOB operation. However, if you
+want to free the buffer explicitly, you can set the flag parameter
+to OCI_LOB_BUFFER_FREE.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+flag    (IN)     - to indicate if the buffer resources need to be freed
+                   after a flush. Default value is OCI_LOB_BUFFER_NOFREE.
+                   Set it to OCI_LOB_BUFFER_FREE if you want the buffer
+                   resources to be freed.
+Related Functions
+OCILobEnableBuffering()
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+
+
+OCILobFreeTemporary()
+
+Name
+OCI Lob Free Temporary
+
+Purpose
+Free a temporary LOB
+
+Syntax
+sword OCILobFreeTemporary(OCISvcCtx          *svchp,
+                          OCIError           *errhp,
+                          OCILobLocator      *locp);
+
+Comments
+  Frees the contents of the temporary Lob this locator is pointing to. Note
+  that the locator itself is not freed until a OCIDescriptorFree is done.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB
+
+Related functions
+OCILobCreateTemporary()
+OCILobIsTemporary()
+
+
+Name
+OCI Lob/File Get Chunk Size
+
+Purpose
+When creating the table, the user can specify the chunking factor, which can
+be a multiple of Oracle blocks. This corresponds to the chunk size used by the
+LOB data layer when accessing/modifying the LOB value. Part of the chunk is
+used to store system-related information and the rest stores the LOB value.
+This function returns the amount of space used in the LOB chunk to store 
+the LOB value.
+
+Syntax
+sword OCILobGetChunkSize ( OCISvcCtx      *svchp,
+                           OCIError       *errhp,
+                           OCILobLocator  *locp,
+                           ub4            *chunksizep );
+
+Comments
+ Performance will be improved if the user issues read/write
+requests using a multiple of this chunk size. For writes, there is an added 
+benefit since LOB chunks are versioned and, if all writes are done on chunk
+basis, no extra/excess versioning is done nor duplicated. Users could batch 
+up the write until they have enough for a chunk instead of issuing several
+write calls for the same chunk.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+chunksizep (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+
+OCILobGetLength()
+
+Name
+OCI Lob/File Length
+
+Purpose
+Gets the length of a LOB/FILE. 
+
+Syntax
+sword OCILobGetLength ( OCISvcCtx      *svchp,
+                        OCIError       *errhp,
+                        OCILobLocator  *locp,
+                        ub4            *lenp );
+
+Comments
+Gets the length of a LOB/FILE. If the LOB/FILE is NULL, the length is 
+undefined.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+lenp (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+OCIErrorGet, OCIFileSetName
+
+
+
+OCILobIsEqual()
+
+Name
+
+OCI Lob Is Equal
+
+Purpose
+Compares two LOB locators for equality.
+
+Syntax
+sword OCILobIsEqual ( OCIEnv                  *envhp,
+                      const OCILobLocator     *x,
+                      const OCILobLocator     *y,
+                      boolean                 *is_equal );
+
+Comments
+Compares the given LOB locators for equality.  Two LOB locators are equal if 
+and only if they both refer to the same LOB data.
+Two NULL locators are considered not equal by this function.
+Parameters
+envhp (IN) - the OCI environment handle.
+x (IN) - LOB locator to compare.
+y (IN) - LOB locator to compare.
+is_equal (OUT) - TRUE, if the LOB locators are equal; FALSE if they are not.
+
+See also
+OCILobAssign, OCILobLocatorIsInit
+OCILobLocatorAssign,
+OCILobIsOpen()
+
+Name
+
+OCI Lob Is Open
+sword OCILobIsOpen(svchp, errhp, locp, flag)
+OCISvcCtx     *svchp;
+OCIError      *errhp;
+OCILobLocator *locp;
+boolean       *flag;
+
+Comments
+   Checks if the LOB locator was opened before. flag is set to TRUE
+   if opened; FALSE otherwise 
+
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN) - the locator to test for temporary LOB
+flag(OUT) - TRUE, if the LOB locator points to is open
+                    FALSE, if not.
+
+OCILobIsTemporary()
+
+Name
+
+OCI Lob Is Temporary
+
+Purpose
+  Tests if this locator points to a temporary LOB
+
+Syntax
+sword OCILobIsTemporary(OCIEnv            *envhp,
+                        OCIError          *errhp,
+                        OCILobLocator     *locp,
+                        boolean           *is_temporary);
+
+Comments
+Tests the locator to determine if it points to a temporary LOB.
+If so, is_temporary is set to TRUE. If not, is_temporary is set
+to FALSE.
+
+Parameters
+envhp (IN) - the environment handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN) - the locator to test for temporary LOB
+is_temporary(OUT) - TRUE, if the LOB locator points to a temporary LOB;
+                    FALSE, if not.
+
+See Also
+OCILobCreateTemporary, OCILobFreeTemporary
+
+
+OCILobLoadFromFile()
+
+Name
+OCI Lob Load From File
+
+Purpose
+Load/copy all or a portion of the file into an internal LOB.
+
+Syntax
+sword OCILobLoadFromFile ( OCISvcCtx        *svchp,
+                           OCIError         *errhp,
+                           OCILobLocator    *dst_locp,
+                           OCILobLocator    *src_filep,
+                           ub4              amount,
+                           ub4              dst_offset,
+                           ub4              src_offset );
+
+Comments
+Loads/copies a portion or all of a file value into an internal LOB as 
+specified.  The data is copied from the source file to the destination 
+internal LOB (BLOB/CLOB).  No character set conversions are performed 
+when copying the bfile data to a clob/nclob.  The bfile data must already
+be in the same character set as the clob/nclob in the database.  No
+error checking is performed to verify this.
+The source (src_filep) and the destination (dst_locp) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination internal 
+LOB which may be of type blob, clob, or nclob. 
+src_filep (IN/OUT) - a locator uniquely referencing the source BFILE. 
+amount (IN) - the number of bytes to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source BFILE.  It is 
+the number of bytes from the beginning of the LOB.  The offset starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim(), OCILobCopy()
+
+OCILobLocatorAssign()
+
+Name
+OCI Lob LOCATOR ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobLocatorAssign ( OCISvcCtx             *svchp, 
+                            OCIError              *errhp, 
+                            const OCILobLocator   *src_locp, 
+                            OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For 
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note : the only difference between this and OCILobAssign is that this takes
+a OCI service handle pointer instead of a OCI environment handle pointer
+
+Parameters
+svchp (IN/OUT) - OCI service handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobAssign()
+
+
+
+
+OCILobLocatorIsInit()
+
+Name
+OCI LOB locator is initialized?
+
+Purpose
+Tests to see if a given LOB locator is initialized.
+
+Syntax
+sword OCILobLocatorIsInit ( OCIEnv   *envhp,
+                            OCIError *errhp,
+                            const OCILobLocator *locp,
+                            boolean *is_initialized );
+
+Comments
+Tests to see if a given LOB locator is initialized.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - the LOB locator being tested
+is_initialized (OUT) - returns TRUE if the given LOB locator is initialized; 
+FALSE if it is not.
+
+See also
+OCIErrorGet, OCILobIsEqual
+
+
+
+
+OCILobRead()
+
+Name
+OCI Lob/File ReaD
+
+Purpose
+Reads a portion of a LOB/FILE as specified by the call into a buffer. 
+
+Syntax
+sword OCILobRead ( OCISvcCtx       *svchp,
+                   OCIError        *errhp,
+                   OCILobLocator   *locp,
+                   ub4             offset,
+                   ub4             *amtp,
+                   void           *bufp,
+                   ub4             bufl,
+                   void           *ctxp,  
+                   OCICallbackLobRead cbfp,
+                   ub2             csid,
+                   ub1             csfrm );
+
+Comments
+Reads a portion of a LOB/FILE as specified by the call into a buffer. Data 
+read from a hole is returned as 0s. It is an error to try to read from a NULL
+LOB/FILE. The OS FILE must already exist on the server and must have been 
+opened using the input locator. Oracle must hav epermission to read the OS 
+file and user must have read permission on the directory object.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in the 
+number of characters from the beginning of the LOB, for binary LOBs it is the 
+number of bytes. Starts from 1.
+amtp (IN/OUT) - On input, the number of character or bytes to be read. On 
+output, the actual number of bytes or characters read. 
+If the amount of bytes to be read is larger than the buffer length it is 
+assumed that the LOB is being read in a streamed mode. On input if this value 
+is 0, then the data shall be read in streamed mode from the LOB until the end 
+of LOB. If the data is read in pieces, *amtp always contains the length of 
+the last piece read.  If a callback function is defined, then this callback 
+function will be invoked each time bufl bytes are read off the pipe. Each 
+piece will be written into bufp.
+If the callback function is not defined, then OCI_NEED_DATA error code will 
+be returned. The application must invoke the LOB read over and over again to 
+read more pieces of the LOB until the OCI_NEED_DATA error code is not 
+returned. The buffer pointer and the length can be different in each call 
+if the pieces are being read into different sizes and location. 
+bufp (IN) - the pointer to a buffer into which the piece will be read. The 
+length of the allocated memory is assumed to be bufl. 
+bufl (IN) - the length of the buffer in octets. 
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece. If 
+this is NULL, then OCI_NEED_DATA will be returned for each piece. 
+The callback function must return OCI_CONTINUE for the read to continue. 
+If any other error code is returned, the LOB read is aborted. 
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN) - a buffer pointer for the piece.
+  len (IN) - the length of length of current piece in bufp.
+  piece (IN) - which piece - OCI_FIRST_PIECE, OCI_NEXT_PIECE or 
+  OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCILobFileOpen, OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobTrim()
+
+Name
+
+OCI Lob  Trim
+
+Purpose
+Trims the lob value to a shorter length
+
+Syntax
+sword OCILobTrim ( OCISvcCtx       *svchp,
+                 OCIError        *errhp,
+                 OCILobLocator   *locp,
+                 ub4             newlen );
+
+Comments
+Truncates LOB data to a specified shorter length. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. This locator 
+must be a locator that was obtained from the server specified by svchp. 
+newlen (IN) - the new length of the LOB data, which must be less than or equal
+to the current length. 
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCiLobErase, OCILobAppend, OCILobCopy
+
+
+
+
+
+OCILobWrite()
+
+Name
+OCI Lob Write
+
+Purpose
+Writes a buffer into a LOB
+
+Syntax
+sword OCILobWrite ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             offset,
+                    ub4             *amtp,
+                    void           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    void           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    void    *ctxp,
+                                    void    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer into a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to 
+the pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWrite() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWrite() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in 
+the number of characters from the beginning of the LOB, for binary LOBs it 
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. 
+Even if the data is being written in pieces, bufp must contain the first 
+piece of the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in 
+a piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+OCILobWriteAppend()
+
+Name
+OCI Lob Write Append
+
+Purpose
+Writes data to the end of a LOB value. This call provides the ability
+to get the length of the data and append it to the end of the LOB in
+a single round trip to the server.
+
+Syntax
+sword OCILobWriteAppend ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             *amtp,
+                    void           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    void           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    void    *ctxp,
+                                    void    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer to the end of a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to the 
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWriteAppend() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWriteAppend() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. Even 
+if the data is being written in pieces, bufp must contain the first piece of 
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a 
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+OCILobGetStorageLimit()
+
+Name
+OCI Lob Get Storage Limit
+
+Purpose
+To get the maximum Length of a LOB in bytes that can be stored in the database.
+
+Syntax
+sword OCILobGetStorageLimit ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    oraub8          *limitp);
+
+
+Comments
+With unlimited size LOB support the limit for a LOB is no longer restricted
+to 4GB.
+This interface should be used to get the actual limit for storing data for
+a specific
+LOB locator. Note that if the compatibality is set to 9.2 or older the limit
+would still be 4GB.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+limitp (OUT)  - The storage limit for a LOB in bytes.
+Related Functions
+
+
+
+
+OCILobGetOptions()
+
+Name
+OCI Lob Get Options
+
+Purpose
+To get the current options set for the given SecureFile.
+
+Syntax
+sword OCILobGetOptions ( OCISvcCtx       *svchp,
+                         OCIError        *errhp,
+                         OCILobLocator   *locp,
+                         ub4              optypes,
+                         void            *optionsp,
+                         ub4             *optionslenp,
+                         ub4              mode);
+
+
+Comments
+This function only works on SecureFiles.  All others will get an error.
+
+Parameters
+svchp   (IN/OUT) - the service context handle. 
+errhp   (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp    (IN/OUT) - a LOB locator that uniquely references a LOB. 
+optypes (IN)     - the types of options flags to be retrieved.
+optionsp (OUT)   - the options flags or value for the given types.
+optionslenp (IN/OUT) - the length of option_value buffer
+mode    (IN)     - for future use (pass 0 for now).
+Related Functions
+OCISetOptions()
+
+OCILobSetOptions()
+
+Name
+OCI Lob Set Options
+
+Purpose
+To set the options for the given SecureFile Lob.
+
+Syntax
+sword OCILobSetOptions ( OCISvcCtx       *svchp,
+                         OCIError        *errhp,
+                         OCILobLocator   *locp,
+                         ub4              optypes,
+                         void            *optionsp,
+                         ub4              optionslen,
+                         ub4              mode);
+
+
+Comments
+This function only works on SecureFile Lobs.  All others will get an error.
+
+Parameters
+svchp     (IN/OUT) - the service context handle. 
+errhp     (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp      (IN/OUT) - a LOB locator that uniquely references a LOB. 
+optypes   (IN)     - the types of options flags to be set.
+optionsp  (IN)     - the options flags or value to be set for the given types.
+optionslen (IN)    - then length of option_value buffer
+mode      (IN)     - for future use (pass 0 for now).
+Related Functions
+OCILobGetOptions()
+
+OCILobGetContentType()
+
+Name
+OCI Lob Get Content Type
+
+Purpose
+To get the current contenttype set for the given SecureFile.
+
+Syntax
+sword OCILobGetContentType (OCISvcCtx       *svchp,
+                            OCIError        *errhp,
+                            OCILobLocator   *locp,
+                            oratext         *contenttypep,
+                            ub4             *contenttypelenp,
+                            ub4              mode);
+
+
+Comments
+This function only works on SecureFiles.  All others will get an error.
+If the securefile does not have a contenttype associated with it,
+the contenttype length (= *contenttypelenp) is returned as 0 without
+modifying the buffer contenttypep. 
+Parameters
+svchp      (IN/OUT) - the service context handle. 
+errhp      (IN/OUT) - an error handle which can be passed to OCIErrorGet() for
+                      diagnostic information in the event of an error. 
+locp       (IN/OUT) - a LOB locator that uniquely references a LOB.
+contenttypep(IN/OUT)- pointer to the buffer where the contenttype is stored
+                      after successful execution.
+                      The caller needs to allocate the buffer before calling
+                      this function. The size of the allocated buffer should
+                      be >= OCI_LOB_CONTENTTYPE_MAXSIZE bytes
+contenttypelenp(IN/OUT)- The caller should set this field to the size
+                         of contenttypep buffer.
+                         After the call successfully executes, it will hold the
+                         size of the contenttype returned.
+mode           (IN) - for future use (pass 0 for now).
+Related Functions
+OCISetContentType()
+
+OCILobSetContentType()
+
+Name
+OCI Lob Set Content Type
+
+Purpose
+To set the contenttype for the given SecureFile Lob.
+
+Syntax
+sword OCILobSetContentType (OCISvcCtx       *svchp,
+                            OCIError        *errhp,
+                            OCILobLocator   *locp,
+                            const oratext   *contenttypep,
+                            ub4              contenttypelen,
+                            ub4              mode);
+
+
+Comments
+This function only works on SecureFiles.  All others will get an error.
+To clear an existing contenttype set on a securefile, the user will
+invoke OCILobSetContentType API with contenttypep  set to (oratext *)0,
+and contenttypelen set to 0.
+Parameters
+svchp     (IN/OUT) - the service context handle. 
+errhp     (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp      (IN/OUT) - a LOB locator that uniquely references a LOB.
+contenttypep  (IN) - the contenttype to be set for the given LOB.
+contenttypelen(IN) - the size of contenttype in bytes. The size of the
+                     contenttype should be <= OCI_LOB_CONTENTTYPE_MAXSIZE
+                     bytes.
+mode      (IN)     - for future use (pass 0 for now).
+Related Functions
+OCILobGetContentType()
+
+
+OCILogoff()
+Name
+OCI simplified Logoff
+Purpose
+This function is used to terminate a session created with OCILogon() or
+OCILogon2().
+Syntax
+sword OCILogoff ( OCISvcCtx      *svchp
+                   OCIError       *errhp );
+Comments
+This call is used to terminate a session which was created with OCILogon() or
+OCILogon2().  
+This call implicitly deallocates the server, authentication, and service 
+context handles.
+Note: For more information on logging on and off in an application, 
+refer to the section "Application Initialization, Connection, and 
+Authorization" on page 2-16.
+Parameters
+svchp (IN) - the service context handle which was used in the call to 
+OCILogon() or OCILogon2().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+See Also
+OCILogon(), OCILogon2().
+
+
+
+
+
+
+OCILogon()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a simple logon session.
+Syntax
+sword OCILogon ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       *svchp,
+                       const OraText      *username,
+                       ub4             uname_len,
+                       const OraText      *password,
+                       ub4             passwd_len,
+                       const OraText      *dbname,
+                       ub4             dbname_len );
+Comments
+This function is used to create a simple logon session for an application. 
+Note: Users requiring more complex session (e.g., TP monitor 
+applications) should refer to the section "Application Initialization, 
+Connection, and Authorization" on page 2-16.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+See Also
+OCILogoff()
+
+
+
+
+
+OCILogon2()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a logon session in connection pooling mode.
+Syntax
+sword OCILogon2 ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       **svchp,
+                       const OraText      *username,
+                       ub4             uname_len,
+                       const OraText      *password,
+                       ub4             passwd_len,
+                       const OraText      *dbname,
+                       ub4             dbname_len,
+                       ub4             mode);
+Comments
+This function is used to create a simple logon session for an application in
+Connection Pooling mode. The valid values for mode are currently OCI_POOL and
+OCI_DEFAULT. Call to this function with OCI_DEFAULT mode is equivalent to 
+OCILogon() call.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle. This call assumes that 
+OCIConnectionPoolCreate() has already been called for the same dbname.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password. If this is null, it is assumed that a
+                proxy session has to be created and the required grants on 
+                the database are already done.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+mode (IN) - the mode for doing the server attach. Should be OCI_POOL for
+            using Connection Pooling.
+
+
+See Also
+OCILogoff()
+
+
+
+
+
+OCIMemoryFree()
+Name
+OCI FREE Memory
+Purpose
+Frees up storage associated with the pointer.
+Syntax
+void OCIMemoryFree ( const OCIStmt   *stmhp,
+                     void           *memptr);
+Comments
+Frees up dynamically allocated data pointers associated with the pointer using 
+either the default memory free function or the registered memory free 
+function, as the case may be.
+A user-defined memory free function can be registered during the initial call 
+to OCIInitialize(). 
+This call is always successful. 
+Parameters
+stmhp (IN) - statement handle which returned this data buffer.
+memptr (IN) - pointer to data allocated by the client library. 
+Related Functions
+OCIInitialize()
+
+
+
+
+
+OCIParamGet()
+Name
+OCI Get PARaMeter
+Purpose
+Returns a descriptor of a parameter specified by position in the describe 
+handle or statement handle.
+Syntax
+sword OCIParamGet ( const void       *hndlp,
+                  ub4         htype,
+                  OCIError    *errhp,
+                  void    **parmdpp,
+                  ub4         pos );
+Comments
+This call returns a descriptor of a parameter specified by position in the 
+describe handle or statement handle. Parameter descriptors are always 
+allocated internally by the OCI library. They are read-only.
+OCI_NO_DATA may be returned if there are no parameter descriptors for this 
+position. 
+See Appendix B for more detailed information about parameter descriptor 
+attributes.
+Parameters
+hndlp (IN) - a statement handle or describe handle. The OCIParamGet() 
+function will return a parameter descriptor for this handle. 
+htype (IN) - the type of the handle passed in the handle parameter. Valid 
+types are OCI_HTYPE_DESCRIBE, for a describe handle OCI_HTYPE_STMT, for a 
+statement handle
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+parmdpp (OUT) - a descriptor of the parameter at the position given in the pos 
+parameter.
+pos (IN) - position number in the statement handle or describe handle. A 
+parameter descriptor will be returned for this position.
+Note: OCI_NO_DATA may be returned if there are no parameter 
+descriptors for this position. 
+Related Functions
+OCIAttrGet(), OCIAttrSet()
+
+
+
+
+
+OCIParamSet()
+Name
+OCI Parameter Set in handle
+Purpose
+Used to set a complex object retrieval descriptor into a complex object 
+retrieval handle.
+Syntax
+sword   OCIParamGet ( void *hndlp,
+                       ub4 htyp,
+                      OCIError *errhp,
+                      const void *dscp,
+                      ub4 dtyp,
+                      ub4 pos );
+Comments
+This call sets a given complex object retrieval descriptor into a complex 
+object retrieval handle.
+The handle must have been previously allocated using OCIHandleAlloc(), and 
+the descriptor must have been previously allocated using OCIDescAlloc(). 
+Attributes of the descriptor are set using OCIAttrSet().
+Parameters
+hndlp (IN/OUT) - handle pointer.
+htype (IN) - handle type.
+errhp (IN/OUT) - error handle.
+dscp (IN) - complex object retrieval descriptor pointer.
+dtyp (IN) - 
+pos (IN) - position number.
+See Also
+
+
+
+
+
+OCIPasswordChange()
+Name
+OCI Change PassWord
+Purpose
+This call allows the password of an account to be changed.
+Syntax
+sword OCIPasswordChange ( OCISvcCtx     *svchp,
+                        OCIError      *errhp,
+                        const OraText    *user_name,
+                        ub4           usernm_len,
+                        const OraText    *opasswd,
+                        ub4           opasswd_len,
+                        const OraText    *npasswd,
+                        sb4           npasswd_len,
+                        ub4           mode);
+Comments
+This call allows the password of an account to be changed. This call is 
+similar to OCISessionBegin() with the following differences:
+If the user authentication is already established, it authenticates 
+the account using the old password and then changes the 
+password to the new password
+If the user authentication is not established, it establishes a user 
+authentication and authenticates the account using the old 
+password, then changes the password to the new password.
+This call is useful when the password of an account is expired and 
+OCISessionBegin() returns an error or warning which indicates that the 
+password has expired. 
+Parameters
+svchp (IN/OUT) - a handle to a service context. The service context handle 
+must be initialized and have a server context handle associated with it.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+user_name (IN) - specifies the user name. It points to a character string, 
+whose length is specified in usernm_len. This parameter must be NULL if the 
+service context has been initialized with an authentication handle.
+usernm_len (IN) - the length of the user name string specified in user_name. 
+For a valid user name string, usernm_len must be non-zero.
+opasswd (IN) - specifies the user's old password. It points to a character 
+string, whose length is specified in opasswd_len .
+opasswd_len (IN) - the length of the old password string specified in opasswd. 
+For a valid password string, opasswd_len must be non-zero.
+npasswd (IN) - specifies the user's new password. It points to a character 
+string, whose length is specified in npasswd_len which must be non-zero for a 
+valid password string. If the password complexity verification routine is 
+specified in the user's profile to verify the new password's complexity, the 
+new password must meet the complexity requirements of the verification 
+function.
+npasswd_len (IN)  - then length of the new password string specified in 
+npasswd. For a valid password string, npasswd_len must be non-zero.
+mode - pass as OCI_DEFAULT.
+Related Functions
+OCISessionBegin()
+
+
+----------------------------------OCIReset------------------------------------
+
+
+OCIReset()
+Name
+OCI Reset
+Purpose
+Resets the interrupted asynchronous operation and protocol. Must be called
+if a OCIBreak call had been issued while a non-blocking operation was in
+progress.
+Syntax
+sword OCIReset ( void      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call is called in non-blocking mode ONLY. Resets the interrupted
+asynchronous operation and protocol. Must be called if a OCIBreak call 
+had been issued while a non-blocking operation was in progress. 
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+
+OCIResultSetToStmt()
+Name
+OCI convert Result Set to Statement Handle
+Purpose
+Converts a descriptor to statement handle for fetching rows.
+Syntax
+sword OCIResultSetToStmt ( OCIResult     *rsetdp,
+                         OCIError      *errhp );
+Comments
+Converts a descriptor to statement handle for fetching rows.
+A result set descriptor can be allocated with a call to OCIDescAlloc().
+Parameters
+rsetdp (IN/OUT) - a result set descriptor pointer. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIDescAlloc()
+
+
+
+
+OCIServerAttach()
+Name
+OCI ATtaCH to server
+Purpose
+Creates an access path to a data source for OCI operations.
+Syntax
+sword OCIServerAttach ( OCIServer    *srvhp,
+                      OCIError     *errhp,
+                      const OraText   *dblink,
+                      sb4          dblink_len,
+                      ub4          mode);
+Comments
+This call is used to create an association between an OCI application and a 
+particular server. 
+This call initializes a server context handle, which must have been previously 
+allocated with a call to OCIHandleAlloc().
+The server context handle initialized by this call can be associated with a 
+service context through a call to OCIAttrSet(). Once that association has been 
+made, OCI operations can be performed against the server.
+If an application is operating against multiple servers, multiple server 
+context handles can be maintained. OCI operations are performed against 
+whichever server context is currently associated with the service context.
+Parameters
+srvhp (IN/OUT) - an uninitialized server context handle, which gets 
+initialized by this call. Passing in an initialized server handle causes an 
+error. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+dblink (IN) - specifies the database (server) to use. This parameter points to
+a character string which specifies a connect string or a service point. If the 
+connect string is NULL, then this call attaches to the default host. The length
+of connstr is specified in connstr_len. The connstr pointer may be freed by the
+caller on return.
+dblink_len (IN) - the length of the string pointed to by connstr. For a valid 
+connect string name or alias, connstr_len must be non-zero.
+mode (IN) - specifies the various modes of operation.  For release 8.0, pass as
+OCI_DEFAULT - in this mode, calls made to the server on this server context 
+are made in blocking mode. 
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIServerAttach().
+Related Functions
+OCIServerDetach()
+
+
+
+OCIServerDetach()
+Name
+OCI DeTaCH server
+Purpose
+Deletes an access to a data source for OCI operations.
+Syntax
+sword OCIServerDetach ( OCIServer   *svrhp,
+                      OCIError    *errhp,
+                      ub4         mode); 
+Comments
+This call deletes an access to data source for OCI operations, which was 
+established by a call to OCIServerAttach(). 
+Parameters
+srvhp (IN) - a handle to an initialized server context, which gets reset to 
+uninitialized state. The handle is not de-allocated. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+mode (IN) - specifies the various modes of operation. The only valid mode is 
+OCI_DEFAULT for the default mode. 
+Related Functions
+OCIServerAttach()
+
+
+
+OCIServerVersion()
+Name
+OCI VERSion
+Purpose
+Returns the version string of the Oracle server.
+Syntax
+sword OCIServerVersion ( void        *hndlp, 
+                       OCIError     *errhp, 
+                       OraText         *bufp,
+                       ub4          bufsz
+                       ub1          hndltype );
+Comments
+This call returns the version string of the Oracle server. 
+For example, the following might be returned as the version string if your 
+application is running against a 7.3.2 server:
+Oracle7 Server Release 7.3.2.0.0 - Production Release
+PL/SQL Release 2.3.2.0.0 - Production
+CORE Version 3.5.2.0.0 - Production
+TNS for SEQUENT DYNIX/ptx: Version 2.3.2.0.0 - Production
+NLSRTL Version 3.2.2.0.0 - Production
+
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN) - the buffer in which the version information is returned.
+bufsz (IN) - the length of the buffer.
+hndltype (IN) - the type of handle passed to the function.
+Related Functions
+
+
+
+
+
+OCISessionBegin()
+Name
+OCI Session Begin and authenticate user
+Purpose
+Creates a user authentication and begins a user session for a given server.
+Syntax
+sword OCISessionBegin ( OCISvcCtx     *svchp,
+                      OCIError      *errhp,
+                      OCISession    *usrhp,
+                      ub4           credt,
+                      ub4           mode);
+
+Comments
+For Oracle8, OCISessionBegin() must be called for any given server handle 
+before requests can be made against it. Also, OCISessionBegin() only supports 
+authenticating the user for access to the Oracle server specified by the 
+server handle in the service context. In other words, after OCIServerAttach() 
+is called to initialize a server handle, OCISessionBegin() must be called to 
+authenticate the user for that given server. 
+When OCISessionBegin() is called for the first time for the given server 
+handle, the initialized authentication handle is called a primary 
+authentication context. A primary authentication context may not be created 
+with the OCI_MIGRATE mode. Also, only one primary authentication context can 
+be created for a given server handle and the primary authentication context c
+an only ever be used with that server handle. If the primary authentication 
+context is set in a service handle with a different server handle, then an 
+error will result.
+After OCISessionBegin() has been called for the server handle, and the primary 
+authentication context is set in the service handle, OCISessionBegin() may be 
+called again to initialize another authentication handle with different (or 
+the same) credentials. When OCISessionBegin() is called with a service handle 
+set with a primary authentication context, the returned authentication context
+in authp is called a user authentication context. As many user authentication 
+contexts may be initialized as desired.
+User authentication contexts may be created with the OCI_MIGRATE mode. 
+If the OCI_MIGRATE mode is not specified, then the user authentication 
+context can only ever be used with the same server handle set in svchp. If 
+OCI_MIGRATE mode is specified, then the user authentication may be set 
+with different server handles. However, the user authentication context is 
+restricted to use with only server handles which resolve to the same database 
+instance and that have equivalent primary authentication contexts. Equivalent 
+authentication contexts are those which were authenticated as the same 
+database user.
+OCI_SYSDBA, OCI_SYSOPER, OCI_SYSASM, and OCI_PRELIM_AUTH may only be used 
+with a primary authentication context.
+To provide credentials for a call to OCISessionBegin(), one of two methods are 
+supported. The first is to provide a valid username and password pair for 
+database authentication in the user authentication handle passed to 
+OCISessionBegin(). This involves using OCIAttrSet() to set the 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD attributes on the 
+authentication handle. Then OCISessionBegin() is called with 
+OCI_CRED_RDBMS.
+Note: When the authentication handle is terminated using 
+OCISessionEnd(), the username and password attributes remain 
+unchanged and thus can be re-used in a future call to OCISessionBegin(). 
+Otherwise, they must be reset to new values before the next 
+OCISessionBegin() call.
+The second type of credentials supported are external credentials. No 
+attributes need to be set on the authentication handle before calling 
+OCISessionBegin(). The credential type is OCI_CRED_EXT. This is equivalent 
+to the Oracle7 `connect /' syntax. If values have been set for 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD, then these are 
+ignored if OCI_CRED_EXT is used.
+Parameters
+svchp (IN) - a handle to a service context. There must be a valid server 
+handle set in svchp.
+errhp (IN) - an error handle to the retrieve diagnostic information.
+usrhp (IN/OUT) - a handle to an authentication context, which is initialized 
+by this call.
+credt (IN) - specifies the type of credentials to use for authentication. 
+Valid values for credt are:
+OCI_CRED_RDBMS - authenticate using a database username and 
+password pair as credentials. The attributes OCI_ATTR_USERNAME 
+and OCI_ATTR_PASSWORD should be set on the authentication 
+context before this call.
+OCI_CRED_EXT - authenticate using external credentials. No username 
+or password is provided.
+mode (IN) - specifies the various modes of operation. Valid modes are:
+OCI_DEFAULT - in this mode, the authentication context returned may 
+only ever be set with the same server context specified in svchp. This 
+establishes the primary authentication context.
+OCI_MIGRATE - in this mode, the new authentication context may be 
+set in a service handle with a different server handle. This mode 
+establishes the user authentication context. 
+OCI_SYSDBA - in this mode, the user is authenticated for SYSDBA 
+access.
+OCI_SYSOPER - in this mode, the user is authenticated for SYSOPER 
+access.
+OCI_SYSASM - in this mode, the user is authenticated for SYSASM
+access.  Note that only an ASM instance can grant SYSASM access.
+OCI_PRELIM_AUTH - this mode may only be used with OCI_SYSDBA, OCI_SYSASM, 
+or OCI_SYSOPER to authenticate for certain administration tasks.
+Related Functions
+OCISessionEnd()
+
+
+
+
+
+
+OCISessionEnd()
+Name
+OCI Terminate user Authentication Context
+Purpose
+Terminates a user authentication context created by OCISessionBegin()
+Syntax
+sword OCISessionEnd ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCISession      *usrhp,
+                    ub4             mode);
+
+Comments
+The user security context associated with the service context is invalidated 
+by this call. Storage for the authentication context is not freed. The 
+transaction specified by the service context is implicitly committed. The 
+transaction handle, if explicitly allocated, may be freed if not being used.
+Resources allocated on the server for this user are freed.
+The authentication handle may be reused in a new call to OCISessionBegin().
+Parameters
+svchp (IN/OUT) - the service context handle. There must be a valid server 
+handle and user authentication handle associated with svchp.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+usrhp (IN) - de-authenticate this user. If this parameter is passed as NULL, 
+the user in the service context handle is de-authenticated.
+mode (IN) - the only valid mode is OCI_DEFAULT.
+Example
+In this example, an authentication context is destroyed.
+Related Functions
+OCISessionBegin()
+
+
+
+
+OCIStmtExecute()
+Name
+OCI EXECute
+Purpose
+This call associates an application request with a server.
+Syntax
+sword OCIStmtExecute ( OCISvcCtx           *svchp,
+                     OCIStmt             *stmtp,
+                     OCIError            *errhp,
+                     ub4                 iters,
+                     ub4                 rowoff,
+                     const OCISnapshot   *snap_in,
+                     OCISnapshot         *snap_out,
+                     ub4                 mode );
+Comments
+This function  is used to execute a prepared SQL statement.
+Using an execute call, the application associates a request with a server. On 
+success, OCI_SUCCESS is returned.
+If a SELECT statement is executed, the description of the select list follows 
+implicitly as a response. This description is buffered on the client side for 
+describes, fetches and define type conversions. Hence it is optimal to 
+describe a select list only after an execute. 
+Also for SELECT statements, some results are available implicitly. Rows will 
+be received and buffered at the end of the execute. For queries with small row 
+count, a prefetch causes memory to be released in the server if the end of 
+fetch is reached, an optimization that may result in memory usage reduction. 
+Set attribute call has been defined to set the number of rows to be prefetched
+per result set.
+For SELECT statements, at the end of the execute, the statement handle 
+implicitly maintains a reference to the service context on which it is 
+executed. It is the user's responsibility to maintain the integrity of the 
+service context. If the attributes of a service context is changed for 
+executing some operations on this service context, the service context must 
+be restored to have the same attributes, that a statement was executed with, 
+prior to a fetch on the statement handle. The implicit reference is maintained 
+until the statement handle is freed or the fetch is cancelled or an end of 
+fetch condition is reached.
+Note: If output variables are defined for a SELECT statement before a 
+call to OCIStmtExecute(), the number of rows specified by iters will be 
+fetched directly into the defined output buffers and additional rows 
+equivalent to the prefetch count will be prefetched. If there are no 
+additional rows, then the fetch is complete without calling 
+OCIStmtFetch().
+The execute call will return errors if the statement has bind data types that 
+are not supported in an Oracle7 server.
+Parameters
+svchp (IN/OUT) - service context handle. 
+stmtp (IN/OUT) - an statement handle - defines the statement and the 
+associated data to be executed at the server. It is invalid to pass in a 
+statement handle that has bind of data types only supported in release 8.0 
+when srvchp points to an Oracle7 server. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. If the statement is being 
+batched and it is successful, then this handle will contain this particular 
+statement execution specific errors returned from the server when the batch is 
+flushed.
+iters (IN) - the number of times this statement is executed for non-Select 
+statements. For Select statements, if iters is non-zero, then defines must 
+have been done for the statement handle. The execution fetches iters rows into 
+these predefined buffers and prefetches more rows depending upon the prefetch 
+row count. This function returns an error if iters=0 for non-SELECT 
+statements.
+rowoff (IN) - the index from which the data in an array bind is relevant for 
+this multiple row execution. 
+snap_in (IN) - this parameter is optional. if supplied, must point to a 
+snapshot descriptor of type OCI_DTYPE_SNAP.  The contents of this descriptor 
+must be obtained from the snap_out parameter of a previous call.  The 
+descriptor is ignored if the SQL is not a SELECT.  This facility allows 
+multiple service contexts to ORACLE to see the same consistent snapshot of the 
+database's committed data.  However, uncommitted data in one context is not 
+visible to another context even using the same snapshot.
+snap_out (OUT) - this parameter optional. if supplied, must point to a 
+descriptor of type OCI_DTYPE_SNAP. This descriptor is filled in with an 
+opaque representation which is the current ORACLE "system change 
+number" suitable as a snap_in input to a subsequent call to OCIStmtExecute().  
+This descriptor should not be used any longer than necessary in order to avoid 
+"snapshot too old" errors. 
+mode (IN) - The modes are:
+If OCI_DEFAULT_MODE, the default mode, is selected, the request is 
+immediately executed. Error handle contains diagnostics on error if any. 
+OCI_EXACT_FETCH - if the statement is a SQL SELECT, this mode is 
+only valid if the application has set the prefetch row count prior to this 
+call. In this mode, the OCI library will get up to the number of rows 
+specified (i.e., prefetch row count plus iters). If the number of rows 
+returned by the query is greater than this value, OCI_ERROR will be 
+returned with ORA-01422 as the implementation specific error in a 
+diagnostic record. If the number of rows returned by the query is 
+smaller than the prefetch row count, OCI_SUCCESS_WITH_INFO will 
+be returned with ORA-01403 as the implementation specific error. The 
+prefetch buffer size is ignored and the OCI library tries to allocate all the 
+space required to contain the prefetched rows. The exact fetch semantics 
+apply to only the top level rows. No more rows can be fetched for this 
+query at the end of the call. 
+OCI_KEEP_FETCH_STATE - the result set rows (not yet fetched) of this 
+statement executed in this transaction will be maintained when the 
+transaction is detached for migration. By default, a query is cancelled 
+when a transaction is detached for migration. This mode is the default 
+mode when connected to a V7 server. 
+Related Functions
+OCIStmtPrepare()
+
+
+
+
+
+OCIStmtFetch()
+Name
+OCI FetCH
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         mode);
+Comments
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+orientation (IN) - for release 8.0, the only acceptable value is 
+OCI_FETCH_NEXT, which is also the default value. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+OCIStmtFetch2()
+Name
+OCI FetCH2
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch2 ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         scrollOffset,
+                   ub4         mode);
+Comments
+The fetch call works similar to the OCIStmtFetch call with the 
+addition of the fetchOffset parameter. It can be used on any 
+statement handle, whether it is scrollable or not. For a 
+non-scrollable statement handle, the only acceptable value 
+will be OCI_FETCH_NEXT, and the fetchOffset parameter will be 
+ignored. Applications are encouraged to use this new call. 
+
+A fetchOffset with OCI_FETCH_RELATIVE is equivalent to 
+OCI_FETCH_CURRENT with a value of 0, is equivalent to 
+OCI_FETCH_NEXT with a value of 1, and equivalent to 
+OCI_FETCH_PRIOR with a value of -1. Note that the range of 
+accessible rows is [1,OCI_ATTR_ROW_COUNT] beyond which an 
+error could be raised if sufficient rows do not exist in 
+
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+It defaults to 1 for orientation OCI_FETCH_LAST.
+orientation (IN) -  The acceptable values are as follows, with 
+OCI_FETCH_NEXT being the default value.
+OCI_FETCH_CURRENT gets the current row, 
+OCI_FETCH_NEXT gets the next row from the current position,
+OCI_FETCH_FIRST gets the first row in the result set,
+OCI_FETCH_LAST gets the last row in the result set, 
+OCI_FETCH_PRIOR gets the previous row from the current row in the result set, 
+OCI_FETCH_ABSOLUTE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using absolute positioning,
+OCI_FETCH_RELATIVE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using relative positioning.
+scrollOffset(IN) - offset used with the OCI_FETCH_ABSOLUTE and 
+OCI_FETCH_RELATIVE orientation parameters only. It specify
+the new current position for scrollable result set. It is 
+ignored for non-scrollable result sets. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+
+
+OCIStmtGetPieceInfo()
+Name
+OCI Get Piece Information
+Purpose
+Returns piece information for a piecewise operation.
+Syntax
+sword OCIStmtGetPieceInfo( const OCIStmt  *stmtp,
+                         OCIError       *errhp,
+                         void          **hndlpp,
+                         ub4            *typep,
+                         ub1            *in_outp,
+                         ub4            *iterp, 
+                         ub4            *idxp,
+                         ub1            *piecep );
+
+Comments
+When an execute/fetch call returns OCI_NEED_DATA to get/return a 
+dynamic bind/define value or piece, OCIStmtGetPieceInfo() returns the 
+relevant information: bind/define handle, iteration or index number and 
+which piece.
+See the section "Runtime Data Allocation and Piecewise Operations" on page 
+5-16 for more information about using OCIStmtGetPieceInfo().
+Parameters
+stmtp (IN) - the statement when executed returned OCI_NEED_DATA. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+hndlpp (OUT) - returns a pointer to the bind or define handle of the bind or 
+define whose runtime data is required or is being provided.
+typep (OUT) - the type of the handle pointed to by hndlpp: OCI_HTYPE_BIND 
+(for a bind handle) or OCI_HTYPE_DEFINE (for a define handle).
+in_outp (OUT) - returns OCI_PARAM_IN if the data is required for an IN bind 
+value. Returns OCI_PARAM_OUT if the data is available as an OUT bind 
+variable or a define position value.
+iterp (OUT) - returns the row number of a multiple row operation.
+idxp (OUT) - the index of an array element of a PL/SQL array bind operation.
+piecep (OUT) - returns one of the following defined values - 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE and 
+OCI_LAST_PIECE. The default value is always OCI_ONE_PIECE. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtSetPieceInfo()
+
+
+
+
+OCIStmtPrepare()
+Name
+OCI Statement REQuest
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     const OraText   *stmt, 
+                     ub4          stmt_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The 
+OCIStmtPrepare() call defines an application request. 
+This is a purely local call. Data values for this statement initialized in 
+subsequent bind calls will be stored in a bind handle which will hang off this 
+statement handle.
+This call does not create an association between this statement handle and any 
+particular server.
+See the section "Preparing Statements" on page 2-21 for more information 
+about using this call.
+Parameters
+stmtp (IN) - a statement handle.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-terminated 
+string. The pointer to the OraText of the statement must be available as long 
+as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server. 
+mode (IN) - the only defined mode is OCI_DEFAULT for default mode. 
+Example
+This example demonstrates the use of OCIStmtPrepare(), as well as the OCI 
+application initialization calls.
+Related Functions
+OCIAttrGet(), OCIStmtExecute()
+
+
+OCIStmtPrepare2()
+Name
+OCI Statement REQuest with (a) early binding to svchp and/or
+(b) stmt caching
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp,
+                     OCIStmt      **stmtp,
+                     OCIError     *errhp,
+                     const OraText   *stmt,
+                     ub4          stmt_len,
+                     const OraText *key,
+                     ub4          key_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call creates an association between the statement handle and a service
+context. It differs from OCIStmtPrepare in that respect.It also supports
+stmt caching. The stmt will automatically be cached if the authp of the stmt
+has enabled stmt caching.
+Parameters
+svchp (IN) - the service context handle that contains the session that
+             this stmt handle belongs to.
+stmtp (OUT) - an unallocated stmt handle must be pased in. An allocated
+              and prepared  statement handle will be returned.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+            terminated string. The pointer to the OraText of the statement 
+            must be available as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to search with. It thus optimizes the search in the cache.
+key_len (IN) - the length of the key. This, too, is onlly valid for stmt
+               caching.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the defined modes are OCI_DEFAULT and OCI_PREP2_CACHE_SEARCHONLY.
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtRelease()
+
+
+OCIStmtRelease()
+Name
+OCI Statement Release. This call is used to relesae the stmt that
+was retreived using OCIStmtPrepare2(). If the stmt is release
+using this call, OCIHandleFree() must not be called on the stmt
+handle.
+Purpose
+This call releases the statement obtained by OCIStmtPrepare2
+Syntax
+sword OCIStmtRelease ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     cONST OraText *key,
+                     ub4          key_len,
+                     ub4          mode);
+Comments
+This call is used to release a handle obtained via OCIStmtPrepare2().
+It also frees the memory associated with the handle.
+This is a purely local call.
+Parameters
+stmtp (IN/OUT) - The statement handle to be released/freed.
+errhp (IN) - an error handle to retrieve diagnostic information.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to tag the stmt with.
+key_len (IN) - the length of the key. This, too, is only valid for stmt
+               caching.
+mode (IN) - the defined modes are OCI_DEFAULT for default mode and
+            OCI_STRLS_CACHE_DELETE (only used for Stmt Caching).
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtPrepare2()
+
+
+OCIStmtSetPieceInfo()
+Name
+OCI Set Piece Information
+Purpose
+Sets piece information for a piecewise operation.
+Syntax
+sword OCIStmtSetPieceInfo ( void             *hndlp,
+                          ub4               type,
+                          OCIError          *errhp,
+                          const void       *bufp,
+                          ub4               *alenp, 
+                          ub1               piece,
+                          const void       *indp, 
+                          ub2               *rcodep ); 
+Comments
+When an execute call returns OCI_NEED_DATA to get a dynamic IN/OUT 
+bind value or piece, OCIStmtSetPieceInfo() sets the piece information: the 
+buffer, the length, the indicator and which piece is currently being processed.
+For more information about using OCIStmtSetPieceInfo() see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+hndlp (IN/OUT) - the bind/define handle.
+type (IN) - type of the handle. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN/OUT) - bufp is a pointer to a storage containing the data value or 
+the piece when it is an IN bind variable, otherwise bufp is a pointer to 
+storage for getting a piece or a value for OUT binds and define variables. For
+named data types or REFs, a pointer to the object or REF is returned.
+alenp (IN/OUT) - the length of the piece or the value. 
+piece (IN) - the piece parameter. The following are valid values: 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or 
+OCI_LAST_PIECE. 
+The default value is OCI_ONE_PIECE. This parameter is used for IN bind 
+variables only.
+indp (IN/OUT) - indicator. A pointer to a sb2 value or pointer to an indicator 
+structure for named data types (SQLT_NTY) and REFs (SQLT_REF), i.e., *indp 
+is either an sb2 or a void * depending upon the data type.
+rcodep (IN/OUT) - return code. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtGetPieceInfo()
+
+
+OCIFormatInit
+Name
+OCIFormat Package Initialize
+Purpose
+Initializes the OCIFormat package.
+Syntax
+sword OCIFormatInit(void *hndl, OCIError *err);
+Comments
+This routine must be called before calling any other OCIFormat routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatTerm()
+
+
+OCIFormatString
+Name
+OCIFormat Package Format String
+Purpose
+Writes a text string into the supplied text buffer using the argument
+list submitted to it and in accordance with the format string given.
+Syntax
+sword OCIFormatString(void *hndl, OCIError *err, OraText *buffer,
+                      sbig_ora bufferLength, sbig_ora *returnLength,
+                      const OraText *formatString, ...);
+Comments
+The first call to this routine must be preceded by a call to the
+OCIFormatInit routine that initializes the OCIFormat package
+for use.  When this routine is no longer needed then terminate
+the OCIFormat package by a call to the OCIFormatTerm routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl         (IN/OUT) - OCI environment or session handle
+err          (IN/OUT) - OCI error handle
+buffer       (OUT)    - text buffer for the string
+bufferLength (IN)     - length of the text buffer
+returnLength (OUT)    - length of the formatted string
+formatString (IN)     - format specification string
+...          (IN)     - variable argument list
+Related Functions
+
+
+OCIFormatTerm 
+Name
+OCIFormat Package Terminate
+Purpose
+Terminates the OCIFormat package.
+Syntax
+sword OCIFormatTerm(void *hndl, OCIError *err);
+Comments
+It must be called after the OCIFormat package is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatInit()
+
+
+OCIFormatTUb1
+Name
+OCIFormat Package ub1 Type
+Purpose
+Return the type value for the ub1 type.
+Syntax
+sword OCIFormatTUb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb2
+Name
+OCIFormat Package ub2 Type
+Purpose
+Return the type value for the ub2 type.
+Syntax
+sword OCIFormatTUb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb4
+Name
+OCIFormat Package ub4 Type
+Purpose
+Return the type value for the ub4 type.
+Syntax
+sword OCIFormatTUb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUword
+Name
+OCIFormat Package uword Type
+Purpose
+Return the type value for the uword type.
+Syntax
+sword OCIFormatTUword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUbig_ora
+Name
+OCIFormat Package ubig_ora Type
+Purpose
+Return the type value for the ubig_ora type.
+Syntax
+sword OCIFormatTUbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb1
+Name
+OCIFormat Package sb1 Type
+Purpose
+Return the type value for the sb1 type.
+Syntax
+sword OCIFormatTSb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb2
+Name
+OCIFormat Package sb2 Type
+Purpose
+Return the type value for the sb2 type.
+Syntax
+sword OCIFormatTSb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb4
+Name
+OCIFormat Package sb4 Type
+Purpose
+Return the type value for the sb4 type.
+Syntax
+sword OCIFormatTSb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSword
+Name
+OCIFormat Package sword Type
+Purpose
+Return the type value for the sword type.
+Syntax
+sword OCIFormatTSword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSbig_ora
+Name
+OCIFormat Package sbig_ora Type
+Purpose
+Return the type value for the sbig_ora type.
+Syntax
+sword OCIFormatTSbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb1
+Name
+OCIFormat Package eb1 Type
+Purpose
+Return the type value for the eb1 type.
+Syntax
+sword OCIFormatTEb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb2
+Name
+OCIFormat Package eb2 Type
+Purpose
+Return the type value for the eb2 type.
+Syntax
+sword OCIFormatTEb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb4
+Name
+OCIFormat Package eb4 Type
+Purpose
+Return the type value for the eb4 type.
+Syntax
+sword OCIFormatTEb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEword
+Name
+OCIFormat Package eword Type
+Purpose
+Return the type value for the eword type.
+Syntax
+sword OCIFormatTEword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTChar
+Name
+OCIFormat Package text Type
+Purpose
+Return the type value for the text type.
+Syntax
+sword OCIFormatTChar(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTText
+Name
+OCIFormat Package *text Type
+Purpose
+Return the type value for the *text type.
+Syntax
+sword OCIFormatTText(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTDouble
+Name
+OCIFormat Package double Type
+Purpose
+Return the type value for the double type.
+Syntax
+sword OCIFormatTDouble(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatDvoid
+Name
+OCIFormat Package void Type
+Purpose
+Return the type value for the void type.
+Syntax
+sword OCIFormatTDvoid(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEnd
+Name
+OCIFormat Package end Type
+Purpose
+Return the list terminator's "type".
+Syntax
+sword OCIFormatTEnd(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCISvcCtxToLda()
+Name
+OCI toggle SerVice context handle to Version 7 Lda_Def
+Purpose
+Toggles between a V8 service context handle and a V7 Lda_Def.
+Syntax
+sword OCISvcCtxToLda ( OCISvcCtx    *srvhp,
+                     OCIError     *errhp,
+                     Lda_Def      *ldap );
+Comments
+Toggles between an Oracle8 service context handle and an Oracle7 Lda_Def.
+This function can only be called after a service context has been properly 
+initialized.
+Once the service context has been translated to an Lda_Def, it can be used in 
+release 7.x OCI calls (e.g., obindps(), ofen()).
+Note: If there are multiple service contexts which share the same server 
+handle, only one can be in V7 mode at any time.
+The action of this call can be reversed by passing the resulting Lda_Def to 
+the OCILdaToSvcCtx() function.
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ldap (IN/OUT) - a Logon Data Area for V7-style OCI calls which is initialized 
+by this call. 
+Related Functions
+OCILdaToSvcCtx()
+
+
+
+
+OCITransCommit()
+Name
+OCI TX (transaction) CoMmit
+Purpose
+Commits the transaction associated with a specified service context.
+Syntax
+sword OCITransCommit ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags );
+Comments
+The transaction currently associated with the service context is committed. If 
+it is a distributed transaction that the server cannot commit, this call 
+additionally retrieves the state of the transaction from the database to be 
+returned to the user in the error handle.
+If the application has defined multiple transactions, this function operates 
+on the transaction currently associated with the service context. If the 
+application is working with only the implicit local transaction created when 
+database changes are made, that implicit transaction is committed.
+If the application is running in the object mode, then the modified or updated 
+objects in the object cache for this transaction are also committed.
+The flags parameter is used for one-phase commit optimization in distributed 
+transactions. If the transaction is non-distributed, the flags parameter is 
+ignored, and OCI_DEFAULT can be passed as its value. OCI applications 
+managing global transactions should pass a value of 
+OCI_TRANS_TWOPHASE to the flags parameter for a two-phase commit. The 
+default is one-phase commit.
+Under normal circumstances, OCITransCommit() returns with a status 
+indicating that the transaction has either been committed or rolled back. With 
+distributed transactions, it is possible that the transaction is now in-doubt 
+(i.e., neither committed nor aborted). In this case, OCITransCommit() 
+attempts to retrieve the status of the transaction from the server. 
+The status is returned.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags -see the "Comments" section above.
+Related Functions
+OCITransRollback()
+
+
+
+
+OCITransDetach()
+Name
+OCI TX (transaction) DeTach
+Purpose
+Detaches a transaction.
+Syntax
+sword OCITransDetach ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags);
+Comments
+Detaches a global transaction from the service context handle. The transaction 
+currently attached to the service context handle becomes inactive at the end 
+of this call. The transaction may be resumed later by calling OCITransStart(), 
+specifying  a flags value of OCI_TRANS_RESUME.
+When a transaction is detached, the value which was specified in the timeout 
+parameter of OCITransStart() when the transaction was started is used to 
+determine the amount of time the branch can remain inactive before being 
+deleted by the server's PMON process.
+Note: The transaction can be resumed by a different process than the one 
+that detached it, provided that the transaction has the same 
+authorization.
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransStart()
+
+
+
+OCITransForget()
+Name
+OCI TX (transaction) ForGeT
+Purpose
+Causes the server to forget a heuristically completed global transaction.
+Syntax
+sword OCITransForget ( OCISvcCtx     *svchp, 
+                     OCIError      *errhp,
+                     ub4           flags);
+
+Comments
+
+Forgets a heuristically completed global transaction. The server deletes the 
+status of the transaction from the system's pending transaction table.
+The XID of the transaction to be forgotten is set as an attribute of the 
+transaction handle (OCI_ATTR_XID).
+Parameters
+srvcp (IN) - the service context handle - the transaction is rolled back.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransRollback()
+
+
+OCITransMultiPrepare() 
+Name
+OCI Trans(action) Multi-Branch Prepare
+Purpose
+Prepares a transaction with multiple branches in a single call.
+Syntax
+sword OCITransMultiPrepare ( OCISvcCtx    *svchp,
+                             ub4           numBranches,
+                             OCITrans     **txns,
+                             OCIError     **errhp);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+This call is an advanced performance feature intended for use only in
+situations where the caller is responsible for preparing all the branches
+in a transaction. 
+Parameters
+srvcp (IN) - the service context handle. 
+numBranches (IN) - This is the number of branches expected. It is also the
+array size for the next two parameters.
+txns (IN) - This is the array of transaction handles for the branches to
+prepare. They should all have the OCI_ATTR_XID set. The global transaction
+ID should be the same.
+errhp (IN) - This is the array of error handles. If OCI_SUCCESS is not
+returned, then these will indicate which branches received which errors.
+Related Functions
+OCITransPrepare()
+
+
+OCITransPrepare()
+Name
+OCI TX (transaction) PREpare
+Purpose
+Prepares a transaction for commit.
+Syntax
+sword OCITransPrepare ( OCISvcCtx    *svchp, 
+                      OCIError     *errhp,
+                      ub4          flags);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+The call returns OCI_SUCCESS_WITH_INFO if the transaction has not made 
+any changes. The error handle will indicate that the transaction is read-only. 
+The flag parameter is not currently used. 
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransForget()
+
+
+
+
+OCITransRollback()
+Name
+OCI TX (transaction) RoLlback
+Purpose
+Rolls back the current transaction.
+Syntax
+sword OCITransRollback ( void        *svchp, 
+                       OCIError     *errhp,
+                       ub4          flags );
+Comments
+The current transaction- defined as the set of statements executed since the 
+last OCITransCommit() or since OCISessionBegin()-is rolled back.
+If the application is running under object mode then the modified or updated 
+objects in the object cache for this transaction are also rolled back.
+An error is returned if an attempt is made to roll back a global transaction 
+that is not currently active.
+Parameters
+svchp (IN) - a service context handle. The transaction currently set in the 
+service context handle is rolled back.
+errhp -(IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit()
+
+
+
+
+OCITransStart()
+Name
+OCI TX (transaction) STart
+Purpose
+Sets the beginning of a transaction.
+Syntax
+sword OCITransStart ( OCISvcCtx    *svchp, 
+                    OCIError     *errhp, 
+                    uword        timeout,
+                    ub4          flags);
+
+Comments
+This function sets the beginning of a global or serializable transaction. The 
+transaction context currently associated with the service context handle is 
+initialized at the end of the call if the flags parameter specifies that a new 
+transaction should be started.
+The XID of the transaction is set as an attribute of the transaction handle 
+(OCI_ATTR_XID)
+Parameters
+svchp (IN/OUT) - the service context handle. The transaction context in the 
+service context handle is initialized at the end of the call if the flag 
+specified a new transaction to be started.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+err and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+timeout (IN) - the time, in seconds, to wait for a transaction to become 
+available for resumption when OCI_TRANS_RESUME is specified. When 
+OCI_TRANS_NEW is specified, this value is stored and may be used later by 
+OCITransDetach().
+flags (IN) - specifies whether a new transaction is being started or an 
+existing transaction is being resumed. Also specifies serializiability or 
+read-only status. More than a single value can be specified. By default, 
+a read/write transaction is started. The flag values are:
+OCI_TRANS_NEW - starts a new transaction branch. By default starts a 
+tightly coupled and migratable branch.
+OCI_TRANS_TIGHT - explicitly specifies a tightly coupled branch
+OCI_TRANS_LOOSE - specifies a loosely coupled branch
+OCI_TRANS_RESUME - resumes an existing transaction branch. 
+OCI_TRANS_READONLY - start a readonly transaction
+OCI_TRANS_SERIALIZABLE - start a serializable transaction
+Related Functions
+OCITransDetach()
+
+
+
+
+
+******************************************************************************/
+/*-----------------------Dynamic Callback Function Pointers------------------*/
+ 
+ 
+typedef sb4 (*OCICallbackInBind)(void  *ictxp, OCIBind *bindp, ub4 iter,
+                                  ub4 index, void  **bufpp, ub4 *alenp,
+                                  ub1 *piecep, void  **indp);
+ 
+typedef sb4 (*OCICallbackOutBind)(void  *octxp, OCIBind *bindp, ub4 iter,
+                                 ub4 index, void  **bufpp, ub4 **alenp,
+                                 ub1 *piecep, void  **indp,
+                                 ub2 **rcodep);
+ 
+typedef sb4 (*OCICallbackDefine)(void  *octxp, OCIDefine *defnp, ub4 iter,
+                                 void  **bufpp, ub4 **alenp, ub1 *piecep,
+                                 void  **indp, ub2 **rcodep);
+
+typedef sword (*OCIUserCallback)(void  *ctxp, void  *hndlp, ub4 type,
+                                 ub4 fcode, ub4 when, sword returnCode,
+                                 sb4 *errnop, va_list arglist);
+
+typedef sword (*OCIEnvCallbackType)(OCIEnv *env, ub4 mode,
+                                   size_t xtramem_sz, void  *usrmemp,
+                                   OCIUcb *ucbDesc); 
+
+typedef sb4 (*OCICallbackLobRead)(void  *ctxp, const void  *bufp,
+                                             ub4 len, ub1 piece);
+
+typedef sb4 (*OCICallbackLobWrite)(void  *ctxp, void  *bufp, 
+                                          ub4 *lenp, ub1 *piece);
+
+#ifdef ORAXB8_DEFINED
+
+typedef sb4 (*OCICallbackLobRead2)(void  *ctxp, const void  *bufp, oraub8 len,
+                                   ub1 piece, void  **changed_bufpp,
+                                   oraub8 *changed_lenp);
+
+typedef sb4 (*OCICallbackLobWrite2)(void  *ctxp, void  *bufp, oraub8 *lenp,
+                                    ub1 *piece, void  **changed_bufpp,
+                                    oraub8 *changed_lenp);
+
+typedef sb4 (*OCICallbackLobArrayRead)(void  *ctxp, ub4 array_iter,
+                                       const void  *bufp, oraub8 len,
+                                       ub1 piece, void  **changed_bufpp,
+                                       oraub8 *changed_lenp);
+
+typedef sb4 (*OCICallbackLobArrayWrite)(void  *ctxp, ub4 array_iter,
+                                        void  *bufp, oraub8 *lenp,
+                                        ub1 *piece, void  **changed_bufpp,
+                                        oraub8 *changed_lenp);
+#endif
+
+typedef sb4 (*OCICallbackLobGetDeduplicateRegions)(void *ctxp,
+                                              OCILobRegion *regions,
+                                              ub4 count, ub1 piece,
+                                              OCILobRegion **changed_reg,
+                                              ub4 *changed_count);
+
+typedef sb4 (*OCICallbackAQEnq)(void  *ctxp, void  **payload, 
+                                void  **payload_ind);
+
+typedef sb4 (*OCICallbackAQEnqStreaming)(void  *ctxp, void  **payload, 
+                                         void  **payload_ind,
+                                         OCIAQMsgProperties  **msgprop,
+                                         OCIType **tdo);
+
+typedef sb4 (*OCICallbackAQDeq)(void  *ctxp, void  **payload, 
+                                void  **payload_ind);
+
+/*--------------------------Failover Callback Structure ---------------------*/
+typedef sb4 (*OCICallbackFailover)(void  *svcctx, void  *envctx,
+                                   void  *fo_ctx, ub4 fo_type,
+                                   ub4 fo_event);
+
+typedef struct
+{
+  OCICallbackFailover callback_function;
+  void  *fo_ctx;
+} 
+OCIFocbkStruct;
+
+/*---------------------Statement Cache callback function ------------------*/
+
+typedef sword (*OCICallbackStmtCache)(void *ctx, OCIStmt *stmt, ub4 mode);
+
+/*--------------------------HA Callback Structure ---------------------*/
+typedef void (*OCIEventCallback)(void  *evtctx, OCIEvent *eventhp);
+
+
+/*------------------------- Round Trip Callback Structure --------------------*/
+typedef sword (*OCIRoundTripCallback)(void  *rtctx, OCISvcCtx *svch,
+                                      OCISession *userh);
+
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+sword   OCIInitialize   (ub4 mode, void  *ctxp, 
+                 void  *(*malocfp)(void  *ctxp, size_t size),
+                 void  *(*ralocfp)(void  *ctxp, void  *memptr, size_t newsize),
+                 void   (*mfreefp)(void  *ctxp, void  *memptr) );
+
+sword   OCITerminate( ub4 mode);
+
+sword   OCIEnvCreate (OCIEnv **envp, ub4 mode, void  *ctxp,
+                 void  *(*malocfp)(void  *ctxp, size_t size),
+                 void  *(*ralocfp)(void  *ctxp, void  *memptr, size_t newsize),
+                 void   (*mfreefp)(void  *ctxp, void  *memptr),
+                 size_t xtramem_sz, void  **usrmempp);
+
+sword   OCIEnvNlsCreate (OCIEnv **envp, ub4 mode, void  *ctxp,
+                 void  *(*malocfp)(void  *ctxp, size_t size),
+                 void  *(*ralocfp)(void  *ctxp, void  *memptr, size_t newsize),
+                 void   (*mfreefp)(void  *ctxp, void  *memptr),
+                 size_t xtramem_sz, void  **usrmempp,
+                 ub2 charset, ub2 ncharset);
+
+sword   OCIFEnvCreate (OCIEnv **envp, ub4 mode, void  *ctxp,
+                 void  *(*malocfp)(void  *ctxp, size_t size),
+                 void  *(*ralocfp)(void  *ctxp, void  *memptr, size_t newsize),
+                 void   (*mfreefp)(void  *ctxp, void  *memptr),
+                 size_t xtramem_sz, void  **usrmempp, void  *fupg);
+
+sword   OCIHandleAlloc(const void  *parenth, void  **hndlpp, const ub4 type, 
+                       const size_t xtramem_sz, void  **usrmempp);
+
+sword   OCIHandleFree(void  *hndlp, const ub4 type);
+
+
+sword   OCIDescriptorAlloc(const void  *parenth, void  **descpp, 
+                           const ub4 type, const size_t xtramem_sz, 
+                           void  **usrmempp);
+
+sword   OCIArrayDescriptorAlloc(const void  *parenth, void  **descpp, 
+                           const ub4 type, ub4 array_size, 
+                           const size_t xtramem_sz, void  **usrmempp);
+
+sword   OCIDescriptorFree(void  *descp, const ub4 type);
+
+sword   OCIArrayDescriptorFree(void  **descp, const ub4 type);
+
+sword   OCIEnvInit (OCIEnv **envp, ub4 mode, 
+                    size_t xtramem_sz, void  **usrmempp);
+
+sword   OCIServerAttach  (OCIServer *srvhp, OCIError *errhp,
+                          const OraText *dblink, sb4 dblink_len, ub4 mode);
+
+sword   OCIServerDetach  (OCIServer *srvhp, OCIError *errhp, ub4 mode);
+
+sword   OCISessionBegin  (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp,
+                          ub4 credt, ub4 mode);
+
+sword   OCISessionEnd   (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp, 
+                         ub4 mode);
+
+sword   OCILogon (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, 
+                  const OraText *username, ub4 uname_len, 
+                  const OraText *password, ub4 passwd_len, 
+                  const OraText *dbname, ub4 dbname_len);
+
+sword   OCILogon2 (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                  const OraText *username, ub4 uname_len,
+                  const OraText *password, ub4 passwd_len,
+                  const OraText *dbname, ub4 dbname_len,
+                  ub4 mode);
+
+sword   OCILogoff (OCISvcCtx *svchp, OCIError *errhp);
+
+
+sword   OCIPasswordChange   (OCISvcCtx *svchp, OCIError *errhp, 
+                             const OraText *user_name, ub4 usernm_len, 
+                             const OraText *opasswd, ub4 opasswd_len, 
+                             const OraText *npasswd, ub4 npasswd_len, 
+                             ub4 mode);
+
+sword   OCIStmtPrepare   (OCIStmt *stmtp, OCIError *errhp, const OraText *stmt,
+                          ub4 stmt_len, ub4 language, ub4 mode);
+
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp, OCIStmt **stmtp, OCIError *errhp,
+                     const OraText *stmt, ub4 stmt_len, const OraText *key,
+                     ub4 key_len, ub4 language, ub4 mode);
+
+sword OCIStmtRelease ( OCIStmt *stmtp, OCIError *errhp, const OraText *key,
+                       ub4 key_len, ub4 mode);
+
+sword   OCIBindByPos  (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+                       ub4 position, void  *valuep, sb4 value_sz,
+                       ub2 dty, void  *indp, ub2 *alenp, ub2 *rcodep,
+                       ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   OCIBindByName   (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+                         const OraText *placeholder, sb4 placeh_len, 
+                         void  *valuep, sb4 value_sz, ub2 dty, 
+                         void  *indp, ub2 *alenp, ub2 *rcodep, 
+                         ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   OCIBindObject  (OCIBind *bindp, OCIError *errhp, const OCIType *type, 
+                        void  **pgvpp, ub4 *pvszsp, void  **indpp, 
+                        ub4 *indszp);
+
+sword   OCIBindDynamic   (OCIBind *bindp, OCIError *errhp, void  *ictxp,
+                          OCICallbackInBind icbfp, void  *octxp,
+                          OCICallbackOutBind ocbfp);
+
+sword   OCIBindArrayOfStruct   (OCIBind *bindp, OCIError *errhp, 
+                                ub4 pvskip, ub4 indskip,
+                                ub4 alskip, ub4 rcskip);
+
+sword   OCIStmtGetPieceInfo   (OCIStmt *stmtp, OCIError *errhp, 
+                               void  **hndlpp, ub4 *typep,
+                               ub1 *in_outp, ub4 *iterp, ub4 *idxp, 
+                               ub1 *piecep);
+
+sword   OCIStmtSetPieceInfo   (void  *hndlp, ub4 type, OCIError *errhp, 
+                               const void  *bufp, ub4 *alenp, ub1 piece, 
+                               const void  *indp, ub2 *rcodep);
+
+sword   OCIStmtExecute  (OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, 
+                         ub4 iters, ub4 rowoff, const OCISnapshot *snap_in, 
+                         OCISnapshot *snap_out, ub4 mode);
+
+sword   OCIDefineByPos  (OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+                         ub4 position, void  *valuep, sb4 value_sz, ub2 dty,
+                         void  *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+
+sword   OCIDefineObject  (OCIDefine *defnp, OCIError *errhp, 
+                          const OCIType *type, void  **pgvpp, 
+                          ub4 *pvszsp, void  **indpp, ub4 *indszp);
+
+sword   OCIDefineDynamic   (OCIDefine *defnp, OCIError *errhp, void  *octxp,
+                            OCICallbackDefine ocbfp);
+
+sword   OCIRowidToChar  (OCIRowid *rowidDesc, OraText *outbfp, ub2 *outbflp,
+                         OCIError *errhp);
+
+sword   OCIDefineArrayOfStruct  (OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+                                 ub4 indskip, ub4 rlskip, ub4 rcskip);
+
+sword   OCIStmtFetch   (OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+                        ub2 orientation, ub4 mode);
+
+sword   OCIStmtFetch2   (OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+                        ub2 orientation, sb4 scrollOffset, ub4 mode);
+
+sword   OCIStmtGetBindInfo   (OCIStmt *stmtp, OCIError *errhp, ub4 size, 
+                              ub4 startloc,
+                              sb4 *found, OraText *bvnp[], ub1 bvnl[],
+                              OraText *invp[], ub1 inpl[], ub1 dupl[],
+                              OCIBind **hndl);
+
+sword   OCIDescribeAny  (OCISvcCtx *svchp, OCIError *errhp, 
+                         void  *objptr, 
+                         ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+                         ub1 objtyp, OCIDescribe *dschp);
+
+sword   OCIParamGet (const void  *hndlp, ub4 htype, OCIError *errhp, 
+                     void  **parmdpp, ub4 pos);
+
+sword   OCIParamSet(void  *hdlp, ub4 htyp, OCIError *errhp, const void  *dscp,
+                    ub4 dtyp, ub4 pos);
+
+sword   OCITransStart  (OCISvcCtx *svchp, OCIError *errhp, 
+                        uword timeout, ub4 flags );
+
+sword   OCITransDetach  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags );
+
+sword   OCITransCommit  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransRollback  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransPrepare (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransMultiPrepare (OCISvcCtx *svchp, ub4 numBranches, 
+                              OCITrans **txns, OCIError **errhp);
+
+sword   OCITransForget (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCIErrorGet   (void  *hndlp, ub4 recordno, OraText *sqlstate,
+                       sb4 *errcodep, OraText *bufp, ub4 bufsiz, ub4 type);
+
+sword   OCILobAppend  (OCISvcCtx *svchp, OCIError *errhp, 
+                       OCILobLocator *dst_locp,
+                       OCILobLocator *src_locp);
+
+sword   OCILobAssign (OCIEnv *envhp, OCIError *errhp, 
+                      const OCILobLocator *src_locp, 
+                      OCILobLocator **dst_locpp);
+
+sword   OCILobCharSetForm (OCIEnv *envhp, OCIError *errhp, 
+                           const OCILobLocator *locp, ub1 *csfrm);
+
+sword   OCILobCharSetId (OCIEnv *envhp, OCIError *errhp, 
+                         const OCILobLocator *locp, ub2 *csid);
+
+sword   OCILobCopy (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+                    OCILobLocator *src_locp, ub4 amount, ub4 dst_offset, 
+                    ub4 src_offset);
+
+sword OCILobCreateTemporary(OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration);
+
+
+sword OCILobClose( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp );
+
+
+sword   OCILobDisableBuffering (OCISvcCtx      *svchp,
+                                OCIError       *errhp,
+                                OCILobLocator  *locp);
+
+sword   OCILobEnableBuffering (OCISvcCtx      *svchp,
+                               OCIError       *errhp,
+                               OCILobLocator  *locp);
+
+sword   OCILobErase (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      ub4 *amount, ub4 offset);
+
+sword   OCILobFileClose (OCISvcCtx *svchp, OCIError *errhp, 
+                         OCILobLocator *filep);
+
+sword   OCILobFileCloseAll (OCISvcCtx *svchp, OCIError *errhp);
+
+sword   OCILobFileExists (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *filep,
+                          boolean *flag);
+
+sword   OCILobFileGetName (OCIEnv *envhp, OCIError *errhp, 
+                           const OCILobLocator *filep, 
+                           OraText *dir_alias, ub2 *d_length, 
+                           OraText *filename, ub2 *f_length);
+
+sword   OCILobFileIsOpen (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *filep,
+                          boolean *flag);
+
+sword   OCILobFileOpen (OCISvcCtx *svchp, OCIError *errhp, 
+                        OCILobLocator *filep,
+                        ub1 mode);
+
+sword   OCILobFileSetName (OCIEnv *envhp, OCIError *errhp, 
+                           OCILobLocator **filepp, 
+                           const OraText *dir_alias, ub2 d_length, 
+                           const OraText *filename, ub2 f_length);
+
+sword   OCILobFlushBuffer (OCISvcCtx       *svchp,
+                           OCIError        *errhp,
+                           OCILobLocator   *locp,
+                           ub4              flag);
+
+sword OCILobFreeTemporary(OCISvcCtx          *svchp,
+                          OCIError           *errhp,
+                          OCILobLocator      *locp);
+
+sword OCILobGetChunkSize(OCISvcCtx         *svchp,
+                         OCIError          *errhp,
+                         OCILobLocator     *locp,
+                         ub4               *chunksizep);
+
+sword   OCILobGetLength  (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *locp,
+                          ub4 *lenp);
+
+sword   OCILobIsEqual  (OCIEnv *envhp, const OCILobLocator *x, 
+                        const OCILobLocator *y, 
+                        boolean *is_equal);
+
+sword OCILobIsOpen( OCISvcCtx     *svchp,
+                    OCIError      *errhp,
+                    OCILobLocator *locp,
+                    boolean       *flag);
+
+sword OCILobIsTemporary(OCIEnv            *envp,
+                        OCIError          *errhp,
+                        OCILobLocator     *locp,
+                        boolean           *is_temporary);
+
+sword   OCILobLoadFromFile (OCISvcCtx *svchp, OCIError *errhp, 
+                            OCILobLocator *dst_locp,
+                            OCILobLocator *src_filep, 
+                            ub4 amount, ub4 dst_offset, 
+                            ub4 src_offset);
+
+sword   OCILobLocatorAssign  (OCISvcCtx *svchp, OCIError *errhp, 
+                            const OCILobLocator *src_locp, 
+                            OCILobLocator **dst_locpp);
+
+
+sword   OCILobLocatorIsInit (OCIEnv *envhp, OCIError *errhp, 
+                             const OCILobLocator *locp, 
+                             boolean *is_initialized);
+
+sword   OCILobOpen( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp,
+                   ub1               mode );
+ 
+sword   OCILobRead  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     ub4 *amtp, ub4 offset, void  *bufp, ub4 bufl, void  *ctxp,
+                     OCICallbackLobRead cbfp, ub2 csid, ub1 csfrm);
+
+sword   OCILobTrim  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     ub4 newlen);
+
+sword   OCILobWrite  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      ub4 *amtp, ub4 offset, void  *bufp, ub4 buflen,
+                      ub1 piece,  void  *ctxp, OCICallbackLobWrite cbfp,
+                      ub2 csid, ub1 csfrm);
+
+sword OCILobGetDeduplicateRegions(OCISvcCtx *svchp, OCIError *errhp, 
+                                  OCILobLocator *locp, 
+                                  OCILobRegion *regp, ub4 *count, ub1 piece,
+                                  void *ctxp,
+                                  OCICallbackLobGetDeduplicateRegions cbfp);
+
+sword OCILobWriteAppend(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *lobp,
+                        ub4 *amtp, void  *bufp, ub4 bufl, ub1 piece,
+                        void *ctxp, OCICallbackLobWrite cbfp, ub2 csid,
+                        ub1 csfrm);
+
+sword   OCIBreak (void  *hndlp, OCIError *errhp);
+
+sword   OCIReset (void  *hndlp, OCIError *errhp);
+
+sword   OCIServerVersion  (void  *hndlp, OCIError *errhp, OraText *bufp, 
+                           ub4 bufsz,
+                           ub1 hndltype);
+
+sword   OCIServerRelease  (void  *hndlp, OCIError *errhp, OraText *bufp,
+                           ub4 bufsz,
+                           ub1 hndltype, ub4 *version);
+
+sword   OCIAttrGet (const void  *trgthndlp, ub4 trghndltyp, 
+                    void  *attributep, ub4 *sizep, ub4 attrtype, 
+                    OCIError *errhp);
+
+sword   OCIAttrSet (void  *trgthndlp, ub4 trghndltyp, void  *attributep,
+                    ub4 size, ub4 attrtype, OCIError *errhp);
+
+sword   OCISvcCtxToLda (OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap);
+
+sword   OCILdaToSvcCtx (OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap);
+
+sword   OCIResultSetToStmt (OCIResult *rsetdp, OCIError *errhp);
+
+sword OCIFileClose ( void   *hndl, OCIError *err, OCIFileObject *filep );
+
+sword   OCIUserCallbackRegister(void  *hndlp, ub4 type, void  *ehndlp,
+                                    OCIUserCallback callback, void  *ctxp,
+                                    ub4 fcode, ub4 when, OCIUcb *ucbDesc);
+
+sword   OCIUserCallbackGet(void  *hndlp, ub4 type, void  *ehndlp,
+                               ub4 fcode, ub4 when, OCIUserCallback *callbackp,
+                               void  **ctxpp, OCIUcb *ucbDesc);
+
+sword   OCISharedLibInit(void  *metaCtx, void  *libCtx, ub4 argfmt, sword argc,
+                         void  **argv, OCIEnvCallbackType envCallback);
+
+sword OCIFileExists ( void   *hndl, OCIError *err, OraText *filename,
+                     OraText *path, ub1 *flag  );
+
+sword OCIFileFlush( void  *hndl, OCIError *err, OCIFileObject *filep  );
+
+
+sword OCIFileGetLength( void  *hndl, OCIError *err, OraText *filename,
+                        OraText *path, ubig_ora *lenp  );
+
+sword OCIFileInit ( void  *hndl, OCIError *err );
+
+sword OCIFileOpen ( void  *hndl, OCIError *err, OCIFileObject **filep,
+                    OraText *filename, OraText *path, ub4 mode, ub4 create, 
+                    ub4 type );
+
+sword OCIFileRead ( void  *hndl, OCIError *err, OCIFileObject *filep,
+                    void  *bufp, ub4 bufl, ub4 *bytesread );
+
+sword OCIFileSeek ( void  *hndl, OCIError *err, OCIFileObject *filep,
+                     uword origin, ubig_ora offset, sb1 dir );
+
+sword OCIFileTerm ( void  *hndl, OCIError *err );
+
+
+sword OCIFileWrite ( void  *hndl, OCIError *err, OCIFileObject   *filep,
+                     void  *bufp, ub4 buflen, ub4 *byteswritten );
+
+
+#ifdef ORAXB8_DEFINED
+
+sword   OCILobCopy2 (OCISvcCtx *svchp, OCIError *errhp,
+                     OCILobLocator *dst_locp,
+                     OCILobLocator *src_locp, oraub8 amount,
+                     oraub8 dst_offset, 
+                     oraub8 src_offset);
+
+sword   OCILobErase2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      oraub8 *amount, oraub8 offset);
+
+sword   OCILobGetLength2 (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *locp, oraub8 *lenp);
+
+sword   OCILobLoadFromFile2 (OCISvcCtx *svchp, OCIError *errhp, 
+                             OCILobLocator *dst_locp,
+                             OCILobLocator *src_filep, 
+                             oraub8 amount, oraub8 dst_offset, 
+                             oraub8 src_offset);
+
+sword   OCILobRead2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset,
+                     void  *bufp, oraub8 bufl, ub1 piece, void  *ctxp,
+                     OCICallbackLobRead2 cbfp, ub2 csid, ub1 csfrm);
+
+sword   OCILobArrayRead (OCISvcCtx *svchp, OCIError *errhp, ub4 *array_iter,
+                         OCILobLocator **lobp_arr, oraub8 *byte_amt_arr,
+                         oraub8 *char_amt_arr, oraub8 *offset_arr,
+                         void  **bufp_arr, oraub8 *bufl_arr, ub1 piece,
+                         void  *ctxp, OCICallbackLobArrayRead cbfp, ub2 csid,
+                         ub1 csfrm);
+
+sword   OCILobTrim2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     oraub8 newlen);
+
+sword   OCILobWrite2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset,
+                      void  *bufp, oraub8 buflen, ub1 piece, void  *ctxp, 
+                      OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm);
+
+sword   OCILobArrayWrite (OCISvcCtx *svchp, OCIError *errhp, ub4 *array_iter,
+                          OCILobLocator **lobp_arr, oraub8 *byte_amt_arr,
+                          oraub8 *char_amt_arr, oraub8 *offset_arr,
+                          void  **bufp_arr, oraub8 *bufl_arr, ub1 piece,
+                          void  *ctxp, OCICallbackLobArrayWrite cbfp, ub2 csid,
+                          ub1 csfrm);
+
+sword OCILobWriteAppend2 (OCISvcCtx *svchp, OCIError *errhp,
+                          OCILobLocator *lobp,
+                          oraub8 *byte_amtp, oraub8 *char_amtp, void  *bufp,
+                          oraub8 bufl, ub1 piece, void  *ctxp,
+                          OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm);
+
+sword OCILobGetStorageLimit (OCISvcCtx *svchp, OCIError *errhp,
+                             OCILobLocator *lobp, oraub8 *limitp);
+
+sword OCILobGetOptions (OCISvcCtx *svchp, OCIError *errhp,
+                        OCILobLocator *lobp,
+                        ub4 optypes, void *optionsp, ub4 *optionslenp,
+                        ub4 mode);
+
+sword OCILobSetOptions (OCISvcCtx *svchp, OCIError *errhp,
+                        OCILobLocator *lobp,
+                        ub4 optypes, void *optionsp, ub4 optionslen,
+                        ub4 mode);
+
+sword OCILobGetContentType (OCISvcCtx *svchp, 
+                            OCIError *errhp, OCILobLocator *lobp,
+                            oratext *contenttypep, ub4 *contenttypelenp,
+                            ub4 mode);
+
+sword OCILobSetContentType (OCISvcCtx *svchp,
+                            OCIError *errhp, OCILobLocator *lobp,
+                            const oratext *contenttypep, ub4 contenttypelen,
+                            ub4 mode);
+
+#endif
+
+/*
+ ** Initialize the security package
+ */
+sword   OCISecurityInitialize (OCISecurity *sechandle, OCIError *error_handle);
+
+sword   OCISecurityTerminate (OCISecurity *sechandle, OCIError *error_handle);
+
+sword OCISecurityOpenWallet(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            size_t wrllen,
+                            OraText *wallet_resource_locator,
+                            size_t pwdlen,
+                            OraText *password,
+                            nzttWallet *wallet);
+
+sword OCISecurityCloseWallet(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttWallet *wallet);
+
+sword OCISecurityCreateWallet(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              size_t wrllen,
+                              OraText *wallet_resource_locator,
+                              size_t pwdlen,
+                              OraText *password,
+                              nzttWallet *wallet);
+
+sword OCISecurityDestroyWallet(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               size_t wrllen,
+                               OraText *wallet_resource_locator,
+                               size_t pwdlen,
+                               OraText *password);
+
+sword OCISecurityStorePersona(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona **persona,
+                              nzttWallet *wallet);
+
+sword OCISecurityOpenPersona(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttPersona *persona);
+
+sword OCISecurityClosePersona(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona);
+
+sword OCISecurityRemovePersona(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona **persona);
+
+sword OCISecurityCreatePersona(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttIdentType identity_type,
+                               nzttCipherType cipher_type,
+                               nzttPersonaDesc *desc,
+                               nzttPersona **persona);
+
+sword OCISecuritySetProtection(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               nzttcef crypto_engine_function,
+                               nztttdufmt data_unit_format,
+                               nzttProtInfo *protection_info);
+
+sword OCISecurityGetProtection(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               nzttcef crypto_engine_function,
+                               nztttdufmt * data_unit_format_ptr,
+                               nzttProtInfo *protection_info);
+
+sword OCISecurityRemoveIdentity(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttIdentity **identity_ptr);
+
+sword OCISecurityCreateIdentity(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttIdentType type,
+                                nzttIdentityDesc *desc,
+                                nzttIdentity **identity_ptr);
+
+sword OCISecurityAbortIdentity(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttIdentity **identity_ptr);
+
+sword OCISecurityFreeIdentity(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttIdentity **identity_ptr);
+
+
+sword OCISecurityStoreTrustedIdentity(OCISecurity *osshandle,
+                                      OCIError *error_handle,
+                                      nzttIdentity **identity_ptr,
+                                      nzttPersona *persona);
+
+sword OCISecuritySign(OCISecurity *osshandle,
+                      OCIError *error_handle,
+                      nzttPersona *persona,
+                      nzttces signature_state,
+                      size_t input_length,
+                      ub1 *input,
+                      nzttBufferBlock *buffer_block);
+
+sword OCISecuritySignExpansion(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               size_t inputlen,
+                               size_t *signature_length);
+
+sword OCISecurityVerify(OCISecurity *osshandle,
+                        OCIError *error_handle,
+                        nzttPersona *persona,
+                        nzttces signature_state,
+                        size_t siglen,
+                        ub1 *signature,
+                        nzttBufferBlock *extracted_message,
+                        boolean *verified,
+                        boolean *validated,
+                        nzttIdentity **signing_party_identity);
+
+sword OCISecurityValidate(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          nzttPersona *persona,
+                          nzttIdentity *identity,
+                          boolean *validated);
+
+sword OCISecuritySignDetached(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona,
+                              nzttces signature_state,
+                              size_t input_length,
+                              ub1 * input,
+                              nzttBufferBlock *signature);
+
+sword OCISecuritySignDetExpansion(OCISecurity *osshandle,
+                                  OCIError *error_handle,
+                                  nzttPersona *persona,
+                                  size_t input_length,
+                                  size_t *required_buffer_length);
+
+sword OCISecurityVerifyDetached(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttPersona *persona,
+                                nzttces signature_state,
+                                size_t data_length,
+                                ub1 *data,
+                                size_t siglen,
+                                ub1 *signature,
+                                boolean *verified,
+                                boolean *validated,
+                                nzttIdentity **signing_party_identity);
+
+sword OCISecurity_PKEncrypt(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            size_t number_of_recipients,
+                            nzttIdentity *recipient_list,
+                            nzttces encryption_state,
+                            size_t input_length,
+                            ub1 *input,
+                            nzttBufferBlock *encrypted_data);
+
+sword OCISecurityPKEncryptExpansion(OCISecurity *osshandle,
+                                    OCIError *error_handle,
+                                    nzttPersona *persona,
+                                    size_t number_recipients,
+                                    size_t input_length,
+                                    size_t *buffer_length_required);
+
+sword OCISecurityPKDecrypt(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttPersona *persona,
+                           nzttces encryption_state,
+                           size_t input_length,
+                           ub1 *input,
+                           nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncrypt(OCISecurity *osshandle,
+                         OCIError *error_handle,
+                         nzttPersona *persona,
+                         nzttces encryption_state,
+                         size_t input_length,
+                         ub1 *input,
+                         nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncryptExpansion(OCISecurity *osshandle,
+                                  OCIError *error_handle,
+                                  nzttPersona *persona,
+                                  size_t input_length,
+                                  size_t *encrypted_data_length);
+
+sword OCISecurityDecrypt(OCISecurity *osshandle,
+                         OCIError *error_handle,
+                         nzttPersona *persona,
+                         nzttces decryption_state,
+                         size_t input_length,
+                         ub1 *input,
+                         nzttBufferBlock *decrypted_data);
+
+sword OCISecurityEnvelope(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          nzttPersona *persona,
+                          size_t number_of_recipients,
+                          nzttIdentity *identity,
+                          nzttces encryption_state,
+                          size_t input_length,
+                          ub1 *input,
+                          nzttBufferBlock *enveloped_data);
+
+sword OCISecurityDeEnvelope(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            nzttces decryption_state,
+                            size_t input_length,
+                            ub1 *input,
+                            nzttBufferBlock *output_message,
+                            boolean *verified,
+                            boolean *validated,
+                            nzttIdentity **sender_identity);
+
+sword OCISecurityKeyedHash(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttPersona *persona,
+                           nzttces hash_state,
+                           size_t input_length,
+                           ub1 *input,
+                           nzttBufferBlock *keyed_hash);
+
+sword OCISecurityKeyedHashExpansion(OCISecurity *osshandle,
+                                    OCIError *error_handle,
+                                    nzttPersona *persona,
+                                    size_t input_length,
+                                    size_t *required_buffer_length);
+
+sword OCISecurityHash(OCISecurity *osshandle,
+                      OCIError *error_handle,
+                      nzttPersona *persona,
+                      nzttces hash_state,
+                      size_t input,
+                      ub1 *input_length,
+                      nzttBufferBlock *hash);
+
+sword OCISecurityHashExpansion(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               size_t input_length,
+                               size_t *required_buffer_length);
+
+sword OCISecuritySeedRandom(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            size_t seed_length,
+                            ub1 *seed);
+
+sword OCISecurityRandomBytes(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttPersona *persona,
+                             size_t number_of_bytes_desired,
+                             nzttBufferBlock *random_bytes);
+
+sword OCISecurityRandomNumber(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona,
+                              uword *random_number_ptr);
+
+sword OCISecurityInitBlock(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttBufferBlock *buffer_block);
+
+sword OCISecurityReuseBlock(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttBufferBlock *buffer_block);
+
+sword OCISecurityPurgeBlock(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttBufferBlock *buffer_block);
+
+sword OCISecuritySetBlock(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          uword flags_to_set,
+                          size_t buffer_length,
+                          size_t used_buffer_length,
+                          ub1 *buffer,
+                          nzttBufferBlock *buffer_block);
+
+sword OCISecurityGetIdentity(OCISecurity   *osshandle,
+                             OCIError      *error_handle,
+                             size_t         namelen,
+                             OraText          *distinguished_name,
+                             nzttIdentity **identity);
+
+sword OCIAQEnq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                 OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop,
+                 OCIType *payload_tdo, void  **payload, void  **payload_ind, 
+                 OCIRaw **msgid, ub4 flags); 
+
+sword OCIAQDeq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                 OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop,
+                 OCIType *payload_tdo, void  **payload, void  **payload_ind, 
+                 OCIRaw **msgid, ub4 flags); 
+
+sword OCIAQEnqArray(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                    OCIAQEnqOptions *enqopt, ub4 *iters,
+                    OCIAQMsgProperties **msgprop, OCIType *payload_tdo,
+                    void  **payload, void  **payload_ind, OCIRaw **msgid,
+                    void  *ctxp, OCICallbackAQEnq enqcbfp, ub4 flags);
+
+sword OCIAQEnqStreaming(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                        OCIAQEnqOptions *enqopt, OCIType *payload_tdo,
+                        void  *ctxp, OCICallbackAQEnqStreaming enqcbfp,
+                        ub4 flags);
+
+sword OCIAQDeqArray(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                    OCIAQDeqOptions *deqopt, ub4 *iters,
+                    OCIAQMsgProperties **msgprop, OCIType *payload_tdo,
+                    void  **payload, void  **payload_ind, OCIRaw **msgid,
+                    void  *ctxp, OCICallbackAQDeq deqcbfp, ub4 flags);
+
+sword OCIAQListen(OCISvcCtx *svchp, OCIError *errhp, 
+                      OCIAQAgent **agent_list, ub4 num_agents,
+                      sb4 wait, OCIAQAgent **agent,
+                      ub4 flags);
+
+sword OCIAQListen2(OCISvcCtx *svchp, OCIError *errhp, 
+                   OCIAQAgent **agent_list, ub4 num_agents,
+                   OCIAQListenOpts  *lopts, OCIAQAgent **agent, 
+                   OCIAQLisMsgProps *lmops, ub4 flags);
+
+sword OCIAQGetReplayInfo(OCISvcCtx *svchp, OCIError *errhp,
+                         OraText *queue_name, OCIAQAgent *sender,
+                         ub4 replay_attribute, OraText *correlation,
+                         ub2 *corr_len);
+
+sword OCIAQResetReplayInfo(OCISvcCtx *svchp, OCIError *errhp,
+                           OraText *queue_name, OCIAQAgent *sender,
+                           ub4 replay_attribute); 
+
+sword OCIExtractInit(void  *hndl, OCIError *err);
+
+sword OCIExtractTerm(void  *hndl, OCIError *err);
+
+sword OCIExtractReset(void  *hndl, OCIError *err);
+
+sword OCIExtractSetNumKeys(void  *hndl, OCIError *err, uword numkeys);
+
+sword OCIExtractSetKey(void  *hndl, OCIError *err, const OraText *name, 
+                       ub1 type, ub4 flag, const void  *defval, 
+                       const sb4 *intrange, const OraText *const *strlist);
+
+sword OCIExtractFromFile(void  *hndl, OCIError *err, ub4 flag, 
+                         OraText *filename);
+
+sword OCIExtractFromStr(void  *hndl, OCIError *err, ub4 flag, OraText *input);
+
+sword OCIExtractToInt(void  *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, sb4 *retval);
+
+sword OCIExtractToBool(void  *hndl, OCIError *err, OraText *keyname, 
+                       uword valno, ub1 *retval);
+
+sword OCIExtractToStr(void  *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, OraText *retval, uword buflen);
+
+sword OCIExtractToOCINum(void  *hndl, OCIError *err, OraText *keyname, 
+                         uword valno, OCINumber *retval);
+
+sword OCIExtractToList(void  *hndl, OCIError *err, uword *numkeys);
+
+sword OCIExtractFromList(void  *hndl, OCIError *err, uword index, 
+                         OraText **name, 
+                         ub1 *type, uword *numvals, void  ***values);
+
+/* Memory Related Service Interfaces */
+
+sword OCIMemoryAlloc(void  *hdl, OCIError *err, void  **mem,
+        OCIDuration dur, ub4 size, ub4 flags);
+
+sword OCIMemoryResize(void  *hdl, OCIError *err, void  **mem,
+                        ub4 newsize, ub4 flags);
+                        
+sword OCIMemoryFree(void  *hdl, OCIError *err, void  *mem);
+
+sword OCIContextSetValue(void  *hdl, OCIError *err, OCIDuration duration,
+                        ub1 *key, ub1 keylen, void  *ctx_value);
+
+sword OCIContextGetValue(void  *hdl, OCIError *err, ub1 *key,
+                        ub1 keylen, void  **ctx_value);
+
+sword OCIContextClearValue(void  *hdl, OCIError *err, ub1 *key, 
+                        ub1 keylen);
+
+sword OCIContextGenerateKey(void  *hdl, OCIError *err, ub4 *key);
+
+sword OCIMemorySetCurrentIDs(void  *hdl, OCIError *err, 
+                             ub4 curr_session_id, ub4 curr_trans_id, 
+                             ub4 curr_stmt_id);
+
+sword OCIPicklerTdsCtxInit(OCIEnv *env, OCIError *err, 
+                           OCIPicklerTdsCtx **tdsc);
+
+sword OCIPicklerTdsCtxFree(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc);
+
+sword OCIPicklerTdsInit(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc, 
+                                        OCIPicklerTds **tdsh);
+
+sword OCIPicklerTdsFree(OCIEnv *env, OCIError *err, OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsCreateElementNumber(OCIEnv *env, OCIError *err, 
+                                        OCIPicklerTds *tdsh, ub1 prec, 
+                                        sb1 scale, OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementChar(OCIEnv *env, OCIError *err, 
+                                     OCIPicklerTds *tdsh, ub2 len, 
+                                     OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementVarchar(OCIEnv *env, OCIError *err, 
+                                        OCIPicklerTds *tdsh, ub2 len, 
+                                        OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementRaw(OCIEnv *env, OCIError *err, 
+                                    OCIPicklerTds *tdsh, ub2 len, 
+                                    OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElement(OCIEnv *env, OCIError *err, 
+                                 OCIPicklerTds *tdsh, OCITypeCode dty, 
+                                 OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsAddAttr(OCIEnv *env, OCIError *err, 
+                           OCIPicklerTds *tdsh, OCIPicklerTdsElement elt);
+
+sword OCIPicklerTdsGenerate(OCIEnv *env, OCIError *err, 
+                                OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsGetAttr(OCIEnv *env, OCIError *err, 
+                                const OCIPicklerTds *tdsh, ub1  attrno,
+                                OCITypeCode *typ, ub2  *len);
+
+sword OCIPicklerFdoInit(OCIEnv *env, OCIError *err, 
+                                OCIPicklerFdo **fdoh);
+
+sword OCIPicklerFdoFree(OCIEnv *env, OCIError *err, 
+                                OCIPicklerFdo *fdoh);
+
+sword OCIPicklerImageInit(OCIEnv *env, OCIError *err, 
+                          OCIPicklerFdo *fdoh, 
+                          OCIPicklerTds *tdsh,
+                          OCIPicklerImage **imgh);
+
+sword OCIPicklerImageFree(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageAddScalar(OCIEnv *env, OCIError *err,  
+                               OCIPicklerImage *imgh, 
+                               void  *scalar, ub4  len);
+ 
+sword OCIPicklerImageAddNullScalar(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageGenerate(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageGetScalarSize(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh, 
+                                ub4  attrno, ub4  *size);
+ 
+sword OCIPicklerImageGetScalar(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh, ub4  attrno, 
+                                void  *buf, ub4  *len, OCIInd *ind);
+
+sword OCIPicklerImageCollBegin(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, const OCIPicklerTds *colltdsh);
+ 
+sword OCIPicklerImageCollAddScalar( OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, void  *scalar,
+                ub4 buflen, OCIInd ind);
+ 
+sword OCIPicklerImageCollEnd(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh);
+ 
+/* should take svcctx for locator stuff */
+sword OCIPicklerImageCollBeginScan(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, const OCIPicklerTds *coll_tdsh,
+                ub4 attrnum, ub4 startidx, OCIInd *ind);
+ 
+sword OCIPicklerImageCollGetScalarSize(OCIEnv *env, OCIError *err,
+                const OCIPicklerTds *coll_tdsh, ub4 *size);
+ 
+sword OCIPicklerImageCollGetScalar(OCIEnv *env, OCIError *err,
+                                   OCIPicklerImage *imgh, void  *buf,
+                                   ub4 *buflen, OCIInd *ind);
+
+sword OCIAnyDataGetType(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode *tc, OCIType **type);
+
+sword OCIAnyDataIsNull(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        boolean *isnull);
+
+sword OCIAnyDataConvert(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, void  *ind, void  *data_val,
+        ub4 len, OCIAnyData **sdata);
+
+sword OCIAnyDataBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, OCIAnyData **sdata);
+
+sword OCIAnyDataDestroy(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata);
+
+sword OCIAnyDataAttrSet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, void  *ind, void  *attr_val,
+        ub4 length, boolean is_any);
+
+sword OCIAnyDataCollAddElem(OCISvcCtx *svchp, OCIError *errhp,
+        OCIAnyData *sdata, OCITypeCode tc, OCIType *type, void  *ind,
+        void  *attr_val, ub4 length, boolean is_any, boolean last_elem);
+
+sword OCIAnyDataEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+                          OCIAnyData *sdata);
+
+sword OCIAnyDataAccess(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, void  *ind, void  *attr_val,
+        ub4 *length);
+
+sword OCIAnyDataGetCurrAttrNum(OCISvcCtx *svchp, OCIError *errhp, 
+                               OCIAnyData *sdata, ub4 *attrnum);
+
+sword OCIAnyDataAttrGet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, void  *ind, void  *attr_val,
+        ub4 *length, boolean is_any);
+
+sword OCIAnyDataCollGetElem(OCISvcCtx *svchp, OCIError *errhp,
+  OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, void  *ind, void  *celem_val,
+  ub4 *length, boolean is_any);
+
+
+/*------------------------ OCIAnyDataSet interfaces -------------------------*/
+
+/*
+   NAME
+     OCIAnyDataSetBeginCreate - OCIAnyDataSet Begin Creation
+   PARAMETERS
+     svchp (IN/OUT) - The OCI service context.
+     errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+                      recorded in errhp and this function returns OCI_ERROR.
+                      Diagnostic information can be obtained by calling
+                      OCIErrorGet().
+     typecode       - typecode corresponding to the OCIAnyDataSet.
+     type (IN)      - type corresponding to the OCIAnyDataSet. If the typecode
+                      corresponds to a built-in type (OCI_TYPECODE_NUMBER etc.)
+                      , this parameter can be NULL. It should be non NULL for
+                      user defined types (OCI_TYPECODE_OBJECT,
+                      OCI_TYPECODE_REF, collection types etc.)
+     dur (IN)       - duration for which OCIAnyDataSet is allocated.
+     data_set (OUT) - Initialized OCIAnyDataSet.
+     RETURNS        - error code
+   NOTES
+     This call allocates an OCIAnyDataSet for the duration of dur and
+     initializes it with the type information. The OCIAnyDataSet can hold
+     multiple instances of the given type. For performance reasons, the 
+     OCIAnyDataSet will end up pointing to the passed in OCIType parameter.
+     It is the responsibility of the caller to ensure that the OCIType is
+     longer lived (has allocation duration >= the duration of the OCIAnyData
+     if the OCIType is a transient one, allocation/pin duration >= duration of
+     the OCIAnyData if the OCIType is a persistent one).
+
+*/
+sword OCIAnyDataSetBeginCreate(OCISvcCtx *svchp, OCIError *errhp,
+     OCITypeCode typecode, const OCIType *type, OCIDuration dur,
+     OCIAnyDataSet ** data_set);
+
+/*
+   NAME
+     OCIAnyDataSetDestroy  - OCIAnyDataSet Destroy
+   DESCRIPTION
+     This call frees the OCIAnyDataSet allocated using
+     OCIAnyDataSetBeginCreate().
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)    - The OCI service context.
+     errhp (IN/OUT)    - The OCI Error handle.
+     data_set (IN/OUT) - OCIAnyDataSet to be freed.
+*/
+sword OCIAnyDataSetDestroy(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set);
+
+
+/*
+   NAME
+     OCIAnyDataSetAddInstance - OCIAnyDataSet Add an instance
+   DESCRIPTION
+     This call adds a new skeleton instance to the OCIAnyDataSet and all the
+     attributes of the instance are set to NULL. It returns this skeleton
+     instance through the OCIAnyData parameter which can be constructed
+     subsequently by invoking the OCIAnyData API.
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN/OUT)   - OCIAnyDataSet to which a new instance is added.
+     data (IN/OUT)       - OCIAnyData corresponding to the newly added
+                           instance. If (*data) is NULL, a new OCIAnyData will
+                           be allocated for same duration as the OCIAnyDataSet.
+                           If (*data) is not NULL, it will get reused. This
+                           OCIAnyData can be subseqently constructed using the
+                           OCIAnyDataConvert() call or it can be constructed
+                           piece-wise using the OCIAnyDataAttrSet and
+                           OCIAnyDataCollAddElem calls.
+   NOTES
+     No Destruction of the old value is done here. It is the responsibility of
+     the caller to destroy the old value pointed to by (*data) and set (*data)
+     to a null pointer before beginning to make a sequence of this call. No
+     deep copying (of OCIType information nor the data part.) is done in the
+     returned OCIAnyData. This OCIAnyData cannot be used beyond the allocation
+     duration of the OCIAnyDataSet (it is like a reference into the
+     OCIAnyDataSet). The returned OCIAnyData can be reused on subsequent calls
+     to this function, to sequentially add new data instances to the
+     OCIAnyDataSet.
+*/
+sword OCIAnyDataSetAddInstance(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*
+   NAME
+     OCIAnyDataSetEndCreate - OCIAnyDataSet End Creation process.
+   DESCRIPTION
+     This call marks the end of OCIAnyDataSet creation. It should be called
+     after constructing all of its instance(s).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)        - The OCI service context.
+     errhp (IN/OUT)        - The OCI error handle. If there is an error, it is
+                             recorded in errhp and this function returns
+                             OCI_ERROR. Diagnostic information can be obtained
+                             by calling OCIErrorGet().
+     data_set (IN/OUT)     - OCIAnyDataSet that has been fully constructed.
+*/
+sword OCIAnyDataSetEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set);
+
+/*
+   NAME
+     OCIAnyDataSetGetType - OCIAnyDataSet Get Type of an OCIAnyDataSet
+   DESCRIPTION
+     Gets the Type corresponding to an OCIAnyDataSet. It returns the actual
+     pointer to the type maintained inside an OCIAnyDataSet. No copying is
+     done for performance reasons. The client is responsible for not using
+     this type once the OCIAnyDataSet is freed (or its duration ends).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN)       - Initialized OCIAnyDataSet.
+     tc (OUT)            - The typecode of the type.
+     type (OUT)          - The type corresponding to the OCIAnyDataSet. This
+                           could be null if the OCIAnyData corresponds to a
+                           built-in type.
+*/
+sword OCIAnyDataSetGetType (OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCITypeCode *tc, OCIType **type);
+
+/*
+  NAME
+    OCIAnyDataSetGetCount - OCIAnyDataSet Get Count of instances.
+  DESCRIPTION
+    This call gets the number of instances in the OCIAnyDataSet.
+  RETURNS
+    error code.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet.
+    count (OUT)         - number of instances in OCIAnyDataSet
+*/
+sword OCIAnyDataSetGetCount(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, ub4 *count);
+
+/*
+  NAME
+    OCIAnyDataSetGetInstance - OCIAnyDataSet Get next instance.
+  DESCRIPTION
+    Only sequential access to the instances in an OCIAnyDataSet is allowed.
+    This call returns the OCIAnyData corresponding to an instance at the
+    current position and updates the current position. Subsequently, the
+    OCIAnyData access routines may be used to access the instance.
+  RETURNS
+    error code. Returns OCI_NO_DATA if the current position is at the end of
+    the set, OCI_SUCCESS otherwise.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet
+    data (IN/OUT)       - OCIAnyData corresponding to the instance. If (*data)
+                          is NULL, a new OCIAnyData will be allocated for same
+                          duration as the OCIAnyDataSet. If (*data) is not NULL
+                          , it will get reused. This OCIAnyData can be
+                          subsequently accessed using the OCIAnyDataAccess()
+                          call or piece-wise by using the OCIAnyDataAttrGet()
+                          call.
+  NOTE
+    No Destruction of the old value is done here. It is the responsibility of
+    the caller to destroy the old value pointed to by (*data) and set (*data)
+    to a null pointer before beginning to make a sequence of this call. No deep
+    copying (of OCIType information nor the data part.) is done in the returned
+    OCIAnyData. This OCIAnyData cannot be used beyond the allocation duration
+    of the OCIAnyDataSet (it is like a reference into the OCIAnyDataSet). The
+    returned OCIAnyData can be reused on subsequent calls to this function to
+    sequentially access the OCIAnyDataSet.
+*/
+sword OCIAnyDataSetGetInstance(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*--------------------- End of OCIAnyDataSet interfaces ---------------------*/
+
+sword OCIFormatInit(void  *hndl, OCIError *err);
+
+sword OCIFormatString(void  *hndl, OCIError *err, OraText *buffer,
+                      sbig_ora bufferLength, sbig_ora *returnLength,
+                      const OraText *formatString, ...);
+
+sword OCIFormatTerm(void  *hndl, OCIError *err);
+
+sword OCIFormatTUb1(void);
+sword OCIFormatTUb2(void);
+sword OCIFormatTUb4(void);
+sword OCIFormatTUword(void);
+sword OCIFormatTUbig_ora(void);
+sword OCIFormatTSb1(void);
+sword OCIFormatTSb2(void);
+sword OCIFormatTSb4(void);
+sword OCIFormatTSword(void);
+sword OCIFormatTSbig_ora(void);
+sword OCIFormatTEb1(void);
+sword OCIFormatTEb2(void);
+sword OCIFormatTEb4(void);
+sword OCIFormatTEword(void);
+sword OCIFormatTChar(void);
+sword OCIFormatTText(void);
+sword OCIFormatTDouble(void);
+sword OCIFormatTDvoid(void);
+sword OCIFormatTEnd(void);
+
+/*-------------------------- Extensions to XA interface ---------------------*/
+/* ------------------------- xaosvch ----------------------------------------*/
+/*
+   NAME
+     xaosvch  -  XA Oracle get SerViCe Handle
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This macro has been provided for backward compatibilty with 8.0.2
+*/
+OCISvcCtx *xaosvch(OraText *dbname);
+
+/* ------------------------- xaoSvcCtx --------------------------------------*/
+/*
+   NAME
+     xaoSvcCtx  -  XA Oracle get SerViCe ConTeXt
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the service
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCISvcCtx *xaoSvcCtx(OraText *dbname);
+
+/* ------------------------- xaoEnv -----------------------------------------*/
+/*
+   NAME
+     xaoEnv  -  XA Oracle get ENvironment Handle
+   DESCRIPTION
+     Given a database name return the environment handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the environment
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCIEnv *xaoEnv(OraText *dbname);
+
+/* ------------------------- xaosterr ---------------------------------------*/
+/*
+   NAME
+     xaosterr  -  XA Oracle get xa STart ERRor code
+   DESCRIPTION
+     Given an oracle error code return the XA error code
+ */
+int xaosterr(OCISvcCtx *svch, sb4 error);
+/*-------------------------- End Extensions ---------------------------------*/
+/*---------------------- Extensions to NLS cartridge service ----------------*/
+/* ----------------------- OCINlsGetInfo ------------------------------------*/
+/*
+   NAME
+     OCINlsGetInfo - Get NLS info from OCI environment handle
+   REMARKS
+     This function generates language information specified by item from OCI 
+     environment handle envhp into an array pointed to by buf within size 
+     limitation as buflen.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   buf(OUT)
+     Pointer to the destination buffer.
+   buflen(IN)
+     The size of destination buffer. The maximum length for each information
+     is 32 bytes.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_DAYNAME1 : Native name for Monday.
+       OCI_NLS_DAYNAME2 : Native name for Tuesday.
+       OCI_NLS_DAYNAME3 : Native name for Wednesday.
+       OCI_NLS_DAYNAME4 : Native name for Thursday.
+       OCI_NLS_DAYNAME5 : Native name for Friday.
+       OCI_NLS_DAYNAME6 : Native name for for Saturday.
+       OCI_NLS_DAYNAME7 : Native name for for Sunday.
+       OCI_NLS_ABDAYNAME1 : Native abbreviated name for Monday.
+       OCI_NLS_ABDAYNAME2 : Native abbreviated name for Tuesday.
+       OCI_NLS_ABDAYNAME3 : Native abbreviated name for Wednesday.
+       OCI_NLS_ABDAYNAME4 : Native abbreviated name for Thursday.
+       OCI_NLS_ABDAYNAME5 : Native abbreviated name for Friday.
+       OCI_NLS_ABDAYNAME6 : Native abbreviated name for for Saturday.
+       OCI_NLS_ABDAYNAME7 : Native abbreviated name for for Sunday.
+       OCI_NLS_MONTHNAME1 : Native name for January.
+       OCI_NLS_MONTHNAME2 : Native name for February.
+       OCI_NLS_MONTHNAME3 : Native name for March.
+       OCI_NLS_MONTHNAME4 : Native name for April.
+       OCI_NLS_MONTHNAME5 : Native name for May.
+       OCI_NLS_MONTHNAME6 : Native name for June.
+       OCI_NLS_MONTHNAME7 : Native name for July.
+       OCI_NLS_MONTHNAME8 : Native name for August.
+       OCI_NLS_MONTHNAME9 : Native name for September.
+       OCI_NLS_MONTHNAME10 : Native name for October.
+       OCI_NLS_MONTHNAME11 : Native name for November.
+       OCI_NLS_MONTHNAME12 : Native name for December.
+       OCI_NLS_ABMONTHNAME1 : Native abbreviated name for January.
+       OCI_NLS_ABMONTHNAME2 : Native abbreviated name for February.
+       OCI_NLS_ABMONTHNAME3 : Native abbreviated name for March.
+       OCI_NLS_ABMONTHNAME4 : Native abbreviated name for April.
+       OCI_NLS_ABMONTHNAME5 : Native abbreviated name for May.
+       OCI_NLS_ABMONTHNAME6 : Native abbreviated name for June.
+       OCI_NLS_ABMONTHNAME7 : Native abbreviated name for July.
+       OCI_NLS_ABMONTHNAME8 : Native abbreviated name for August.
+       OCI_NLS_ABMONTHNAME9 : Native abbreviated name for September.
+       OCI_NLS_ABMONTHNAME10 : Native abbreviated name for October.
+       OCI_NLS_ABMONTHNAME11 : Native abbreviated name for November.
+       OCI_NLS_ABMONTHNAME12 : Native abbreviated name for December.
+       OCI_NLS_YES : Native string for affirmative response.
+       OCI_NLS_NO : Native negative response. 
+       OCI_NLS_AM : Native equivalent string of AM.
+       OCI_NLS_PM : Native equivalent string of PM.
+       OCI_NLS_AD : Native equivalent string of AD.
+       OCI_NLS_BC : Native equivalent string of BC.
+       OCI_NLS_DECIMAL : decimal character.
+       OCI_NLS_GROUP : group separator.
+       OCI_NLS_DEBIT : Native symbol of debit.
+       OCI_NLS_CREDIT : Native sumbol of credit.
+       OCI_NLS_DATEFORMAT : Oracle date format.
+       OCI_NLS_INT_CURRENCY: International currency symbol.
+       OCI_NLS_LOC_CURRENCY : Locale currency symbol.
+       OCI_NLS_LANGUAGE : Language name.
+       OCI_NLS_ABLANGUAGE : Abbreviation for language name.
+       OCI_NLS_TERRITORY : Territory name.
+       OCI_NLS_CHARACTER_SET : Character set name.
+       OCI_NLS_LINGUISTIC : Linguistic name.
+       OCI_NLS_CALENDAR : Calendar name.
+       OCI_NLS_DUAL_CURRENCY : Dual currency symbol.
+*/
+sword OCINlsGetInfo(void  *envhp, OCIError *errhp, OraText *buf,
+                    size_t buflen, ub2 item);
+
+/* ----------------------- OCINlsNumericInfoGet -----------------------------*/
+/*
+   NAME
+     OCINlsNumericInfoGet - Get NLS numeric info from OCI environment handle
+   REMARKS
+     This function generates numeric language information specified by item 
+     from OCI environment handle envhp into an output number variable.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   val(OUT)
+     Pointer to the output number variable. On OCI_SUCCESS return, it will
+     contain the requested NLS numeric info.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_CHARSET_MAXBYTESZ : Maximum character byte size for OCI
+                                   environment or session handle charset
+       OCI_NLS_CHARSET_FIXEDWIDTH: Character byte size for fixed-width charset;
+                                   0 for variable-width charset 
+*/
+sword OCINlsNumericInfoGet(void  *envhp, OCIError *errhp, sb4 *val, ub2 item);
+
+/* ----------------------- OCINlsCharSetNameToId ----------------------------*/
+/*
+   NAME
+     OCINlsCharSetNameToId - Get Oracle charset id given Oracle charset name
+   REMARKS
+     This function will get the Oracle character set id corresponding to
+     the given Oracle character set name.
+   RETURNS
+     Oracle character set id for the given Oracle character set name if
+     character set name and OCI handle are valid; otherwise returns 0.
+   envhp(IN/OUT)
+     OCI environment handle.
+   name(IN)
+     Pointer to a null-terminated Oracle character set name whose id 
+     will be returned.
+*/
+ub2 OCINlsCharSetNameToId(void  *envhp, const oratext *name);
+
+/* ----------------------- OCINlsCharSetIdToName ----------------------------*/
+/*
+   NAME
+     OCINlsCharSetIdToName - Get Oracle charset name given Oracle charset id
+   REMARKS
+     This function will get the Oracle character set name corresponding to
+     the given Oracle character set id.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will contain
+     the null-terminated string for character set name.
+   buflen(IN)
+     Size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ for
+     guarantee to store an Oracle character set name. If it's smaller than
+     the length of the character set name, the function will return OCI_ERROR.
+   id(IN)
+     Oracle character set id.
+*/
+sword OCINlsCharSetIdToName(void  *envhp, oratext *buf, size_t buflen, ub2 id);
+
+/* ----------------------- OCINlsNameMap ------------------------------------*/
+/*
+   NAME
+     OCINlsNameMap - Map NLS naming from Oracle to other standards and vice 
+                     versa
+   REMARKS
+     This function will map NLS naming from Oracle to other standards (such
+     as ISO, IANA) and vice versa.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will 
+     contain null-terminated string for requested mapped name.
+   buflen(IN)
+     The size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ
+     for guarantee to store an NLS name. If it is smaller than the length
+     of the name, the function will return OCI_ERROR.
+   srcbuf(IN)
+     Pointer to null-terminated NLS name. If it is not a valid name in its
+     define scope, the function will return OCI_ERROR.
+   flag(IN)
+     It specifies name mapping direction and can take the following values:
+       OCI_NLS_CS_IANA_TO_ORA : Map character set name from IANA to Oracle
+       OCI_NLS_CS_ORA_TO_IANA : Map character set name from Oracle to IANA
+       OCI_NLS_LANG_ISO_TO_ORA : Map language name from ISO to Oracle
+       OCI_NLS_LANG_ORA_TO_ISO : Map language name from Oracle to ISO
+       OCI_NLS_TERR_ISO_TO_ORA : Map territory name from ISO to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO : Map territory name from Oracle to ISO
+       OCI_NLS_TERR_ISO3_TO_ORA : Map territory name from 3-letter ISO
+                                  abbreviation to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO3 : Map territory name from Oracle to 3-letter
+                                  ISO abbreviation
+*/
+sword OCINlsNameMap(void  *envhp, oratext *buf, size_t buflen,
+                    const oratext *srcbuf, ub4 flag);
+
+/* -------------------- OCIMultiByteToWideChar ------------------------------*/
+/*
+   NAME
+     OCIMultiByteToWideChar - Convert a null terminated multibyte string into 
+                              wchar
+   REMARKS
+     This routine converts an entire null-terminated string into the wchar 
+     format. The wchar output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for wchar.
+   src (IN)
+     Source string to be converted.
+   rsize (OUT)
+     Number of characters converted including null-terminator.
+     If it is a NULL pointer, no number return
+*/
+sword OCIMultiByteToWideChar(void  *envhp, OCIWchar *dst, const OraText *src,
+                             size_t *rsize);
+
+
+/* --------------------- OCIMultiByteInSizeToWideChar -----------------------*/
+/*
+   NAME
+     OCIMultiByteInSizeToWideChar - Convert a mulitbyte string in length into
+                                    wchar
+   REMARKS
+     This routine converts part of string into the wchar format. It will
+     convert as many complete characters as it can until it reaches output
+     buffer size or input buffer size or it reaches a null-terminator in
+     source string. The output buffer will be null-terminated if space permits.
+     If dstsz is zero, this function will only return number of characters not
+     including ending null terminator for converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Pointer to a destination buffer for wchar. It can be NULL pointer when
+     dstsz is zero.
+   dstsz(IN)
+     Destination buffer size in character. If it is zero, this function just
+     returns number of characters will be need for the conversion.
+   src (IN)
+     Source string to be converted.
+   srcsz(IN)
+     Length of source string in byte.
+   rsize(OUT)
+     Number of characters written into destination buffer, or number of
+     characters for converted string is dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIMultiByteInSizeToWideChar(void  *envhp, OCIWchar *dst,
+                                  size_t dstsz, const OraText *src, 
+                                  size_t srcsz, size_t *rsize);
+
+
+/* ---------------------- OCIWideCharToMultiByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharToMultiByte - Convert a null terminated wchar string into
+                              multibyte
+   REMARKS
+     This routine converts an entire null-terminated wide character string into
+     multi-byte string. The output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte string.
+   src (IN)
+     Source wchar string to be converted.
+   rsize (OUT)
+     Number of bytes written into the destination buffer.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharToMultiByte(void  *envhp, OraText *dst, const OCIWchar *src,
+                             size_t *rsize);
+
+
+/* ---------------------- OCIWideCharInSizeToMultiByte ----------------------*/
+/*
+   NAME
+     OCIWideCharInSizeToMultiByte - Convert a wchar string in length into 
+                                    mulitbyte
+   REMARKS
+     This routine converts part of wchar string into the multi-byte format.
+     It will convert as many complete characters as it can until it reaches
+     output buffer size or input buffer size or it reaches a null-terminator
+     in source string. The output buffer will be null-terminated if space
+     permits. If dstsz is zero, the function just returns the size of byte not 
+     including ending null-terminator need to store the converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte. It can be NULL pointer if dstsz is
+     zero.
+   dstsz(IN)
+     Destination buffer size in byte. If it is zero, it just returns the size
+     of bytes need for converted string.
+   src (IN)
+     Source wchar string to be converted.
+   srcsz(IN)
+     Length of source string in character.
+   rsize(OUT)
+     Number of bytes written into destination buffer, or number of bytes need
+     to store the converted string if dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharInSizeToMultiByte(void  *envhp, OraText *dst,
+                                    size_t dstsz, const OCIWchar *src,
+                                    size_t srcsz, size_t *rsize);
+
+
+
+/* ----------------------- OCIWideCharIsAlnum -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlnum - test whether wc is a letter or decimal digit
+   REMARKS
+     It tests whether wc is a letter or decimal digit.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlnum(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsAlpha -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlpha - test whether wc is an alphabetic letter
+   REMARKS
+     It tests whether wc is an alphabetic letter
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlpha(void  *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsCntrl ---------------------------------*/
+/*
+   NAME
+     OCIWideCharIsCntrl - test whether wc is a control character
+   REMARKS
+     It tests whether wc is a control character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsCntrl(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsDigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsDigit - test whether wc is a decimal digit character
+   REMARKS
+     It tests whether wc is a decimal digit character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsDigit(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsGraph -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsGraph - test whether wc is a graph character
+   REMARKS
+     It tests whether wc is a graph character. A graph character is character
+     with a visible representation and normally includes alphabetic letter,
+     decimal digit, and punctuation.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsGraph(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsLower - test whether wc is a lowercase letter
+   REMARKS
+     It tests whether wc is a lowercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsLower(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPrint -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPrint - test whether wc is a printable character
+   REMARKS
+     It tests whether wc is a printable character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPrint(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPunct -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPunct - test whether wc is a punctuation character
+   REMARKS
+     It tests whether wc is a punctuation character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPunct(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsSpace -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsSpace - test whether wc is a space character
+   REMARKS
+     It tests whether wc is a space character. A space character only causes
+     white space in displayed text(for example, space, tab, carriage return,
+     newline, vertical tab or form feed).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSpace(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsUpper - test whether wc is a uppercase letter
+   REMARKS
+     It tests whether wc is a uppercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsUpper(void  *envhp, OCIWchar wc);
+
+
+/*----------------------- OCIWideCharIsXdigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsXdigit - test whether wc is a hexadecimal digit
+   REMARKS
+     It tests whether wc is a hexadecimal digit ( 0-9, A-F, a-f ).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsXdigit(void  *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsSingleByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharIsSingleByte - test whether wc is a single-byte character
+   REMARKS
+     It tests whether wc is a single-byte character when converted into
+     multi-byte.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSingleByte(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharToLower - Convert a wchar into the lowercase
+   REMARKS
+     If there is a lower-case character mapping for wc in the specified locale,
+     it will return the lower-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for lowercase mapping.
+*/
+OCIWchar OCIWideCharToLower(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharToUpper - Convert a wchar into the uppercase
+   REMARKS
+     If there is a upper-case character mapping for wc in the specified locale,
+     it will return the upper-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for uppercase mapping.
+*/
+OCIWchar OCIWideCharToUpper(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcmp --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcmp - compare two null terminated wchar string
+   REMARKS
+     It compares two wchar string in binary ( based on wchar encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if wstr1 == wstr2.
+     Positive, if wstr1 > wstr2.
+     Negative, if wstr1 < wstr2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   wstr1(IN)
+     Pointer to a null-terminated wchar string.
+   wstr2(IN)
+     Pointer to a null-terminated wchar string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+     comparison.
+*/
+int OCIWideCharStrcmp(void  *envhp, const OCIWchar *wstr1, 
+                const OCIWchar *wstr2, int flag);
+
+
+/* ----------------------- OCIWideCharStrncmp -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncmp - compare twe wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcmp(), except that at most len1
+     characters from wstr1 and len2 characters from wstr1 are compared. The
+     null-terminator will be taken into the comparison.
+   RETURNS
+     0, if wstr1 = wstr2
+     Positive, if wstr1 > wstr2
+     Negative, if wstr1 < wstr2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr1(IN)
+     Pointer to the first wchar string
+   len1(IN)
+     The length for the first string for comparison
+   wstr2(IN)
+     Pointer to the second wchar string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIWideCharStrncmp(void  *envhp, const OCIWchar *wstr1, size_t len1,
+                 const OCIWchar *wstr2, size_t len2, int flag);
+
+
+/* ----------------------- OCIWideCharStrcat --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcat - concatenate two wchar strings
+   REMARKS
+     This function appends a copy of the wchar string pointed to by wsrcstr,
+     including the null-terminator to the end of wchar string pointed to by
+     wdststr. It returns the number of character in the result string not
+     including the ending null-terminator.
+   RETURNS
+     number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+*/
+size_t OCIWideCharStrcat(void  *envhp, OCIWchar *wdststr,
+                         const OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrchr --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrchr - Search the first occurrence of wchar in a wchar string
+   REMARKS
+     This function searchs for the first occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrchr(void  *envhp, const OCIWchar *wstr,
+                            OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcpy --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcpy - copy a wchar string
+   REMARKS
+     This function copies the wchar string pointed to by wsrcstr, including the
+     null-terminator, into the array pointed to by wdststr. It returns the
+     number of character copied not including the ending null-terminator.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrcpy(void  *envhp, OCIWchar *wdststr,
+                         const OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrlen --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrlen - Return number of character in a wchar string
+   REMARKS
+     This function computes the number of characters in the wchar string
+     pointed to by wstr, not including the null-terminator, and returns
+    this number. 
+   RETURNS
+     number of characters not including ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrlen(void  *envhp, const OCIWchar *wstr);
+
+
+/* ----------------------- OCIWideCharStrncat -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncat - Concatenate wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcat(), except that at most n
+     characters from wsrcstr are appended to wdststr. Note that the
+     null-terminator in wsrcstr will stop appending. wdststr will be
+     null-terminated.. 
+   RETURNS
+     Number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+   n(IN)
+     Number of characters from wsrcstr to append.
+*/
+size_t OCIWideCharStrncat(void  *envhp, OCIWchar *wdststr,
+                          const OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrncpy -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncpy - Copy wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcpy(), except that at most n
+     characters are copied from the array pointed to by wsrcstr to the array
+     pointed to by wdststr. Note that the null-terminator in wdststr will
+     stop coping and result string will be null-terminated.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+   n(IN)
+     Number of characters from wsrcstr to copy.
+*/
+size_t OCIWideCharStrncpy(void  *envhp, OCIWchar *wdststr,
+                          const OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrrchr -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrrchr - search the last occurrence of a wchar in wchar string
+   REMARKS
+     This function searchs for the last occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrrchr(void  *envhp, const OCIWchar *wstr,
+                             OCIWchar wc);
+
+
+/* --------------------- OCIWideCharStrCaseConversion -----------------------*/
+/*
+   NAME
+     OCIWideCharStrCaseConversion - convert a wchar string into lowercase or
+                                    uppercase
+   REMARKS
+     This function convert the wide char string pointed to by wsrcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by wdststr. The result string will be null-terminated.
+   RETURNS
+     number of characters for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   wdststr(OUT)
+     Pointer to destination array.
+   wsrcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE : convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIWideCharStrCaseConversion(void  *envhp, OCIWchar *wdststr,
+                                    const OCIWchar *wsrcstr, ub4 flag);
+
+
+/*---------------------- OCIWideCharDisplayLength ---------------------------*/
+/*
+   NAME
+     OCIWideCharDisplayLength - Calculate the display length for a wchar
+   REMARKS
+     This function determines the number of column positions required for wc
+     in display. It returns number of column positions, or 0 if wc is 
+     null-terminator.
+   RETURNS
+     Number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharDisplayLength(void  *envhp, OCIWchar wc );
+
+
+/*---------------------- OCIWideCharMultiByteLength -------------------------*/
+/*
+   NAME
+     OCIWideCharMultiByteLength - Determine byte size in multi-byte encoding
+   REMARKS
+     This function determines the number of byte required for wc in multi-byte
+     encoding. It returns number of bytes in multi-byte for wc.
+   RETURNS
+     Number of bytes.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharMultiByteLength(void  *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIMultiByteStrcmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcmp - Compare two multi-byte strings
+   REMARKS
+     It compares two multi-byte strings in binary ( based on encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if str1 == str2.
+     Positive, if str1 > str2.
+     Negative, if str1 < str2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to a null-terminated string.
+   str2(IN)
+     Pointer to a null-terminated string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrcmp(void  *envhp, const OraText *str1,
+                       const OraText *str2, int flag);
+
+
+/*----------------------- OCIMultiByteStrncmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncmp - compare two strings in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcmp(), except that at most
+     len1 bytes from str1 and len2 bytes from str2 are compared. The
+     null-terminator will be taken into the comparison.
+   RETURNS
+     0, if str1 = str2
+     Positive, if str1 > str2
+     Negative, if str1 < str2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to the first string
+   len1(IN)
+     The length for the first string for comparison
+   str2(IN)
+     Pointer to the second string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrncmp(void  *envhp, const OraText *str1, size_t len1,
+                        OraText *str2, size_t len2, int flag);
+
+
+/*----------------------- OCIMultiByteStrcat --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcat - concatenate multibyte strings
+   REMARKS
+     This function appends a copy of the multi-byte string pointed to by
+     srcstr, including the null-terminator to the end of string pointed to by
+     dststr. It returns the number of bytes in the result string not including
+     the ending null-terminator.
+   RETURNS
+     number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle
+   dststr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   srcstr(IN)
+     Pointer to the source string to append.
+*/
+size_t OCIMultiByteStrcat(void  *envhp, OraText *dststr,
+                          const OraText *srcstr);
+
+
+/*------------------------- OCIMultiByteStrcpy ------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcpy - copy multibyte string
+   REMARKS
+     This function copies the multi-byte string pointed to by srcstr,
+     including the null-terminator, into the array pointed to by dststr. It
+     returns the number of bytes copied not including the ending 
+     null-terminator.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to the OCI environment handle.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrcpy(void  *envhp, OraText *dststr,
+                          const OraText *srcstr);
+
+
+/*----------------------- OCIMultiByteStrlen --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrlen - Calculate multibyte string length
+   REMARKS
+     This function computes the number of bytes in the multi-byte string
+     pointed to by str, not including the null-terminator, and returns this
+     number. 
+   RETURNS
+     number of bytes not including ending null-terminator.
+   str(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrlen(void  *envhp, const OraText *str);
+
+
+/*----------------------- OCIMultiByteStrncat -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncat - concatenate string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcat(), except that at most n
+     bytes from srcstr are appended to dststr. Note that the null-terminator in
+     srcstr will stop appending and the function will append as many character
+     as possible within n bytes. dststr will be null-terminated. 
+   RETURNS
+     Number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle.
+   srcstr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   dststr(IN)
+     Pointer to the source multi-byte string to append.
+   n(IN)
+     Number of bytes from srcstr to append.
+*/
+size_t OCIMultiByteStrncat(void  *envhp, OraText *dststr,
+                           const OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrncpy -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncpy - copy multibyte string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcpy(), except that at most n
+     bytes are copied from the array pointed to by srcstr to the array pointed
+     to by dststr. Note that the null-terminator in srcstr will stop coping and
+     the function will copy as many character as possible within n bytes. The 
+     result string will be null-terminated.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to a OCI environment handle.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   n(IN)
+     Number of bytes from srcstr to copy.
+*/
+size_t OCIMultiByteStrncpy(void  *envhp, OraText *dststr,
+                           const OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrnDisplayLength ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrnDisplayLength - calculate the display length for a
+                                     multibyt string
+   REMARKS
+     This function returns the number of display positions occupied by the 
+     complete characters within the range of n bytes.
+   RETURNS
+     number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle.
+   str(IN)
+     Pointer to a multi-byte string.
+   n(IN)
+     Number of bytes to examine.
+*/
+size_t OCIMultiByteStrnDisplayLength(void  *envhp, const OraText *str1,
+                                     size_t n);
+
+
+/*---------------------- OCIMultiByteStrCaseConversion  ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrCaseConversion
+   REMARKS
+     This function convert the multi-byte string pointed to by srcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by dststr. The result string will be null-terminated.
+   RETURNS
+     number of bytes for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   dststr(OUT)
+     Pointer to destination array.
+   srcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE: convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the 
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIMultiByteStrCaseConversion(void  *envhp, OraText *dststr,
+                                     const OraText *srcstr, ub4 flag);
+
+
+/*------------------------- OCICharSetToUnicode -----------------------------*/
+/*
+   NAME
+     OCICharSetToUnicode - convert multibyte string into Unicode as UCS2
+   REMARKS
+     This function converts a multi-byte string pointed to by src to Unicode 
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. 
+     The function will return number of characters converted into Unicode.
+     If dstlen is zero, it will just return the number of characters for the
+     result without real conversion.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle
+   dst(OUT)
+     Pointer to a destination buffer
+   dstlen(IN)
+     Size of destination buffer in character
+   src(IN)
+     Pointer to multi-byte source string.
+   srclen(IN)
+     Size of source string in bytes.
+   rsize(OUT)
+     Number of characters converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCICharSetToUnicode(void  *envhp, ub2 *dst, size_t dstlen,
+                          const OraText *src, size_t  srclen, size_t *rsize);
+
+
+/*------------------------- OCIUnicodeToCharSet -----------------------------*/
+/*
+   NAME
+     OCIUnicodeToCharSet - convert Unicode into multibyte
+   REMARKS
+     This function converts a Unicode string pointed to by src to multi-byte
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. The function will
+     return number of bytes converted into multi-byte. If dstlen is zero, it
+     will just return the number of bytes for the result without real 
+     conversion. If a Unicode character is not convertible for the character
+     set specified in OCI environment handle, a replacement character will be
+     used for it. In this case, OCICharSetConversionIsReplacementUsed() will
+     return ture.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle.
+   dst(OUT)
+     Pointer to a destination buffer.
+   dstlen(IN)
+     Size of destination buffer in byte.
+   src(IN)
+     Pointer to a Unicode string.
+   srclen(IN)
+     Size of source string in characters.
+   rsize(OUT)
+     Number of bytes converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCIUnicodeToCharSet(void  *envhp, OraText *dst, size_t dstlen, 
+                           const ub2 *src, size_t srclen, size_t *rsize);
+
+/*----------------------- OCINlsCharSetConvert ------------------------------*/
+/*
+   NAME
+     OCINlsCharSetConvert - convert between any two character set.
+   REMARKS
+     This function converts a string pointed to by src in the character set
+     specified with srcid to the array pointed to by dst in the character set
+     specified with dstid. The conversion will stop when it reaches the source
+     limitation or destination limitation. The function will return the number
+     of bytes converted into the destination buffer. Even though either source
+     or destination character set id is OCI_UTF16ID, given and return data
+     length will be represented with the byte length as this function is
+     intended for generic purpose. Note the conversion will not stop at null
+     data.
+     To get character set id from name, OCINlsCharSetNameToId can be used.
+     To check if derived data in the destination buffer contains any
+     replacement character resulting from conversion failure,
+     OCICharSetConversionIsReplacementUsed can be used to get the status.
+     Data alignment should be guaranteed by a caller. For example, UTF-16 data
+     should be aligned to ub2 type.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+   errhp(IN/OUT)
+     OCI error handle. If there is an error, it is recorded in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained
+     by calling OCIErrorGet().
+   dstid(IN)
+     Character set id for the destination buffer.
+   dstp(OUT)
+     Pointer to the destination buffer.
+   dstlen(IN)
+     The maximum byte size of destination buffer.
+   srcid(IN)
+     Character set id for the source buffer.
+   srcp(IN)
+     Pointer to the source buffer.
+   srclen(IN)
+     The length byte size of source buffer.
+   rsize(OUT)
+     The number of characters converted. If it is a NULL pointer, nothing to
+     return.
+*/
+sword OCINlsCharSetConvert(void  *envhp, OCIError *errhp, 
+                        ub2 dstid, void  *dstp, size_t dstlen,
+                        ub2 srcid, const void  *srcp, size_t srclen,
+                        size_t *rsize);
+
+
+/* ------------------- OCICharsetConversionIsReplacementUsed ----------------*/
+/*
+   NAME
+     OCICharsetConversionIsReplacementUsed - chech if replacement is used in 
+                                             conversion
+   REMARKS
+     This function indicates whether or not the replacement character was used
+     for nonconvertible characters in character set conversion in last invoke
+     of OCICharsetUcs2ToMb().
+   RETURNS
+     TRUE is the replacement character was used in last OCICharsetUcs2ToMb()
+     invoking, else FALSE.
+   envhp(IN/OUT)
+     OCI environment handle. This should be the first handle passed to 
+     OCICharsetUcs2ToMb().
+*/
+boolean OCICharSetConversionIsReplacementUsed(void  *envhp);
+
+/*------------------- OCINlsEnvironmentVariableGet -----------------*/
+/*
+   NAME
+     OCINlsEnvironmentVariableGet - get a value of NLS environment variable.
+
+   DESCRIPTION
+     This function retrieves a value of NLS environment variable to the buffer
+     pointed to by val. Data type is determined by the parameter specified by
+     item. Either numeric data or string data can be retrieved.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+
+   PARAMETERS
+   valp(OUT) -
+     Pointer to the buffer.
+   size(IN) -
+     Size of the buffer. This argument is only applicable to string data type,
+     but not to numerical data, in such case, it is ignored.
+   item(IN) -
+     NLS item value, which can be one of following values:
+       OCI_NLS_CHARSET_ID  - NLS_LANG character set id in ub2 data type.
+       OCI_NLS_NCHARSET_ID - NLS_NCHAR character set id in ub2 data type.
+   charset(IN) -
+     Character set id for retrieved string data. If it is 0, NLS_LANG will be
+     used. OCI_UTF16ID is a valid id. In case of numeric data, this argument
+     is ignored.
+   rsize(OUT) -
+     Size of return value.
+
+   NOTE
+     This functions is mainly used for retrieving character set id from either
+     NLS_LANG or NLS_NCHAR environment variables. If NLS_LANG is not set,
+     the default character set id is returned.
+     For future extension, the buffer is capable for storing other data types.
+*/
+sword OCINlsEnvironmentVariableGet(void   *valp, size_t size, ub2 item,
+                                   ub2 charset, size_t *rsize);
+
+
+/*------------------------- OCIMessageOpen ----------------------------------*/
+/*
+   NAME
+     OCIMessageOpen - open a locale message file
+   REMARKS
+     This function opens a message handle for facility of product in a language
+     pointed to by envhp. It first try to open the message file corresponding
+     to envhp for the facility. If it successes, it will use that file to
+     initialize a message handle, else it will use the default message file
+     which is for American language for the facility. The function return a
+     pointer pointed to a message handle into msghp parameter.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(OUT)
+     a message handle for return
+   product(IN)
+     A pointer to a product name. Product name is used to locate the directory
+     for message in a system dependent way. For example, in Solaris, the
+     directory of message files for the product `rdbms' is
+     `${ORACLE_HOME}/rdbms'.
+   facility(IN)
+     A pointer to a facility name in the product. It is used to construct a
+     message file name. A message file name follows the conversion with 
+     facility as prefix. For example, the message file name for facility
+     `img' in American language will be `imgus.msb' where `us' is the 
+     abbreviation of American language and `msb' as message binary file 
+     extension.
+   dur(IN)
+     Duration for memory allocation for the return message handle. It can be
+     the following values:
+        OCI_DURATION_CALL
+        OCI_DURATION_STATEMENT
+        OCI_DURATION_SESSION
+        OCI_DURATION_TRANSACTION
+     For the detail description, please refer to Memory Related Service
+     Interfaces section.
+*/
+sword OCIMessageOpen(void  *envhp, OCIError *errhp, OCIMsg **msghp,
+                      const OraText *product, const OraText *facility, 
+                      OCIDuration dur);
+ 
+
+/*------------------------- OCIMessageGet -----------------------------------*/
+/*
+   NAME
+     OCIMessageGet - get a locale message from a message handle
+   REMARKS
+     This function will get message with message number identified by msgno and
+     if buflen is not zero, the function will copy the message into the buffer
+     pointed to by msgbuf. If buflen is zero, the message will be copied into
+     a message buffer inside the message handle pointed to by msgh. For both
+     cases. it will return the pointer to the null-terminated message string.
+     If it cannot get the message required, it will return a NULL pointer.
+   RETURNS
+     A pointer to a null-terminated message string on success, otherwise a NULL
+     pointer.
+   msgh(IN/OUT)
+     Pointer to a message handle which was previously opened by
+     OCIMessageOpen().
+   msgno(IN)
+     The message number for getting message.
+   msgbuf(OUT)
+     Pointer to a destination buffer to the message retrieved. If buflen is
+     zero, it can be NULL pointer.
+   buflen(IN)
+     The size of the above destination buffer.
+*/
+OraText *OCIMessageGet(OCIMsg *msgh, ub4 msgno, OraText *msgbuf,
+                       size_t buflen);
+
+/*------------------------- OCIMessageClose ---------------------------------*/
+/*
+   NAME
+     OCIMessageClose - close a message handle
+   REMARKS
+     This function closes a message handle pointed to by msgh and frees any
+     memory associated with this handle.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(IN/OUT)
+     A pointer to a message handle which was previously opened by
+     OCIMessageOpen().
+*/
+sword OCIMessageClose(void  *envhp, OCIError *errhp, OCIMsg *msghp);
+
+/*--------------- End of Extensions to NLS cartridge service ----------------*/
+
+
+/*----------------- Extensions to OCI Thread interface ---------------------*/
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+1 Threads Interface
+
+The OCIThread package provides a number of commonly used threading
+primitives for use by Oracle customers.  It offers a portable interface to
+threading capabilities native to various platforms.  It does not implement
+threading on platforms which do not have native threading capability.
+
+OCIThread does not provide a portable implementation of multithreaded 
+facilities.  It only serves as a set of portable covers for native 
+multithreaded facilities.  Therefore, platforms that do not have native 
+support for multi-threading will only be able to support a limited 
+implementation of OCIThread.  As a result, products that rely on all of 
+OCIThread's functionality will not port to all platforms.  Products that must 
+port to all platforms must use only a subset of OCIThread's functionality.  
+This issue is discussed further in later sections of this document.
+
+The OCIThread API is split into four main parts.  Each part is described
+briefly here.  The following subsections describe each in greater detail.
+
+ 1. Initialization and Termination Calls
+
+     These calls deal with the initialization and termination of OCIThread.
+     Initialization of OCIThread initializes the OCIThread context which is
+     a member of the OCI environment or session handle.  This context is 
+     required for other OCIThread calls.
+
+ 2. Passive Threading Primitives
+
+     The passive threading primitives include primitives to manipulate mutual
+     exclusion (mutex) locks, thread ID's, and thread-specific data keys.
+
+     The reason that these primitives are described as 'passive' is that while
+     their specifications allow for the existence of multiple threads, they do
+     not require it.  This means that it is possible for these primitives to
+     be implemented according to specification in both single-threaded and
+     multi-threaded environments.
+
+     As a result, OCIThread clients that use only these primitives will not
+     require the existence of multiple threads in order to work correctly,
+     i.e., they will be able to work in single-threaded environments without 
+     branching code.
+
+ 3. Active Threading Primitives
+
+     Active threading primitives include primitives dealing with the creation,
+     termination, and other manipulation of threads.
+
+     The reason that these primitives are described as 'active' is that they
+     can only be used in true multi-threaded environments.  Their
+     specifications explicitly require that it be possible to have multiple
+     threads.  If you need to determine at runtime whether or not you are in a
+     multi-threaded environment, call OCIThreadIsMulti() before calling an
+     OCIThread active primitive.
+
+
+1.1 Initialization & Termination
+==================================
+
+The types and functions described in this section are associated with the
+initialization and termination of the OCIThread package.  OCIThread must
+be properly initialized before any of its functionality can be used.
+OCIThread's process initialization function, 'OCIThreadProcessInit()',
+must be called with care; see below.
+
+The observed behavior of the initialization and termination functions is the
+same regardless of whether OCIThread is in single-threaded or multi-threaded
+environment.  It is OK to call the initialization functions from both generic
+and operating system specific (OSD) code.
+
+1.1.1 Types
+
+  OCIThreadContext - OCIThread Context
+  -------------------------------------
+
+    Most calls to OCIThread functions take the OCI environment or session 
+    handle as a parameter.  The OCIThread context is part of the OCI 
+    environment or session handle and it must be initialized by calling 
+    'OCIThreadInit()'.  Termination of the OCIThread context occurs by calling
+    'OCIThreadTerm()'.
+
+    The OCIThread context is a private data structure.  Clients must NEVER
+    attempt to examine the contents of the context.
+
+1.1.2  OCIThreadProcessInit
+
+  OCIThreadProcessInit - OCIThread Process INITialization
+  --------------------------------------------------------
+
+    Description
+
+      This function should be called to perform OCIThread process
+      initialization.
+
+    Prototype
+
+      void OCIThreadProcessInit();
+
+    Returns
+
+      Nothing.
+
+    Notes
+
+      Whether or not this function needs to be called depends on how OCI
+      Thread is going to be used.
+
+        * In a single-threaded application, calling this function is optional.
+          If it is called at all, the first call to it must occur before calls
+          to any other OCIThread functions.  Subsequent calls can be made
+          without restriction; they will not have any effect.
+
+        * In a multi-threaded application, this function MUST be called.  The
+          first call to it MUST occur 'strictly before' any other OCIThread
+          calls; i.e., no other calls to OCIThread functions (including other
+          calls to this one) can be concurrent with the first call.
+          Subsequent calls to this function can be made without restriction;
+          they will not have any effect.
+
+
+1.1.3 OCIThreadInit
+
+  OCIThreadInit - OCIThread INITialize
+  -------------------------------------
+
+    Description
+
+      This initializes OCIThread context.
+
+    Prototype
+
+      sword OCIThreadInit(void *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal for OCIThread clients to try an examine the memory
+      pointed to by the returned pointer.
+
+      It is safe to make concurrent calls to 'OCIThreadInit()'.  Unlike
+      'OCIThreadProcessInit()',  there is no need to have a first call
+      that occurs before all the others.
+
+      The first time 'OCIThreadInit()' is called, it initilaizes the OCI
+      Thread context.  It also saves a pointer to the context in some system
+      dependent manner.  Subsequent calls to 'OCIThreadInit()' will return
+      the same context.
+
+      Each call to 'OCIThreadInit()' must eventually be matched by a call to
+      'OCIThreadTerm()'.
+
+  OCIThreadTerm - OCIThread TERMinate
+  ------------------------------------
+
+    Description
+
+      This should be called to release the OCIThread context.  It should be
+      called exactly once for each call made to 'OCIThreadInit()'.
+
+    Prototype
+
+      sword OCIThreadTerm(void *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is safe to make concurrent calls to 'OCIThreadTerm()'.
+
+      'OCIThreadTerm()' will not do anything until it has been called as
+      many times as 'OCIThreadInit()' has been called.  When that happens,
+      it terminates the OCIThread layer and frees the memory allocated for
+      the context.  Once this happens, the context should not be re-used.
+      It will be necessary to obtain a new one by calling 'OCIThreadInit()'.
+
+
+  OCIThreadIsMulti - OCIThread Is Multi-Threaded?
+  ------------------------------------------------
+
+    Description
+
+      This tells the caller whether the application is running in a
+      multi-threaded environment or a single-threaded environment.
+
+    Prototype
+      boolean OCIThreadIsMulti(void);
+
+    Returns
+
+      TRUE if the environment is multi-threaded;
+      FALSE if the environment is single-threaded.
+
+
+1.2 Passive Threading Primitives
+==================================
+
+1.2.1 Types
+
+The passive threading primitives deal with the manipulation of mutex, 
+thread ID's, and thread-specific data.  Since the specifications of these 
+primitives do not require the existence of multiple threads, they can be 
+used both on multithreaded and single-threaded platforms.
+
+1.2.1.1  OCIThreadMutex - OCIThread Mutual Exclusion Lock
+-----------------------------------------------------------
+
+  The type 'OCIThreadMutex' is used to represent a mutual exclusion lock
+  (mutex).  A mutex is typically used for one of two purposes: (i) to
+  ensure that only one thread accesses a given set of data at a time, or
+  (ii) to ensure that only one thread executes a given critical section of
+  code at a time.
+
+  Mutexes pointer can be declared as parts of client structures or as 
+  stand-alone variables.  Before they can be used, they must be initialized 
+  using 'OCIThreadMutexInit()'.  Once they are no longer needed, they must be
+  destroyed using 'OCIThreadMutexDestroy()'.  A mutex pointer must NOT be 
+  used after it is destroyed.
+
+  A thread can acquire a mutex by using either 'OCIThreadMutexAcquire()' or
+  'OCIThreadMutexTry()'.  They both ensure that only one thread at a time is
+  allowed to hold a given mutex.  A thread that holds a mutex can release it
+  by calling 'OCIThreadMutexRelease()'.
+
+
+1.2.1.2  OCIThreadKey - OCIThread Key for Thread-Specific Data
+----------------------------------------------------------------
+
+  A key can be thought of as a process-wide variable that has a
+  thread-specific value.  What this means is that all the threads in a
+  process can use any given key.  However, each thread can examine or modify
+  that key independently of the other threads.  The value that a thread sees
+  when it examines the key will always be the same as the value that it last
+  set for the key.  It will not see any values set for the key by the other
+  threads.
+
+  The type of the value held by a key is a 'void *' generic pointer.
+
+  Keys can be created using 'OCIThreadKeyInit()'.  When a key is created, its
+  value is initialized to 'NULL' for all threads.
+
+  A thread can set a key's value using 'OCIThreadKeySet()'.  A thread can
+  get a key's value using 'OCIThreadKeyGet()'.
+
+  The OCIThread key functions will save and retrieve data SPECIFIC TO THE
+  THREAD.  When clients maintain a pool of threads and assign the threads to
+  different tasks, it *may not* be appropriate for a task to use OCIThread
+  key functions to save data associated with it.  Here is a scenario of how
+  things can fail: A thread is assigned to execute the initialization of a
+  task.  During the initialization, the task stored some data related to it
+  in the thread using OCIThread key functions.  After the initialization,
+  the thread is returned back to the threads pool.  Later, the threads pool
+  manager assigned another thread to perform some operations on the task,
+  and the task needs to retrieve those data it stored earlier in
+  initialization.  Since the task is running in another thread, it will not
+  be able to retrieve the same data back!  Applications that use thread
+  pools should be aware of this and be cautious when using OCIThread key
+  functions.
+
+
+1.2.1.3  OCIThreadKeyDestFunc - OCIThread Key Destructor Function Type
+------------------------------------------------------------------------
+
+  This is the type of a pointer to a key's destructor routine.  Keys can be
+  associated with a destructor routine when they are created (see
+  'OCIThreadKeyInit()').
+
+  A key's destructor routine will be called whenever a thread that has a
+  non-NULL value for the key terminates.
+
+  The destructor routine returns nothing and takes one parameter.  The
+  parameter will be the value that was set for key when the thread
+  terminated.
+
+  The destructor routine is guaranteed to be called on a thread's value
+  in the key after the termination of the thread and before process
+  termination.  No more precise guarantee can be made about the timing
+  of the destructor routine call; thus no code in the process may assume
+  any post-condition of the destructor routine.  In particular, the
+  destructor is not guaranteed to execute before a join call on the
+  terminated thread returns.
+
+
+1.2.1.4  OCIThreadId - OCIThread Thread ID
+--------------------------------------------
+
+  Type 'OCIThreadId' is the type that will be used to identify a thread.
+  At any given time, no two threads will ever have the same 'OCIThreadId'.
+  However, 'OCIThreadId' values can be recycled; i.e., once a thread dies,
+  a new thread may be created that has the same 'OCIThreadId' as the one
+  that died.  In particular, the thread ID must uniquely identify a thread
+  T within a process, and it must be consistent and valid in all threads U
+  of the process for which it can be guaranteed that T is running
+  concurrently with U.  The thread ID for a thread T must be retrievable
+  within thread T.  This will be done via OCIThreadIdGet().
+
+  The 'OCIThreadId' type supports the concept of a NULL thread ID: the NULL
+  thread ID will never be the same as the ID of an actual thread.
+
+
+
+1.2.2 Function prototypes for passive primitives
+--------------------------------------------------
+
+1.2.2.1 Mutex functions
+-------------------------
+
+  OCIThreadMutexInit - OCIThread MuteX Initialize
+  -----------------------------------------------
+
+    Description
+
+      This allocate and initializes a mutex.  All mutexes must be 
+      initialized prior to use.
+
+    Prototype
+
+      sword OCIThreadMutexInit(void *hndl, OCIError *err, 
+                               OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(OUT):  The mutex to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Multiple threads must not initialize the same mutex simultaneously.
+      Also, a mutex must not be reinitialized until it has been destroyed (see
+      'OCIThreadMutexDestroy()').
+
+  OCIThreadMutexDestroy - OCIThread MuteX Destroy
+  -----------------------------------------------
+
+    Description
+
+      This destroys and deallocate a mutex.  Each mutex must be destroyed 
+      once it is no longer needed.
+
+    Prototype
+
+      sword OCIThreadMutexDestroy(void *hndl, OCIError *err,
+                                  OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is not legal to destroy a mutex that is uninitialized or is currently
+      held by a thread.  The destruction of a mutex must not occur concurrently
+      with any other operations on the mutex.  A mutex must not be used after
+      it has been destroyed.
+
+
+  OCIThreadMutexAcquire - OCIThread MuteX Acquire
+  -----------------------------------------------
+
+    Description
+
+      This acquires a mutex for the thread in which it is called.  If the mutex
+      is held by another thread, the calling thread is blocked until it can
+      acquire the mutex.
+
+    Prototype
+
+     sword OCIThreadMutexAcquire(void *hndl, OCIError *err,
+                                 OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to acquire.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to acquire an uninitialized mutex.
+
+      This function's behavior is undefined if it is used by a thread to
+      acquire a mutex that is already held by that thread.
+
+
+
+  OCIThreadMutexRelease - OCIThread MuteX Release
+  -----------------------------------------------
+
+    Description
+
+      This releases a mutex.  If there are any threads blocked on the mutex,
+      one of them will acquire it and become unblocked.
+
+    Prototype
+
+      sword OCIThreadMutexRelease(void *hndl, OCIError *err,
+                                  OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to release.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to release an uninitialized mutex.  It is also
+      illegal for a thread to release a mutex that it does not hold.
+
+
+  OCIThreadKeyInit - OCIThread KeY Initialize
+  -------------------------------------------
+
+    Description
+
+      This creates a key.  Each call to this routine allocate and generates 
+      a new key that is distinct from all other keys.
+
+    Prototype
+
+      sword OCIThreadKeyInit(void *hndl, OCIError *err, OCIThreadKey **key,
+                             OCIThreadKeyDestFunc destFn);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(OUT):    The 'OCIThreadKey' in which to create the new key.
+
+        destFn(IN):  The destructor for the key.  NULL is permitted.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Once this function executes successfully, a pointer to an allocated and 
+      initialized key is return.  That key can be used with 'OCIThreadKeyGet()'
+      and 'OCIThreadKeySet()'.  The initial value of the key will be 'NULL' for
+      all threads.
+
+      It is illegal for this function to be called more than once to create the
+      same key (i.e., to be called more than once with the same value for the
+      'key' parameter).
+
+      If the 'destFn' parameter is not NULL, the routine pointed to by 'destFn'
+      will be called whenever a thread that has a non-NULL value for the key
+      terminates.  The routine will be called with one parameter.  The
+      parameter will be the key's value for the thread at the time at which the
+      thread terminated.
+      If the key does not need a destructor function, pass NULL for 'destFn'.
+
+
+  OCIThreadKeyDestroy - OCIThread KeY DESTROY
+  -------------------------------------------
+
+   Description
+
+     Destroy and deallocate the key pointed to by 'key'.
+
+    Prototype
+
+      sword OCIThreadKeyDestroy(void *hndl, OCIError *err, 
+                                OCIThreadKey **key);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT):  The 'OCIThreadKey' in which to destroy the key.
+ 
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      This is different from the destructor function callback passed to the
+      key create routine.  This new destroy function 'OCIThreadKeyDestroy' is 
+      used to terminate any resources OCI THREAD acquired when it created 
+      'key'.  [The 'OCIThreadKeyDestFunc' callback type is a key VALUE 
+      destructor; it does in no way operate on the key itself.]
+
+      This must be called once the user has finished using the key.  Not
+      calling the key destroy function may result in memory leaks.
+
+
+
+
+1.2.2.2 Thread Key operations
+-------------------------------
+
+  OCIThreadKeyGet - OCIThread KeY Get value
+  -----------------------------------------
+
+    Description
+
+      This gets the calling thread's current value for a key.
+
+    Prototype
+
+      sword OCIThreadKeyGet(void *hndl, OCIError *err, OCIThreadKey *key,
+                            void **pValue);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN):          The key.
+
+        pValue(IN/OUT):   The location in which to place the thread-specific
+                          key value.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+      If the calling thread has not yet assigned a value to the key, 'NULL' is
+      placed in the location pointed to by 'pValue'.
+
+
+  OCIThreadKeySet - OCIThread KeY Set value
+  -----------------------------------------
+
+    Description
+
+      This sets the calling thread's value for a key.
+
+    Prototype
+
+      sword OCIThreadKeySet(void *hndl, OCIError *err, OCIThreadKey *key,
+                            void *value);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT): The key.
+
+        value(IN):   The thread-specific value to set in the key.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+1.2.2.3  Thread Id
+--------------------
+
+  OCIThreadIdInit - OCIThread Thread Id INITialize
+  --------------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdInit(void *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid (OUT):   Pointer to the thread ID to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadIdDestroy - OCIThread Thread Id DESTROY
+  --------------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdDestroy(void *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN/OUT):        Pointer to the thread ID to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Note
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSet - OCIThread Thread Id Set
+  -----------------------------------------
+
+    Description
+
+      This sets one 'OCIThreadId' to another.
+
+    Prototype
+
+      sword OCIThreadIdSet(void *hndl, OCIError *err, 
+                           OCIThreadId *tidDest,
+                           OCIThreadId *tidSrc);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tidDest(OUT):   This should point to the location of the 'OCIThreadId'
+                        to be set to.
+
+        tidSrc(IN):     This should point to the 'OCIThreadId' to set from.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSetNull - OCIThread Thread Id Set Null
+  ---------------------------------------------------------
+
+    Description
+
+      This sets the NULL thread ID to a given 'OCIThreadId'.
+
+    Prototype
+
+      sword OCIThreadIdSetNull(void *hndl, OCIError *err,
+                               OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        tid(OUT):    This should point to the 'OCIThreadId' in which to put
+                     the NULL thread ID.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdGet - OCIThread Thread Id Get
+  ------------------------------------------
+
+    Description
+
+      This retrieves the 'OCIThreadId' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadIdGet(void *hndl, OCIError *err,
+                           OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(OUT):    This should point to the location in which to place the
+                     ID of the calling thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      When OCIThread is used in a single-threaded environment,
+      OCIThreadIdGet() will always place the same value in the location
+      pointed to by 'tid'.  The exact value itself is not important.  The
+      important thing is that it is not the same as the NULL thread ID and
+      that it is always the same value.
+
+
+  OCIThreadIdSame - OCIThread Thread Ids Same?
+  ----------------------------------------------
+
+    Description
+
+      This determines whether or not two 'OCIThreadId's represent the same
+      thread.
+
+    Prototype
+
+      sword OCIThreadIdSame(void *hndl, OCIError *err,
+                            OCIThreadId *tid1, OCIThreadId *tid2,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid1(IN):   Pointer to the first 'OCIThreadId'.
+
+        tid2(IN):   Pointer to the second 'OCIThreadId'.
+        
+        result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid1' and 'tid2' represent the same thread, 'result' is set to TRUE.
+      Otherwise, 'result' is set to FALSE.
+
+      'result' is set to TRUE if both 'tid1' and 'tid2' are the NULL thread ID.
+
+      'ti1d' and 'tid2' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdNull - OCIThread Thread Id NULL?
+  ---------------------------------------------
+
+    Description
+
+      This determines whether or not a given 'OCIThreadId' is the NULL thread
+      ID.
+
+    Prototype
+
+      sword OCIThreadIdNull(void *hndl, OCIError *err,
+                            OCIThreadId *tid,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN):    Pointer to the 'OCIThreadId' to check.
+
+        result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid' is the NULL thread ID, 'result' is set to TRUE.  Otherwise, 
+      'result' is set to FALSE.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+1.3 Active Threading Primitives
+=================================
+
+The active threading primitives deal with the manipulation of actual
+threads.  Because the specifications of most of these primitives require
+that it be possible to have multiple threads, they work correctly only in
+the enabled OCIThread; In the disabled OCIThread, they always return
+failure.  The exception is OCIThreadHandleGet(); it may be called in a 
+single-threaded environment, in which case it will have no effect.
+
+Active primitives should only be called by code running in a multi-threaded
+environment.  You can call OCIThreadIsMulti() to determine whether the 
+environment is multi-threaded or single-threaded.
+
+
+1.3.1  Types
+--------------
+
+1.3.1.1    OCIThreadHandle - OCIThread Thread Handle
+------------------------------------------------------
+
+  Type 'OCIThreadHandle' is used to manipulate a thread in the active
+  primitives:  OCIThreadJoin()and OCIThreadClose().  A thread handle opened by
+  OCIThreadCreate() must be closed in a matching call to
+  OCIThreadClose().  A thread handle is invalid after the call to
+  OCIThreadClose().
+
+  The distinction between a thread ID and a thread handle in OCIThread usage
+  follows the distinction between the thread ID and the thread handle on
+  Windows NT.  On many platforms, the underlying native types are the same.
+
+
+1.3.2  Functions
+------------------
+
+  OCIThreadHndInit - OCIThread HaNDle Initialize
+  ----------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndInit(void *hndl, OCIError *err, 
+                             OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(OUT):   The address of pointer to the thread handle to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadHndDestroy - OCIThread HaNDle Destroy
+  ----------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndDestroy(void *hndl, OCIError *err, 
+                                OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(IN/OUT):  The address of pointer to the thread handle to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+  OCIThreadCreate - OCIThread Thread Create
+  -----------------------------------------
+
+    Description
+
+      This creates a new thread.
+
+    Prototype
+
+      sword OCIThreadCreate(void *hndl, OCIError *err,
+                            void (*start)(void *), void *arg,
+                            OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        start(IN):    The function in which the new thread should begin
+                      execution.
+
+        arg(IN):      The argument to give the function pointed to by 'start'.
+
+        tid(IN/OUT):  If not NULL, gets the ID for the new thread.
+
+        tHnd(IN/OUT): If not NULL, gets the handle for the new thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      The new thread will start by executing a call to the function pointed
+      to by 'start' with the argument given by 'arg'.  When that function
+      returns, the new thread will terminate.  The function should not
+      return a value and should accept one parameter, a 'void *'.
+
+      The call to OCIThreadCreate() must be matched by a call to
+      OCIThreadClose() if and only if tHnd is non-NULL.
+
+      If tHnd is NULL, a thread ID placed in *tid will not be valid in the
+      calling thread because the timing of the spawned thread's termination
+      is unknown.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+
+  OCIThreadJoin - OCIThread Thread Join
+  -------------------------------------
+
+    Description
+
+      This function allows the calling thread to 'join' with another thread.
+      It blocks the caller until the specified thread terminates.
+
+    Prototype
+
+      sword OCIThreadJoin(void *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN):    The 'OCIThreadHandle' of the thread to join with.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      The result of multiple threads all trying to join with the same thread is
+      undefined.
+
+
+  OCIThreadClose - OCIThread Thread Close
+  ---------------------------------------
+
+   Description
+
+     This function should be called to close a thread handle.
+
+   Prototype
+
+     sword OCIThreadClose(void *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):    The OCIThread thread handle to close.
+
+   Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+   Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      Both thread handle and the thread ID that was returned by the same call
+      to OCIThreadCreate() are invalid after the call to OCIThreadClose().
+
+
+
+  OCIThreadHandleGet - OCIThread Thread Get Handle
+  ------------------------------------------------
+
+    Description
+
+      Retrieve the 'OCIThreadHandle' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadHandleGet(void *hndl, OCIError *err,
+                               OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):      If not NULL, the location to place the thread
+                           handle for the thread.
+
+     Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().   
+
+      The thread handle 'tHnd' retrieved by this function must be closed 
+      with OCIThreadClose() and destroyed by OCIThreadHndDestroy() after it
+      is used.
+
+
+
+
+1.4 Using OCIThread
+=====================
+
+This section summarizes some of the more important details relating to the use
+of OCIThread.
+
+  * Process initialization
+
+    OCIThread only requires that the process initialization function
+    ('OCIThreadProcessInit()') be called when OCIThread is being used in a
+    multi-threaded application.  Failing to call 'OCIThreadProcessInit()' in
+    a single-threaded application is not an error.
+
+  * OCIThread initialization
+
+    Separate calls to 'OCIThreadInit()' will all return the same OCIThread
+    context.
+
+    Also, remember that each call to 'OCIThreadInit()' must eventually be
+    matched by a call to 'OCIThreadTerm()'.
+
+  * Active vs. Passive Threading primitives
+
+    OCIThread client code written without using any active primitives can be
+    compiled and used without change on both single-threaded and
+    multi-threaded platforms.
+
+    OCIThread client code written using active primitives will only work
+    correctly on multi-threaded platforms.  In order to write a version of the
+    same application to run on single-threaded platform, it is necessary to 
+    branch the your code, whether by branching versions of the source file or 
+    by branching at runtime with the OCIThreadIsMulti() call.
+
+******************************************************************************/
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+void OCIThreadProcessInit();
+
+sword OCIThreadInit(void  *hndl, OCIError *err);
+
+sword OCIThreadTerm(void  *hndl, OCIError *err);
+
+boolean OCIThreadIsMulti();
+
+sword OCIThreadMutexInit(void  *hndl, OCIError *err,  
+                         OCIThreadMutex **mutex); 
+
+sword OCIThreadMutexDestroy(void  *hndl, OCIError *err, 
+                            OCIThreadMutex **mutex);
+
+sword OCIThreadMutexAcquire(void  *hndl, OCIError *err,
+                            OCIThreadMutex *mutex);
+
+sword OCIThreadMutexRelease(void  *hndl, OCIError *err,
+                            OCIThreadMutex *mutex);
+
+sword OCIThreadKeyInit(void  *hndl, OCIError *err, OCIThreadKey **key,
+                       OCIThreadKeyDestFunc destFn);
+
+sword OCIThreadKeyDestroy(void  *hndl, OCIError *err, 
+                          OCIThreadKey **key);
+
+sword OCIThreadKeyGet(void  *hndl, OCIError *err, OCIThreadKey *key,
+                      void  **pValue);
+
+sword OCIThreadKeySet(void  *hndl, OCIError *err, OCIThreadKey *key,
+                      void  *value);
+
+sword OCIThreadIdInit(void  *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdDestroy(void  *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdSet(void  *hndl, OCIError *err, 
+                     OCIThreadId *tidDest, OCIThreadId *tidSrc);
+
+sword OCIThreadIdSetNull(void  *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdGet(void  *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdSame(void  *hndl, OCIError *err,
+                      OCIThreadId *tid1, OCIThreadId *tid2,
+                      boolean *result);
+
+sword OCIThreadIdNull(void  *hndl, OCIError *err,
+                      OCIThreadId *tid, boolean *result);
+
+sword OCIThreadHndInit(void  *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadHndDestroy(void  *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadCreate(void  *hndl, OCIError *err,
+                      void (*start)(void  *), void  *arg,
+                      OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+sword OCIThreadJoin(void  *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadClose(void  *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadHandleGet(void  *hndl, OCIError *err, OCIThreadHandle *tHnd);
+/*----------------- End OCI Thread interface Extensions ---------------------*/
+
+/*------------------ Begin OCI Row Callback Interfaces ----------------------*/
+
+typedef sword (*OCIBindRowCallback)(void  *ctx);
+typedef sword (*OCIFetchRowCallback)(void  *ctx);
+
+/*------------------ Begin OCI Row Callback Interfaces ----------------------*/
+
+/*--------------- Begin OCI Client Notification Interfaces ------------------*/
+
+typedef ub4 (*OCISubscriptionNotify)(void  *ctx, OCISubscription *subscrhp, 
+                                     void  *pay, ub4 payl, 
+                                     void  *desc, ub4 mode);
+
+sword OCISubscriptionRegister(OCISvcCtx *svchp, OCISubscription **subscrhpp, 
+                              ub2 count, OCIError *errhp, ub4 mode);
+
+
+sword OCISubscriptionPost(OCISvcCtx *svchp, OCISubscription **subscrhpp, 
+                              ub2 count, OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionUnRegister(OCISvcCtx *svchp, OCISubscription *subscrhp, 
+                              OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionDisable(OCISubscription *subscrhp, 
+                           OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionEnable(OCISubscription *subscrhp, 
+                          OCIError *errhp, ub4 mode);
+
+/*------------------- End OCI Publish/Subscribe Interfaces ------------------*/
+
+/*----------------- Extensions to Datetime interfaces -----------------------*/
+/*--------------------- Actual Prototypes -----------------------------------*/
+sword OCIDateTimeGetTime(void  *hndl, OCIError *err, OCIDateTime *datetime, 
+                         ub1 *hr, ub1 *mm, ub1 *ss, ub4 *fsec);
+
+sword OCIDateTimeGetDate(void  *hndl, OCIError *err,  const OCIDateTime *date, 
+                 sb2 *yr, ub1 *mnth, ub1 *dy );
+
+sword OCIDateTimeGetTimeZoneOffset(void  *hndl,OCIError *err,
+                                   const OCIDateTime *datetime,
+                                   sb1 *hr,sb1 *mm);
+
+sword OCIDateTimeConstruct(void   *hndl,OCIError *err,OCIDateTime *datetime,
+               sb2 yr,ub1 mnth,ub1 dy,ub1 hr,ub1 mm,ub1 ss,ub4 fsec,
+               OraText  *timezone,size_t timezone_length);
+
+sword OCIDateTimeSysTimeStamp(void  *hndl, OCIError *err, 
+                              OCIDateTime *sys_date );
+
+sword OCIDateTimeAssign(void  *hndl, OCIError *err, const OCIDateTime *from, 
+                       OCIDateTime *to);
+
+sword OCIDateTimeToText(void  *hndl, OCIError *err, const OCIDateTime *date, 
+                        const OraText *fmt, ub1 fmt_length, ub1 fsprec, 
+                        const OraText *lang_name, size_t lang_length, 
+                        ub4 *buf_size, OraText *buf );
+
+sword OCIDateTimeFromText(void  *hndl, OCIError *err, const OraText *date_str, 
+             size_t dstr_length, const OraText *fmt, ub1 fmt_length,
+             const OraText *lang_name, size_t lang_length, OCIDateTime *date );
+
+sword OCIDateTimeCompare(void  *hndl, OCIError *err, const OCIDateTime *date1, 
+                     const OCIDateTime *date2,  sword *result );
+
+sword OCIDateTimeCheck(void  *hndl, OCIError *err, const OCIDateTime *date, 
+                 ub4 *valid );
+
+sword OCIDateTimeConvert(void  *hndl, OCIError *err, OCIDateTime *indate,
+                                OCIDateTime *outdate);
+
+sword OCIDateTimeSubtract(void  *hndl, OCIError *err, OCIDateTime *indate1, 
+                OCIDateTime *indate2,    OCIInterval *inter);
+
+sword OCIDateTimeIntervalAdd(void  *hndl, OCIError *err, OCIDateTime *datetime,
+         OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIDateTimeIntervalSub(void  *hndl, OCIError *err, OCIDateTime *datetime,
+         OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIIntervalSubtract(void  *hndl, OCIError *err, OCIInterval *minuend, 
+                            OCIInterval *subtrahend, OCIInterval *result );
+
+sword OCIIntervalAdd(void  *hndl, OCIError *err, OCIInterval *addend1, 
+                        OCIInterval *addend2, OCIInterval *result );
+
+sword OCIIntervalMultiply(void  *hndl, OCIError *err, const OCIInterval *inter,
+                        OCINumber *nfactor, OCIInterval *result );
+
+sword OCIIntervalDivide(void  *hndl, OCIError *err, OCIInterval *dividend, 
+                OCINumber *divisor, OCIInterval *result );
+
+sword OCIIntervalCompare(void  *hndl, OCIError *err, OCIInterval *inter1, 
+                        OCIInterval *inter2, sword *result );
+
+sword OCIIntervalFromNumber(void  *hndl, OCIError *err, OCIInterval *inter, 
+                        OCINumber *number);
+
+sword OCIIntervalFromText( void  *hndl, OCIError *err, const OraText *inpstr, 
+                size_t str_len, OCIInterval *result );
+
+sword OCIIntervalToText( void  *hndl, OCIError *err, const OCIInterval *inter,
+                         ub1 lfprec, ub1 fsprec, 
+                        OraText *buffer, size_t buflen, size_t *resultlen );
+
+sword OCIIntervalToNumber(void  *hndl, OCIError *err,const OCIInterval *inter, 
+                        OCINumber *number);
+
+sword OCIIntervalCheck(void  *hndl, OCIError *err, const OCIInterval *interval,
+                         ub4 *valid );
+
+sword OCIIntervalAssign(void  *hndl, OCIError *err, const OCIInterval *ininter,
+                        OCIInterval *outinter );
+
+sword OCIIntervalSetYearMonth(void  *hndl, OCIError *err, sb4 yr, sb4 mnth,
+                        OCIInterval *result );
+
+sword OCIIntervalGetYearMonth(void  *hndl, OCIError *err, sb4 *yr, sb4 *mnth,
+                        const OCIInterval *result );
+
+sword OCIIntervalSetDaySecond(void  *hndl, OCIError *err, sb4 dy, sb4 hr,
+                        sb4 mm, sb4 ss, sb4 fsec, OCIInterval *result );
+
+sword OCIIntervalGetDaySecond(void  *hndl, OCIError *err, sb4 *dy, sb4 *hr,
+                     sb4 *mm, sb4 *ss, sb4 *fsec, const OCIInterval *result );
+
+sword OCIDateTimeToArray(void  *hndl, OCIError *err,
+                         const OCIDateTime *datetime, const OCIInterval *reftz,
+                         ub1 *outarray, ub4 *len, ub1 fsprec);
+
+sword OCIDateTimeFromArray(void  *hndl, OCIError *err, ub1 *inarray, ub4 len,
+                           ub1 type, OCIDateTime *datetime,
+                           const OCIInterval *reftz, ub1 fsprec);
+
+sword OCIDateTimeGetTimeZoneName(void  *hndl, OCIError *err,
+                                 const OCIDateTime *datetime, 
+                                 ub1 *buf, ub4 *buflen);
+
+sword OCIIntervalFromTZ(void  *hndl, OCIError *err, const oratext *inpstring,
+                        size_t str_len, OCIInterval *result);
+
+/*----------------- End Datetime interface Extensions -----------------------*/
+
+/*----------------- Connection Pooling prototypes ---------------------------*/
+sword OCIConnectionPoolCreate(OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+                              OraText **poolName, sb4 *poolNameLen,  
+                              const OraText *dblink, sb4 dblinkLen,
+                              ub4 connMin, ub4 connMax, ub4 connIncr,
+                              const OraText *poolUserName, sb4 poolUserLen,
+                              const OraText *poolPassword, sb4 poolPassLen,
+                              ub4 mode);
+
+sword OCIConnectionPoolDestroy(OCICPool *poolhp,
+                               OCIError *errhp, ub4 mode);
+
+/*----------------- End Connection Pooling prototypes -----------------------*/
+
+/*-------------------- Session Pooling prototypes ---------------------------*/
+
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISPool *spoolhp, 
+                            OraText **poolName, ub4 *poolNameLen, 
+                            const OraText *connStr, ub4 connStrLen,
+                            ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                            OraText *userid, ub4 useridLen,
+                            OraText *password, ub4 passwordLen,
+                            ub4 mode);
+                                                  
+sword OCISessionPoolDestroy (OCISPool *spoolhp,
+                             OCIError *errhp,
+                             ub4 mode);
+                             
+sword OCISessionGet (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                     OCIAuthInfo *authhp,
+                     OraText *poolName, ub4 poolName_len, 
+                     const OraText *tagInfo, ub4 tagInfo_len,
+                     OraText **retTagInfo, ub4 *retTagInfo_len,
+                     boolean *found, ub4 mode);
+
+sword OCISessionRelease (OCISvcCtx *svchp, OCIError *errhp,
+                         OraText *tag, ub4 tag_len,
+                         ub4 mode);
+
+/*-------------------- End Session Pooling prototypes -----------------------*/
+
+/* --------------------- OCI Application Context --------------------------*/
+
+
+sword OCIAppCtxSet(void * sesshndl, void  *nsptr, ub4 nsptrlen,
+                   void  *attrptr,  ub4 attrptrlen,
+                   void  *valueptr, ub4 valueptrlen,
+                   OCIError *errhp, ub4 mode);
+
+sword OCIAppCtxClearAll(void *sesshndl, void  *nsptr, ub4 nsptrlen,
+                        OCIError *errhp, ub4 mode);
+
+/*-------------------------------- OCIMemStats ------------------------------*/
+sword  OCIMemStats(void     *hndlp, OCIError *errhp, OCIEnv   **envhp,
+                   ub4      mode, ub4      mode1, oratext     *tabname);
+
+/*-------------------------------- OCIPing ----------------------------------*/
+sword OCIPing (OCISvcCtx *svchp, OCIError *errhp, ub4 mode);
+
+/*----------------- Kerberos Authentication prototypes ----------------------*/
+
+sword OCIKerbAttrSet(OCISession *trgthndlp, ub4 cred_use, ub1 *ftgt_ticket, 
+                     ub4 ticket_len, ub1 *session_key, ub4 skey_len, 
+                     ub2 ftgt_keytype, ub4 ftgt_ticket_flags, 
+                     sb4 ftgt_auth_time, sb4 ftgt_start_time, 
+                     sb4 ftgt_end_time, sb4 ftgt_renew_time, 
+                     oratext *ftgt_client_principal, 
+                     ub4 ftgt_client_principal_len, oratext *ftgt_client_realm,
+                     ub4 ftgt_client_realm_len, OCIError *errhp);
+
+/*------------------- End Kerberos Authentication prototypes ----------------*/
+
+/*------------------- Database Startup/Shutdown prototypes ------------------*/
+
+sword OCIDBStartup (OCISvcCtx     *svchp,
+                    OCIError      *errhp,
+                    OCIAdmin      *admhp,
+                    ub4            mode,
+                    ub4            flags);
+
+sword OCIDBShutdown(OCISvcCtx     *svchp,
+                    OCIError      *errhp,
+                    OCIAdmin      *admhp,
+                    ub4            mode);
+
+/*------------------ End Database Startup/Shutdown prototypes ---------------*/
+
+/*----------------------- OCIClientVersion ------------------------------*/
+void OCIClientVersion(sword *major_version,
+                      sword *minor_version,
+                      sword *update_num,
+                      sword *patch_num,
+                      sword *port_update_num);
+/*----------------------- End OCIClientVersion --------------------------*/
+
+/*----------------------- HA Event prototypes ------------------------------*/
+
+sword OCIInitEventHandle(OCIError *errhp, 
+                         OCIEvent *event,
+                         text     *str,
+                         ub4       size);
+
+/*----------------------- End HA Event prototypes --------------------------*/
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+            /* the following functions are depracated and should not be used */
+#ifdef NEVER
+sword   OCIStmtBindByPos  (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+                  ub4 position, void  *valuep, sb4 value_sz,
+                  ub2 dty, void  *indp, ub2 *alenp, ub2 *rcodep,
+                  ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+sword   OCIStmtBindByName  (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+                  const OraText *placeholder, sb4 placeh_len, void  *valuep, 
+                  sb4 value_sz, ub2 dty, void  *indp, ub2 *alenp, 
+                  ub2 *rcodep, ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   ocidefn  (OCIStmt *stmtp, OCIDefine *defnp, OCIError *errhp,
+                  ub4 position, void  *valuep, sb4 value_sz, ub2 dty,
+                  void  *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+#endif /* NEVER */
+
+#endif                                                       /* OCIAP_ORACLE */
diff --git a/sdk/include/ociapr.h b/sdk/include/ociapr.h
new file mode 100755
index 0000000..2f25c52
--- /dev/null
+++ b/sdk/include/ociapr.h
@@ -0,0 +1,155 @@
+/* Copyright (c) 1991, 2005, Oracle. All rights reserved.  */
+/*
+   NAME
+     ociapr.h
+   MODIFIED   (MM/DD/YY)
+    mbastawa   09/16/05 -  dbhygiene
+    dmukhin    06/29/05 -  ANSI prototypes; miscellaneous cleanup 
+    dsaha      05/19/00 -  Fix lint
+    sgollapu   05/19/98 -  Change text to OraText
+    dchatter   11/10/95 -  add ognfd() - get native fd
+    lchidamb   04/06/95 -  drop maxdsz from obindps/odefinps
+    slari      04/07/95 -  add opinit
+    dchatter   03/08/95 -  osetpi and ogetpi
+    lchidamb   12/09/94 -  add obindps() and odefinps()
+    dchatter   03/06/95 -  merge changes from branch 1.1.720.2
+    dchatter   11/14/94 -  merge changes from branch 1.1.720.1
+    dchatter   02/08/95 -  olog call; drop onblon
+    dchatter   10/31/94 -  new functions for non-blocking oci
+    rkooi2     11/27/92 -  Changing datatypes to agree with ocidef.h 
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/18/92 -  Changed to agree with oci.c 
+    sjain      03/16/92 -  Creation 
+*/
+/*
+ *  Declare the OCI functions.
+ *  Prototype information is included.
+ *  Use this header for ANSI C compilers.
+ */
+
+#ifndef OCIAPR
+#define OCIAPR
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif 
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif 
+
+/*
+ * Oci BIND (Piecewise or with Skips) 
+ */
+sword  obindps(struct cda_def *cursor, ub1 opcode, OraText *sqlvar, 
+               sb4 sqlvl, ub1 *pvctx, sb4 progvl, 
+               sword ftype, sword scale,
+               sb2 *indp, ub2 *alen, ub2 *arcode, 
+               sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip,
+               ub4 maxsiz, ub4 *cursiz,
+               OraText *fmt, sb4 fmtl, sword fmtt);
+sword  obreak(struct cda_def *lda);
+sword  ocan  (struct cda_def *cursor);
+sword  oclose(struct cda_def *cursor);
+sword  ocof  (struct cda_def *lda);
+sword  ocom  (struct cda_def *lda);
+sword  ocon  (struct cda_def *lda);
+
+
+/*
+ * Oci DEFINe (Piecewise or with Skips) 
+ */
+sword  odefinps(struct cda_def *cursor, ub1 opcode, sword pos,ub1 *bufctx,
+                sb4 bufl, sword ftype, sword scale, 
+                sb2 *indp, OraText *fmt, sb4 fmtl, sword fmtt, 
+                ub2 *rlen, ub2 *rcode,
+                sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip);
+sword  odessp(struct cda_def *cursor, OraText *objnam, size_t onlen,
+              ub1 *rsv1, size_t rsv1ln, ub1 *rsv2, size_t rsv2ln,
+              ub2 *ovrld, ub2 *pos, ub2 *level, OraText **argnam,
+              ub2 *arnlen, ub2 *dtype, ub1 *defsup, ub1* mode,
+              ub4 *dtsiz, sb2 *prec, sb2 *scale, ub1 *radix,
+              ub4 *spare, ub4 *arrsiz);
+sword  odescr(struct cda_def *cursor, sword pos, sb4 *dbsize,
+                 sb2 *dbtype, sb1 *cbuf, sb4 *cbufl, sb4 *dsize,
+                 sb2 *prec, sb2 *scale, sb2 *nullok);
+sword  oerhms   (struct cda_def *lda, sb2 rcode, OraText *buf,
+                 sword bufsiz);
+sword  oermsg   (sb2 rcode, OraText *buf);
+sword  oexec    (struct cda_def *cursor);
+sword  oexfet   (struct cda_def *cursor, ub4 nrows,
+                 sword cancel, sword exact);
+sword  oexn     (struct cda_def *cursor, sword iters, sword rowoff);
+sword  ofen     (struct cda_def *cursor, sword nrows);
+sword  ofetch   (struct cda_def *cursor);
+sword  oflng    (struct cda_def *cursor, sword pos, ub1 *buf,
+                 sb4 bufl, sword dtype, ub4 *retl, sb4 offset);
+sword  ogetpi   (struct cda_def *cursor, ub1 *piecep, void  **ctxpp, 
+                 ub4 *iterp, ub4 *indexp);
+sword  oopt     (struct cda_def *cursor, sword rbopt, sword waitopt);
+sword  opinit   (ub4 mode);
+sword  olog     (struct cda_def *lda, ub1* hda,
+                 OraText *uid, sword uidl,
+                 OraText *pswd, sword pswdl, 
+                 OraText *conn, sword connl, 
+                 ub4 mode);
+sword  ologof   (struct cda_def *lda);
+sword  oopen    (struct cda_def *cursor, struct cda_def *lda,
+                 OraText *dbn, sword dbnl, sword arsize,
+                 OraText *uid, sword uidl);
+sword  oparse   (struct cda_def *cursor, OraText *sqlstm, sb4 sqllen,
+                 sword defflg, ub4 lngflg);
+sword  orol     (struct cda_def *lda);
+sword  osetpi   (struct cda_def *cursor, ub1 piece, void  *bufp, ub4 *lenp);
+
+void sqlld2     (struct cda_def *lda, OraText *cname, sb4 *cnlen);
+void sqllda     (struct cda_def *lda);
+
+/* non-blocking functions */
+sword onbset    (struct cda_def *lda ); 
+sword onbtst    (struct cda_def *lda ); 
+sword onbclr    (struct cda_def *lda ); 
+sword ognfd     (struct cda_def *lda, void  *fdp);
+
+
+/* 
+ * OBSOLETE CALLS 
+ */
+
+/* 
+ * OBSOLETE BIND CALLS
+ */
+sword  obndra(struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, ub2 *alen, ub2 *arcode, ub4 maxsiz,
+                 ub4 *cursiz, OraText *fmt, sword fmtl, sword fmtt);
+sword  obndrn(struct cda_def *cursor, sword sqlvn, ub1 *progv,
+                 sword progvl, sword ftype, sword scale, sb2 *indp,
+                 OraText *fmt, sword fmtl, sword fmtt);
+sword  obndrv(struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, OraText *fmt, sword fmtl, sword fmtt);
+
+/*
+ * OBSOLETE DEFINE CALLS
+ */
+sword  odefin(struct cda_def *cursor, sword pos, ub1 *buf,
+              sword bufl, sword ftype, sword scale, sb2 *indp,
+              OraText *fmt, sword fmtl, sword fmtt, ub2 *rlen, ub2 *rcode);
+
+/* older calls ; preferred equivalent calls above */
+
+sword  oname    (struct cda_def *cursor, sword pos, sb1 *tbuf,
+                 sb2 *tbufl, sb1 *buf, sb2 *bufl);
+sword  orlon    (struct cda_def *lda, ub1 *hda, 
+                 OraText *uid, sword uidl, 
+                 OraText *pswd, sword pswdl, 
+                 sword audit);
+sword  olon     (struct cda_def *lda, OraText *uid, sword uidl,
+                 OraText *pswd, sword pswdl, sword audit);
+sword  osql3    (struct cda_def *cda, OraText *sqlstm, sword sqllen);
+sword  odsc     (struct cda_def *cursor, sword pos, sb2 *dbsize,
+                 sb2 *fsize, sb2 *rcode, sb2 *dtype, sb1 *buf,
+                 sb2 *bufl, sb2 *dsize);
+
+#endif /* OCIAPR */
diff --git a/sdk/include/ocidef.h b/sdk/include/ocidef.h
new file mode 100644
index 0000000..9fde50b
--- /dev/null
+++ b/sdk/include/ocidef.h
@@ -0,0 +1,886 @@
+/* Copyright (c) 1981, 2005, Oracle. All rights reserved.  */
+/* Copyright (c) 1984, 2005, Oracle. All rights reserved.  */
+ 
+/*
+NAME
+  ocidef
+CONTENTS
+  Oracle Call Interface cursor area and LDA definitions
+NOTES
+  none
+OWNER
+  Oates
+DATE
+  09/07/82
+MODIFIED
+    mbastawa   09/16/05  - dbhygiene
+    dmukhin    06/29/05  - ANSI prototypes; miscellaneous cleanup 
+    srseshad   03/25/03  - convert oci public api to ansi
+    csteinba   11/05/02  - bug 2521931: redefine OTYACL
+    aahluwal   06/03/02  - bug 2360115
+    bpalaval   02/08/01  - Change text to oratext.
+    chliang    02/01/01  - fix olint error.
+    bpalaval   11/16/00  - Bug 1244685 : Fix ALTER CLUSTER issue..
+    slari      11/08/00  - remove functions duplicated in ociapr.h
+    whe        09/01/99 -  976457:check __cplusplus for C++ code
+    skmishra   04/23/97 -  Provide C++ compatibility
+    lchidamb   06/26/96 -  put upidef.h, riddef.h within #ifndef
+    slari      06/12/96 -  add ocigft_getFcnType
+    dchatter   11/10/95 -  ocignfd - oci get native file descriptor
+    slari      05/11/95 -  change OCIEVDEF/OCIEVTSF to UPIEVDEF/UPIEVTSF
+    dchatter   04/06/95 -  add ifdef flags around OCI_flags
+    lchidamb   04/06/95 -  drop maxdsz from ocibndps/ocidfnps
+    slari      04/07/95 -  rename opinit to ocipin
+    slari      03/13/95 -  thread safety changes
+    dchatter   03/08/95 -  piece definitions OCI_*_PIECE
+    lchidamb   12/06/94 -  add support for binding/defining with skips
+    dchatter   03/06/95 -  merge changes from branch 1.12.720.1
+    dchatter   02/06/95 -  add defines for login mode parameters
+    dchatter   07/06/94 -  Deleting CRSCHK, with refcursor, no way to set this
+    dchatter   06/13/94 -  add a new LDA flag LDANBL
+    rkooi      11/18/92 -  update ocidpr interface 
+    mmoore     10/31/92 -  add ocidpr 
+    gpongrac   11/17/92 -  fix oexfet prototype 
+    sjain      01/03/92 -  Add ocibra 
+    rjenkins   11/04/91 -  adding prototypes for oparse and oexfet 
+    sjain      04/15/91 -         Change ocistf proto 
+    sjain      04/01/91 -         Rearrange oty codes. Add new ones 
+    Jain       12/03/90 - Add #define for new describe call
+    Jain       11/29/90 - Add new function code for the new oci calls
+    Mendels    01/20/89 - fix 19170: make ocitbl CONST_DATA
+    Kabcene    01/27/88 - change interfaces to match V5
+    Navab      12/09/87 - add a parameter to ocierr call
+    Navab      11/30/87 - add ocierr, rename ocioer
+    Navab      10/08/87 - add prototypes for procedure declarations
+    Howard     09/07/87 - endif blah
+    Howard     05/11/87 - Add OTY types
+    Howard     04/27/87 - move ocldef defines here
+    Oates      10/15/85 - Add OCANCEL
+    Oates      09/30/85 - Implement ORA*Net
+    Oates      06/27/85 - Make datatype compatible with upidef.h
+    Andy       05/07/85 - delete CSRFBPIC
+*/
+
+#ifndef UPIDEF 
+#include <upidef.h>
+#endif
+
+#ifndef RIDDEF
+#include <riddef.h>
+#endif
+
+#include <ociapr.h>
+
+#ifndef OCIDEF
+#define OCIDEF
+ 
+ 
+#define CSRCHECK 172                                   /* csrdef is a cursor */
+#define LDACHECK 202                          /* csrdef is a login data area */
+struct csrdef
+{
+   sb2     csrrc;                /* return code: v2 codes, v4 codes negative */
+   ub2     csrft;                                           /* function type */
+   ub4     csrrpc;                                   /* rows processed count */
+   ub2     csrpeo;                                     /* parse error offset */
+   ub1     csrfc;                                           /* function code */
+   ub1     csrlfl;                     /* lda flag to indicate type of login */
+   ub2     csrarc;                        /* actual untranslated return code */
+   ub1     csrwrn;                                          /* warning flags */
+   ub1     csrflg;                                           /* error action */
+   sword   csrcn;                                           /* cursor number */
+   riddef  csrrid;                                        /* rowid structure */
+   sword   csrose;                                /* os dependent error code */
+   ub1     csrchk;                      /* check byte = CSRCHECK - in cursor */
+                                        /* check byte = LDACHECK - in    LDA */
+   struct hstdef *csrhst;                              /* pointer to the hst */
+};
+typedef struct csrdef csrdef;
+typedef struct csrdef ldadef;                    /* lda is the same as a csr */
+ 
+ 
+/* values for csrlfl */
+#define LDAFLG 1                                            /* ...via ologon */
+#define LDAFLO 2                                     /* ...via olon or orlon */
+#define LDANBL 3                                  /* ...nb logon in progress */
+ 
+/* valuses for crsfc */
+#define csrfpa 2                                                  /* ...OSQL */
+#define csrfex 4                                                 /* ...OEXEC */
+#define csrfbi 6                                                 /* ...OBIND */
+#define csrfdb 8                                                /* ...ODFINN */
+#define csrfdi 10                                               /* ...ODSRBN */
+#define csrffe 12                                               /* ...OFETCH */
+#define csrfop 14                                                /* ...OOPEN */
+#define csrfcl 16                                               /* ...OCLOSE */
+#define csrfds 22                                                 /* ...ODSC */
+#define csrfnm 24                                                /* ...ONAME */
+#define csrfp3 26                                                /* ...OSQL3 */
+#define csrfbr 28                                               /* ...OBNDRV */
+#define csrfbx 30                                               /* ...OBNDRN */
+/*#defe csrfdf 32*/                                                  /* ???? */
+#define csrfso 34                                                 /* ...OOPT */
+#define csrfre 36                                               /* ...ORESUM */
+#define csrfbn 50                                               /* ...OBINDN */
+#define csrfca 52                                               /* ..OCANCEL */
+#define csrfsd 54                                                 /* ..OSQLD */
+#define csrfef 56                                                /* ..OEXFEN */
+#define csrfln 58                                                 /* ..OFLNG */
+#define csrfdp 60                                                /* ..ODSCSP */
+#define csrfba 62                                                /* ..OBNDRA */
+#define csrfbps 63                                               /*..OBINDPS */
+#define csrfdps 64                                              /*..ODEFINPS */
+#define csrfgpi 65                                              /* ...OGETPI */
+#define csrfspi 66                                              /* ...OSETPI */
+
+/* values for csrwrn */
+#define CSRWANY  0x01                         /* there is a warning flag set */
+#define CSRWTRUN 0x02                           /* a data item was truncated */
+#define CSRWNVIC 0x04      /* NULL values were used in an aggregate function */
+#define CSRWITCE 0x08           /* column count not equal to into list count */
+#define CSRWUDNW 0x10               /* update or delete without where clause */
+#define CSRWRSV0 0x20
+#define CSRWROLL 0x40                                   /* rollback required */
+#define CSRWRCHG 0x80       /* change after query start on select for update */
+ 
+/* values fro csrflg */
+#define CSRFSPND 0x01                         /* current operation suspended */
+#define CSRFATAL 0x02            /* fatal operation: transaction rolled back */
+#define CSRFBROW 0x04                              /* current row backed out */
+#define CSRFREFC 0x08     /* ref cursor type CRSCHK disabled for this cursor */
+#define CSRFNOAR 0x10     /* ref cursor type binds, so no array bind/execute */
+ 
+/* define function codes; in order of octdef.h */
+#define OTYCTB 1                                             /* CREATE TABLE */
+#define OTYSER 2                                                 /* set role */
+#define OTYINS 3                                                   /* INSERT */
+#define OTYSEL 4                                                   /* SELECT */
+#define OTYUPD 5                                                   /* UPDATE */
+#define OTYDRO 6                                                /* drop role */
+#define OTYDVW 7                                                /* DROP VIEW */
+                                                  /* once was validate index */
+                                                /* once was create partition */
+                                                 /* once was alter partition */
+#define OTYDTB 8                                               /* DROP TABLE */
+                                                     /* once was alter space */
+                                                      /* once was drop space */
+#define OTYDEL 9                                                   /* DELETE */
+#define OTYCVW 10                                             /* create view */
+#define OTYDUS 11                                               /* drop user */
+#define OTYCRO 12                                             /* create role */
+#define OTYCSQ 13                                         /* create sequence */
+#define OTYASQ 14                                          /* alter sequence */
+#define OTYACL 15                                           /* alter cluster */
+#define OTYDSQ 16                                           /* drop sequence */
+#define OTYCSC 17                                           /* create schema */
+#define OTYCCL 18                                          /* CREATE CLUSTER */
+                                                   /* once was alter cluster */
+#define OTYCUS 19                                             /* create user */
+#define OTYCIX 20                                            /* CREATE INDEX */
+#define OTYDIX 21                                              /* DROP INDEX */
+#define OTYDCL 22                                            /* DROP CLUSTER */
+#define OTYVIX 23                                          /* validate index */
+#define OTYCPR 24                                        /* create procedure */
+#define OTYAPR 25                                         /* alter procedure */
+#define OTYATB 26                                             /* alter table */
+                                                        /* once was evaluate */
+#define OTYXPL 27                                                 /* explain */
+#define OTYGRA 28                                                   /* grant */
+#define OTYREV 29                                                  /* revoke */
+#define OTYCSY 30                                          /* create synonym */
+#define OTYDSY 31                                            /* drop synonym */
+#define OTYASY 32                                 /* alter system switch log */
+#define OTYSET 33                                         /* set transaction */
+#define OTYPLS 34                                          /* pl/sql execute */
+#define OTYLTB 35                                                    /* lock */
+#define OTYNOP 36                                                    /* noop */
+#define OTYRNM 37                                                  /* rename */
+#define OTYCMT 38                                                 /* comment */
+#define OTYAUD 39                                                   /* audit */
+#define OTYNOA 40                                                /* no audit */
+#define OTYAIX 41                                             /* ALTER INDEX */
+#define OTYCED 42                                /* create external database */
+#define OTYDED 43                                  /* drop external database */
+#define OTYCDB 44                                         /* create database */
+#define OTYADB 45                                          /* alter database */
+#define OTYCRS 46                                 /* create rollback segment */
+#define OTYARS 47                                  /* alter rollback segment */
+#define OTYDRS 48                                   /* drop rollback segment */
+#define OTYCTS 49                                       /* create tablespace */
+#define OTYATS 50                                        /* alter tablespace */
+#define OTYDTS 51                                         /* drop tablespace */
+#define OTYASE 52                                           /* alter session */
+#define OTYAUR 53                                              /* alter user */
+#define OTYCWK 54                                           /* commit (work) */
+#define OTYROL 55                                                /* rollback */
+#define OTYSPT 56                                               /* savepoint */
+ 
+/* For number greater than 56 the the type is the same as defined in 
+** octdef.h for that number. So for completion look at octdef.h 
+*/
+
+#define OTYDEV OTYCVW                       /* old DEFINE VIEW = create view */
+ 
+/* FUNCTION CODES */
+#define OCLFPA  2                                            /* parse - OSQL */
+#define OCLFEX  4                                         /* execute - OEXEC */
+#define OCLFBI  6                                    /* BIND by name - OBIND */
+#define OCLFDB  8                                 /* define buffer -  ODEFIN */
+#define OCLFDI  10                                   /* describe item - ODSC */
+#define OCLFFE  12                                         /* fetch - OFETCH */
+#define OCLFOC  14                                    /* open cursor - OOPEN */
+#       define OCLFLI  OCLFOC            /* old name for open cursor - OOPEN */
+#define OCLFCC  16                                  /* close cursor - OCLOSE */
+#       define OCLFLO  OCLFCC          /* old name for close cursor - OCLOSE */
+#define OCLFDS  22                                        /* describe - ODSC */
+#define OCLFON  24                     /* get table and column names - ONAME */
+#define OCLFP3  26                                          /* parse - OSQL3 */
+#define OCLFBR  28                        /* bind reference by name - OBNDRV */
+#define OCLFBX  30                        /* bind referecne numeric - OBNDRN */
+#define OCLFSO  34                                /* special function - OOPT */
+#define OCLFRE  36                                        /* resume - ORESUM */
+#define OCLFBN  50                                                  /* bindn */
+#define OCLFMX  52                                /* maximum function number */
+
+#ifdef NEVER                                                 /* unused codes */
+# define OCLFLK  18                           /* open  for kernel operations */
+# define OCLFEK  20                             /* execute kernel operations */
+# define OCLFOK  22                                          /* kernel close */
+# define OCLFIN  28                                       /* logon to oracle */
+# define OCLFOF  30                                    /* logoff from oracle */
+# define OCLFAX  32                               /* allocate a context area */
+# define OCLFPI  34                                  /* page in context area */
+# define OCLFIS  36                                  /* special system logon */
+# define OCLFCO  38                          /* cancel the current operation */
+# define OCLFGI  40                                       /* get database id */
+# define OCLFJN  42                                     /* journal operation */
+# define OCLFCL  44                       /* cleanup prior execute operation */
+# define OCLFMC  46                                     /* map a cursor area */
+# define OCLFUC  48                  /* unmap cursor and restore user maping */
+#endif /*NEVER                                           *//* obsolete codes */
+ 
+
+/* values for ocimode in ocipin call */
+
+#define OCIEVDEF UPIEVDEF           /* default : non-thread safe enivronment */
+#define OCIEVTSF UPIEVTSF                         /* thread-safe environment */
+
+
+/* OCIL* flags used to determine the mode of login, using ocilog().
+** Currently defined only for non-blocking and thread-safe logins.
+*/
+
+#define OCILMDEF        UPILMDEF                   /* default, regular login */
+#define OCILMNBL        UPILMNBL                       /* non-blocking logon */
+#define OCILMESY        UPILMESY            /* thread safe but external sync */
+#define OCILMISY        UPILMISY                  /* internal sync, we do it */
+#define OCILMTRY        UPILMTRY        /* try to, but do not block on mutex */
+
+
+/* 
+ * since sqllib uses both ocidef and ocidfn the following defines
+ * need to be guarded
+ */
+#ifndef OCI_FLAGS 
+#define OCI_FLAGS
+
+/* OCI_*_PIECE defines the piece types that are returned or set
+*/
+
+#define OCI_ONE_PIECE   UPI_ONE_PIECE     /* there or this is the only piece */
+#define OCI_FIRST_PIECE UPI_FIRST_PIECE          /* the first of many pieces */
+#define OCI_NEXT_PIECE  UPI_NEXT_PIECE            /* the next of many pieces */
+#define OCI_LAST_PIECE  UPI_LAST_PIECE      /* the last piece of this column */
+#endif
+
+/*
+**  OCITAB: define return code pairs for version 2 to 3 conversions
+*/
+struct  ocitab
+{
+   sb2  ocitv3;                                   /* Version 3/4 return code */
+   sb2  ocitv2;                          /* Version 2 equivalent return code */
+};
+typedef struct ocitab ocitab;
+ 
+externref const ocitab ocitbl[];
+ 
+/* macros to check cursors and LDA's.  */
+/* macros to set error codes           */
+
+# define CRSCHK(c)     if ((c->csrchk != CSRCHECK)\
+                            && !bit(c->csrflg, CSRFREFC))\
+                          return(ocir32(c, OER(1001)))
+# define ldaerr(l, e)  ( l->csrrc = (sb2)(-( l->csrarc = (ub2)(e)) ) )
+# define LDACHK(l)     if (l->csrchk != LDACHECK) \
+                          return(ldaerr(l, OER(1001)))
+ 
+
+/************************************************/
+/*         OCI PROCEDURE DECLARATIONS           */
+/************************************************/ 
+
+
+
+
+/*****************************/
+/*  Database logon/logout    */
+/*****************************/
+sword ocilog(  ldadef *lda, struct hstdef *hst, oratext *uid, sword uidl, 
+                  oratext *psw, sword pswl, oratext* conn, sword connl,
+                  ub4 mode );
+sword ocilon(  ldadef *lda, oratext *uid, sword uidl, oratext *psw, 
+                  sword pswl, sword audit );
+sword  ocilgi(  ldadef *lda, sb2 areacount  );
+sword ocirlo(  ldadef *lda, struct hstdef *hst, oratext *uid, sword uidl,
+            oratext *psw, sword pswl, sword audit  );
+     /* ocilon - logon to oracle
+     ** ocilgi - version 2 compatible ORACLE logon call.
+     **          no login to ORACLE is performed: the LDA is initialized
+     ** ocirlo - version 5 compatible ORACLE Remote Login call,
+     **          oracle login is executed.
+     **   lda     - pointer to ldadef
+     **   uid     - user id [USER[/PASSWORD]]
+     **   uidl    - length of uid, if -1 strlen(uid) is used
+     **   psw     - password string; ignored if specified in uid
+     **   pswl    - length of psw, if -1 strlen(psw) is used
+     **   audit   - is not supported; the only permissible value is 0
+     **   areacount - unused
+     */
+
+sword ocilof(  ldadef *lda  );
+     /*
+     ** ocilof - disconnect from ORACLE
+     **   lda     - pointer to ldadef
+     */
+
+
+/*********************/
+/*   Error Messages  */
+/*********************/
+sword ocierr(  ldadef *lda, sb2 rcode, oratext *buffer, sword bufl  );
+sword ocidhe(  sb2 rcode, oratext *buffer  );
+    /* 
+    ** Move the text explanation for an ORACLE error to a user defined buffer
+    **  ocierr - will return the message associated with the hstdef stored 
+    **           in the lda.
+    **  ocidhe - will return the message associated with the default host.
+    **    lda    - lda associated with the login session
+    **    rcode  - error code as returned by V3 call interface
+    **    buffer - address of a user buffer of at least 132 characters
+    */
+
+
+/***********************/
+/*  Cursor Open/Close  */
+/***********************/
+sword ociope(  struct csrdef *cursor, ldadef *lda, oratext *dbn, sword dbnl, 
+                 sword areasize, oratext *uid, sword uidl  );
+
+sword ociclo(  struct csrdef *cursor  );
+   /* 
+   ** open or close a cursor.
+   **   cursor - pointer to csrdef
+   **   ldadef - pointer to ldadef
+   **   dbn    - unused
+   **   dbnl   - unused
+   **   areasize - if (areasize == -1)  areasize <- system default initial size
+   **              else if (areasize IN [1..256]) areasize <- areasize * 1024;
+   **              most applications should use the default size since context
+   **              areas are extended as needed until memory is exhausted.
+   **   uid    - user id
+   **   uidl   - userid length
+   */
+
+/***********************************/
+/*      CONTROL AND OPTIONS        */
+/***********************************/
+sword ocibre(  ldadef *lda  );
+   /*
+   **  ocibrk - Oracle Call Interface send BReaK Sends a break to
+   **  oracle.  If oracle is  active,  the  current  operation  is
+   **  cancelled.  May be called  asynchronously.   DOES  NOT  SET
+   **  OERRCD in the hst.  This is because ocibrk  may  be  called
+   **  asynchronously.  Callers must test the return code.
+   **    lda  - pointer to a ldadef 
+   */
+
+sword ocican(  struct csrdef *cursor  );
+   /*
+   **  cancel the operation on the cursor, no additional OFETCH calls
+   **  will be issued for the existing cursor without an intervening 
+   **  OEXEC call.
+   **   cursor  - pointer to csrdef
+   */
+
+sword ocisfe(  struct csrdef *cursor, sword erropt, sword waitopt  );
+   /* 
+   ** ocisfe - user interface set error options
+   ** set the error and cursor options.
+   ** allows user to set the options for dealing with fatal dml errors
+   ** and other cursor related options
+   ** see oerdef for valid settings
+   **   cursor  - pointer to csrdef
+   **   erropt  - error optionsn
+   **   waitopr - wait options
+   */
+
+
+/***************************************/
+/* COMMIT/ROLLBACK/AUTOCOMMIT          */
+/***************************************/
+sword   ocicom(  ldadef *lda  );
+sword   ocirol(  ldadef *lda  );
+   /*
+   ** ocicom - commit the current transaction
+   ** ocirol - roll back the current transaction
+   */
+ 
+sword   ocicon(  ldadef *lda  );
+sword   ocicof(  ldadef *lda  );
+   /*
+   ** ocicon - auto Commit ON
+   ** ocicof - auto Commit OFf
+   */
+
+
+ 
+/************************/
+/*     parsing          */
+/************************/
+sword    ocisq3(struct csrdef *cursor, oratext * /* sqlstm */, sword sqllen);
+   /*
+   ** ocisq3 - user interface parse sql statement
+   **   cursor - pointer to csrdef
+   **   sqlstm - pointer to SQL statement
+   **   sqllen - length of SQL statement.  if -1, strlen(sqlstm) is used
+   */
+
+
+
+/***************************/
+/*      BINDING            */
+/***************************/
+/* these are for the opcode in ocibndps, ocidfnps */
+#define OCI_PCWS 0
+#define OCI_SKIP 1
+
+sword ocibin(  struct csrdef *cursor, oratext *sqlvar, sword sqlvl, 
+                  ub1 *progv, sword progvl, sword ftype, sword scale, 
+                  oratext *fmt, sword fmtl, sword fmtt  );
+sword  ocibrv(  struct csrdef *cursor, oratext *sqlvar, sword sqlvl, 
+                ub1 *progv, sword progvl, sword ftype, sword scale, sb2 *indp,
+                oratext *fmt, sword fmtl, sword fmtt  );
+sword  ocibra(  struct csrdef *cursor, oratext *sqlvar, sword sqlvl, 
+                   ub1 *progv, sword progvl, sword ftype, sword scale, 
+                   sb2 *indp, ub2 *aln, ub2 *rcp, ub4 mal, ub4 *cal, 
+                   oratext *fmt, sword fmtl, sword fmtt  );
+sword  ocibndps(  struct csrdef *cursor, ub1 opcode, oratext *sqlvar, 
+                     sb4 sqlvl, ub1 *progv, sb4 progvl, sword ftype, 
+                     sword scale, sb2 *indp, ub2 *aln, ub2 *rcp, sb4 pv_skip, 
+                     sb4 ind_skip, sb4 len_skip, sb4 rc_skip, ub4 mal, 
+                     ub4 *cal, oratext *fmt, sb4 fmtl, sword fmtt  );
+sword ocibnn (  struct csrdef *cursor, ub2 sqlvn, ub1 *progv, sword progvl,
+                   sword ftype, sword scale, oratext *fmt, sword fmtl, 
+                   sword fmtt  );
+sword  ocibrn(  struct csrdef *cursor, sword sqlvn, ub1 *progv, sword progvl,
+                sword ftype, sword scale, sb2 *indp, oratext *fmt, sword fmtl, 
+                sword fmtt  );
+    /*
+    ** ocibin - bind by value by name
+    ** ocibrv - bind by reference by name
+    ** ocibra - bind by reference by name (array)
+    ** ocibndps - bind by reference by name (array) piecewise or with skips
+    ** ocibnn - bind by value numeric
+    ** ocibrn - bind by reference numeric
+    **
+    ** the contents of storage specified in bind-by-value calls are
+    ** evaluated immediately.
+    ** the addresses of storage specified in bind-by-reference calls are
+    ** remembered, and the contents are examined at every execute.
+    **
+    **  cursor  - pointer to csrdef
+    **  sqlvn   - the number represented by the name of the bind variables
+    **            for variables of the form :n or &n for n in [1..256)
+    **            (i.e. &1, :234).  unnecessarily using larger numbers
+    **            in the range wastes space.
+    **  sqlvar  - the name of the bind variable (:name or &name)
+    **  sqlval  - the length of the name;
+    **            in bindif -1, strlen(bvname) is used
+    **  progv   - pointer to the object to bind.
+    **  progvl  - length of object to bind.
+    **            in bind-by-value if specified as -1 then strlen(bfa) is
+    **              used (really only makes sends with character types)
+    **            in bind-by-value, if specified as -1 then UB2MAXVAL
+    **              is used.  Again this really makes sense only with
+    **              SQLT_STR.
+    **  ftype   - datatype of object
+    **  indp    - pointer to indicator variable.
+    **              -1     means to ignore bfa/bfl and bind NULL;
+    **              not -1 means to bind the contents of bfa/bfl
+    **              bind the contents pointed to by bfa
+    **  aln     - Alternate length pointer
+    **  rcp     - Return code pointer
+    **  mal     - Maximum array length
+    **  cal     - Current array length pointer
+    **  fmt     - format string
+    **  fmtl    - length of format string; if -1, strlen(fmt) is used
+    **  fmtt    - desired output type after applying forat mask. Not
+    **            really yet implemented
+    **  scale   - number of decimal digits in a cobol packed decimal (type 7)
+    **
+    ** Note that the length of bfa when bound as SQLT_STR is reduced
+    ** to strlen(bfa).
+    ** Note that trailing blanks are stripped of storage of SQLT_STR.
+    */
+    
+/***************************/
+/*        DESCRIBING       */
+/***************************/
+sword ocidsc (  struct csrdef *cursor, sword pos, sb2 *dbsize, sb2 *fsize,
+             sb2 *rcode, sb2 *dtype, sb1 *buf, sb2 *bufl, sb2 *dsize  );
+sword ocidsr(  struct csrdef *cursor, sword pos, sb2 *dbsize, sb2 *dtype, 
+            sb2 *fsize  );
+sword   ocinam(  struct csrdef *cursor, sword pos, sb1 *tbuf, sb2 *tbufl,
+                sb1 *buf, sb2 *bufl );
+    /*
+    **  ocidsc, ocidsr: Obtain information about a column
+    **  ocinam : get the name of a column
+    **   cursor  - pointer to csrdef
+    **   pos     - position in select list from [1..N]
+    **   dbsize  - place to store the database size
+    **   fsize   - place to store the fetched size
+    **   rcode   - place to store the fetched column returned code
+    **   dtype   - place to store the data type
+    **   buf     - array to store the column name
+    **   bufl    - place to store the column name length
+    **   dsize   - maximum display size
+    **   tbuf    - place to store the table name
+    **   tbufl   - place to store the table name length
+    */
+
+sword ocidsp (  struct csrdef *cursor, sword pos, sb4 *dbsize, sb2 *dbtype,
+                   sb1 *cbuf, sb4 *cbufl, sb4 *dsize, sb2 *pre, sb2 *scl,
+                   sb2 *nul );
+
+sword ocidpr( ldadef *lda, oratext *object_name, size_t object_length,
+                void * reserved1, size_t reserved1_length, void * reserved2,
+                size_t reserved2_length, ub2 *overload, ub2 *position,
+                ub2 *level, oratext **argument_name, ub2 *argument_length, 
+                ub2 *datatype, ub1 *default_supplied, ub1 *in_out, 
+                ub4 *length, sb2 *precision, sb2 *scale, ub1 *radix, 
+                ub4 *spare, ub4 *total_elements );
+   /*
+   ** OCIDPR - User Program Interface: Describe Stored Procedure
+   **
+   ** This routine is used to obtain information about the calling
+   ** arguments of a stored procedure.  The client provides the 
+   ** name of the procedure using "object_name" and "database_name"
+   ** (database name is optional).  The client also supplies the 
+   ** arrays for OCIDPR to return the values and indicates the 
+   ** length of array via the "total_elements" parameter.  Upon return
+   ** the number of elements used in the arrays is returned in the 
+   ** "total_elements" parameter.  If the array is too small then 
+   ** an error will be returned and the contents of the return arrays 
+   ** are invalid.
+   **
+   **
+   **   EXAMPLE :
+   **
+   **   Client provides -
+   **
+   **   object_name    - SCOTT.ACCOUNT_UPDATE@BOSTON
+   **   total_elements - 100
+   **   
+   **
+   **   ACCOUNT_UPDATE is an overloaded function with specification :
+   **
+   **     type number_table is table of number index by binary_integer;
+   **     table account (account_no number, person_id number,
+   **                    balance number(7,2))
+   **     table person  (person_id number(4), person_nm varchar2(10))
+   **
+   **      function ACCOUNT_UPDATE (account number, 
+   **         person person%rowtype, amounts number_table,
+   **         trans_date date) return accounts.balance%type;
+   **
+   **      function ACCOUNT_UPDATE (account number, 
+   **         person person%rowtype, amounts number_table,
+   **         trans_no number) return accounts.balance%type;
+   **
+   **
+   **   Values returned -
+   **
+   **   overload position   argument  level  datatype length prec scale rad
+   **   -------------------------------------------------------------------
+   **          0        0                0   NUMBER     22    7     2   10
+   **          0        1   ACCOUNT      0   NUMBER     22    0     0    0
+   **          0        2   PERSON       0   RECORD      0    0     0    0
+   **          0        2     PERSON_ID  1   NUMBER     22    4     0   10
+   **          0        2     PERSON_NM  1   VARCHAR2   10    0     0    0
+   **          0        3   AMOUNTS      0   TABLE       0    0     0    0
+   **          0        3                1   NUMBER     22    0     0    0
+   **          0        4   TRANS_NO     0   NUMBER     22    0     0    0
+   **
+   **          1        0                0   NUMBER     22    7     2   10
+   **          1        1   ACCOUNT      0   NUMBER     22    0     0    0
+   **          1        2   PERSON       0   RECORD      0    0     0    0
+   **          1        2    PERSON_ID   1   NUMBER     22    4     0   10
+   **          1        2    PERSON_NM   1   VARCHAR2   10    0     0    0
+   **          1        3   AMOUNTS      0   TABLE       0    0     0    0
+   **          1        3                1   NUMBER     22    0     0    0
+   **          1        4   TRANS_DATE   0   NUMBER     22    0     0    0
+   **
+   **
+   **  OCIDPR Argument Descriptions -
+   **
+   **  ldadef           - pointer to ldadef
+   **  object_name      - object name, synonyms are also accepted and will 
+   **                     be translate, currently only procedure and function
+   **                     names are accepted, also NLS names are accepted.
+   **                     Currently, the accepted format of a name is 
+   **                     [[part1.]part2.]part3[@dblink] (required)
+   **  object_length    - object name length (required)
+   **  reserved1        - reserved for future use
+   **  reserved1_length - reserved for future use
+   **  reserved2        - reserved for future use
+   **  reserved2_length - reserved for future use
+   **  overload         - array indicating overloaded procedure # (returned)
+   **  position         - array of argument positions, position 0 is a 
+   **                     function return argument (returned)
+   **  level            - array of argument type levels, used to describe
+   **                     sub-datatypes of data structures like records
+   **                     and arrays (returned)
+   **  argument_name    - array of argument names, only returns first 
+   **                     30 characters of argument names, note storage
+   **                     for 30 characters is allocated by client (returned)
+   **  argument_length  - array of argument name lengths (returned)
+   **  datatype         - array of oracle datatypes (returned)
+   **  default_supplied - array indicating parameter has default (returned)
+   **                     0 = no default, 1 = default supplied
+   **  in_out           - array indicating if argument is IN or OUT (returned
+   **                     0 = IN param, 1 = OUT param, 2 = IN/OUT param
+   **  length           - array of argument lengths (returned)
+   **  precision        - array of precisions (if number type)(returned)
+   **  scale            - array of scales (if number type)(returned)
+   **  radix            - array of radix (if number type)(returned)
+   **  spare            - array of spares.
+   **  total_elements   - size of arrays supplied by client (required),
+   **                     total number of elements filled (returned)
+   */
+
+/*************************************/
+/* DEFINING                          */
+/*************************************/
+sword ocidfi(  struct csrdef *cursor, sword pos, ub1 *buf, sword bufl,
+                  sword ftype, sb2 *rc, sword scale  );
+sword ocidfn(  struct csrdef *cursor, sword pos, ub1 *buf, sword bufl,
+                 sword ftype, sword scale, sb2 *indp, oratext *fmt, sword fmtl,
+                 sword fmtt, ub2 *rl, ub2 *rc  );
+sword ocidfnps(  struct csrdef *cursor, ub1 opcode, sword pos, ub1 *buf, 
+                    sb4 bufl, sword ftype, sword scale,  
+                    sb2 *indp, oratext *fmt, sb4 fmtl,
+                    sword fmtt, ub2 *rl, ub2 *rc,
+                    sb4 pv_skip, sb4 ind_skip, sb4 len_skip, 
+                    sb4 rc_skip  );
+
+
+   /*  Define a user data buffer using upidfn
+   **   cursor  - pointer to csrdef
+   **   pos     - position of a field or exp in the select list of a query
+   **   bfa/bfl - address and length of client-supplied storage
+                  to receive data
+   **   ftype   - user datatype
+   **   scale   - number of fractional digits for cobol packed decimals
+   **   indp    - place to store the length of the returned value. If returned
+   **             value is:
+   **             negative, the field fetched was NULL
+   **             zero    , the field fetched was same length or shorter than
+   **               the buffer provided
+   **             positive, the field fetched was truncated
+   **   fmt    - format string
+   **   fmtl   - length of format string, if -1 strlent(fmt) used
+   **   rl     - place to store column length after each fetch
+   **   rc     - place to store column error code after each fetch
+   **   fmtt   - fomat type
+   */
+ 
+/********************************/
+/*    PIECE INFORMATION GET/SET */
+/********************************/
+sword           ocigetpi(  struct csrdef *cursor, ub1 *piecep,
+                              void  **ctxpp, ub4 *iterp, ub4 *indexp  );
+sword           ocisetpi(  struct csrdef *cursor, ub1 piece,
+                              void  *bufp, ub4 *lenp  );
+
+
+/********************************/
+/*   EXECUTE                    */
+/********************************/
+sword ociexe(  struct csrdef *cursor  );
+sword ociexn(  struct csrdef *cursor, sword iters, sword roff  );
+sword ociefn(  struct csrdef *cursor, ub4 nrows, sword can, sword exact );
+    /* 
+    ** ociexe  - execute a cursor
+    ** ociexn  - execute a cursosr N times
+    **  cursor   - pointer to a csrdef
+    **  iters    - number of times to execute cursor
+    **  roff     - offset within the bind variable array at which to begin 
+    **             operations.
+    */
+
+
+/*********************************/
+/*     FETCHING                  */
+/*********************************/
+sword ocifet(  struct csrdef *cursor  );
+sword ocifen(  struct csrdef *cursor, sword nrows  );
+    /* ocifet - fetch the next row
+    ** ocifen - fetch n rows 
+    ** cursor   - pointer to csrdef
+    ** nrows    - number of rows to be fetched
+    */
+
+sword ocilng( struct csrdef *cursor, sword posit, ub1 *bfa, sb4 bfl,
+                 sword dty, ub4 *rln, sb4 off );
+
+/*********************************/
+/*         CONVERSION            */
+/*********************************/
+sword ocic32(  struct csrdef *cursor  );
+    /*
+    **   Convert selected version 3 return codes to the equivalent
+    **   version 2 code.
+    **   csrdef->csrrc is set to the converted code
+    **   csrdef->csrft is set to v2 oracle statment type
+    **   csrdef->csrrpc is set to the rows processed count
+    **   csrdef->csrpeo is set to error postion
+    ** 
+    **     cursor - pointer to csrdef
+    */
+
+
+sword ocir32(  struct csrdef *cursor, sword retcode  );
+   /*   
+   ** Convert selected version 3 return codes to the equivalent version 2 
+   ** code.
+   **
+   **    cursor - pointer to csrdef
+   **    retcode - place to store the return code
+   */
+
+
+void ociscn(  sword **arglst, char *mask_addr, sword **newlst  );
+   /*
+   ** Convert call-by-ref to call-by-value:
+   ** takes an arg list and a mask address, determines which args need 
+   ** conversion to a value, and creates a new list begging at the address
+   ** of newlst.
+   **
+   **    arglst    - list of arguments
+   **    mast_addr _ mask address determines args needing conversion
+   **    newlst    - new list of args
+   */
+
+sword    ocistf (  sword typ, sword bufl, sword rdig, oratext *fmt, 
+                      struct csrdef *cursor, sword *err  );
+/*  Convert a packed  decimal buffer  length  (bytes) and scale to a format
+**  string of the form mm.+/-nn, where  mm is the number of packed 
+**  decimal digits, and nn is the scaling factor.   A positive scale name 
+**  nn digits to the rights of the decimal; a negative scale means nn zeros 
+**  should be supplied to the left of the decimal.
+**     bufl   - length of the packed decimal buffer
+**     rdig   - number of fractional digits
+**     fmt    - pointer to a string holding the conversion format
+**     cursor - pointer to csrdef 
+**     err    - pointer to word storing error code
+*/ 
+
+
+/******************************************/
+/*         Non-blocking operations        */
+/******************************************/
+sword ocinbs(  ldadef *lda  );  /* set a connection to non-blocking   */
+sword ocinbt(  ldadef *lda  );  /* test if connection is non-blocking */
+sword ocinbc(  ldadef *lda  );  /* clear a connection to blocking     */
+sword ocinlo(  ldadef *lda, struct hstdef *hst, oratext *conn,
+                  sword connl, oratext *uid, sword uidl,
+                  oratext *psw, sword pswl, sword audit  );  
+              /* logon in non-blocking fashion */
+/* ocinlo allows an application to logon in non-blocking fashion.
+**   lda     - pointer to ldadef
+**   hst     - pointer to a 256 byte area, must be cleared to zero before call
+**   conn    - the database link (if specified @LINK in uid will be ignored)
+**   connl   - length of conn; if -1 strlen(conn) is used   
+**   uid     - user id [USER[/PASSWORD][@LINK]]
+**   uidl    - length of uid, if -1 strlen(uid) is used
+**   psw     - password string; ignored if specified in uid
+**   pswl    - length of psw, if -1 strlen(psw) is used
+**   audit   - is not supported; the only permissible value is 0
+*/
+
+/***************************************************/
+/*         Procedure Declaration for Pro*C         */
+/***************************************************/
+/* Note: The following routines are used in Pro*C and have the
+   same interface as their couterpart in OCI. 
+   Althought the interface follows for more details please refer 
+   to the above routines */
+
+/******************************************/
+/*         initialization/logon/logof     */
+/******************************************/
+sword ocipin(  ub4 mode  );
+
+sword ologin(  ldadef *lda, sb2 areacount  );
+sword ologon(  ldadef *lda, sb2 areacount  );
+
+/*****************************************/
+/*        Open/Close/Parse Cursor        */
+/*****************************************/
+
+/* 
+** ocisqd - oci delayed parse (Should be used only with deferred upi/oci)
+** FUNCTION: Call upidpr to delay the parse of the sql statement till the
+**           time that a call needs to be made to the kernel (execution or
+**           describe time )
+** RETURNS: Oracle return code.
+*/ 
+sword ocisq7( struct csrdef *cursor, oratext * /* sqlstm */, sb4 sqllen,
+                 sword defflg, ub4 sqlt );
+
+/*****************************************/
+/*            Bind                       */
+/*****************************************/
+sword obind(  struct csrdef *cursor, oratext *sqlvar, sword sqlvl, 
+                 ub1 *progv, sword progvl, sword ftype, sword scale, 
+                 oratext *fmt, sword fmtl, sword fmtt  );
+sword obindn(  struct csrdef *cursor, ub2 sqlvn, ub1 *progv, sword progvl,
+                  sword ftype, sword scale, oratext *fmt, sword fmtl, 
+                  sword fmtt  );
+
+/**********************************************/
+/*                 Define                     */
+/**********************************************/
+sword odfinn(  struct csrdef *cursor, sword pos, ub1 *buf, sword bufl,
+                  sword ftype, sb2 *rc, sword scale  );
+
+/**********************************************/
+/*                 Describe                   */
+/**********************************************/
+sword odsrbn(  struct csrdef *cursor, sword pos, sb2 *dbsize, sb2 *dtype, 
+            sb2 *fsize  );
+
+
+/******************************************/
+/*         Non-blocking operations        */
+/******************************************/
+sword onblon(  ldadef *lda, struct hstdef *hst, oratext *conn,
+                  sword connl, oratext *uid, sword uidl,
+                  oratext *psw, sword pswl, sword audit  );  
+              /* logon in non-blocking fashion */
+sword ocignfd(  ldadef *lda, void  *nfdp );           /* get native fd */
+
+ub2   ocigft_getFcnType(  ub2 oertyp  );      /* get sql function code */
+
+#endif
diff --git a/sdk/include/ocidem.h b/sdk/include/ocidem.h
new file mode 100755
index 0000000..f7bb786
--- /dev/null
+++ b/sdk/include/ocidem.h
@@ -0,0 +1,113 @@
+/*
+ * 
+ */
+
+/* Copyright (c) 1991, 2005, Oracle. All rights reserved.  */
+/* Copyright (c) 1991, 2005, Oracle. All rights reserved.  */
+/*
+   NAME
+     ocidem.h - OCI demo header
+   MODIFIED   (MM/DD/YY)
+    dmukhin    06/29/05  - ANSI prototypes; miscellaneous cleanup 
+    whe        04/07/99 -  bug#810071
+    whe        03/19/99 -  lrg 32079 etc.: putting static back for oci_func_tab
+    nmacnaug   02/02/99 -  static declarations should not be in header files
+    mygopala   09/22/97 -  Fix for bug 550351
+    surman     03/14/97 -  Merge 413362 to 8.0.3
+    surman     11/08/96 -  413362: Add SS_64BIT_SERVER macro
+    emendez    04/07/94 -  merge changes from branch 1.6.710.1
+    emendez    02/02/94 -  Fix for bug 157576
+    jnlee      01/05/93 -  include oratypes.h once, make oci_func_tab static
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/22/92 -  Change text back to char to avoid casts 
+    rkooi2     10/20/92 -  Changes to make it portable 
+    sjain      03/16/92 -  Creation 
+*/
+
+/*
+ *  ocidem.h
+ *
+ *  Declares additional functions and data structures
+ *  used in the OCI C sample programs.
+ */
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif /* ORATYPES */
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif /* OCIDFN */
+
+#ifndef OCIDEM
+#define OCIDEM
+
+
+/*  internal/external datatype codes */
+#define VARCHAR2_TYPE            1
+#define NUMBER_TYPE              2
+#define INT_TYPE                 3
+#define FLOAT_TYPE               4
+#define STRING_TYPE              5
+#define ROWID_TYPE              11
+#define DATE_TYPE               12
+
+/*  ORACLE error codes used in demonstration programs */
+#define VAR_NOT_IN_LIST       1007
+#ifndef NO_DATA_FOUND
+#  define NO_DATA_FOUND         1403
+#endif
+#define NULL_VALUE_RETURNED   1405
+
+/*  some SQL and OCI function codes */
+#define FT_INSERT                3
+#define FT_SELECT                4
+#define FT_UPDATE                5
+#define FT_DELETE                9
+
+#define FC_OOPEN                14
+
+/*
+ *  OCI function code labels,
+ *  corresponding to the fc numbers
+ *  in the cursor data area.
+ */
+static const text  *oci_func_tab[] =  {(text *) "not used",
+/* 1-2 */       (text *) "not used", (text *) "OSQL",
+/* 3-4 */       (text *) "not used", (text *) "OEXEC, OEXN",
+/* 5-6 */       (text *) "not used", (text *) "OBIND",
+/* 7-8 */       (text *) "not used", (text *) "ODEFIN",
+/* 9-10 */      (text *) "not used", (text *) "ODSRBN",
+/* 11-12 */     (text *) "not used", (text *) "OFETCH, OFEN",
+/* 13-14 */     (text *) "not used", (text *) "OOPEN",
+/* 15-16 */     (text *) "not used", (text *) "OCLOSE",
+/* 17-18 */     (text *) "not used", (text *) "not used",
+/* 19-20 */     (text *) "not used", (text *) "not used",
+/* 21-22 */     (text *) "not used", (text *) "ODSC",
+/* 23-24 */     (text *) "not used", (text *) "ONAME",
+/* 25-26 */     (text *) "not used", (text *) "OSQL3",
+/* 27-28 */     (text *) "not used", (text *) "OBNDRV",
+/* 29-30 */     (text *) "not used", (text *) "OBNDRN",
+/* 31-32 */     (text *) "not used", (text *) "not used",
+/* 33-34 */     (text *) "not used", (text *) "OOPT",
+/* 35-36 */     (text *) "not used", (text *) "not used",
+/* 37-38 */     (text *) "not used", (text *) "not used",
+/* 39-40 */     (text *) "not used", (text *) "not used",
+/* 41-42 */     (text *) "not used", (text *) "not used",
+/* 43-44 */     (text *) "not used", (text *) "not used",
+/* 45-46 */     (text *) "not used", (text *) "not used",
+/* 47-48 */     (text *) "not used", (text *) "not used",
+/* 49-50 */     (text *) "not used", (text *) "not used",
+/* 51-52 */     (text *) "not used", (text *) "OCAN",
+/* 53-54 */     (text *) "not used", (text *) "OPARSE",
+/* 55-56 */     (text *) "not used", (text *) "OEXFET",
+/* 57-58 */     (text *) "not used", (text *) "OFLNG",
+/* 59-60 */     (text *) "not used", (text *) "ODESCR",
+/* 61-62 */     (text *) "not used", (text *) "OBNDRA",
+/* 63-64 */     (text *) "OBINDPS",  (text *) "ODEFINPS",
+/* 65-66 */     (text *) "OGETPI",   (text *) "OSETPI"
+};
+
+#endif      /* OCIDEM */
+
diff --git a/sdk/include/ocidfn.h b/sdk/include/ocidfn.h
new file mode 100644
index 0000000..873c5a7
--- /dev/null
+++ b/sdk/include/ocidfn.h
@@ -0,0 +1,249 @@
+/* Copyright (c) 1991, 2005, Oracle. All rights reserved.  */
+/* Copyright (c) 1991, 2005, Oracle. All rights reserved.  */
+/*
+   NAME
+     ocidfn.h - OCI Definations
+   NOTES
+     Shipped to users.
+   MODIFIED   (MM/DD/YY)
+    mbastawa   09/16/05 - dbhygiene
+    dmukhin    06/29/05 - ANSI prototypes; miscellaneous cleanup 
+    srseshad   11/25/02 - change binary float/double codes
+    srseshad   11/14/02 - Add SQLT_IBFLOAT, SQLT_IBDOUBLE
+    mxyang     09/17/02 - grabtrans 'mmorsi_obj_float'
+    srseshad   09/06/02 - Add binary float/double
+    aahluwal   06/04/02 - bug 2360115
+    kmuthukk   05/02/00 - add SQLT_PNTY
+    amangal    07/30/99 - Merge into 8.1.6 : Bug 879031
+    tnbui      07/28/99 - Remove SQLT_TIMESTAMP_ITZ                            
+    tnbui      07/21/99 - SQLT_TIMESTAMP_LTZ                                   
+    tnbui      06/16/99 - TIMESTAMP WITH IMPLICIT TIME ZONE                    
+    whe        04/07/99 - bug#810075
+    whe        03/19/99 - lrg 32079 etc.: move HDA def from ocidem.h to ocidfn.
+    skmishra   05/10/98 -
+    vyanaman   04/16/98 - update sql92 datatypes
+    khnguyen   01/16/98 -
+    khnguyen   12/23/97 - SQLT* for datetimes and intervals
+    tanguyen   08/19/97 -
+    dchatter   03/18/97 -  porting exception 390897
+    dchatter   05/02/97 -   merge porting exception
+    dalpern    12/04/96 -   SQLCS_LIT_NULL added
+    cxcheng    11/14/96 -   add SQLT_BFILE/SQLT_CFILE to fix compile prob
+    cxcheng    11/12/96 -   add SQLT_NCO for named collection
+    lchidamb   10/17/96 -   add SQLT_VST and SQLT_ODT
+    sgollapu   10/14/96 -   Mutual exclusion of ocidfn and sqldef
+    sgollapu   10/07/96 -   OCI Simplification
+    aroy       09/09/96 -   add SQLCS* definitions
+    slari      08/07/96 -  add SQLT_RDD, rowid descriptor
+    slari      06/12/96 -  remove SQLT_TTBL
+    dchatter   04/21/96 -  prepare for merge into main
+    slari      08/24/95 -  b299432, define CDA_SIZE
+    zwalcott   02/28/96 -  add SQLT_BFILEE and SQLT_CFILEE.
+    lchidamb   02/22/96 -  make dtys consistent with dtydef.h
+    lchidamb   02/16/96 -  add SQLT_BFILEE and SQLT_CFILEE
+    lchidamb   01/30/96 -  rename new datatypes for v8
+    lchidamb   09/06/95 -  add new datatypes
+    slari      05/11/95 -  add OCI_EV_DEF and OCI_EV_TSF
+    dchatter   04/06/95 -  add ifdef flags around OCI_flags
+    dchatter   03/08/95 -  piece values
+    dchatter   03/06/95 -  merge changes from branch 1.2.720.3
+    jfbrown    02/17/95 -  merge changes from branch 1.2.720.2
+    dchatter   02/08/95 -  olog call modes
+    jfbrown    02/03/95 -  remove non-printable characters
+    lchidamb   12/06/94 -  merge changes from branch 1.2.720.1
+    lchidamb   10/04/94 -  added field chk to cda_head, cda_def
+    dchatter   07/05/94 -  SQLT_CUR added
+    rkooi2     11/27/92 -  Changing e* datatypes to s* 
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/22/92 -  Added #ifndef ORATYPES ... 
+    rkooi2     10/18/92 -  Changes to make it portable. 
+    sjain      03/16/92 -  Creation 
+*/
+
+/*
+ *  ocidfn.h
+ *
+ *  Common header file for OCI C sample programs.
+ *  This header declares the cursor and logon data area structure.
+ *  The types used are defined in <oratypes.h>.
+ *
+ */
+ 
+#ifndef OCIDFN
+#define OCIDFN
+
+#include <oratypes.h>
+
+/* The cda_head struct is strictly PRIVATE.  It is used
+   internally only. Do not use this struct in OCI programs. */
+
+struct cda_head {
+    sb2          v2_rc;
+    ub2          ft;
+    ub4          rpc;
+    ub2          peo;
+    ub1          fc;
+    ub1          rcs1;
+    ub2          rc;
+    ub1          wrn;
+    ub1          rcs2;
+    sword        rcs3;
+    struct {
+        struct {
+           ub4    rcs4;
+           ub2    rcs5;
+           ub1    rcs6;
+        } rd;
+        ub4    rcs7;
+        ub2    rcs8;
+    } rid;
+    sword        ose;
+    ub1           chk;
+    void         *rcsp;
+};
+
+/*
+** Size of HDA area:
+** 512 for 64 bit arquitectures
+** 256 for 32 bit arquitectures
+*/
+
+#if defined(SS_64BIT_SERVER) || defined(__64BIT__)
+# define HDA_SIZE 512
+#else
+# define HDA_SIZE 256
+#endif
+
+#if defined(SS_64BIT_SERVER) || defined(__64BIT__)
+#define CDA_SIZE 88
+#else
+# define CDA_SIZE 64
+#endif
+
+/* the real CDA, padded to CDA_SIZE bytes in size */
+struct cda_def {
+    sb2          v2_rc;                                    /* V2 return code */
+    ub2          ft;                                    /* SQL function type */
+    ub4          rpc;                                /* rows processed count */
+    ub2          peo;                                  /* parse error offset */
+    ub1          fc;                                    /* OCI function code */
+    ub1          rcs1;                                        /* filler area */
+    ub2          rc;                                       /* V7 return code */
+    ub1          wrn;                                       /* warning flags */
+    ub1          rcs2;                                           /* reserved */
+    sword        rcs3;                                           /* reserved */
+    struct {                                              /* rowid structure */
+        struct {
+           ub4    rcs4;
+           ub2    rcs5;
+           ub1    rcs6;
+        } rd;
+        ub4    rcs7;
+        ub2    rcs8;
+    } rid;
+    sword        ose;                                 /* OSD dependent error */
+    ub1           chk;
+    void         *rcsp;                          /* pointer to reserved area */
+    ub1          rcs9[CDA_SIZE - sizeof (struct cda_head)];        /* filler */
+};
+
+typedef struct cda_def Cda_Def;
+
+/* the logon data area (LDA)
+   is the same shape as the CDA */
+typedef struct cda_def Lda_Def;
+
+/* OCI Environment Modes for opinit call */
+#define OCI_EV_DEF 0                  /* default single-threaded environment */
+#define OCI_EV_TSF 1                              /* thread-safe environment */
+
+/* OCI Logon Modes for olog call */
+#define OCI_LM_DEF 0                                        /* default login */
+#define OCI_LM_NBL 1                                   /* non-blocking logon */
+
+/* 
+ * since sqllib uses both ocidef and ocidfn the following defines
+ * need to be guarded
+ */
+#ifndef OCI_FLAGS 
+#define OCI_FLAGS
+
+/* OCI_*_PIECE defines the piece types that are returned or set
+*/
+#define OCI_ONE_PIECE   0                 /* there or this is the only piece */
+#define OCI_FIRST_PIECE 1                        /* the first of many pieces */
+#define OCI_NEXT_PIECE  2                         /* the next of many pieces */
+#define OCI_LAST_PIECE  3                   /* the last piece of this column */
+#endif
+
+#ifndef SQLDEF 
+
+/* input data types */
+#define SQLT_CHR  1                        /* (ORANET TYPE) character string */
+#define SQLT_NUM  2                          /* (ORANET TYPE) oracle numeric */
+#define SQLT_INT  3                                 /* (ORANET TYPE) integer */
+#define SQLT_FLT  4                   /* (ORANET TYPE) Floating point number */
+#define SQLT_STR  5                                /* zero terminated string */
+#define SQLT_VNU  6                        /* NUM with preceding length byte */
+#define SQLT_PDN  7                  /* (ORANET TYPE) Packed Decimal Numeric */
+#define SQLT_LNG  8                                                  /* long */
+#define SQLT_VCS  9                             /* Variable character string */
+#define SQLT_NON  10                      /* Null/empty PCC Descriptor entry */
+#define SQLT_RID  11                                                /* rowid */
+#define SQLT_DAT  12                                /* date in oracle format */
+#define SQLT_VBI  15                                 /* binary in VCS format */
+#define SQLT_BFLOAT 21                                /* Native Binary float*/
+#define SQLT_BDOUBLE 22                             /* NAtive binary double */
+#define SQLT_BIN  23                                  /* binary data(DTYBIN) */
+#define SQLT_LBI  24                                          /* long binary */
+#define SQLT_UIN  68                                     /* unsigned integer */
+#define SQLT_SLS  91                        /* Display sign leading separate */
+#define SQLT_LVC  94                                  /* Longer longs (char) */
+#define SQLT_LVB  95                                   /* Longer long binary */
+#define SQLT_AFC  96                                      /* Ansi fixed char */
+#define SQLT_AVC  97                                        /* Ansi Var char */
+#define SQLT_IBFLOAT  100                          /* binary float canonical */
+#define SQLT_IBDOUBLE 101                         /* binary double canonical */
+#define SQLT_CUR  102                                        /* cursor  type */
+#define SQLT_RDD  104                                    /* rowid descriptor */
+#define SQLT_LAB  105                                          /* label type */
+#define SQLT_OSL  106                                        /* oslabel type */
+
+#define SQLT_NTY  108                                   /* named object type */
+#define SQLT_REF  110                                            /* ref type */
+#define SQLT_CLOB 112                                       /* character lob */
+#define SQLT_BLOB 113                                          /* binary lob */
+#define SQLT_BFILEE 114                                   /* binary file lob */
+#define SQLT_CFILEE 115                                /* character file lob */
+#define SQLT_RSET 116                                     /* result set type */
+#define SQLT_NCO  122      /* named collection type (varray or nested table) */
+#define SQLT_VST  155                                      /* OCIString type */
+#define SQLT_ODT  156                                        /* OCIDate type */
+
+/* datetimes and intervals */
+#define SQLT_DATE                      184                      /* ANSI Date */
+#define SQLT_TIME                      185                           /* TIME */
+#define SQLT_TIME_TZ                   186            /* TIME WITH TIME ZONE */
+#define SQLT_TIMESTAMP                 187                      /* TIMESTAMP */
+#define SQLT_TIMESTAMP_TZ              188       /* TIMESTAMP WITH TIME ZONE */
+#define SQLT_INTERVAL_YM               189         /* INTERVAL YEAR TO MONTH */
+#define SQLT_INTERVAL_DS               190         /* INTERVAL DAY TO SECOND */
+#define SQLT_TIMESTAMP_LTZ             232        /* TIMESTAMP WITH LOCAL TZ */
+
+#define SQLT_PNTY   241              /* pl/sql representation of named types */
+
+/* cxcheng: this has been added for backward compatibility -
+   it needs to be here because ocidfn.h can get included ahead of sqldef.h */
+#define SQLT_FILE SQLT_BFILEE                             /* binary file lob */
+#define SQLT_CFILE SQLT_CFILEE
+#define SQLT_BFILE SQLT_BFILEE
+ 
+/* CHAR/NCHAR/VARCHAR2/NVARCHAR2/CLOB/NCLOB char set "form" information */
+#define SQLCS_IMPLICIT 1     /* for CHAR, VARCHAR2, CLOB w/o a specified set */
+#define SQLCS_NCHAR    2                  /* for NCHAR, NCHAR VARYING, NCLOB */
+#define SQLCS_EXPLICIT 3   /* for CHAR, etc, with "CHARACTER SET ..." syntax */
+#define SQLCS_FLEXIBLE 4                 /* for PL/SQL "flexible" parameters */
+#define SQLCS_LIT_NULL 5      /* for typecheck of NULL and empty_clob() lits */
+
+#endif  /* SQLDEF */
+#endif  /* OCIDFN */
diff --git a/sdk/include/ociextp.h b/sdk/include/ociextp.h
new file mode 100644
index 0000000..7026a68
--- /dev/null
+++ b/sdk/include/ociextp.h
@@ -0,0 +1,282 @@
+/*
+ * 
+ */
+
+/* Copyright (c) 1996, 2005, Oracle. All rights reserved.  */
+ 
+/* 
+   NAME 
+     ociextp.h - Interface Definitions for PL/SQL External Procedures
+
+   DESCRIPTION 
+     This header file contains C language callable interface from 
+     PL/SQL External Procedures.
+
+   PUBLIC FUNCTION(S) 
+     OCIExtProcAllocCallMemory  - Allocate Call memory
+     OCIExtProcRaiseExcp        - Raise Exception
+     OCIExtProcRaiseExcpWithMsg - Raise Exception with message
+     OCIExtProcGetEnv           - Get OCI Environment
+
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   dmukhin     06/29/05 - ANSI prototypes; miscellaneous cleanup 
+   srseshad    03/12/03 - convert oci public api to ansi
+   rdecker     01/10/02 - change 32k to MAX_OEN for error numbers
+   sagrawal    07/20/01 - Statement Handle to safe cal outs
+   abrumm      04/19/01 - move include of oci.h after defines/typedef
+   rdecker     02/22/01 - lint fix
+   bpalaval    02/08/01 - Change text to oratext.
+   sagrawal    06/16/00 - ref cursor in callouts
+   whe         09/01/99 - 976457:check __cplusplus for C++ code
+   asethi      04/15/99 - Created (by moving ociextp.h from /vobs/plsql/public)
+   rhari       03/25/97 - Use ifndef
+   rhari       12/18/96 - Include oratypes.h
+   rhari       12/11/96 - #416977, Flip values of return codes
+   rhari       12/02/96 - Define Return Code Macros
+   rhari       11/18/96 - Error number is int
+   rhari       10/30/96 - Fix OCIExtProcRaiseExcpWithMsg
+   rhari       10/30/96 - Get rid of warnings
+   rhari       10/04/96 - Fix OCIExtProcRaiseExcpWithMsg
+   rhari       09/23/96 - Creation
+
+*/
+
+ 
+#ifndef OCIEXTP_ORACLE
+# define OCIEXTP_ORACLE
+
+# ifndef ORATYPES 
+#  include <oratypes.h> 
+# endif
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/* ----------------------------- Return Codes ----------------------------- */
+/* Success and Error return codes for certain external procedure interface 
+ * functions. If a particular interface function returns OCIEXTPROC_SUCCESS
+ * or OCIEXTPROC_ERROR, then applications must use these macros to check
+ * for return values.
+ *
+ *     OCIEXTPROC_SUCCESS  -- External Procedure Success Return Code 
+ *     OCIEXTPROC_ERROR    -- External Procedure Failure Return Code 
+ */
+#define OCIEXTPROC_SUCCESS 0
+#define OCIEXTPROC_ERROR   1
+
+
+/* --------------------------- With-Context Type --------------------------- */
+/*
+ * The C callable interface to PL/SQL External Procedures require the 
+ * With-Context parameter to be passed. The type of this structure is 
+ * OCIExtProcContext is is opaque to the user.
+ *
+ * The user can declare the With-Context parameter in the application as
+ *
+ *    OCIExtProcContext *with_context;
+ */
+typedef struct OCIExtProcContext OCIExtProcContext;
+
+/* NOTE: OCIExtProcContext must be visible prior to including <oci.h> */
+
+# ifndef OCI_ORACLE
+#  include <oci.h>
+# endif
+
+
+/* ----------------------- OCIExtProcAllocCallMemory ----------------------- */
+/* OCIExtProcAllocCallMemory
+ *    Allocate N bytes of memory for the duration of the External Procedure.
+ *
+ *    Memory thus allocated will be freed by PL/SQL upon return from the
+ *    External Procedure. You must not use any kind of 'free' function on 
+ *    memory allocated by OCIExtProcAllocCallMemory.
+ *    Use this function to allocate memory for function returns.
+ * 
+ * PARAMETERS
+ * Input : 
+ *    with_context - The with_context pointer that is passed to the C 
+ *                   External Procedure.
+ *                  Type of with_context : OCIExtProcContext *
+ *    amount       - The number of bytes to allocate.
+ *                   Type of amount : size_t
+ *
+ * Output :
+ *    Nothing
+ *
+ * Return :
+ *    An untyped (opaque) Pointer to the allocated memory. 
+ *
+ * Errors :
+ *    A 0 return value should be treated as an error
+ *
+ * EXAMPLE 
+ *  text *ptr = (text *)OCIExtProcAllocCallMemory(wctx, 1024)
+ *
+ */
+#define OCIExtProcAllocCallMemory(with_context, amount) \
+ociepacm(with_context, (size_t)amount)
+
+
+
+
+/* -------------------------- OCIExtProcRaiseExcp -------------------------- */
+/* OCIExtProcRaiseExcp
+ *    Raise an Exception to PL/SQL.
+ *
+ *  Calling this function signalls an exception back to PL/SQL. After a
+ *  successful return from this function, the External Procedure must start 
+ *  its exit handling and return back to PL/SQL. Once an exception is 
+ *  signalled to PL/SQL, INOUT and OUT arguments, if any, are not processed 
+ *  at all.
+ * 
+ * PARAMETERS
+ * Input :
+ *   with_context - The with_context pointer that is passed to the C
+ *                  External Procedure. 
+ *                  Type of with_context : OCIExtProcContext *
+ *   errnum       - Oracle Error number to signal to PL/SQL. errnum
+ *                  must be a positive number and in the range 1 to MAX_OEN
+ *                  Type of errnum : int
+ * Output :
+ *   Nothing
+ *
+ * Return :
+ *   OCIEXTPROC_SUCCESS - If the call was successful.
+ *   OCIEXTPROC_ERROR   - If the call failed.
+ *
+ */
+#define OCIExtProcRaiseExcp(with_context, errnum) \
+ocieperr(with_context, (int)errnum)
+
+
+
+
+
+/* ---------------------- OCIExtProcRaiseExcpWithMsg ---------------------- */
+/* OCIExtProcRaiseExcpWithMsg
+ *    Raise an exception to PL/SQL. In addition, substitute the
+ *    following error message string within the standard Oracle error 
+ *    message string. See note for OCIExtProcRaiseExcp
+ * 
+ * PARAMETERS
+ * Input :
+ *   with_context  - The with_context pointer that is passed to the C
+ *                   External Procedure.
+ *                   Type of with_context : OCIExtProcContext *
+ *   errnum        - Oracle Error number to signal to PL/SQL. errnum
+ *                   must be a positive number and in the range 1 to MAX_OEN
+ *                   Type of errnum : int
+ *   errmsg        - The error message associated with the errnum.
+ *                   Type of errmsg : char *
+ *   len           - The length of the error message. 0 if errmsg is
+ *                   null terminated string.
+ *                   Type of len : size_t
+ * Output :
+ *   Nothing
+ *
+ * Return :
+ *  OCIEXTPROC_SUCCESS - If the call was successful.
+ *  OCIEXTPROC_ERROR   - If the call failed.
+ *
+ */
+#define OCIExtProcRaiseExcpWithMsg(with_context, errnum, errmsg, msglen) \
+ociepmsg(with_context, (int)errnum, errmsg, (size_t)msglen)
+
+
+
+/* --------------------------- OCIExtProcGetEnv --------------------------- */
+/* OCIExtProcGetEnv
+ *    Get OCI Environment
+ * 
+ * PARAMETERS
+ * Input :
+ *    with_context - The with_context pointer that is passed to the C
+ *                   External Procedure.
+ *
+ * Output :
+ *    envh - The OCI Environment handle.
+ *    svch - The OCI Service handle.
+ *    errh - The OCI Error handle.
+ *
+ * Return :
+ *  OCI_SUCCESS - Successful completion of the function.
+ *  OCI_ERROR   - Error.
+ *
+ */
+#define OCIExtProcGetEnv(with_context, envh, svch, errh) \
+ociepgoe(with_context, envh, svch, errh)
+
+
+
+/* ------------------------ OCIInitializeStatementHandle ------------------- */
+/* OCIreateStatementHandle
+ *    Initialize Statement Handle
+ * 
+ * PARAMETERS
+ * Input :
+ *    wctx     - The 
+ *    cursorno - The cursor number for which we need to initialize
+ *               the statement handle
+ *    svch     - The OCI Service handle.
+ *
+ * Output :
+ *    stmthp - The OCI Statement handle.
+ *    errh   - The OCI Error handle.
+ *
+ * Return :
+ *  OCI_SUCCESS - Successful completion of the function.
+ *  OCI_ERROR   - Error.
+ *
+ */
+#define OCIInitializeStatementHandle(wctx, cursorno,  svch, stmthp, errh) \
+ociepish(wctx, cursor, svch, stmthp, errh)
+
+
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+
+void  *ociepacm(OCIExtProcContext *with_context, size_t amount);
+
+
+
+size_t ocieperr(OCIExtProcContext *with_context, int error_number);
+
+
+
+size_t ociepmsg(OCIExtProcContext *with_context, int error_number,
+                oratext *error_message, size_t len );
+
+
+
+sword ociepgoe(OCIExtProcContext *with_context, OCIEnv **envh, 
+               OCISvcCtx **svch, OCIError **errh);
+
+
+#endif                                                     /* OCIEXTP_ORACLE */
diff --git a/sdk/include/ocikpr.h b/sdk/include/ocikpr.h
new file mode 100755
index 0000000..425d696
--- /dev/null
+++ b/sdk/include/ocikpr.h
@@ -0,0 +1,165 @@
+/* Copyright (c) 1991, 2005, Oracle. All rights reserved.  */
+/*
+   NAME
+     ocikpr.h - header of K & R compilers
+   MODIFIED   (MM/DD/YY)
+    mbastawa   09/16/05 - dbhygiene 
+    porangas   12/04/00 - Forward merge bug#974710 to 9i
+    sgollapu   05/19/98 - Change text to OraText
+    dchatter   04/21/96 -
+    dchatter   11/10/95 -  add ognfd() - get native fd
+    lchidamb   04/06/95 -  drop maxdsz from obindps/odefinps
+    slari      04/07/95 -  add opinit
+    dchatter   03/08/95 -  osetpi and ogetpi
+    lchidamb   12/09/94 -  add obindps() and odefinps()
+    dchatter   03/06/95 -  merge changes from branch 1.1.720.2
+    dchatter   11/14/94 -  merge changes from branch 1.1.720.1
+    dchatter   02/08/95 -  olog call; drop onblon
+    dchatter   10/31/94 -  new functions for non-blocking oci
+    rkooi2     11/27/92 -  Changing datatypes (in comments) and return types 
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/18/92 -  Changed to agree with oci.c 
+    sjain      03/16/92 -  Creation 
+*/
+
+/*
+ *  Declare the OCI functions.
+ *  Prototype information is commented out.
+ *  Use this header for non-ANSI C compilers.
+ *  Note that you will need to include ocidfn.h in the .c files
+ *    to get the definition for cda_def.
+ */
+
+#ifndef OCIKPR
+#define OCIKPR
+
+#include <oratypes.h>
+
+/*
+ * Oci BIND (Piecewise or with Skips) 
+ */
+sword  obindps(  struct cda_def *cursor, ub1 opcode, OraText *sqlvar, 
+                  sb4 sqlvl, ub1 *pvctx, sb4 progvl, 
+                  sword ftype, sword scale,
+                  sb2 *indp, ub2 *alen, ub2 *arcode, 
+                  sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip,
+                  ub4 maxsiz, ub4 *cursiz, 
+                  OraText *fmt, sb4 fmtl, sword fmtt  );
+sword  obreak(  struct cda_def *lda  );
+sword  ocan  (  struct cda_def *cursor  );
+sword  oclose(  struct cda_def *cursor  );
+sword  ocof  (  struct cda_def *lda  );
+sword  ocom  (  struct cda_def *lda  );
+sword  ocon  (  struct cda_def *lda  );
+
+
+/*
+ * Oci DEFINe (Piecewise or with Skips) 
+ */
+sword  odefinps(  struct cda_def *cursor, ub1 opcode, sword pos,ub1 *bufctx,
+                   sb4 bufl, sword ftype, sword scale, 
+                   sb2 *indp, OraText *fmt, sb4 fmtl, sword fmtt, 
+                   ub2 *rlen, ub2 *rcode,
+                   sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip  );
+sword  odescr(  struct cda_def *cursor, sword pos, sb4 *dbsize,
+                   sb2 *dbtype, sb1 *cbuf, sb4 *cbufl, sb4 *dsize,
+                   sb2 *prec, sb2 *scale, sb2 *nullok  );
+sword  odessp(  struct cda_def *cursor, OraText *objnam, size_t onlen,
+                   ub1 *rsv1, size_t rsv1ln, ub1 *rsv2, size_t rsv2ln,
+                   ub2 *ovrld, ub2 *pos, ub2 *level, OraText **argnam,
+                   ub2 *arnlen, ub2 *dtype, ub1 *defsup, ub1* mode,
+                   ub4 *dtsiz, sb2 *prec, sb2 *scale, ub1 *radix,
+                   ub4 *spare, ub4 *arrsiz  );
+sword  oerhms(  struct cda_def *lda, sb2 rcode, OraText *buf,
+                   sword bufsiz  );
+sword  oermsg(  sb2 rcode, OraText *buf  );
+sword  oexec (  struct cda_def *cursor  );
+sword  oexfet(  struct cda_def *cursor, ub4 nrows,
+                   sword cancel, sword exact  );
+sword  oexn  (  struct cda_def *cursor, sword iters, sword rowoff  );
+sword  ofen  (  struct cda_def *cursor, sword nrows  );
+sword  ofetch(  struct cda_def *cursor  );
+sword  oflng (  struct cda_def *cursor, sword pos, ub1 *buf,
+                   sb4 bufl, sword dtype, ub4 *retl, sb4 offset  );
+sword  ogetpi(  struct cda_def *cursor, ub1 *piecep, void  **ctxpp, 
+                   ub4 *iterp, ub4 *indexp  );
+sword  opinit(  ub4 mode  );
+sword  olog  (  struct cda_def *lda, ub1 *hst, 
+                   OraText *uid, sword uidl,
+                   OraText *psw, sword pswl, 
+                   OraText *conn, sword connl, 
+                   ub4 mode  );
+sword  ologof(  struct cda_def *lda  );
+sword  oopen (  struct cda_def *cursor, struct cda_def *lda,
+                   OraText *dbn, sword dbnl, sword arsize,
+                   OraText *uid, sword uidl  );
+sword  oopt  (  struct cda_def *cursor, sword rbopt, sword waitopt  );
+sword  oparse(  struct cda_def *cursor, OraText *sqlstm, sb4 sqllen,
+                   sword defflg, ub4 lngflg  );
+sword  orol  (  struct cda_def *lda  );
+sword  osetpi(  struct cda_def *cursor, ub1 piece, void  *bufp, 
+                   ub4 *lenp  );
+void sqlld2  (  struct cda_def *lda, OraText *cname, sb4 *cnlen  );
+void sqllda  (  struct cda_def *lda  );
+
+/* non-blocking functions */
+sword onbset(  struct cda_def *lda  ); 
+sword onbtst(  struct cda_def *lda  ); 
+sword onbclr(  struct cda_def *lda  ); 
+sword ognfd (  struct cda_def *lda, void  *fdp  );
+
+
+
+/* 
+ * OBSOLETE FUNCTIONS 
+ */
+
+/* 
+ * OBSOLETE BIND CALLS-- use obindps() 
+ */
+sword  obndra(  struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, ub2 *alen, ub2 *arcode, ub4 maxsiz,
+                 ub4 *cursiz, OraText *fmt, sword fmtl, sword fmtt  );
+sword  obndrn(  struct cda_def *cursor, sword sqlvn, ub1 *progv,
+                 sword progvl, sword ftype, sword scale, sb2 *indp,
+                 OraText *fmt, sword fmtl, sword fmtt  );
+sword  obndrv(  struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, OraText *fmt, sword fmtl, sword fmtt  );
+
+/* 
+ * OBSOLETE DEFINE CALLS-- use odefinps() 
+ */
+sword  odefin(  struct cda_def *cursor, sword pos, ub1 *buf,
+                 sword bufl, sword ftype, sword scale, sb2 *indp,
+                 OraText *fmt, sword fmtl, sword fmtt, ub2 *rlen, 
+                 ub2 *rcode  );
+
+
+/* older calls ; preferred equivalent calls above */
+sword  odsc  (  struct cda_def *cursor, sword pos, sb2 *dbsize,
+                   sb2 *fsize, sb2 *rcode, sb2 *dtype, sb1 *buf,
+                   sb2 *bufl, sb2 *dsize  );
+sword  oname (  struct cda_def *cursor, sword pos, sb1 *tbuf,
+                   sb2 *tbufl, sb1 *buf, sb2 *bufl  );
+sword  olon  (  struct cda_def *lda, OraText *uid, sword uidl,
+                   OraText *pswd, sword pswdl, sword audit  );
+sword  orlon (  struct cda_def *lda, ub1 *hda, OraText *uid,
+                   sword uidl, OraText *pswd, sword pswdl, sword audit  );
+sword  osql3 (  struct cda_def *cda, OraText *sqlstm, sword sqllen  );
+
+
+
+
+
+
+
+#endif  /* OCIKPR */
+
+
+
+
+
+
+
diff --git a/sdk/include/ocixmldb.h b/sdk/include/ocixmldb.h
new file mode 100644
index 0000000..721516f
--- /dev/null
+++ b/sdk/include/ocixmldb.h
@@ -0,0 +1,211 @@
+/* Copyright (c) 2003, 2011, Oracle and/or its affiliates. 
+All rights reserved. */
+ 
+/* 
+   NAME 
+     ocixmldb.h - XDB public functions
+
+   DESCRIPTION 
+     This file contains XDB specific public functions required for DOM C-API. 
+
+   RELATED DOCUMENTS 
+
+ 
+   EXPORT FUNCTION(S) 
+   struct xmlctx *OCIXmlDbInitXmlCtx(OCIEnv *, OCISvcCtx *, OCIError *,
+                               ocixmldbparam *params, int num_params);
+
+   void    OCIXmlDbFreeXmlCtx(struct xmlctx *xctx);
+
+
+  ------------------------------------------------------------------------
+   EXAMPLES
+   
+   NOTES
+
+   MODIFIED   (MM/DD/YY)
+   srirkris    06/15/11 - Add OCIXmlDr_DEF 
+   srirkris    06/07/11 - Backport srirkris_bug-12613945 from main
+   srirkris    04/26/11 - Backport srirkris_xmlop_bnd from main
+   srirkris    04/14/11 - Backport srirkris_xqupd_repl from main
+   yifeng      02/15/11 - Backport yifeng_bug-10236275 from main
+   srirkris    03/01/11 - OCIXmlDbRewriteXMLDiff definition change
+   vmedi       01/14/11 - OCIXmlDbGetFullyQualifiedSchemaUrl
+   sipatel     03/08/10 - add lob arg to OCIXmlDbRewriteXMLDiff
+   samane      01/20/10 - Bug 9302227
+   yifeng      11/05/09 - add OCIXmlDbRewriteXMLDiff
+   samane      08/05/09 - Bug 8661204
+   ataracha    12/11/03 - remove redundant definitions
+   ataracha    05/28/03 - change names
+   ataracha    02/18/03 - add oratypes, remove XMLERR_*
+   imacky      02/01/03 - remove xml.h; xdbs fix
+   ataracha    01/24/03 - use "struct xmlctx" instead of xmlctx
+   imacky      01/28/03 - fix XMLERR defs
+   ataracha    01/21/03 - ataracha_uni_capi_cleanup
+   ataracha    01/09/03 - Creation
+
+*/
+
+#ifndef ORATYPES 
+#include <oratypes.h> 
+#endif
+ 
+#ifndef OCI_ORACLE
+# include <oci.h>
+#endif
+
+#ifndef OCIXMLDB_ORACLE
+# define OCIXMLDB_ORACLE
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+#ifndef XMLCTX_DEFINED
+# define XMLCTX_DEFINED
+/* DATATYPE xmlctx - XML top-level context
+*/
+struct xmlctx; typedef struct xmlctx xmlctx;
+#endif
+
+
+typedef struct OCIXmlDiffBnd {
+ oratext *bndnmp;
+ ub1    bndnml;
+ ub2 bndpos; 
+ ub2 bndnum;
+ ub2 bnddty;
+ void *bndvalp;
+ ub4 bndvallen;
+} OCIXmlDiffBnd;
+
+struct xmldrctx; typedef struct xmldrctx xmldrctx;
+
+typedef enum 
+{
+  XCTXINIT_OCIDUR  = 1,
+  XCTXINIT_ERRHDL  = 2
+} ocixmldbpname;
+
+typedef struct ocixmldbparam
+{
+  ocixmldbpname   name_ocixmldbparam;
+  void           *value_ocixmldbparam;
+} ocixmldbparam;
+
+#define NUM_OCIXMLDBPARAMS 2
+
+#define OCIXMLDB_BINDBYNAME 1
+#define OCIXMLDB_BINDBYNUM 2
+
+#define OCIMAXXQUBNDLMT 1000
+
+#define OCIXmlDr_DEF 1
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+/*****************************************************************************
+                              DESCRIPTION
+
+-----------------------------OCIXmlDbInitXmlCtx---------------------------------
+Name
+OCIXmlDbInitXmlCtx
+Purpose
+To get a xmlctx structure initialized with error-handler and XDB callbacks. 
+Syntax
+struct xmlctx *OCIXmlDbInitXmlCtx (OCIEnv           *envhp,
+                                 OCISvcCtx        *svchp, 
+                                 OCIError         *err, 
+                                 params_ocixmldb *params,
+                                 int               num_params);
+Parameters
+envhp (IN) - The OCI environment handle
+svchp (IN) - The OCI service handle
+errhp (IN) - The OCI error handle
+params (IN)- This contains the following optional parameters :
+   (a) OCIDuration dur (IN - The OCI Duration (Default: OCI_DURATION_SESSION)
+   (b) void (*err_handler) (sword, (const oratext *) (IN) - 
+       Pointer to the error handling function (Default: null)
+num_params (IN) - Number of parameters to be read from parameter params.
+                  If the value of num_params exceeds the size of array 
+                  "params", unexpected behavior will result.
+
+Returns
+A pointer to xmlctx structure, with xdb context, error handler and callbacks 
+populated with appropriate values. This is later used for all API calls. NULL
+if no database connection available.
+
+-----------------------------OCIXmlDbFreeXmlCtx----------------------------
+Name
+OCIXmlDbFreeXmlCtx
+Pupose
+To free any allocations done during OCIXmlDbInitXmlCtx.
+Syntax
+void OCIXmlDbFreeXmlCtx (struct xmlctx *xctx)
+Parameters
+xctx (IN) - The xmlctx to terminate
+Returns
+-
+------------------------OCIXmlDbOrastreamFromLob---------------------------
+Name
+OCIXmlDbOrastreamFromLob
+Pupose
+To create an orastream from a lob. This orastream can be used by functions like XMLLoadDom().
+Syntax
+sword OCIXmlDbOrastreamFromLob(OCIError *errhp, xmlctx *xctx,
+                               void **stream, OCILobLocator *lobloc)
+Parameters
+envhp  (IN)     - The OCI environment handle
+xctx   (IN)     - XML context
+stream (IN/OUT) - A pointer to orastream
+lobloc (IN)     - The OCI lob locator
+Returns
+The orastream created on top of the lob is returned in the parameter 'stream'.
+******************************************************************************/
+
+struct xmlctx *OCIXmlDbInitXmlCtx(OCIEnv *, OCISvcCtx *, OCIError *, 
+                            ocixmldbparam *, int);
+
+void    OCIXmlDbFreeXmlCtx(struct xmlctx *xctx);
+sword OCIXmlDbStreamFromXMLType(OCIError   *errhp, void  **stream, 
+                                OCIXMLType *doc, ub4 mode);
+sword OCIXmlDbOrastreamFromLob(OCIError *errhp, xmlctx *xctx, 
+                               void **stream, OCILobLocator *lobloc);
+sword OCIXmlDbStreamRead(OCIError   *errhp, void  *stream, 
+                         void *bufp, sb8 *len, ub4 mode);
+sword OCIXmlDbStreamClose(OCIError *errhp, void *stream);
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+/* This function is for internal usage only */
+sword OCIXmlDbRewriteXMLDiff(OCIEnv *envhp, OCIError *errhp, OCISvcCtx *svchp, 
+                             xmldrctx *xctx , oratext* colname, ub4 colnamelen,  
+                             const void* xmldiff, ub4 xmldifflen, 
+                             OCILobLocator *xdiff_locator, oratext** updstmt, 
+                             ub2 binditerator, ub2 *colvalbndcount,  
+                             OCIXmlDiffBnd **bindlist);
+
+struct xmldrctx *OCIXmlInitDRCtx(OCIEnv *env, OCISvcCtx *svc, OCIError *err, 
+                                 ub1 bindtyp);
+
+void OCIXmlFreeDRCtx(xmldrctx *xctx);
+
+sword OCIXmlDbGetFullyQualifiedSchemaUrl(OCIError *errhp,
+                                         oratext  *schema_url,
+                                         ub2       schema_url_len,
+                                         oratext  *schema_owner,
+                                         ub2       schema_owner_len,
+                                         oratext **fq_schema_url,
+                                         ub4      *fs_schema_url_len);
+
+void *OCIXmlDbMemCallback(void *ctx, size_t size);
+
+#endif                                              /* OCIXMLDB_ORACLE */
diff --git a/sdk/include/ocixstream.h b/sdk/include/ocixstream.h
new file mode 100644
index 0000000..16ebf1f
--- /dev/null
+++ b/sdk/include/ocixstream.h
@@ -0,0 +1,2046 @@
+/* Copyright (c) 2006, 2011, Oracle and/or its affiliates. 
+All rights reserved. */
+ 
+/* 
+   NAME 
+     ocixstream.h - OCI X-Stream APIs
+
+   DESCRIPTION 
+     OCI APIs for X-Stream
+
+   RELATED DOCUMENTS 
+ 
+   EXPORT FUNCTION(S) 
+
+   INTERNAL FUNCTION(S)
+
+   EXAMPLES
+
+   NOTES
+
+   MODIFIED   (MM/DD/YY)
+   elu         06/06/11 - Backport elu_bug-12592488 from main
+   bpwang      04/14/11 - Backport bpwang_bug-11815316 from main
+   elu         04/12/11 - xmlschema
+   elu         03/28/11 - xmlschema
+   tianli      03/21/11 - Backport tianli_bug-11875662 from main
+   elu         05/25/11 - remove xml schema
+   thoang      03/10/10 - Add OCIXSTREAM_IN_ATTACH_RESTART_INBOUND mode
+   thoang      12/28/09 - Update comments
+   elu         01/07/10 - stmt lcr
+   thoang      12/15/09 - Remove non-oracle src mode 
+   thoang      12/09/09 - Add note to OCIXStreamInErrorGet
+   thoang      12/04/09 - Remove ProcessedLWMGet2/Set2 
+   rmao        11/20/09 - add OCI_ROWLCR_SEQ_LCR
+   thoang      10/20/09 - Add rollback and start_tx cmd.  
+   bpwang      10/09/09 - Add OCI_ROWLCR_HAS_ID_KEY_ONLY
+   elu         10/05/09 - add stmt LCR
+   rihuang     10/06/09 - Add OCIXSTREAM_IN_FLUSH_WAIT_FOR_COMPLETE
+   thoang      05/08/09 - Add OCILCR_NEW_ONLY_MODE 
+   praghuna    05/11/09 - removed 'TODO' comments 
+   thoang      02/15/09 - Change lob_column_* to chunk_column_*
+   thoang      01/27/09 - 8216105 - add OLD/NEW column parms to OCILCRHeaderGet
+   rihuang     01/05/09 - Add OCI_LCR_ATTR_TRACKING_LABEL
+   tianli      11/28/08 - add DDL flags
+   tianli      11/20/08 - add OCILCRAttribute methods
+   thoang      11/20/08 - Define OCI_LCR_MAX_TXID_LEN
+   tianli      11/07/08 - add edition
+   thoang      11/10/08 - change return type to sword for consistency
+   thoang      10/16/08 - remove commit position arg
+   tianli      08/26/08 - rename client_name in XStreamIn attach call
+   thoang      06/30/08 - Support XStream APIs using two callbacks.
+   praghuna    05/14/08 - charset id is ub2, OCILcrGetRowStmtWithBindVar
+   thoang      06/02/08 - Define reserved attach mode for internal clients
+   elu         05/08/08 - add pos functions
+   thoang      04/29/08 - API changes 
+   jinwu       04/28/08 - add OCILcrGetExtraAttributes
+   elu         04/14/08 - add OCI_LCR_MAX_POSITION_LEN
+   juyuan      03/27/08 - add flag for Set/GetHeader and Set/GetColumnInfo
+   thoang      02/25/08 - Add GetNextChunk and SetNextChunk
+   rihuang     03/24/08 - Signature change for OCILcrNew
+   elu         03/05/08 - add lcr id
+   praghuna    02/26/08 - Added OCILcrGetRowStmt
+   thoang      01/25/08 - Add wm_time parameter to XApply APIs
+   thoang      12/28/07 - Add mode parameter to XApplyDetach
+   thoang      11/07/07 - Change extapp apis to return ub1[] watermark
+   juyuan      05/23/07 - XStream In
+   thoang      11/13/06 - Add XStream Out methods
+   thoang      11/13/06 - Add LCR getter methods 
+   nshodhan    05/12/06 - streams OCI APIs 
+   nshodhan    05/12/06 - Creation
+
+*/
+
+#ifndef OCIXSTREAM_ORACLE
+# define OCIXSTREAM_ORACLE
+
+#ifndef ORATYPES
+# include <oratypes.h>
+#endif
+
+#ifndef OCI_ORACLE
+# include <oci.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+/* LCR Types -- must match with values defined in kngo.h */
+#define OCI_LCR_XROW                   (3)               /* External Row LCR */
+#define OCI_LCR_XDDL                   (4)               /* External DDL LCR */
+
+/* DML Command Types -- must match with values defined in kngl.h */
+#define OCI_LCR_ROW_CMD_INSERT          "INSERT"
+#define OCI_LCR_ROW_CMD_DELETE          "DELETE"
+#define OCI_LCR_ROW_CMD_UPDATE          "UPDATE"
+#define OCI_LCR_ROW_CMD_COMMIT          "COMMIT"
+#define OCI_LCR_ROW_CMD_LOB_WRITE       "LOB WRITE"
+#define OCI_LCR_ROW_CMD_LOB_TRIM        "LOB TRIM"
+#define OCI_LCR_ROW_CMD_LOB_ERASE       "LOB ERASE"
+#define OCI_LCR_ROW_CMD_ROLLBACK        "ROLLBACK"
+#define OCI_LCR_ROW_CMD_START_TX        "START_TX"      /* start transaction */
+#define OCI_LCR_ROW_CMD_CTRL_INFO       "CONTROL INFO"        /* contorl lcr */
+
+/* LCR Extra Attribute Name -- must match with values defined in knll.h */
+#define OCI_LCR_ATTR_THREAD_NO         "THREAD#"
+#define OCI_LCR_ATTR_ROW_ID            "ROW_ID"
+#define OCI_LCR_ATTR_SESSION_NO        "SESSION#"
+#define OCI_LCR_ATTR_SERIAL_NO         "SERIAL#"
+#define OCI_LCR_ATTR_USERNAME          "USERNAME"
+#define OCI_LCR_ATTR_TX_NAME           "TX_NAME"
+
+/* below are non first class LCR field specific */
+#define OCI_LCR_ATTR_EDITION_NAME      "EDITION_NAME"
+#define OCI_LCR_ATTR_MESSAGE_TRACKING_LABEL "MESSAGE_TRACKING_LABEL"
+#define OCI_LCR_ATTR_CURRENT_USER      "CURRENT_USER"
+
+/* the maximum total number of attributes, total of extra attributes
+ * plus non first class LCR field.
+ * NOTE: This MUST be consistent with DefaultRowLCRCache.MaxAttritubeNumber
+ * in DefaultRowLCRCache.java
+ */
+#define OCI_LCR_MAX_ATTRIBUTES         9
+
+/* Row LCR column value types used in OCILCRRowColumnInfoGet/Set functions. */
+#define OCI_LCR_ROW_COLVAL_OLD         0                      /* OLD columns */
+#define OCI_LCR_ROW_COLVAL_NEW         1                     /*  NEW columns */
+
+/* maximum length for position
+ * NOTE: This MUST be consistent with DefaultRowLCRCache.MaxLowWaterMarkLength
+ * in DefaultRowLCRCache.java
+ */
+#define OCI_LCR_MAX_POSITION_LEN        64
+
+/* maximum length for txid */
+#define OCI_LCR_MAX_TXID_LEN            128
+
+/* Valid column flags used in OCILCRRowColumnInfoSet, OCILCRRowColumnInfoGet,
+ * OCILCRLobInfoSet, OCILCRLobInfoGet, OCIXStreamOutChunkReceive, 
+ * OCIXStreamInChunkSend calls.
+ */
+#define OCI_LCR_COLUMN_LOB_DATA     (0x00000001)    /* col contains lob data */
+#define OCI_LCR_COLUMN_LONG_DATA    (0x00000002)    /* col contains long data*/
+#define OCI_LCR_COLUMN_EMPTY_LOB    (0x00000004)    /* col has an empty lob  */
+#define OCI_LCR_COLUMN_LAST_CHUNK   (0x00000008) /* last chunk of current col*/
+#define OCI_LCR_COLUMN_AL16UTF16    (0x00000010)  /* col is in AL16UTF16 fmt */
+#define OCI_LCR_COLUMN_NCLOB        (0x00000020)       /* col has NCLOB data */
+#define OCI_LCR_COLUMN_XML_DATA     (0x00000040)    /* col contains xml data */
+#define OCI_LCR_COLUMN_XML_DIFF     (0x00000080)/* col contains xmldiff data */
+#define OCI_LCR_COLUMN_ENCRYPTED    (0x00000100)         /* col is encrypted */
+
+/* OCI_LCR_COLUMN_UPDATED is set only for the modified columns in the NEW 
+ * column list of an update LCR. 
+ */
+#define OCI_LCR_COLUMN_UPDATED      (0x00000200)           /* col is updated */
+
+/* Valid bit values for the flag parameter in the following APIS:
+ * - OCILCRHeaderGet
+ * - OCILCRHeaderSet
+ */
+#define OCI_ROWLCR_HAS_ID_KEY_ONLY  (0x00000001)     /* only has ID key cols */
+                                                 /* (0x00000002) is RESERVED */
+                                                 /* (0x00000004) is RESERVED */
+                                                 /* (0x00000008) is RESERVED */
+#define OCI_ROWLCR_SEQ_LCR          (0x00000010)             /* sequence lcr */
+
+/* Valid bit values for flag parameter in the following APIs: 
+ * - OCIXStreamOutChunkReceive & OCIXStreamOutLCRReceive 
+ * - OCIXStreamInChunkSend & OCIXStreamInLCRSend  
+ */
+#define OCI_XSTREAM_MORE_ROW_DATA    (0x00000001)  /* LCR contains more data */
+
+/* Valid mode flag for OCILCRHeaderGet and OCILCRRowColumnInfoGet functions */
+#define OCILCR_NEW_ONLY_MODE       (0x0001)      /* NEW columns only -- dont */
+                                                 /* include OLD columns      */
+
+/* Valid mode flag for OCIXStreamInFlush */
+                                   /* Synchronous mode for OCIXStreamInFlush */
+#define OCIXSTREAM_IN_FLUSH_WAIT_FOR_COMPLETE  (0x00000001)
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRNew - OCI LCR NEW
+DESCRIPTION
+  Create a new Streams LCR for the user specified duration and type
+PARAMETERS
+  svchp        (IN)      - OCI service context
+  errhp        (IN)      - OCI Error Handle
+  duration     (IN)      - allocation duration for LCR memory
+  lcrtype      (IN)      - LCR type (OCI_LCR_XROW / OCI_LCR_XDDL)
+  lcrp         (IN/OUT)  - Streams LCR. (*lcrp must be initialized to null.)
+  mode         (IN)      - mode
+NOTES
+  - memory will be based on the duration specified by the user
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRNew(OCISvcCtx    *svchp, 
+                OCIError     *errhp, 
+                OCIDuration   duration, 
+                ub1           lcrtype,
+                void        **lcrp,
+                ub4           mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRFree - OCI LCR FREE
+DESCRIPTION
+  Free Streams LCR specified by the user
+PARAMETERS
+  svchp        (IN)      - OCI service context
+  errhp        (IN)      - OCI Error Handle
+  lcrp         (IN/OUT)  - Streams LCR
+  mode         (IN)      - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRFree(OCISvcCtx    *svchp, 
+                 OCIError     *errhp, 
+                 void         *lcrp,
+                 ub4           mode);
+
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRHeaderSet - OCI LCR Set Header
+DESCRIPTION
+  Initialize elements of Streams LCR's header 
+PARAMETERS
+  svchp                 (IN) - OCI service context
+  errhp                 (IN) - OCI Error Handle
+  src_db_name           (IN) - Pointer to Canonicalized source database name. 
+                               Must be non-NULL. 
+  src_db_name_len       (IN) - Length of source database name in bytes
+                               excluding NULL terminator. Should follow Oracle
+                               naming conventions and size limitations.
+  cmd_type              (IN) - For ROW LCRs: OCI_LCR_ROW_CMD_XXXXXXX 
+                               For DDL LCRs: One of the command types 
+                               corresponding to OCI Reference manual
+  cmd_type_len          (IN) - Length of cmd_type.
+  owner                 (IN) - Canonicalized table owner name. Not required
+                               for COMMIT LCR.
+  owner_len             (IN) - Length of owner name in bytes excluding the 
+                               NULL terminator. Should follow Oracle naming 
+                               conventions and size limitations.
+  oname                 (IN) - Canonicalized table name. Not required for 
+                               COMIT LCR. 
+  oname_len             (IN) - Length of table name in bytes excluding the 
+                               NULL terminator. Should follow Oracle naming 
+                               conventions and size limitations.
+  tag                   (IN) - A binary tag that enables tracking of the LCR. 
+                               For example, this tag can be used to determine
+                               the original source database of the DML 
+                               statement if apply forwarding is used. 
+  tag_len               (IN) - Number of bytes in the tag. Cannot exceed 2000
+                               bytes
+  txid                  (IN) - Transaction ID.
+  txid_len              (IN) - Length of transaction id in bytes excluding the 
+                               NULL terminator. Should not exceeed
+                               OCI_LCR_MAX_TXID_LEN bytes.
+  src_time              (IN) - The time when the change was generated at the 
+                               source database.
+  position              (IN) - position for LCR. Must be byte-comparable.
+  position_len          (IN) - Length of position. Must be non-zero. 
+  flag                  (IN) - LCR flag.
+  lcrp              (IN/OUT) - Streams LCR
+  mode                  (IN) - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+  - This function clears the current contents of the input LCR before
+    setting the header to the new values.
+------------------------------------------------------------------------------=
+*/
+sword OCILCRHeaderSet(OCISvcCtx   *svchp, 
+                       OCIError    *errhp, 
+                       oratext     *src_db_name,
+                       ub2          src_db_name_len,
+                       oratext     *cmd_type,
+                       ub2          cmd_type_len,
+                       oratext     *owner,
+                       ub2          owner_len,
+                       oratext     *oname,
+                       ub2          oname_len,
+                       ub1         *tag,
+                       ub2          tag_len,
+                       oratext     *txid,
+                       ub2          txid_len, 
+                       OCIDate     *src_time,
+                       ub1         *position,
+                       ub2          position_len,
+                       oraub8       flag,
+                       void        *lcrp,
+                       ub4          mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRHeaderGet - OCI LCR Get Header
+DESCRIPTION
+  Get header information from Streams LCR 
+PARAMETERS
+  svchp                  (IN) - OCI service context
+  errhp                  (IN) - OCI Error Handle
+  src_db_name           (OUT) - Pointer to Canonicalized source database name. 
+                                Optional, if src_db_name is specified then 
+                                must specify src_db_name_len as well.
+  src_db_name_len       (OUT) - Length of source database name in bytes
+                                excluding NULL terminator. 
+                                Optional, if specified src_db_name_len then 
+                                must specify src_db_name as well.
+  cmd_type              (OUT) - Command type. Must be non-null if
+                                cmd_type_len is non-null. Must be null if
+                                cmd_type_len is NULL.
+  cmd_type_len          (OUT) - Length of cmd_type. Optional.
+  owner                 (OUT) - Canonicalized table owner name. 
+                                Optional, if owner is specified then 
+                                must specify owner_len as well.
+  owner_len             (OUT) - Length of owner name in bytes excluding the 
+                                NULL terminator. 
+                                Optional, if owner_len is specified then 
+                                must specify owner as well.
+  oname                 (OUT) - Canonicalized table name. 
+                                Optional, if oname is specified then 
+                                must specify oname_len as well.
+  oname_len             (OUT) - Length of table name in bytes excluding the 
+                                NULL terminator. 
+                                Optional, if oname_len is specified then 
+                                must specify oname as well.
+  tag                   (OUT) - A binary tag that enables tracking of the LCR. 
+                                For example, this tag can be used to determine
+                                the original source database of the 
+                                DML statement if apply forwarding is used. 
+                                Optional, if tag is specified then 
+                                must specify tag_len as well.
+  tag_len               (OUT) - Number of bytes in the tag.
+                                Optional, if tag_len is specified then 
+                                must specify tag as well.
+  txid                  (OUT) - Transaction ID. 
+                                Optional, if txid is specified then 
+                                must specify txid_len as well.
+  txid_len              (OUT) - Length of transaction id in bytes excluding
+                                the NULL terminator. 
+                                Optional, if txid_len is specified then 
+                                must specify txid as well.
+  src_time              (OUT) - The time when the change was generated at the 
+                                source database. Optional.
+  old_columns           (OUT) - Number of columns in the OLD column list.
+                                Return 0 if input lcr is DDL LCR. Optional.
+  new_columns           (OUT) - Number of columns present in either 
+                                the OLD or NEW column list. 
+                                Return 0 if input lcr is DDL LCR. Optional.
+                                See NOTES below for the special mode supported
+                                by this function.
+  position              (OUT) - LCR position. Optional.
+  position_len          (OUT) - Length of position. Must be non-null if
+                                position is non-null. Must be null if
+                                position is null.
+  flag                  (OUT) - LCR flag. Optional.
+  lcrp                   (IN) - Streams LCR
+  mode                   (IN) - mode (see NOTES)
+NOTES
+  - Parameter src_time is optional. If specified the appropriate return 
+    structure must be pre-allocated before calling OCILCRHeaderGet.
+  - The return values for src_db_name, cmd_type, owner, oname, tag, txid and 
+    position are shallow-copied (i.e., they point directly into the LCR 
+    structure).  
+  - Valid mode flags:
+    - OCILCR_NEW_ONLY_MODE: if this mode is specified then the new_columns 
+      returned is the count of the columns in the NEW column list only.  
+      Otherwise, the new_columns returned is the number of distinct 
+      columns present in either the NEW or the OLD column list of the given 
+      ROW LCR.
+------------------------------------------------------------------------------=
+*/
+
+sword OCILCRHeaderGet(OCISvcCtx   *svchp, 
+                       OCIError    *errhp, 
+                       oratext    **src_db_name,
+                       ub2         *src_db_name_len,
+                       oratext    **cmd_type,
+                       ub2         *cmd_type_len,
+                       oratext    **owner,
+                       ub2         *owner_len,
+                       oratext    **oname,
+                       ub2         *oname_len,
+                       ub1        **tag,
+                       ub2         *tag_len,
+                       oratext    **txid,
+                       ub2         *txid_len, 
+                       OCIDate     *src_time,
+                       ub2         *old_columns,
+                       ub2         *new_columns,
+                       ub1        **position,
+                       ub2         *position_len,
+                       oraub8      *flag, 
+                       void        *lcrp,
+                       ub4          mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRRowColumnInfoSet - OCI LCR ROW SET COLUMN INFO
+DESCRIPTION
+  Populates column information as specified by the user.
+PARAMETERS
+  svchp             (IN)    - OCI service context
+  errhp             (IN)    - OCI Error Handle
+  column_value_type (IN)    - ROW LCR column value type: 
+                              - OCI_LCR_ROW_COLVAL_OLD        
+                              - OCI_LCR_ROW_COLVAL_NEW    
+  num_columns       (IN)    - Number of columns to be populated
+  column_names      (IN)    - Pointer to an array of column names. Column 
+                              names must be canonicalized. Column names should 
+                             follow Oracle naming conventions
+  column_name_lens (IN)    - Pointer to an array of column name lengths
+                             in bytes, excluding the NULL terminator.
+  column_dtyp      (IN)    - Pointer to an array of column datatypes. 
+  column_valuesp   (IN)    - Pointer to an array of column data values.
+  column_indp      (IN)    - Pointer to an indicator array. For all datatypes,
+                             this is a pointer to an array of  OCIInd values 
+                             (OCI_IND_NULL/OCI_IND_NOTNULL).
+  column_alensp    (IN)    - Pointer to an array of actual column lengths in 
+                             bytes.
+  column_csetfp    (IN)    - Pointer to an array of character set forms for 
+                             the columns. The default form is SQLCS_IMPLICIT. 
+                             Setting this attribute will cause the database or 
+                             national character set to be used on the client 
+                             side. Set this attribute to SQLCS_NCHAR for the 
+                             national character set or SQLCS_IMPLICIT for the 
+                             database character set. 
+                             Pass 0 for non-character columns.
+  column_flags     (IN)    - Pointer to an array of column flags.
+                             Possible bit values are OCI_LCR_COLUMN_* flags 
+                             listed above.
+  column_csid      (IN)    - Pointer to an array of column character set id.
+                             The character set id is only required for
+                             XMLType column; otherwise, the csid is ignored.
+  row_lcrp         (IN/OUT)- Streams Row LCR pointer
+  mode             (IN)    - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRRowColumnInfoSet(OCISvcCtx   *svchp, 
+                             OCIError    *errhp, 
+                             ub2          column_value_type,
+                             ub2          num_columns,
+                             oratext    **column_names,
+                             ub2         *column_name_lens,
+                             ub2         *column_dtyp,
+                             void       **column_valuesp,
+                             OCIInd      *column_indp,
+                             ub2         *column_alensp,
+                             ub1         *column_csetfp,
+                             oraub8      *column_flags,
+                             ub2         *column_csid,
+                             void        *row_lcrp,
+                             ub4          mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRRowColumnInfoGet - OCI LCR ROW GET COLUMN INFO
+DESCRIPTION
+  Returns column information as requested by the user.
+PARAMETERS
+  svchp            (IN)    - OCI service context
+  errhp            (IN)    - OCI Error Handle
+  column_value_type (IN)   - ROW LCR column value type: 
+                             - OCI_LCR_ROW_COLVAL_OLD        
+                             - OCI_LCR_ROW_COLVAL_NEW    
+                             (See NOTES for special mode supported by this
+                              function.)
+  num_columns      (OUT)   - Number of columns in requested column list
+  column_names     (IN/OUT)- Pointer to an array of column names. 
+                             Optional. If specified then column_namesl must
+                             be specified as well, and both arrays must be the 
+                             size specified by array_size parameter. 
+  column_name_lens (IN/OUT)- Pointer to an array of column name lengths
+                             in bytes, excluding the NULL terminator.
+                             Optional. If specified then column_names must
+                             be specified as well, and both arrays must be the 
+                             size specified by array_size parameter. 
+  column_dtyp      (IN/OUT)- Pointer to an array of column datatypes. 
+                             Optional. If specified then this array must be 
+                             the size specified by array_size parameter. 
+  column_valuesp   (IN/OUT)- Pointer to an array of column data values.
+                             Optional. If specified then this array must be 
+                            the  size specified by array_size parameter. 
+  column_indp      (IN/OUT)- Pointer to an indicator array. For all datatypes,
+                             this is a pointer to an array of  OCIInd values 
+                             (OCI_IND_NULL/OCI_IND_NOTNULL).
+                             Optional. If specified then this array must be 
+                             the size specified by array_size parameter. 
+  column_alensp    (IN/OUT)- Pointer to an array of actual column lengths in 
+                             bytes.
+                             Optional. If specified then this array must be 
+                             the size specified by array_size parameter. 
+  column_csetfp    (IN/OUT)- Pointer to an array of character set forms for 
+                             the columns. 
+                             Optional. If specified then this array must be 
+                             the size specified by array_size parameter. 
+  column_flags     (IN/OUT)- Pointer to an array of column flags for 
+                             the columns. 
+                             Optional. If specified then this array must be 
+                             the size specified by array_size parameter. 
+                             Possible bit values are OCI_LCR_COLUMN_* flags 
+                             listed above.
+  column_csid      (IN/OUT)- Pointer to an array of column character set id for
+                             the columns. 
+                             Optional. If specified then this array must be 
+                             the size specified by array_size parameter. 
+                             The column csid is returned only for XMLType 
+                             column. 
+  row_lcrp         (IN)    - Streams Row LCR pointer
+  array_size       (IN)    - Size of each of above arrays   
+  mode             (IN)    - mode (see NOTES)
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+  - If array_size is not large enough to accommodate the number of columns
+    in the requested column list then OCI_ERROR is returned. Parameter 
+    num_columns will have the number of columns in the requested column list.
+  - The return values for column_names and column_valuesp will be shallow
+    copied (i.e., they reference directly into the LCR structure). 
+    Client should not modify those pointers directly.  
+  - Valid mode flags:
+    - OCILCR_NEW_ONLY_MODE: this mode is valid only for OCI_LCR_ROW_COLVAL_NEW 
+      column_value_type; otherwise, an error is raised. 
+      If this mode is specified then the columns returned include only the
+      columns in the NEW column list.
+      If this mode is not specified then the columns returned is the union
+      of the NEW columns plus the OLD columns that are not present in the 
+      NEW column list.
+------------------------------------------------------------------------------=
+*/
+sword OCILCRRowColumnInfoGet(OCISvcCtx   *svchp, 
+                             OCIError    *errhp, 
+                             ub2          column_value_type,
+                             ub2         *num_columns,
+                             oratext    **column_names,
+                             ub2         *column_name_lens,
+                             ub2         *column_dtyp,
+                             void       **column_valuesp,
+                             OCIInd      *column_indp,
+                             ub2         *column_alensp,
+                             ub1         *column_csetfp,
+                             oraub8      *column_flags,
+                             ub2         *column_csid,
+                             void        *row_lcrp,
+                             ub2          array_size,
+                             ub4          mode);
+
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRDDLInfoSet - OCI LCR SET DDL INFO
+DESCRIPTION
+  populates DDL information as sepcified by the user.
+PARAMETERS
+  svchp             (IN)  - OCI service context
+  errhp             (IN)  - OCI Error Handle
+  object_type       (IN)  - The type of object on which the DDL statement was 
+                            executed. The following are valid object types:
+                            CLUSTER, FUNCTION, INDEX, LINK, OUTLINE,
+                            PACKAGE, PACKAGE BODY, PROCEDURE, SEQUENCE,
+                            SYNONYM, TABLE, TRIGGER, TYPE, USER, VIEW
+                            LINK represents a database link.
+                            NULL is also a valid object type. Specify NULL 
+                            for all object types not listed.
+  object_type_len   (IN)  - Length of object_type without the NULL terminator.
+  ddl_text          (IN)  - The text of the DDL statement. This parameter 
+                            should be set to a non-NULL value. 
+                            DDL text must be in Oracle DDL format.
+  ddl_text_len      (IN)  - DDL text length in bytes without NULL terminator.
+  logon_user        (IN)  - Canonicalized name of the user whose session 
+                            executed the DDL statement. Should follow Oracle 
+                            naming conventions and size limitations.
+  logon_user_len    (IN)  - logon user name length in bytes without NULL 
+                            terminator.
+  current_schema    (IN)  - The canonicalized schema name that is used if no 
+                            schema is specified explicitly for the modified 
+                            database objects in ddl_text. If a schema is 
+                            specified in ddl_text that differs from the one 
+                            specified for current_schema, then the schema 
+                            specified in ddl_text will be used. 
+                            This parameter should be set to a non-NULL value.
+                            Should follow Oracle naming conventions and size 
+                            limitations.
+  current_schema_len (IN) - schema name length in bytes without NULL terminator
+  base_table_owner  (IN)  - If the DDL statement is a table related DDL 
+                            (such as CREATE TABLE and ALTER TABLE), or if the 
+                            DDL statement involves a table (such as creating 
+                            a trigger on a table), then base_table_owner 
+                            specifies the canonicalized owner of the table 
+                            involved. Otherwise, base_table_owner is NULL.
+                            Should follow Oracle naming conventions and size 
+                            limitations.
+  base_table_owner_len (IN)- base table owner name length in bytes without NULL
+                            terminator.
+  base_table_name   (IN)  - If the DDL statement is a table related DDL (such
+                            as CREATE TABLE and ALTER TABLE), or if the DDL 
+                            statement involves a table (such as creating a 
+                            trigger on a table), then base_table_name 
+                            specifies the canonicalized name of the table 
+                            involved. Otherwise, base_table_name is NULL.
+                            Length of the above string without the NULL 
+                            terminator. Should follow Oracle naming 
+                            conventions and size limitations.
+                            Should follow Oracle naming conventions and size 
+                            limitations.
+  base_table_name_len (IN)- base table name length in bytes without NULL
+                            terminator.
+  flag               (IN) - DDL LCR flag.
+  ddl_lcrp       (IN/OUT) - Streams Ddl LCR pointer
+  mode              (IN)  - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRDDLInfoSet(OCISvcCtx   *svchp,
+                       OCIError    *errhp,
+                       oratext     *object_type,
+                       ub2          object_type_len,
+                       oratext     *ddl_text,
+                       ub4          ddl_text_len, 
+                       oratext     *logon_user,
+                       ub2          logon_user_len,
+                       oratext     *current_schema,
+                       ub2          current_schema_len,
+                       oratext     *base_table_owner,
+                       ub2          base_table_owner_len,
+                       oratext     *base_table_name,
+                       ub2          base_table_name_len,
+                       oraub8       flag,
+                       void        *ddl_lcrp,
+                       ub4          mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRDDLInfoGet - OCI LCR GET DDL INFO
+DESCRIPTION
+  Returns DDL information from specified lcr.
+PARAMETERS
+  svchp                (IN)  - OCI service context
+  errhp                (IN)  - OCI Error Handle
+  object_type          (OUT)  - The type of object on which the DDL statement 
+                               was executed. 
+                               Optional, if object_type is specified then
+                               must specify object_type_len as well.
+  object_type_len      (OUT)  - Length of object_type without the NULL 
+                                terminator.
+  ddl_text             (OUT) - The text of the DDL statement. 
+                               Optional, if ddl_text is specified then
+                               must specify ddl_text_len as well.
+  ddl_text_len         (OUT) - DDL text length in bytes without NULL 
+                               terminator.
+  logon_user           (OUT) - Canonicalized name of the user whose session 
+                               executed the DDL statement. 
+                               Optional, if logon_user is specified then
+                               must specify logon_user_len as well.
+  logon_user_len       (OUT) - logon user name length in bytes without NULL 
+                               terminator.
+  current_schema       (OUT) - The canonicalized schema name that is used if 
+                               no schema is specified explicitly for the
+                               modified database objects in ddl_text.
+                               Optional, if current_schema is specified then
+                               must specify current_schema_len as well.
+  current_schema_len   (OUT)- schema name length in bytes without NULL 
+                              terminator
+  base_table_owner     (OUT) - If the DDL statement is a table related DDL 
+                               (such as CREATE TABLE and ALTER TABLE), or if
+                               the DDL statement involves a table (such as
+                               creating a trigger on a table), then
+                               base_table_owner specifies the canonicalized
+                               owner of the table involved. Otherwise,
+                               base_table_owner is NULL.  Optional, if
+                               base_table_owner is specified then must specify
+                               base_table_owner_len as well.
+  base_table_owner_len (OUT) - base table owner name length in bytes without 
+                               NULL terminator.
+  base_table_name      (OUT) - If the DDL statement is a table related DDL 
+                               (such as CREATE TABLE and ALTER TABLE), or if
+                               the DDL statement involves a table (such as
+                               creating a trigger on a table), then
+                               base_table_name specifies the canonicalized name
+                               of the table involved. Otherwise,
+                               base_table_name is NULL.  Optional, if
+                               base_table_name is specified then must specify
+                               base_table_name_len as well.
+  base_table_name_len  (OUT) - base table name length in bytes without NULL
+                               terminator.
+  flag                 (OUT) - DDL LCR flag. Optional, data not returned if 
+                               NULL.
+  ddl_lcrp             (IN)  - Streams DDL LCR pointer
+  mode                 (IN)  - mode (for future extention - not used currently)
+RETURNS
+  OCI_SUCCESS or OCI_ERROR.
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRDDLInfoGet(OCISvcCtx   *svchp,
+                       OCIError    *errhp,
+                       oratext    **object_type,
+                       ub2         *object_type_len,
+                       oratext    **ddl_text,
+                       ub4         *ddl_text_len, 
+                       oratext    **logon_user,
+                       ub2         *logon_user_len,
+                       oratext    **current_schema,
+                       ub2         *current_schema_len,
+                       oratext    **base_table_owner,
+                       ub2         *base_table_owner_len,
+                       oratext    **base_table_name,
+                       ub2         *base_table_name_len,
+                       oraub8      *flag,
+                       void        *ddl_lcrp,
+                       ub4          mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRAttributesSet - OCI LCR SET ATTRIBUTES
+DESCRIPTION
+  populates extra attribute information in ROW/DDL LCR, as well as any 
+  non first class attributes that can not be set through
+  OCILCRHeaderSet, OCILCRDDLInfoSet, or OCILCRRowColumnInfoSet.
+  e.g. edition name
+PARAMETERS
+  svchp           (IN)    - OCI service context
+  errhp           (IN)    - OCI Error Handle
+  num_attrs       (IN)    - Number of extra attributes to be populated
+  attr_names      (IN)    - Pointer to an array of attribute names. Attribute
+                            names must be canonicalized and should follow 
+                            Oracle naming conventions
+  attr_names_lens (IN)    - Pointer to an array of attribute name lengths
+                            in bytes, excluding the NULL terminator.
+  attr_dtyp       (IN)    - Pointer to an array of attribute datatypes. 
+  attr_valuesp    (IN)    - Pointer to an array of attribute data values.
+  attr_indp       (IN)    - Pointer to an indicator array. For all datatypes,
+                            this is a pointer to an array of  OCIInd values 
+                            (OCI_IND_NULL/OCI_IND_NOTNULL).
+  attr_alensp     (IN)    - Pointer to an array of actual attribute lengths in 
+                            bytes.
+  lcrp            (IN/OUT)- Streams (Row/DDL) LCR pointer
+  mode            (IN)    - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRAttributesSet(OCISvcCtx   *svchp, 
+                          OCIError    *errhp, 
+                          ub2          num_attrs,
+                          oratext    **attr_names,
+                          ub2         *attr_name_lens,
+                          ub2         *attr_dtyp,
+                          void       **attr_valuesp,
+                          OCIInd      *attr_indp,
+                          ub2         *attr_alensp,
+                          void        *lcrp,
+                          ub4          mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRAttributesGet - OCI LCR GET EXTRA ATTRIBUTES
+DESCRIPTION
+  Gets extra attribute information in (ROW/DDL) LCR, as well as any 
+  non first class attributes that are not populated through
+  OCILCRHeaderGet, OCILCRDDLInfoGet, or OCILCRRowColumnInfoGet
+  e.g. edition name
+PARAMETERS
+  svchp          (IN)    - OCI service context
+  errhp          (IN)    - OCI Error Handle
+  num_attrs      (OUT)   - Number of extra attributes to be populated
+  attr_names     (IN/OUT)- Pointer to an array of attribute names. Attribute
+                           names must be canonicalized and should follow 
+                           Oracle naming conventions
+  attr_namesl    (IN/OUT)- Pointer to an array of attribute name lengths
+                           in bytes, excluding the NULL terminator.
+  attr_dtyp      (IN/OUT)- Pointer to an array of attribute datatypes. 
+  attr_valuesp   (IN/OUT)- Pointer to an array of attribute data values.
+  attr_indp      (IN/OUT)- Pointer to an indicator array. For all datatypes,
+                           this is a pointer to an array of OCIInd values 
+                           (OCI_IND_NULL/OCI_IND_NOTNULL).
+  attr_alensp    (IN/OUT)- Pointer to an array of actual attribute lengths in 
+                           bytes.
+  lcrp           (IN)    - Streams (Row/DDL) LCR pointer
+  array_size     (IN)    - Size of each of above arrays, use at least the size
+                           defined by OCI_LCR_MAX_ATTRIBUTES
+  mode           (IN)    - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+  - If array_size is not large enough to accommodate the number of attributes
+    in the requested attribute list then OCI_ERROR is returned. Parameter
+    num_attrs will return the suggested size. 
+------------------------------------------------------------------------------=
+*/
+sword OCILCRAttributesGet(OCISvcCtx   *svchp,
+                          OCIError    *errhp,
+                          ub2         *num_attrs,
+                          oratext    **attr_names,
+                          ub2         *attr_namesl,
+                          ub2         *attr_dtyp,
+                          void       **attr_valuesp,
+                          OCIInd      *attr_indp,
+                          ub2         *attr_alensp,
+                          void        *lcrp,
+                          ub2          array_size,
+                          ub4          mode);
+
+/*--------------------- OCILCRWhereClauseGet ----------------------------*/
+/*
+   NAME
+       OCILCRWhereClauseGet - OCI Get Where Clause
+   DESCRIPTION
+     Gets the Where clause  statement for the given ROW LCR.
+   PARAMETERS
+       svchp                      (IN/OUT) - OCI service handle
+       errhp                      (IN/OUT) - Error Handle to which errors
+                                             should be reported
+       wc_stmt                    (OUT)    - Sql Statement equivalent to the 
+                                             LCR has applied
+       wc_stmt_len                (IN/OUT) - length of wc_stmt buffer
+       row_lcrp                   (IN)     - row LCR to be converted to SQL
+       mode                       (IN)     - Mode flags (For future extension. 
+                                             Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+     - For now, specify OCI_DEFAULT for mode
+     - WHERE clause generated for INSERT lcr will have all the columns that
+       are being inserted. This WHERE clause could be used to identify the 
+       inserted row after inserting. (like "returning ROWID").
+       INSERT INTO TAB(COL1) VALUES (10) -> WHERE COL1=10
+     - WHERE clause generated for UPDATE will have all the columns in the
+       old column list. However the values of the columns will be that of 
+       new value if it exist in the new column list
+       of the UPDATE. If the column doesnt have new value then the old column
+       value will be used.
+       UPDATE TAB SET COL1 = 10 WHERE COL1 = 20 -> WHERE COL1 = 10
+       UPDATE TAB SET COL2 = 20 WHERE COL1 = 20 -> WHERE COL1 = 20
+     - WHERE clause for DELETE will use the columns and values from 
+       old column lst
+     - LOB piecewise operations would use the new columns and values for
+       generating the WHERE clause.
+*/
+
+sword OCILCRWhereClauseGet(
+     OCISvcCtx  *svchp,
+     OCIError   *errhp,
+     oratext    *wc_stmt,
+     ub4        *wc_stmt_len,
+     void       *row_lcrp,
+     ub4         mode);
+
+/*--------------------- OCILCRRowStmtGet ----------------------------*/
+/*
+   NAME
+       OCILCRRowStmtGet - OCI Get Row Statement 
+   DESCRIPTION
+     Gets the SQL statement for the given ROW LCR.
+   PARAMETERS
+       svchp                      (IN/OUT) - OCI service handle
+       errhp                      (IN/OUT) - Error Handle to which errors
+                                             should be reported
+       row_stmt                   (OUT)    - Sql Statement equivalent to the 
+                                             LCR has applied
+       row_stmt_len               (IN/OUT) - length of row_stmt buffer
+       row_lcrp                   (IN)     - row LCR to be converted to SQL
+       mode                       (IN)     - Mode flags (For future extension. 
+                                             Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+       None
+*/
+sword OCILCRRowStmtGet(
+     OCISvcCtx  *svchp,
+     OCIError   *errhp,
+     oratext    *row_stmt,
+     ub4        *row_stmt_len,
+     void       *row_lcrp,
+     ub4         mode);
+
+/*--------------------- OCILCRWhereClauseWithBindVarGet ----------------------*/
+/*
+   NAME
+       OCILCRWhereClauseWithBindVarGet - OCI Get Where clause with binds
+   DESCRIPTION
+     Gets the where clause statement with bind variables for the given ROW LCR. 
+   PARAMETERS
+       svchp                      (IN/OUT) - OCI service handle
+       errhp                      (IN/OUT) - Error Handle to which errors
+                                             should be reported
+       wc_stmt                    (OUT)    - Sql Stmt equivalent to the LCR
+       wc_stmt_len                (IN/OUT) - length of wc_stmt  buffer
+       num_bind_var               (OUT)    - Number of bind variables
+       bind_var_dtyp              (OUT)    - Array of Data types of bind 
+                                             variables
+       bind_var_valuesp           (OUT)    - Array of Values of bind variables
+       bind_var_indp              (OUT)    - Array of null indicators of 
+                                             bind variables
+       bind_var_alensp            (OUT)    - Array of lengths of bind values
+       bind_var_csetidp           (OUT)    - Array of char set id of binds
+       bind_var_csetfp            (OUT)    - Array of char set form of binds
+       row_lcrp                   (IN)     - row LCR to be converted to SQL
+       array_size                 (IN)     - Size of the array of bind values
+       bind_var_syntax            (IN)     - Native syntax to be used for binds
+       mode                       (IN)     - Mode flags (For future extension. 
+                                             Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+     - For now, specify OCI_DEFAULT for mode
+     - If array_size is not large enough to accommodate the number of columns
+       in the requested column list then OCI_ERROR is returned. Expected 
+       array_size is returned through num_bind_var parameter. 
+     - bind_var_syntax for oracle should contain ":". This will generate 
+       positional binds such as :1, :2, :3 etc. For other non-oracle databases
+       they can give the string that needs to be used for binds. 
+     - WHERE clause generated for INSERT lcr will have all the columns that
+       are being inserted. This WHERE clause could be used to identify the 
+       inserted row after inserting. (like "returning ROWID").
+       INSERT INTO TAB(COL1) VALUES (10) -> WHERE COL1=10
+     - WHERE clause generated for UPDATE will have all the columns in the
+       old column list. However the values of the columns will be that of 
+       new column value of the column if it exist in the new values
+       of the UPDATE. If the column appears only in the old column then
+       old column value will be used.
+       UPDATE TAB SET COL1 = 10 WHERE COL1 = 20 -> WHERE COL1 = 10
+       UPDATE TAB SET COL2 = 20 WHERE COL1 = 20 -> WHERE COL1 = 20
+     - WHERE clause for DELETE will use the columns and values from 
+       old column lst
+     - LOB piecewise operations would use the new columns and values for
+       generating the WHERE clause.
+*/
+sword OCILCRWhereClauseWithBindVarGet(
+     OCISvcCtx *svchp,
+     OCIError  *errhp,
+     oratext   *wc_stmt,
+     ub4       *wc_stmt_len,
+     ub2       *num_bind_var,
+     ub2       *bind_var_dtyp,
+     void     **bind_var_valuesp,
+     OCIInd    *bind_var_indp,
+     ub2       *bind_var_alensp,
+     ub2       *bind_var_csetidp,
+     ub1       *bind_var_csetfp,
+     void      *row_lcrp,
+     ub2        array_size,
+     oratext   *bind_var_syntax,
+     ub4        mode);
+
+/*--------------------- OCILCRRowStmtWithBindVarGet ----------------------*/
+/*
+   NAME
+       OCILCRRowStmtWithBindVarGet - OCI Get Row Statement 
+   DESCRIPTION
+     Gets the SQL statement with bind variables for the given ROW LCR.
+   PARAMETERS
+       svchp                      (IN/OUT) - OCI service handle
+       errhp                      (IN/OUT) - Error Handle to which errors
+                                             should be reported
+       row_stmt                   (OUT)    - Sql Stmt equivalent to the LCR
+       row_stmt_len               (IN/OUT) - length of row_stmt buffer
+       num_bind_var               (OUT)    - Number of bind variables
+       bind_var_dtyp              (OUT)    - Array of Data types of bind 
+                                             variables
+       bind_var_valuesp           (OUT)    - Array of Values of bind variables
+       bind_var_indp              (OUT)    - Array of null indicators of 
+                                             bind variables
+       bind_var_alensp            (OUT)    - Array of lengths od bind values
+       bind_var_csetidp           (OUT)    - Array of char set id of binds
+       bind_var_csetfp            (OUT)    - Array of char set form of binds
+       row_lcrp                   (IN)     - row LCR to be converted to SQL
+       chunk_column_names         (OUT)    - Array of chunked column names in 
+                                             lcr
+       chunk_column_namesl        (OUT)    - Length of chunk_column_names 
+       chunk_column_flags         (OUT)    - flags of chunked columns in lcr
+                                             Possible bit values are 
+                                             OCI_LCR_COLUMN_* flags listed 
+                                             above.
+       array_size                 (IN)     - Size of the array of bind values
+       bind_var_syntax            (IN)     - Native syntax to be used for binds
+       mode                       (IN)     - Mode flags (For future extension. 
+                                             Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+     - For now, specify OCI_DEFAULT for mode
+     - If array_size is not large enough to accommodate the number of columns
+       in the requested column list then OCI_ERROR is returned. Expected 
+       array_size is returned through num_bind_var parameter. 
+     - bind_var_syntax for oracle should contain ":". This will generate 
+       positional binds such as :1, :2, :3 etc. For other non-oracle databases
+       they can give the string that needs to be used for binds. 
+*/
+sword OCILCRRowStmtWithBindVarGet(
+     OCISvcCtx *svchp,
+     OCIError  *errhp,
+     oratext   *row_stmt,
+     ub4       *row_stmt_len,
+     ub2       *num_bind_var,
+     ub2       *bind_var_dtyp,
+     void     **bind_var_valuesp,
+     OCIInd    *bind_var_indp,
+     ub2       *bind_var_alensp,
+     ub2       *bind_var_csetidp,
+     ub1       *bind_var_csetfp,
+     void      *row_lcrp,
+     oratext  **chunk_column_names,
+     ub2       *chunk_column_namesl,
+     oraub8    *chunk_column_flags,
+     ub2        array_size,
+     oratext   *bind_var_syntax,
+     ub4        mode); 
+
+/*
+-------------------------------------------------------------------------------
+  NAME
+    OCILCRSCNsFromPosition - Get SCNs From Position
+                        
+  DESCRIPTION
+    Returns the SCN and commit SCN from the given position. 
+  PARAMETERS
+    svchp          (IN)  -  OCI service context
+    errhp          (IN)  -  OCI Error Handle
+    position       (IN)  -  LCR position
+    position_len   (IN)  -  length of position 
+    scn            (OUT) -  the SCN stored in position
+    commit_scn     (OUT) -  the commit SCN stored in position 
+    mode           (IN)  -  Mode flags (For future extension. Not used 
+                            currently)
+  RETURN
+    OCI_SUCCESS if the conversion succeeds, OCI_ERROR otherwise.
+  NOTE
+    The user must allocate memory for the return numbers.
+    The input position must conform to the format generated by an XStream 
+    server.
+-------------------------------------------------------------------------------
+*/
+sword OCILCRSCNsFromPosition(OCISvcCtx  *svchp,
+                            OCIError   *errhp,
+                            ub1        *position,
+                            ub2         position_len,
+                            OCINumber  *scn, 
+                            OCINumber  *commit_scn,  
+                            ub4         mode); 
+
+/*
+-------------------------------------------------------------------------------
+  NAME
+    OCILCRSCNToPosition - Converts SCN To Position
+
+  DESCRIPTION
+    Converts an SCN to a position. The generated position can be passed as the
+    last_position to OCIXStreamOutAttach function to filter the LCRs
+    with commit SCN less than the given SCN and the LCR's SCN less than the
+    given SCN. This means the first LCR sent by the Outbound server is either
+     - a commit LCR at the given SCN, or 
+     - the first LCR of the subsequent transaction with commit SCN greater 
+       than or equal to the given SCN.
+  PARAMETERS
+    svchp          (IN)  -  OCI service context
+    errhp          (IN)  -  OCI Error Handle
+    position       (OUT) -  Result position. Must pre-allocate 
+                            OCI_LCR_MAX_POSITION_LEN bytes.
+    position_len   (OUT) -  Length of position
+    scn            (IN)  -  The SCN to be stored in position
+    mode           (IN)  -  Mode flags (for future extension)
+  RETURN
+    OCI_SUCCESS if the conversion succeeds, OCI_ERROR otherwise.
+-------------------------------------------------------------------------------
+*/
+sword OCILCRSCNToPosition(OCISvcCtx  *svchp,
+                          OCIError   *errhp,
+                          ub1        *position,
+                          ub2        *position_len,
+                          OCINumber  *scn,
+                          ub4         mode);
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRLobInfoGet - OCI LCR GET LOB INFO
+DESCRIPTION
+  Returns the LOB information for a given piece-wise LOB LCR.
+PARAMETERS
+  svchp          (IN)    - OCI service context
+  errhp          (IN)    - OCI Error Handle
+  column_name    (OUT)   - Pointer to the LOB column name. 
+                           Optional. If specified then column_name_len must
+                           be specified as well.
+  column_name_len(OUT)   - Length of LOB column name without the NULL 
+                           terminator.
+  column_dty     (OUT)   - LOB column dty - either SQLT_CHR (for CLOB) or 
+                           SQLT_BIN (for BLOB).
+  column_flag    (OUT)   - LOB column flag.
+                           Possible bit values are OCI_LCR_COLUMN_* flags 
+                           listed above.
+  offset         (OUT)   - LOB operation offset in code points. Returned only
+                           for LOB_TRIM and LOB_WRITE operations; otherwise,
+                           a zero is returned.
+                           This is the same as the 'soffset' parameter for 
+                           OCILobErase or the 'offset' parameter in 
+                           OCILobWrite functions.
+  size           (OUT)   - LOB operation size in code points. Returned only
+                           for LOB_TRIM and LOB_ERASE operations; otherwise,
+                           a zero is returned.
+                           This is the same as the 'new_length' parameter in 
+                           OCILobTrim or the 'amtp' parameter in OCILobErase 
+                           functions.
+  row_lcrp       (IN)    - Streams Row LCR pointer
+  mode           (IN)    - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRLobInfoGet(OCISvcCtx   *svchp, 
+                       OCIError    *errhp, 
+                       oratext    **column_name,
+                       ub2         *column_name_len,
+                       ub2         *column_dty,
+                       oraub8      *column_flag,
+                       ub4         *offset,
+                       ub4         *size,
+                       void        *row_lcrp,
+                       ub4          mode);
+
+
+/*
+------------------------------------------------------------------------------=
+NAME
+  OCILCRLobInfoSet - OCI LCR SET LOB INFO
+DESCRIPTION
+  Sets the LOB information for a given piece-wise LOB LCR.
+PARAMETERS
+  svchp          (IN)    - OCI service context
+  errhp          (IN)    - OCI Error Handle
+  column_name    (IN)    - Pointer to the LOB column name. 
+  column_name_len(IN)    - Length of LOB column name without the NULL 
+                           terminator.
+  column_dty     (IN)    - LOB column dty - either SQLT_CHR (for CLOB) or 
+                           SQLT_BIN (for BLOB).
+  column_flag    (IN)    - LOB column flag.
+                           Possible bit values are OCI_LCR_COLUMN_* flags 
+                           listed above.
+  offset         (IN)    - LOB operation offset in code points. Returned only
+                           for LOB_TRIM and LOB_WRITE operations; otherwise,
+                           a zero is returned.
+                           This is the same as the 'soffset' parameter for 
+                           OCILobErase or the 'offset' parameter in 
+                           OCILobWrite functions.
+  size           (IN)    - LOB operation size in code points. Returned only
+                           for LOB_TRIM and LOB_ERASE operations; otherwise,
+                           a zero is returned.
+                           This is the same as the 'new_length' parameter in 
+                           OCILobTrim or the 'amtp' parameter in OCILobErase 
+                           functions.
+  row_lcrp       (IN/OUT)- Streams Row LCR pointer
+  mode           (IN)    - mode
+NOTES
+  - For now, specify OCI_DEFAULT for mode
+------------------------------------------------------------------------------=
+*/
+sword OCILCRLobInfoSet(OCISvcCtx   *svchp, 
+                       OCIError    *errhp, 
+                       oratext     *column_name,
+                       ub2          column_name_len,
+                       ub2          column_dty,
+                       oraub8       column_flag,
+                       ub4          offset,
+                       ub4          size,
+                       void        *row_lcrp,
+                       ub4          mode);
+
+/*---------------------------------------------------------------------------
+                        STREAMS XSTREAM OUT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------------- OCIXStreamOutAttach -----------------------------*/
+/*
+   NAME
+       OCIXStreamOutAttach - OCI Attach to XStreams Out
+   DESCRIPTION
+       Given the name of the server process, attach to the outbound server.
+   PARAMETERS
+       svchp                  (IN/OUT) - OCI service handle
+       errhp                  (IN/OUT) - Error Handle for error reporting
+       server_name                (IN) - Server name.
+       server_name_len            (IN) - Length of server name.
+       last_position              (IN) - last rcv position. (Optional)
+       last_position_len          (IN) - Length of last_position.
+       mode                       (IN) - Mode flags (see below) 
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+       Specify OCI_DEFAULT for the mode parameter.
+
+       The name of the outbound server must be provided because multiple 
+       outbound servers can be configured in one Oracle instance. This call 
+       returns OCI_ERROR if it encounters any error while attaching to the 
+       outbound server.
+       
+       The last_position parameter is used to establish the starting point 
+       of the stream. This call returns OCI_ERROR if the specified position 
+       is non-null and less than the server's processed low-watermark; 
+       otherwise, LCRs with position greater than last_position will be
+       sent to the user.
+
+       If last_position is null then the stream will start from the processed 
+       low-watermark maintained in the server.
+*/
+
+sword OCIXStreamOutAttach (OCISvcCtx *svchp, OCIError *errhp, 
+                           oratext *server_name, ub2 server_name_len, 
+                           ub1 *last_position, 
+                           ub2  last_position_len, 
+                           ub4  mode);  
+
+/* Valid modes for OCIXStreamOutAttach call */
+#define OCIXSTREAM_OUT_ATTACH_RESERVED_1              (0x00000001) 
+/* Application is in charge of freeing the LCRs from the outbound server */ 
+#define OCIXSTREAM_OUT_ATTACH_APP_FREE_LCR            (0x00000002) 
+
+/*---------------------- OCIXStreamOutProcessedLWMSet ----------------------*/
+/*
+   NAME
+       OCIXStreamOutProcessedLWMSet - Set Processed Low-Watermark
+   DESCRIPTION
+       Sets the processed low-watermark maintained at the client.
+   PARAMETERS
+       svchp                  (IN/OUT) - OCI service handle
+       errhp                  (IN/OUT) - Error Handle for error reporting
+       processed_low_position     (IN) - processed low position.
+       processed_low_position_len (IN) - processed low position length.
+       mode                       (IN) - mode for future extension. (Not used 
+                                         currently).
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+
+   NOTES
+       The processed low-watermark denotes all LCRs at or below this position
+       have been processed. After successfully attaching to an XStream 
+       outbound server, a local copy of the processed low-watermark is 
+       maintained at the client. Periodically, this watermark is sent to the 
+       server so that archived logs containing already processed transactions 
+       can be purged. 
+
+       The following API is used to update the local copy of the processed 
+       low-watermark. It can be called anytime between OCIXStreamOutAttach 
+       and OCIXStreamOutDetach calls. Clients, using the callback mechanism 
+       to stream LCRs from the server, can invoke this API while 
+       in the callback functions.
+*/
+
+sword OCIXStreamOutProcessedLWMSet (OCISvcCtx *svchp, OCIError *errhp, 
+                                    ub1 *processed_low_position, 
+                                    ub2  processed_low_position_len, 
+                                    ub4  mode);  
+
+
+/*-------------------- OCICallbackXStreamOutLCRProcess ----------------------*/
+/*
+   NAME
+       OCICallbackXStreamOutLCRProcess - Callback to process each LCR received 
+   DESCRIPTION
+       This callback is invoked during OCIXStreamOutLCRCallbackReceive
+       to process each LCR received from the outbound server.
+   PARAMETERS
+       usrctxp                (IN/OUT) - Ptr to the user context.
+       lcrp                       (IN) - Pointer to the LCR just received.
+       lcrtyp                     (IN) - LCR type (OCI_LCR_XROW / OCI_LCR_XDDL)
+       flag                       (IN) - If OCI_XSTREAM_MORE_ROW_DATA is set,
+                                         this means the current LCR has more
+                                         chunk data.
+   RETURNS
+    This callback function must return OCI_CONTINUE to continue processing
+    OCIXStreamOutLCRCallbackReceive call.  Any return code other than 
+    OCI_CONTINUE signals that the client wants to terminate 
+    OCIXStreamOutLCRCallbackReceive immediately.
+*/
+typedef sb4 (*OCICallbackXStreamOutLCRProcess) (void *usrctxp, void *lcrp,
+                                                ub1 lcrtyp, oraub8 flag);
+
+
+/*-------------------- OCICallbackXStreamOutChunkProcess --------------------*/
+/*
+   NAME
+       OCICallbackXStreamOutChunkProcess - Callback to process each chunk 
+   DESCRIPTION
+       This callback is invoked during OCIXStreamOutLCRCallbackReceive
+       to process each chunk in an LCR.
+   PARAMETERS
+       usrctxp     (IN/OUT) - Ptr to the user context.
+       column_name     (IN) - Column name for the current chunk.
+       column_name_len (IN) - Length of column name.
+       column_dty      (IN) - Chunk data type (SQLT_CHR or SQLT_BIN).
+       column_flag     (IN) - LCR column flags. Possible bit values are
+                              OCI_LCR_COLUMN_* flags listed above.
+       column_csid     (IN) - Column character set id. Relevant only if 
+                              the column is an XMLType column (i.e., 
+                              column_flag has OCI_LCR_COLUMN_XML_DATA bit set).
+       chunk_bytes     (IN) - Chunk data length in bytes.
+       chunk_data      (IN) - Chunk data buffer.
+       flag            (IN) - If OCI_XSTREAM_MORE_ROW_DATA is set, this means
+                              the current LCR has more chunks.
+   RETURNS
+    This callback function must return OCI_CONTINUE to continue processing
+    OCIXStreamOutLCRCallbackReceive call.  Any return code other than 
+    OCI_CONTINUE signals that the client wants to terminate 
+    OCIXStreamOutLCRCallbackReceive immediately.
+*/
+typedef sb4 (*OCICallbackXStreamOutChunkProcess)
+                  (void  *usrctxp, oratext *column_name, ub2 column_name_len,
+                   ub2 column_dty, oraub8 column_flag, ub2 column_csid,
+                   ub4 chunk_bytes, ub1 *chunk_data, oraub8 flag);
+
+/*-------------------- OCIXStreamOutLCRCallbackReceive ----------------------*/
+/*
+   NAME
+       OCIXStreamOutLCRCallbackReceive - OCI Receive LCR stream using Callbacks
+   DESCRIPTION
+       This API is used to get the LCR stream from the outbound server using 
+       callbacks to gain better performance. The user must supply a callback 
+       function to be invoked for each LCR received. If some row changes 
+       in the stream may contain LOB/LONG/XMLType columns then the data for
+       those columns are returned to the user in chunks. To receive those row
+       changes, the user must provide a second callback to be invoked to
+       process each chunk data.
+
+       If there is an LCR available in the stream, the processlcr_cb function 
+       is invoked immediately. After the processlcr_cb function exits, if the 
+       current LCR contains additional chunks then the processchunk_cb function
+       is invoked for each chunk belonging to that LCR.  
+
+       If there is no LCR in the stream when the idle timeout expires (see
+       OCI_ATTR_XSTREAM_IDLE_TIMEOUT), this call returns a null LCR with 
+       OCI_SUCCESS code.
+   PARAMETERS
+       svchp                  (IN/OUT) - OCI service handle
+       errhp                  (IN/OUT) - Error Handle for error reporting
+       processlcr_cb              (IN) - Client callback function for each LCR.
+       processchunk_cb            (IN) - Client callback function for each 
+                                         chunk.
+       usrctxp                    (IN) - Client context. (Optional)
+       fetch_low_position         (OUT)- Fetch low watermark. (Optional)
+       fetch_low_position_len     (OUT)- Fetch low watermark length.
+       mode                       (IN) - mode for future extension. (Not used 
+                                         currently).
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+      - The fetch low watermark is used to indicate all transactions
+        with commit position below this have been received by the XStream
+        outbound server.
+
+      - If the LCR contains non-chunked column(s), the duration of that LCR is
+        limited to the processlcr_cb function. If the LCR contains some 
+        chunk data then the duration of the LCR is extended until all the 
+        chunks have been processed (that is, when the flag passing to
+        processchunk_cb function does not have OCI_XSTREAM_MORE_ROW_DATA flag
+        set). If the user wants to access the LCR data at a later time, a 
+        copy of the LCR must be made.  The client callback should not modify 
+        or free the LCR passing to the callback. 
+
+        If the OCIXSTREAM_OUT_ATTACH_APP_FREE_LCR mode is passed to 
+        OCIXStreamOutAttach call then the application is in charge of calling
+        OCILCRFree to free each LCR. Note, this mode does not apply to the 
+        chunk data associated with each LCR. Each chunk data is freed 
+        immediately after each OCIXStreamOutChunkReceive call.
+        
+      - The given usrctxp is passed to both callbacks.
+
+      - An ACK interval is the interval in seconds which the outbound
+        server receives the processed LWM or the inbound server sends 
+        the processed LWM.  The default ACK interval is 30 seconds. This 
+        value can be changed by setting the OCI_ATTR_XSTREAM_ACK_INTERVAL 
+        attribute using OCIAttrSet API.  This attribute is checked only 
+        during the Attach call; thus, it must be set before invoking this API. 
+
+      - The idle timeout is the interval in seconds after which the current 
+        call will terminate if there is no LCR in the stream. The default 
+        idle timeout is one second. This value can be changed by setting the 
+        OCI_ATTR_XSTREAM_IDLE_TIMEOUT attribute using OCIAttrSet API.  This 
+        attribute is checked only during the Attach call; thus, it must be 
+        set before invoking this API. 
+
+      - The outbound server ends each call at the transaction boundary 
+        after an ACK interval has elapsed since the start of the call
+        or when the idle timeout expires. This API returns the fetch 
+        low watermark at the end of each call. 
+*/
+sword OCIXStreamOutLCRCallbackReceive(
+  OCISvcCtx *svchp, OCIError *errhp, 
+  OCICallbackXStreamOutLCRProcess processlcr_cb,
+  OCICallbackXStreamOutChunkProcess processchunk_cb, void *usrctxp, 
+  ub1 *fetch_low_position, ub2 *fetch_low_position_len, ub4 mode);
+
+/*---------------------- OCIXStreamOutLCRReceive -------------------------*/
+/*
+   NAME
+       OCIXStreamOutLCRReceive - Receive LCR without using callback 
+   DESCRIPTION
+       This API is used to receive an LCR from an outbound stream. If there 
+       is an LCR available, this API immediately returns that LCR. 
+       When there is no LCR available in the stream, this call returns a 
+       null LCR after the idle timeout (see OCI_ATTR_XSTREAM_IDLE_TIMEOUT)
+       has expired.
+
+       The client must not modify the LCR received from the outbound server.
+       The duration of each LCR is until the next OCIXStreamOutLCRReceive call.
+       If the OCIXSTREAM_OUT_ATTACH_APP_FREE_LCR mode is passed to 
+       OCIXStreamOutAttach call then the application is in charge of calling
+       OCILCRFree to free each LCR. Note, this mode does not apply to the 
+       chunk data associated with each LCR. Each chunk data is freed 
+       immediately after each OCIXStreamOutChunkReceive call.
+
+       To avoid network round trip for every OCIXStreamOutLCRReceive call, 
+       the connection is tied to this call to let the server fill up 
+       the network buffer with LCRs so subsequent calls can quickly receive 
+       the LCRs from the network. The server ends each call at the 
+       transaction boundary after an ACK interval has elapsed since the start
+       of the call or when the idle timeout expires. See 
+       OCI_ATTR_XSTREAM_ACK_INTERVAL & OCI_ATTR_XSTREAM_IDLE_TIMEOUT
+       attributes.
+   PARAMETERS
+       svchp                  (IN/OUT) - OCI service handle
+       errhp                  (IN/OUT) - Error Handle for error reporting
+       lcrp                      (OUT) - Pointer to the LCR received from the
+                                         stream. 
+       lcrtype                   (OUT) - LCR type (OCI_LCR_XROW / OCI_LCR_XDDL)
+       flag                      (OUT) - If OCI_XSTREAM_MORE_ROW_DATA is set, 
+                                         it means the current LCR has more 
+                                         chunk data.
+       fetch_low_position         (OUT)- Fetch low watermark. (Optional)
+       fetch_low_position_len     (OUT)- Fetch low watermark length.
+       mode                       (IN) - mode for future extension. (Not used 
+                                         currently).
+   RETURNS
+     -  OCI_STILL_EXECUTING means the current call is still in progress. The 
+        connection associated with the specified service context handle is 
+        still tied to this call for streaming the LCRs from the server. An 
+        error is returned if the user attempts to use the same connection to 
+        execute any OCI calls that require database round trip, for example, 
+        OCIStmtExecute, OCIStmtFetch, OCILobRead, etc. OCILcr* calls are 
+        local calls; thus, they are valid while the stream is in progress.
+     -  OCI_SUCCESS means the current call is completed. User is free to 
+        execute OCIStmt*, OCILob*, etc. from the same service context.
+     -  OCI_ERROR means the current call encounters some errors. Use 
+        OCIErrorGet to obtain information about the error.
+
+   NOTES
+     This call always returns a null LCR when the return code is OCI_SUCCESS. 
+     In addition, it returns the fetch low position to denote the outbound 
+     server has received all transactions with commit position lower than or 
+     equal to this value.
+
+     The fetch low watermark is used to indicate all transactions
+     with commit position below this have been received by the XStream
+     outbound server.
+*/
+
+sword OCIXStreamOutLCRReceive(
+  OCISvcCtx *svchp, OCIError *errhp, 
+  void     **lcrp,
+  ub1       *lcrtype,
+  oraub8    *flag,
+  ub1       *fetch_low_position,
+  ub2       *fetch_low_position_len,
+  ub4        mode);
+
+/*-------------------------- OCIXStreamOutChunkReceive ---------------------*/
+/*
+   NAME
+       OCIXStreamOutChunkReceive - Receive Chunk data
+   DESCRIPTION
+       Receives next chunk of LCR data from XStream Outbound server.
+       This API can only be called while OCIXStreamOutLCRReceive call is
+       in progress.
+   PARAMETERS
+       svchp        (IN/OUT) - OCI service handle
+       errhp        (IN/OUT) - Error Handle to which errors should be reported
+       column_name     (OUT) - Name of column for which data is retrieved.
+       column_name_len (OUT) - Length of column name.
+       column_dty      (OUT) - LCR column data type.
+       column_flag     (OUT) - LCR column flag. Possible bit values are
+                                OCI_LCR_COLUMN_LOB_DATA     
+                                OCI_LCR_COLUMN_LONG_DATA   
+                                OCI_LCR_COLUMN_EMPTY_LOB  
+                                OCI_LCR_COLUMN_LAST_CHUNK
+                                OCI_LCR_COLUMN_AL16UTF16
+                                OCI_LCR_COLUMN_ENCRYPTED   
+                                OCI_LCR_COLUMN_NCLOB      
+                                OCI_LCR_COLUMN_XML_DATA  
+                                OCI_LCR_COLUMN_XML_DIFF 
+       column_csid     (OUT) - Column character set id. This is returned only
+                               if the column is an XMLType column (i.e., 
+                               column_flag has OCI_LCR_COLUMN_XML_DATA bit 
+                               set).
+       chunk_bytes     (OUT) - Number of bytes in output buffer.
+       chunk_data      (OUT) - Pointer to the chunk data in the LCR. 
+                               Client must not de-allocate this pointer.
+       flag            (OUT) - If OCI_XSTREAM_MORE_ROW_DATA is set, it means
+                               the current LCR has more data coming.
+       mode             (IN) - mode for future extension. (Not used currently).
+   RETURNS
+       OCI_SUCCESS - Check colname_len and chunk_bytes to determine the 
+                     data just read.
+       OCI_ERROR   - Error encountered. Execute OCIErrorGet to get information
+                     about the error.
+   NOTES
+      - If the return code is OCI_SUCCESS, client should check chunk_bytes to 
+        determine the # of bytes read and check column_name to determine 
+        which LCR column the data associated with.
+
+      - All the chunks from one LOB/LONG/XMLType column are returned entirely 
+        before the chunk value for the next LOB/LONG/XMLType column is 
+        returned.
+
+      - The is no fixed ordering on how the LOB/LONG/XMLType columns is 
+        returned. Users must check the column name to determine which column. 
+        The column_flag will have OCI_LCR_COLUMN_LAST_CHUNK bit set when this 
+        function returns the last chunk of each column.
+
+      - This call returns a null column name and null chunk data if it's 
+        invoked when the current LCR contains only non-chunked columns.
+
+      - If OCIXStreamOutLCRReceive call returns OCI_XSTREAM_MORE_ROW_DATA flag 
+        then the user must iteratively call OCIXStreamOutChunkReceive to 
+        retrieve all the chunks belonging to the current row change before
+        calling the next OCIXStreamOutLCRReceive.
+
+*/
+sword OCIXStreamOutChunkReceive(OCISvcCtx *svchp, OCIError *errhp, 
+                                oratext **column_name, ub2 *column_name_len, 
+                                ub2 *column_dty, oraub8 *column_flag, 
+                                ub2 *column_csid, ub4 *chunk_bytes, 
+                                ub1 **chunk_data, oraub8 *flag, ub4 mode);
+
+/*------------------------- OCIXStreamOutDetach -----------------------------*/
+/*
+   NAME
+       OCIXStreamOutDetach - OCI Detach from XStream Out
+   DESCRIPTION
+      Detaches from the attached XStream outbound server. This call sends the 
+      current local processed low-watermark to the server before detaching 
+      from the outbound server. The outbound server automatically restarts 
+      after this call. This API returns OCI_ERROR if it is invoked while a 
+      ReceiveLCR call is in progress.
+   PARAMETERS
+       svchp    (IN/OUT) - OCI service handle
+       errhp    (IN/OUT) - Error Handle to which errors should be reported
+       mode     (IN)     - mode for future extension. (Not used currently).
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+      - The processed_low_position is passed to the server so it can update its
+        copy.  This value if provided must be greater than or equal to the
+        value maintained in the server; otherwise, an error is returned.
+*/
+sword OCIXStreamOutDetach (OCISvcCtx *svchp, OCIError *errhp, ub4 mode);
+
+/*---------------------------------------------------------------------------
+                        STREAMS XSTREAM IN FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------------ OCIXStreamInAttach -------------------------------*/
+/*
+   NAME
+       OCIXStreamInAttach - OCI XStream In Attach
+   DESCRIPTION
+       Attaches to the specified XStream inbound server.
+   PARAMETERS
+       svchp                 (IN/OUT) - OCI service handle
+       errhp                 (IN/OUT) - Error Handle to which errors
+                                        should be reported
+       server_name               (IN) - XStream inbound server name.
+       server_name_len           (IN) - Length of server name.
+       source_name               (IN) - source name to identify the data src.
+       source_name_len           (IN) - Length of source name.
+       last_position            (OUT) - Last position received by inbound
+                                        server. Optional. If specified must 
+                                        pre-allocate OCI_LCR_MAX_POSITION_LEN 
+                                        bytes for return value.
+       last_position_len        (OUT) - Length of last_position. Must be 
+                                        non-NULL if last_position is non-NULL.
+       mode                      (IN) - Mode flags (For future extension. 
+                                        (Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+       The last_position parameter is returned to establish the starting point 
+       to resume the inbound stream. The client should start sending LCRs with 
+       positions greater than the last_position since the inbound server will
+       ignore all LCRs with positions less than or equal to this value. 
+*/
+
+sword OCIXStreamInAttach(
+      OCISvcCtx *svchp,
+      OCIError  *errhp,
+      oratext   *server_name,
+      ub2        server_name_len,
+      oratext   *source_name,
+      ub2        source_name_len,
+      ub1       *last_position, 
+      ub2       *last_position_len, 
+      ub4        mode);
+
+/*--------- Valid modes for OCIXStreamInAttach -------------*/
+/* Restart inbound server regardless if it's in DISABLED or ABORTED state. */
+#define OCIXSTREAM_IN_ATTACH_RESTART_INBOUND          (0x00000001)
+
+/*-------------------- OCICallbackXStreamInLCRCreate ------------------------*/
+/*
+   NAME
+       OCICallbackXStreamInLCRCreate - Callback to create an LCR 
+   DESCRIPTION
+       This callback is invoked during OCIXStreamInLCRCallbackSend
+       to create each LCR to be sent to the inbound server.
+   PARAMETERS
+       usrctxp                (IN/OUT) - Ptr to the user context
+       lcrp                      (OUT) - Pointer to the LCR to be sent
+       lcrtyp                    (OUT) - LCR type (OCI_LCR_XROW / OCI_LCR_XDDL)
+       flag                      (OUT) - If OCI_XSTREAM_MORE_ROW_DATA is set,
+                                         this means the current LCR has more
+                                         chunk data.
+   RETURNS
+    This callback function must return OCI_CONTINUE to continue processing
+    OCIXStreamInLCRCallbackSend call.  Any return code other than 
+    OCI_CONTINUE signals that the client wants to terminate 
+    OCIXStreamInLCRCallbackSend immediately.
+*/
+typedef sb4  (*OCICallbackXStreamInLCRCreate)(
+               void   *usrctxp,
+               void  **lcrp,  
+               ub1    *lcrtyp,  
+               oraub8 *flag);
+
+/*-------------------- OCICallbackXStreamInChunkCreate --------------------*/
+/*
+   NAME
+       OCICallbackXStreamInChunkCreate - Callback to create each chunk 
+   DESCRIPTION
+       This callback is invoked during OCIXStreamInLCRCallbackSend
+       to create each chunk to be sent to the inbound server.
+   PARAMETERS
+       usrctxp      (IN/OUT) - Ptr to the user context.
+       column_name     (OUT) - Column name for the current chunk.
+       column_name_len (OUT) - Length of column name.
+       column_dty      (OUT) - Chunk data type (SQLT_CHR or SQLT_BIN).
+       column_flag     (OUT) - LCR column flags. Possible bit values are
+                               OCI_LCR_COLUMN_* flags listed above.
+       column_csid     (OUT) - Column character set id. Relevant only if 
+                               the column is an XMLType column (i.e., 
+                               column_flag has OCI_LCR_COLUMN_XML_DATA bit 
+                               set).
+       chunk_bytes     (OUT) - Chunk data length in bytes.
+       chunk_data      (OUT) - Chunk data buffer.
+       flag            (OUT) - If OCI_XSTREAM_MORE_ROW_DATA is set, this means
+                               the current LCR has more chunks.
+   RETURNS
+    This callback function must return OCI_CONTINUE to continue processing
+    OCIXStreamInLCRCallbackSend call.  Any return code other than 
+    OCI_CONTINUE signals that the client wants to terminate 
+    OCIXStreamInLCRCallbackSend immediately.
+*/
+typedef sb4  (*OCICallbackXStreamInChunkCreate)(
+               void      *usrctxp,
+               oratext  **column_name, 
+               ub2       *column_name_len, 
+               ub2       *column_dty, 
+               oraub8    *column_flag,
+               ub2       *column_csid,
+               ub4       *chunk_bytes, 
+               ub1      **chunk_data, 
+               oraub8    *flag);
+
+/*--------------------- OCIXStreamInLCRCallbackSend ------------------------*/
+/*
+   NAME
+       OCIXStreamInLCRCallbackSend - OCI XStream In Send LCR to Inbound Server
+   DESCRIPTION
+       Sends LCR stream to XStream inbound server using callbacks.
+       The API invokes createlcr_cb function to obtain each LCR to send to the 
+       server. If the return flag from the createlcr_cb function has 
+       OCI_XSTREAM_MORE_ROW_DATA bit set, then it invokes createchunk_cb 
+       procedure to obtain each chunk. It repeatedly calls createchunk_cb 
+       function while the flag returned from this callback has 
+       OCI_XSTREAM_MORE_ROW_DATA bit set. When this bit is not set, this API 
+       cycles back to invoke createlcr_cb function to get the next LCR. 
+       This cycle is repeated until the createlcr_cb function returns a null 
+       LCR or when an ACK interval has elapsed since the start of the call.
+       See OCI_ATTR_XSTREAM_ACK_INTERVAL attribute.
+   PARAMETERS
+       svchp                 (IN/OUT) - OCI service handle
+       errhp                 (IN/OUT) - Error Handle to which errors
+                                        should be reported
+       createlcr_cb              (IN) - Callback function to be invoked
+                                        to generate an LCR for streaming. 
+                                        Cannot be null.
+       createchunk_cb            (IN) - Callback function to be invoked to 
+                                        create each chunk. Can be null if the 
+                                        user does not need to send any LCR with
+                                        LOB/LONG/XMLType columns. OCI_ERROR 
+                                        will be returned if this argument is 
+                                        null and the user attempts to send an 
+                                        LCR with additional chunk data.
+       usrctxp                   (IN) - Client context to pass to both
+                                        callback functions.
+       mode                      (IN) - Mode flags (For future extension. 
+                                        Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+       None
+*/
+
+sword OCIXStreamInLCRCallbackSend(
+       OCISvcCtx                              *svchp,
+       OCIError                               *errhp,
+       OCICallbackXStreamInLCRCreate           createlcr_cb,
+       OCICallbackXStreamInChunkCreate         createchunk_cb,
+       void                                   *userctxp,
+       ub4                                     mode);
+
+/*---------------------------- OCIXStreamInLCRSend --------------------------*/
+/*
+   NAME
+       OCIXStreamInLCRSend - OCI XStream In Send LCR to Inbound Server
+   DESCRIPTION
+       Sends LCR stream to XStream inbound server without using callbacks.
+       To avoid a network round trip for every OCIXStreamInLCRSend call,    
+       the connection is tied to this call for at least the duration 
+       specified by the OCI_ATTR_XSTREAM_ACK_INTERVAL attribute.
+   PARAMETERS
+       svchp                 (IN/OUT) - OCI service handle
+       errhp                 (IN/OUT) - Error Handle to which errors
+                                        should be reported
+       lcrp                      (IN) - Pointer to the LCR to send. Cannot
+                                        be null.
+       lcrtype                   (IN) - LCR type (OCI_LCR_XROW / OCI_LCR_XDDL)
+       flag                      (IN) - If OCI_XSTREAM_MORE_ROW_DATA is set,
+                                        it means the current LCR has more
+                                        chunk data.
+       mode                      (IN) - Mode flags (For future extension. 
+                                        Not used currently)
+   RETURNS
+     -  OCI_STILL_EXECUTING means the current call is still in progress. The 
+        connection associated with the specified service context handle is 
+        still tied to this call for streaming the LCRs to the server. An error 
+        is returned if the user attempts to use the same connection to 
+        execute any OCI calls that require database round trip, for example, 
+        OCIStmtExecute, OCIStmtFetch, OCILobRead, etc. OCILcr* calls are 
+        local calls; thus, they are valid while this call is in progress.
+     -  OCI_SUCCESS means the current call is completed. User is free to 
+        execute OCIStmt*, OCILob*, etc. from the same service context.
+     -  OCI_ERROR means this call encounters some errors. Use OCIErrorGet to 
+        obtain information about the error.
+*/
+sword OCIXStreamInLCRSend(
+       OCISvcCtx     *svchp,
+       OCIError      *errhp,
+       void          *lcrp,
+       ub1            lcrtype,
+       oraub8         flag,
+       ub4            mode);
+
+/*----------------------------- OCIXStreamInChunkSend -----------------------*/
+/*
+   NAME
+       OCIXStreamInChunkSend - Send Chunk
+   DESCRIPTION
+       Sends the given chunk of column data to XStream Inbound server.
+       This chunk is associated with the LCR that is sent by the 
+       most recent OCIXStreamInLCRSend call prior to this call.
+   PARAMETERS
+       svchp       (IN/OUT) - OCI service handle
+       errhp       (IN/OUT) - Error Handle to which errors should be reported
+       column_name     (IN) - Name of column for which data is sent.
+                              Column names must be canonicalized and must 
+                              follow Oracle naming conventions.
+       column_name_len (IN) - Length of column name.
+       column_dty      (IN) - LCR column data type (must be SQLT_CHR or 
+                              SQLT_BIN).
+       column_flag     (IN) - LCR column flags. Possible bit values are
+                                OCI_LCR_COLUMN_LOB_DATA
+                                OCI_LCR_COLUMN_LONG_DATA
+                                OCI_LCR_COLUMN_EMPTY_LOB
+                                OCI_LCR_COLUMN_LAST_CHUNK
+                                OCI_LCR_COLUMN_AL16UTF16
+                                OCI_LCR_COLUMN_ENCRYPTED
+                                OCI_LCR_COLUMN_NCLOB
+                                OCI_LCR_COLUMN_XML_DATA
+                                OCI_LCR_COLUMN_XML_DIFF
+       column_csid     (IN) - Column character set id. This is required only
+                              if the column is an XMLType column (i.e., 
+                              column_flag has OCI_LCR_COLUMN_XML_DATA bit set).
+       chunk_bytes     (IN) - Chunk data length in bytes.
+       chunk_data      (IN) - Chunk data buffer.
+       flag            (IN) - If OCI_XSTREAM_MORE_ROW_DATA is set, it means
+                              the current LCR has more data coming.
+       mode            (IN) - mode for future extension. (Not used currently).
+RETURNS
+   OCI_SUCCESS - Successful call.
+   OCI_ERROR   - Error encountered. Execute OCIErrorGet to get information
+                 about the error.
+NOTES
+ - This function must be called while OCIXStreamInLCRSend is in progress.
+   
+ - This function is valid only if the associated LCR's cmd type is
+   INSERT, UPDATE or LOB_WRITE. It can be invoked multiple times for the
+   same LCR. 
+
+ - This API is not valid for LOB_ERASE and LOB_TRIM LCRs.
+
+ - The chunk values for different columns can not be interleaved. If a 
+   column contains multiple chunks, this procedure must be called 
+   consecutively using the same column name before proceeding to a new column. 
+   The ordering in which the LOB/LONG/XMLType column values are set is 
+   irrelevant. 
+
+ - The OCI_LCR_COLUMN_LAST_CHUNK must be specified for the last chunk of
+   each column. 
+
+ - Only one column can be specified for LOB_WRITE operation.
+
+ - For NCLOB or varying width CLOB, the input buffer must be in 
+   AL16UTF16 format.
+
+ - For INSERT operation, each LOB/LONG/XMLType column, with value set using 
+   OCIXStreamInChunkSend, must be included in the current LCR's NEW 
+   column list. The value of that LOB/LONG/XMLType column must be set to 
+   null and must have OCI_LCR_COLUMN_EMPTY_LOB flag defined.
+ 
+*/
+sword OCIXStreamInChunkSend (OCISvcCtx *svchp, OCIError *errhp,
+                             oratext  *column_name, ub2 column_name_len, 
+                             ub2 column_dty, oraub8 column_flag,
+                             ub2 column_csid, ub4 chunk_bytes, 
+                             ub1 *chunk_data, oraub8 flag, ub4 mode);
+
+/*--------------------- OCIXStreamInDetach ----------------------------*/
+/*
+   NAME
+       OCIXStreamInDetach - OCI XStream In Detach from Inbound Server
+   DESCRIPTION
+       Detaches from XStream inbound server and returns the inbound server's 
+       processed low-watermark.
+   PARAMETERS
+       svchp                 (IN/OUT) - OCI service handle
+       errhp                 (IN/OUT) - Error Handle to which errors
+                                        should be reported
+       processed_low_position   (OUT) - Inbound server's processed low
+                                        position. Must pre-allocate 
+                                        OCI_LCR_MAX_POSITION_LEN bytes for
+                                        output buffer.
+       processed_low_position_len(OUT)- Processed_low_position length.
+       mode                      (IN) - Mode flags (For future extension. 
+                                        Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+       None
+*/
+sword OCIXStreamInDetach(
+       OCISvcCtx *svchp, 
+       OCIError  *errhp,
+       ub1       *processed_low_position,
+       ub2       *processed_low_position_len,
+       ub4        mode);
+
+/*--------- Valid modes for OCIXStreamInDetach -------------*/
+/* Restart inbound server when calling detach. */
+#define OCIXSTREAM_IN_DETACH_RESTART_INBOUND          (0x00000001)
+
+/*--------------------- OCIXStreamInProcessedLWMGet -------------------------*/
+/*
+   NAME
+     OCIXStreamInProcessedLWMGet - OCI XStream In Get LowWatermark 
+   DESCRIPTION
+     Returns XStream inbound server's processed low watermark 
+     cached at the client.
+   PARAMETERS
+     svchp                      (IN/OUT) - OCI service handle
+     errhp                      (IN/OUT) - Error Handle to which errors
+                                           should be reported
+     processed_low_position        (OUT) - Inbound server's cached processed
+                                           low position. Must pre-
+                                           allocate OCI_LCR_MAX_POSITION_LEN 
+                                           bytes for output buffer.
+     processed_low_position_len    (OUT) - Processed_low_position length.
+     mode                           (IN) - Mode flags (For future extension.
+                                           Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+       None
+*/
+sword OCIXStreamInProcessedLWMGet(
+       OCISvcCtx *svchp,
+       OCIError  *errhp,
+       ub1       *processed_low_position,
+       ub2       *processed_low_position_len,
+       ub4        mode);
+
+/*-------------------------- OCIXStreamInFlush ------------------------------*/
+/*
+   NAME
+     OCIXStreamInFlush - OCI XStream In Flush network
+   DESCRIPTION
+     Flushes network and terminates any in-progress OCIXStreamInLCRSend or
+     OCIXStreamInLCRCallbackSend call associated with the given service handle.
+   PARAMETERS
+     svchp                      (IN/OUT) - OCI service handle
+     errhp                      (IN/OUT) - Error Handle to which errors
+                                           should be reported
+     mode                           (IN) - Mode flags (see below)
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+   NOTES
+     Each call will incur a database round trip to get the server's processed 
+     low-watermark, which the user can retrieve afterward using 
+     OCIXStreamInProcessedLWMGet API. This API should be called only when 
+     there is no LCR to send to the server and the client wants to know the 
+     progress of the attached inbound server.
+
+     This call returns OCI_ERROR if it is invoked from the callback functions
+     of OCIXStreamInLCRCallbackSend API.
+
+     Client must have attached to an XStream inbound server prior to calling
+     this API. 
+
+  Valid Mode flags:
+  - OCIXSTREAM_IN_FLUSH_WAIT_FOR_COMPLETE :  flush network and wait for all
+    complete and rollback transactions sent to the inbound server to complete
+    before returning control to the client.
+      
+*/
+sword OCIXStreamInFlush(
+       OCISvcCtx *svchp,
+       OCIError  *errhp,
+       ub4        mode);
+
+
+/*-------------------------- OCIXStreamInCommit -----------------------------*/
+/*
+   NAME
+       OCIXStreamInCommit - OCI XStream In Commit 
+   DESCRIPTION
+       Commits current transaction
+   PARAMETERS
+       svchp                      (IN/OUT) - OCI service handle
+       errhp                      (IN/OUT) - Error Handle to which errors
+                                             should be reported
+       lcrp                           (IN) - Pointer to the LCR to send. Must
+                                             be a commit LCR.
+       mode                           (IN) - Mode flags (For future extension.
+                                             Not used currently)
+   RETURNS
+       OCI_SUCCESS or OCI_ERROR.
+   NOTES
+       The position of the input LCR must be higher than
+       DBA_XSTREAM_INBOUND_PROGRESS.APPLIED_HIGH_POSITION and the LCR's source
+       database must match DBA_APPLY_PROGRESS.SOURCE_DATABASE of the attached
+       inbound server.
+
+       Upon receiving this LCR, the inbound server will check if there is any
+       unapplied complete or rollback transaction remaining. If none is found
+       it inserts a row to the apply progress table based on the input LCR and
+       commit the current transaction; otherwise, it returns an error.
+
+       If there is any pre-commit handler defined, it will be executed when
+       this commit LCR is executed.
+*/
+sword OCIXStreamInCommit(
+  OCISvcCtx *svchp,
+  OCIError  *errhp,
+  void      *lcrp,
+  ub4        mode);
+
+/*-------------------------- OCIXStreamInErrorGet ---------------------------*/
+/*
+   NAME
+     OCIXStreamInErrorGet - OCI XStream In Get Error Info
+   DESCRIPTION
+     Returns the first error encountered by the inbound server since the 
+     Attach call.
+   PARAMETERS
+     svchp                      (IN/OUT) - OCI service handle
+     errhp                      (IN/OUT) - Error Handle
+     errcodep                   (OUT)    - Error code
+     msgbuf                     (IN/OUT) - Pre-allocated message buffer
+     msg_bufsize                (IN)     - Message buffer size
+     msg_len                    (OUT)    - Length of returned error message
+     txn_id                     (IN/OUT) - Pre-allocated txn id buffer
+     txn_id_bufsize             (IN)     - Txn_id buffer size
+     txn_id_len                 (OUT)    - Length of returned txn id
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+   NOTES
+     The maximum size for the returned txn id is OCI_LCR_MAX_TXID_LEN. If the 
+     allocated buffer for txn_id is too small, this routine returns ORA-29258.
+     The maximum size for the returned error msg is OCI_ERROR_MAXMSG_SIZE. If
+     the allocated size for msgbuf is too small, the returned message will be
+     truncated.
+*/
+sword OCIXStreamInErrorGet(
+       OCISvcCtx *svchp,
+       OCIError  *errhp,
+       sb4       *errcodep,   
+       oratext   *msgbuf,    
+       ub2        msg_bufsize,
+       ub2       *msg_len,
+       oratext   *txn_id,
+       ub2        txn_id_bufsize, 
+       ub2       *txn_id_len);
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif                                                  /* OCIXSTREAM_ORACLE */
diff --git a/sdk/include/odci.h b/sdk/include/odci.h
new file mode 100644
index 0000000..c65cfad
--- /dev/null
+++ b/sdk/include/odci.h
@@ -0,0 +1,801 @@
+/*
+ * 
+ */
+
+/* Copyright (c) 1998, 2010, Oracle and/or its affiliates. 
+All rights reserved. */
+ 
+/* 
+   NAME 
+     odci.h - Oracle Data Cartridge Interface definitions
+
+   DESCRIPTION 
+     This file contains Oracle Data Cartridge Interface definitions. These
+     include the ODCI Types and Constants.
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     None.
+
+   PRIVATE FUNCTION(S)
+     None.
+
+   EXAMPLES
+
+   NOTES
+     - The constants defined here are replica of the constants defined 
+       in ODCIConst Package defined as part of catodci.sql. If you change
+       these do make the similar change in catodci.sql.
+
+   MODIFIED   (MM/DD/YY)
+   yhu         02/03/10 - add a new flag ODCI_INDEX_UGI
+   spsundar    09/13/07 - 
+   yhu         06/02/06 - add callproperty for statistics 
+   yhu         05/22/06 - add ODCI_NODATA to speed rebuild empty index or ind. 
+                          part. 
+   srirkris    05/09/06 - change ODCIOrderByInfo_ind
+   srirkris    02/06/06 - add definitions for CDI query.
+   spsundar    02/17/06 - add fields/types for system managed domain idx
+   yhu         02/08/06 - add RenameCol Na d RenameTopADT 
+   yhu         03/11/05 - add flags for rename column and rename table 
+   spsundar    11/28/05 - add fields/types for composite domain idx
+   yhu         12/06/05 - mapping table for local text indexes 
+   dmukhin     06/29/05 - ANSI prototypes; miscellaneous cleanup 
+   ayoaz       04/21/03 - add CursorNum to ODCIEnv
+   abrumm      12/30/02 - Bug #2223225: add define for
+                          ODCI_ARG_DESC_LIST_MAXSIZE
+   ayoaz       10/14/02 - Add Cardinality to ODCIArgDesc
+   ayoaz       09/11/02 - add ODCIQueryInfo to ODCIIndexCtx
+   yhu         09/19/02 - add ODCI_DEBUGGING_ON for ODCIEnv.EnvFlags
+   hsbedi      10/10/02 - add object number into ODCIExtTableInfo
+   ayoaz       08/30/02 - add ODCITable2 types
+   tchorma     07/29/02 - Add ODCIFuncCallInfo type for WITH COLUMN CONTEXT
+   hsbedi      06/29/02 - External table populate
+   yhu         07/20/01 - add parallel degree in ODCIIndexInfo.
+   abrumm      02/20/01 - ODCIExtTableInfo: add AccessParmBlob attribute
+   abrumm      01/18/01 - ODCIExtTableInfo: add default directory
+   spsundar    08/24/00 - Update attrbiute positions
+   abrumm      08/04/00 - external tables changes: ODCIExtTableInfo, constants
+   tchorma     09/11/00 - Add return code ODCI_FATAL
+   tchorma     08/08/00 - Add Update Block References Option for Alter Index
+   ayoaz       08/01/00 - Add ODCI_AGGREGATE_REUSE_CTX
+   spsundar    06/19/00 - add ODCIEnv type
+   abrumm      06/27/00 - add defines for ODCIExtTable flags
+   abrumm      06/04/00 - external tables: ODCIExtTableInfo change; add ODCIEnv
+   ddas        04/28/00 - extensible optimizer enhancements for 8.2
+   yhu         06/05/00 - add a bit in IndexInfoFlags for trans. tblspc
+   yhu         04/10/00 - add ODCIPartInfo & remove ODCIIndexPartList
+   abrumm      03/29/00 - external table support
+   spsundar    02/14/00 - update odci definitions for 8.2
+   nagarwal    03/07/99 - bug# 838308 - set estimate_stats=1
+   rmurthy     11/09/98 - add blocking flag
+   ddas        10/31/98 - add ODCI_QUERY_SORT_ASC and ODCI_QUERY_SORT_DESC
+   ddas        05/26/98 - fix ODCIPredInfo flag bits
+   rmurthy     06/03/98 - add macro for RegularCall
+   spsundar    05/08/98 - add constants related to ODCIIndexAlter options
+   rmurthy     04/30/98 - remove include s.h
+   rmurthy     04/20/98 - name fixes
+   rmurthy     04/13/98 - add C mappings for odci types
+   alsrivas    04/10/98 - adding defines for ODCI_INDEX1
+   jsriniva    04/04/98 - Creation
+
+*/
+
+#ifndef OCI_ORACLE
+# include <oci.h>
+#endif
+#ifndef ODCI_ORACLE
+# define ODCI_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* The following are short names that are only supported on IBM mainframes
+ *   with the SLSHORTNAME defined.
+ * With this all subsequent long names will actually be substituted with
+ *  the short names here
+ */
+
+#define ODCIColInfo_ref             odcicir
+#define ODCIColInfoList             odcicil
+#define ODCIColInfoList2            odcicil2
+#define ODCIIndexInfo_ref           odciiir
+#define ODCIPredInfo_ref            odcipir
+#define ODCIRidList                 odcirl
+#define ODCIIndexCtx_ref            odciicr
+#define ODCIObject_ref              odcior
+#define ODCIObjectList              odciol
+#define ODCIQueryInfo_ref           odciqir
+#define ODCIFuncInfo_ref            odcifir
+#define ODCICost_ref                odcicr
+#define ODCIArgDesc_ref             odciadr
+#define ODCIArgDescList             odciadl
+#define ODCIStatsOptions_ref        odcisor
+#define ODCIColInfo                 odcici
+#define ODCIColInfo_ind             odcicii
+#define ODCIIndexInfo               odciii
+#define ODCIIndexInfo_ind           odciiii
+#define ODCIPredInfo                odcipi
+#define ODCIPredInfo_ind            odcipii
+#define ODCIIndexCtx                odciic
+#define ODCIIndexCtx_ind            odciici
+#define ODCIObject                  odcio
+#define ODCIObject_ind              odcioi
+#define ODCIQueryInfo               odciqi
+#define ODCIQueryInfo_ind           odciqii
+#define ODCIFuncInfo                odcifi
+#define ODCIFuncInfo_infd           odcifii
+#define ODCICost                    odcic
+#define ODCICost_ind                odcici
+#define ODCIArgDesc                 odciad
+#define ODCIArgDesc_ind             odciadi
+#define ODCIStatsOptions            odciso
+#define ODCIStatsOptions_ind        odcisoi
+#define ODCIPartInfo                odcipti
+#define ODCIPartInfo_ind            odciptii
+#define ODCIPartInfo_ref            odciptir
+#define ODCIExtTableInfo            odcixt
+#define ODCIExtTableInfo_ind        odcixti
+#define ODCIExtTableInfo_ref        odcixtr
+#define ODCIExtTableQCInfo          odcixq
+#define ODCIExtTableQCInfo_ind      odcixqi
+#define ODCIExtTableQCInfo_ref      odcixqr
+#define ODCIFuncCallInfo            odcifc
+#define ODCIFuncCall_ind            odcifci
+#define ODCIFuncCall_ref            odcifcr
+#define ODCIColValList              odcicvl
+#define ODCIColArrayList            odcical
+#define ODCIFilterInfoList          odciflil
+#define ODCIOrderByInfoList         odciobil
+#define ODCIFilterInfo_ref          odciflir
+#define ODCIOrderByInfo_ref         odciobir
+#define ODCICompQueryInfo_ref       odcicqir
+#define ODCIFilterInfo              odcifli
+#define ODCIOrderByInfo             odciobi
+#define ODCICompQueryInfo           odcicqi
+#define ODCIFilterInfo_ind          odciflii
+#define ODCIOrderByInfo_ind         odciobii
+#define ODCICompQueryInfo_ind       odcicqii
+
+#endif                                                        /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/* Constants for Return Status */
+#define ODCI_SUCCESS             0
+#define ODCI_ERROR               1
+#define ODCI_WARNING             2
+#define ODCI_ERROR_CONTINUE      3
+#define ODCI_FATAL               4
+
+/* Constants for ODCIPredInfo.Flags */
+#define ODCI_PRED_EXACT_MATCH    0x0001
+#define ODCI_PRED_PREFIX_MATCH   0x0002
+#define ODCI_PRED_INCLUDE_START  0x0004
+#define ODCI_PRED_INCLUDE_STOP   0x0008
+#define ODCI_PRED_OBJECT_FUNC    0x0010
+#define ODCI_PRED_OBJECT_PKG     0x0020
+#define ODCI_PRED_OBJECT_TYPE    0x0040
+#define ODCI_PRED_MULTI_TABLE    0x0080
+#define ODCI_PRED_NOT_EQUAL      0x0100
+
+/* Constants for QueryInfo.Flags */
+#define ODCI_QUERY_FIRST_ROWS    0x01
+#define ODCI_QUERY_ALL_ROWS      0x02
+#define ODCI_QUERY_SORT_ASC      0x04
+#define ODCI_QUERY_SORT_DESC     0x08
+#define ODCI_QUERY_BLOCKING      0x10
+
+/* Constants for ScnFlg(Func /w Index Context) */
+#define ODCI_CLEANUP_CALL        1
+#define ODCI_REGULAR_CALL        2
+
+/* Constants for ODCIFuncInfo.Flags */
+#define ODCI_OBJECT_FUNC         0x01
+#define ODCI_OBJECT_PKG          0x02
+#define ODCI_OBJECT_TYPE         0x04
+
+/* Constants for ODCIArgDesc.ArgType */
+#define ODCI_ARG_OTHER           1
+#define ODCI_ARG_COL             2                                 /* column */
+#define ODCI_ARG_LIT             3                                /* literal */
+#define ODCI_ARG_ATTR            4                       /* object attribute */
+#define ODCI_ARG_NULL            5
+#define ODCI_ARG_CURSOR          6
+
+/* Maximum size of ODCIArgDescList array */
+#define ODCI_ARG_DESC_LIST_MAXSIZE 32767
+
+/* Constants for ODCIStatsOptions.Options */
+#define ODCI_PERCENT_OPTION      1
+#define ODCI_ROW_OPTION          2
+
+/* Constants for ODCIStatsOptions.Flags */
+#define ODCI_ESTIMATE_STATS     0x01
+#define ODCI_COMPUTE_STATS      0x02
+#define ODCI_VALIDATE           0x04
+
+/* Constants for ODCIIndexAlter parameter alter_option */
+#define ODCI_ALTIDX_NONE               0
+#define ODCI_ALTIDX_RENAME             1
+#define ODCI_ALTIDX_REBUILD            2
+#define ODCI_ALTIDX_REBUILD_ONL        3
+#define ODCI_ALTIDX_MODIFY_COL         4
+#define ODCI_ALTIDX_UPDATE_BLOCK_REFS  5
+#define ODCI_ALTIDX_RENAME_COL         6
+#define ODCI_ALTIDX_RENAME_TAB         7
+#define ODCI_ALTIDX_MIGRATE            8
+
+/* Constants for ODCIIndexInfo.IndexInfoFlags */
+#define ODCI_INDEX_LOCAL         0x0001
+#define ODCI_INDEX_RANGE_PARTN   0x0002
+#define ODCI_INDEX_HASH_PARTN    0x0004
+#define ODCI_INDEX_ONLINE        0x0008
+#define ODCI_INDEX_PARALLEL      0x0010
+#define ODCI_INDEX_UNUSABLE      0x0020
+#define ODCI_INDEX_ONIOT         0x0040
+#define ODCI_INDEX_TRANS_TBLSPC  0x0080
+#define ODCI_INDEX_FUNCTION_IDX  0x0100
+#define ODCI_INDEX_LIST_PARTN    0x0200
+#define ODCI_INDEX_UGI           0x0400
+
+/* Constants for ODCIIndexInfo.IndexParaDegree */
+#define ODCI_INDEX_DEFAULT_DEGREE 32767
+
+/* Constants for ODCIEnv.EnvFlags */
+#define ODCI_DEBUGGING_ON        0x01
+#define ODCI_NODATA              0x02
+
+/* Constants for ODCIEnv.CallProperty */
+#define ODCI_CALL_NONE           0
+#define ODCI_CALL_FIRST          1
+#define ODCI_CALL_INTERMEDIATE   2
+#define ODCI_CALL_FINAL          3
+#define ODCI_CALL_REBUILD_INDEX  4
+#define ODCI_CALL_REBUILD_PMO    5
+#define ODCI_CALL_STATSGLOBAL    6
+#define ODCI_CALL_STATSGLOBALANDPARTITION    7
+#define ODCI_CALL_STATSPARTITION             8
+
+/* Constants for ODCIExtTableInfo.OpCode */
+#define ODCI_EXTTABLE_INFO_OPCODE_FETCH           1
+#define ODCI_EXTTABLE_INFO_OPCODE_POPULATE        2
+
+/* Constants (bit definitions) for ODCIExtTableInfo.Flag */
+    /* sampling type: row or block */
+#define ODCI_EXTTABLE_INFO_FLAG_SAMPLE           0x00000001
+#define ODCI_EXTTABLE_INFO_FLAG_SAMPLE_BLOCK     0x00000002
+    /* AccessParmClob, AccessParmBlob discriminator */
+#define ODCI_EXTTABLE_INFO_FLAG_ACCESS_PARM_CLOB 0x00000004
+#define ODCI_EXTTABLE_INFO_FLAG_ACCESS_PARM_BLOB 0x00000008
+
+/* Constants for ODCIExtTableInfo.IntraSourceConcurrency */
+#define ODCI_TRUE  1
+#define ODCI_FALSE 0
+
+/* Constants (bit definitions) for ODCIExtTable{Open,Fetch,Populate,Close}
+ * Flag argument.
+ */
+#define ODCI_EXTTABLE_OPEN_FLAGS_QC     0x00000001  /* caller is Query Coord */
+#define ODCI_EXTTABLE_OPEN_FLAGS_SHADOW 0x00000002  /* caller is shadow proc */
+#define ODCI_EXTTABLE_OPEN_FLAGS_SLAVE  0x00000004  /* caller is slave  proc */
+
+#define ODCI_EXTTABLE_FETCH_FLAGS_EOS   0x00000001 /* end-of-stream on fetch */
+
+/* Constants for Flags argument to ODCIAggregateTerminate */
+#define ODCI_AGGREGATE_REUSE_CTX  1
+
+/* Constants for ODCIColInfo.Flags */
+#define ODCI_COMP_FILTERBY_COL     0x0001
+#define ODCI_COMP_ORDERBY_COL      0x0002
+#define ODCI_COMP_ORDERDSC_COL     0x0004
+#define ODCI_COMP_UPDATED_COL      0x0008
+#define ODCI_COMP_RENAMED_COL      0x0010
+#define ODCI_COMP_RENAMED_TOPADT   0x0020
+
+/* Constants for ODCIOrderByInfo.ExprType */
+#define ODCI_COLUMN_EXPR   1
+#define ODCI_ANCOP_EXPR    2
+
+/* Constants for ODCIOrderByInfo.SortOrder */
+#define ODCI_SORT_ASC    1
+#define ODCI_SORT_DESC   2
+#define ODCI_NULLS_FIRST 4
+
+/* Constants for ODCIPartInfo.PartOp */
+#define  ODCI_ADD_PARTITION   1
+#define  ODCI_DROP_PARTITION  2
+
+/*---------------------------------------------------------------------------
+                     ODCI TYPES
+  ---------------------------------------------------------------------------*/
+/*
+ * These are C mappings for the OTS types defined in catodci.sql
+ */
+
+typedef OCIRef   ODCIColInfo_ref;
+typedef OCIArray ODCIColInfoList;
+typedef OCIArray ODCIColInfoList2;
+typedef OCIRef   ODCIIndexInfo_ref;
+typedef OCIRef   ODCIPredInfo_ref;
+typedef OCIArray ODCIRidList;
+typedef OCIRef   ODCIIndexCtx_ref;
+typedef OCIRef   ODCIObject_ref;
+typedef OCIArray ODCIObjectList;
+typedef OCIRef   ODCIQueryInfo_ref;
+typedef OCIRef   ODCIFuncInfo_ref;
+typedef OCIRef   ODCICost_ref;
+typedef OCIRef   ODCIArgDesc_ref;
+typedef OCIArray ODCIArgDescList;
+typedef OCIRef   ODCIStatsOptions_ref;
+typedef OCIRef   ODCIPartInfo_ref;
+typedef OCIRef   ODCIEnv_ref;
+typedef OCIRef   ODCIExtTableInfo_ref;             /* external table support */
+typedef OCIArray ODCIGranuleList;                  /* external table support */
+typedef OCIRef   ODCIExtTableQCInfo_ref;           /* external table support */
+typedef OCIRef   ODCIFuncCallInfo_ref;
+typedef OCIArray ODCINumberList;
+typedef OCIArray ODCIPartInfoList;
+typedef OCIArray ODCIColValList;
+typedef OCIArray ODCIColArrayList;
+typedef OCIArray ODCIFilterInfoList;
+typedef OCIArray ODCIOrderByInfoList;
+typedef OCIRef   ODCIFilterInfo_ref;
+typedef OCIRef   ODCIOrderByInfo_ref;
+typedef OCIRef   ODCICompQueryInfo_ref;
+ 
+struct ODCIColInfo
+{
+   OCIString* TableSchema;
+   OCIString* TableName;
+   OCIString* ColName;
+   OCIString* ColTypName;
+   OCIString* ColTypSchema;
+   OCIString* TablePartition;
+   OCINumber  ColFlags;
+   OCINumber  ColOrderPos;
+   OCINumber  TablePartitionIden;
+   OCINumber  TablePartitionTotal;
+};
+typedef struct ODCIColInfo ODCIColInfo;
+ 
+struct ODCIColInfo_ind
+{
+   OCIInd atomic;
+   OCIInd TableSchema;
+   OCIInd TableName;
+   OCIInd ColName;
+   OCIInd ColTypName;
+   OCIInd ColTypSchema;
+   OCIInd TablePartition;
+   OCIInd ColFlags;
+   OCIInd ColOrderPos;
+   OCIInd TablePartitionIden;
+   OCIInd TablePartitionTotal;
+};
+typedef struct ODCIColInfo_ind ODCIColInfo_ind;
+
+struct ODCIFuncCallInfo
+{
+   struct ODCIColInfo ColInfo;
+};
+
+struct ODCIFuncCallInfo_ind
+{
+  struct ODCIColInfo_ind ColInfo;
+};
+ 
+struct ODCIIndexInfo
+{
+   OCIString*       IndexSchema;
+   OCIString*       IndexName;
+   ODCIColInfoList* IndexCols;
+   OCIString*       IndexPartition;
+   OCINumber        IndexInfoFlags;
+   OCINumber        IndexParaDegree;
+   OCINumber        IndexPartitionIden;
+   OCINumber        IndexPartitionTotal;
+};
+typedef struct ODCIIndexInfo ODCIIndexInfo;
+ 
+struct ODCIIndexInfo_ind
+{
+   OCIInd atomic;
+   OCIInd IndexSchema;
+   OCIInd IndexName;
+   OCIInd IndexCols;
+   OCIInd IndexPartition;
+   OCIInd IndexInfoFlags;
+   OCIInd IndexParaDegree;
+   OCIInd IndexPartitionIden;
+   OCIInd IndexPartitionTotal;
+};
+typedef struct ODCIIndexInfo_ind ODCIIndexInfo_ind;
+ 
+struct ODCIPredInfo
+{
+   OCIString* ObjectSchema;
+   OCIString* ObjectName;
+   OCIString* MethodName;
+   OCINumber  Flags;
+};
+typedef struct ODCIPredInfo ODCIPredInfo;
+ 
+struct ODCIPredInfo_ind
+{
+   OCIInd atomic;
+   OCIInd ObjectSchema;
+   OCIInd ObjectName;
+   OCIInd MethodName;
+   OCIInd Flags;
+};
+typedef struct ODCIPredInfo_ind ODCIPredInfo_ind;
+
+struct ODCIFilterInfo
+{
+  ODCIColInfo ColInfo;
+  OCINumber Flags;
+  OCIAnyData *strt;
+  OCIAnyData *stop;
+};
+typedef struct ODCIFilterInfo ODCIFilterInfo;
+
+struct ODCIFilterInfo_ind
+{
+  OCIInd atomic;
+  ODCIColInfo_ind ColInfo;
+  OCIInd  Flags;
+  OCIInd  strt;
+  OCIInd  stop;
+};
+typedef struct ODCIFilterInfo_ind ODCIFilterInfo_ind;
+
+
+struct ODCIOrderByInfo
+{
+  OCINumber ExprType;
+  OCIString *ObjectSchema;
+  OCIString *TableName;
+  OCIString *ExprName;
+  OCINumber SortOrder;
+};
+typedef struct ODCIOrderByInfo ODCIOrderByInfo;
+
+struct ODCIOrderByInfo_ind
+{
+  OCIInd atomic;
+  OCIInd ExprType;
+  OCIInd ObjectSchema;
+  OCIInd TableName;
+  OCIInd ExprName;
+  OCIInd SortOrder;
+};
+typedef struct ODCIOrderByInfo_ind ODCIOrderByInfo_ind;
+
+
+struct ODCICompQueryInfo
+{
+  ODCIFilterInfoList  *PredInfo;
+  ODCIOrderByInfoList *ObyInfo;
+};
+typedef struct ODCICompQueryInfo ODCICompQueryInfo;
+
+struct ODCICompQueryInfo_ind
+{
+  OCIInd atomic;
+  OCIInd PredInfo;
+  OCIInd ObyInfo;
+};
+typedef struct ODCICompQueryInfo_ind ODCICompQueryInfo_ind;
+
+ 
+struct ODCIObject
+{
+   OCIString* ObjectSchema;
+   OCIString* ObjectName;
+};
+typedef struct ODCIObject ODCIObject;
+ 
+struct ODCIObject_ind
+{
+   OCIInd atomic;
+   OCIInd ObjectSchema;
+   OCIInd ObjectName;
+};
+typedef struct ODCIObject_ind ODCIObject_ind;
+ 
+struct ODCIQueryInfo
+{
+   OCINumber       Flags;
+   ODCIObjectList* AncOps;
+   ODCICompQueryInfo CompInfo;
+};
+typedef struct ODCIQueryInfo ODCIQueryInfo;
+
+ 
+struct ODCIQueryInfo_ind
+{
+   OCIInd atomic;
+   OCIInd Flags;
+   OCIInd AncOps;
+   ODCICompQueryInfo_ind CompInfo;
+};
+typedef struct ODCIQueryInfo_ind ODCIQueryInfo_ind;
+ 
+struct ODCIIndexCtx
+{
+   struct ODCIIndexInfo IndexInfo;
+   OCIString*           Rid;
+   struct ODCIQueryInfo QueryInfo;
+};
+typedef struct ODCIIndexCtx ODCIIndexCtx;
+ 
+struct ODCIIndexCtx_ind
+{
+   OCIInd                   atomic;
+   struct ODCIIndexInfo_ind IndexInfo;
+   OCIInd                   Rid;
+   struct ODCIQueryInfo_ind QueryInfo;
+};
+typedef struct ODCIIndexCtx_ind ODCIIndexCtx_ind;
+ 
+struct ODCIFuncInfo
+{
+   OCIString* ObjectSchema;
+   OCIString* ObjectName;
+   OCIString* MethodName;
+   OCINumber Flags;
+};
+typedef struct ODCIFuncInfo ODCIFuncInfo;
+ 
+struct ODCIFuncInfo_ind
+{
+   OCIInd atomic;
+   OCIInd ObjectSchema;
+   OCIInd ObjectName;
+   OCIInd MethodName;
+   OCIInd Flags;
+};
+typedef struct ODCIFuncInfo_ind ODCIFuncInfo_ind;
+ 
+struct ODCICost
+{
+   OCINumber  CPUcost;
+   OCINumber  IOcost;
+   OCINumber  NetworkCost;
+   OCIString* IndexCostInfo;
+};
+typedef struct ODCICost ODCICost;
+ 
+struct ODCICost_ind
+{
+   OCIInd atomic;
+   OCIInd CPUcost;
+   OCIInd IOcost;
+   OCIInd NetworkCost;
+   OCIInd IndexCostInfo;
+};
+typedef struct ODCICost_ind ODCICost_ind;
+ 
+struct ODCIArgDesc
+{
+   OCINumber  ArgType;
+   OCIString* TableName;
+   OCIString* TableSchema;
+   OCIString* ColName;
+   OCIString* TablePartitionLower;
+   OCIString* TablePartitionUpper;
+   OCINumber  Cardinality;
+};
+typedef struct ODCIArgDesc ODCIArgDesc;
+ 
+struct ODCIArgDesc_ind
+{
+   OCIInd atomic;
+   OCIInd ArgType;
+   OCIInd TableName;
+   OCIInd TableSchema;
+   OCIInd ColName;
+   OCIInd TablePartitionLower;
+   OCIInd TablePartitionUpper;
+   OCIInd Cardinality;
+};
+typedef struct ODCIArgDesc_ind ODCIArgDesc_ind;
+ 
+struct ODCIStatsOptions
+{
+   OCINumber Sample;
+   OCINumber Options;
+   OCINumber Flags;
+};
+typedef struct ODCIStatsOptions ODCIStatsOptions;
+ 
+struct ODCIStatsOptions_ind
+{
+   OCIInd atomic;
+   OCIInd Sample;
+   OCIInd Options;
+   OCIInd Flags;
+};
+typedef struct ODCIStatsOptions_ind ODCIStatsOptions_ind;
+
+struct ODCIEnv
+{
+   OCINumber EnvFlags;
+   OCINumber CallProperty;
+   OCINumber DebugLevel;
+   OCINumber CursorNum;
+};
+typedef struct ODCIEnv ODCIEnv;
+
+struct ODCIEnv_ind
+{
+   OCIInd _atomic;
+   OCIInd EnvFlags;
+   OCIInd CallProperty;
+   OCIInd DebugLevel;
+   OCIInd CursorNum;
+};
+typedef struct ODCIEnv_ind ODCIEnv_ind;
+ 
+struct ODCIPartInfo
+{
+   OCIString* TablePartition;
+   OCIString* IndexPartition;
+   OCINumber  IndexPartitionIden;
+   OCINumber  PartOp;
+};
+typedef struct ODCIPartInfo ODCIPartInfo;
+ 
+struct ODCIPartInfo_ind
+{
+   OCIInd atomic;
+   OCIInd TablePartition;
+   OCIInd IndexPartition;
+   OCIInd IndexPartitionIden;
+   OCIInd PartOp;
+};
+typedef struct ODCIPartInfo_ind ODCIPartInfo_ind;
+
+/*---------- External Tables ----------*/
+struct ODCIExtTableInfo
+{
+   OCIString*       TableSchema;
+   OCIString*       TableName;
+   ODCIColInfoList* RefCols;
+   OCIClobLocator*  AccessParmClob;
+   OCIBlobLocator*  AccessParmBlob;
+   ODCIArgDescList* Locations;
+   ODCIArgDescList* Directories;
+   OCIString*       DefaultDirectory;
+   OCIString*       DriverType;
+   OCINumber        OpCode;
+   OCINumber        AgentNum;
+   OCINumber        GranuleSize;
+   OCINumber        Flag;
+   OCINumber        SamplePercent;
+   OCINumber        MaxDoP;
+   OCIRaw*          SharedBuf;
+   OCIString*       MTableName;
+   OCIString*       MTableSchema;
+   OCINumber        TableObjNo;
+};
+typedef struct ODCIExtTableInfo ODCIExtTableInfo;
+
+struct ODCIExtTableInfo_ind
+{
+   OCIInd _atomic;
+   OCIInd TableSchema;
+   OCIInd TableName;
+   OCIInd RefCols;
+   OCIInd AccessParmClob;
+   OCIInd AccessParmBlob;
+   OCIInd Locations;
+   OCIInd Directories;
+   OCIInd DefaultDirectory;
+   OCIInd DriverType;
+   OCIInd OpCode;
+   OCIInd AgentNum;
+   OCIInd GranuleSize;
+   OCIInd Flag;
+   OCIInd SamplePercent;
+   OCIInd MaxDoP;
+   OCIInd SharedBuf;
+   OCIInd MTableName;
+   OCIInd MTableSchema;
+   OCIInd TableObjNo;
+};
+typedef struct ODCIExtTableInfo_ind ODCIExtTableInfo_ind;
+
+struct ODCIExtTableQCInfo
+{
+   OCINumber        NumGranules;
+   OCINumber        NumLocations;
+   ODCIGranuleList* GranuleInfo;
+   OCINumber        IntraSourceConcurrency;
+   OCINumber        MaxDoP;
+   OCIRaw*          SharedBuf;
+};
+typedef struct ODCIExtTableQCInfo ODCIExtTableQCInfo;
+
+struct ODCIExtTableQCInfo_ind
+{
+   OCIInd _atomic;
+   OCIInd NumGranules;
+   OCIInd NumLocations;
+   OCIInd GranuleInfo;
+   OCIInd IntraSourceConcurrency;
+   OCIInd MaxDoP;
+   OCIInd SharedBuf;
+};
+typedef struct ODCIExtTableQCInfo_ind ODCIExtTableQCInfo_ind;
+
+/*********************************************************/
+/* Table Function Info types (used by ODCITablePrepare)  */
+/*********************************************************/
+
+struct ODCITabFuncInfo
+{
+  ODCINumberList*  Attrs;
+  OCIType*         RetType;
+};
+typedef struct ODCITabFuncInfo ODCITabFuncInfo;
+
+struct ODCITabFuncInfo_ind
+{
+  OCIInd _atomic;
+  OCIInd Attrs;
+  OCIInd RetType;
+};
+typedef struct ODCITabFuncInfo_ind ODCITabFuncInfo_ind;
+
+/*********************************************************************/
+/* Table Function Statistics types (used by ODCIStatsTableFunction)  */
+/*********************************************************************/
+
+struct ODCITabFuncStats
+{
+  OCINumber num_rows;
+};
+typedef struct ODCITabFuncStats ODCITabFuncStats;
+
+struct ODCITabFuncStats_ind
+{
+  OCIInd _atomic;
+  OCIInd num_rows;
+};
+typedef struct ODCITabFuncStats_ind ODCITabFuncStats_ind;
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#endif                                              /* ODCI_ORACLE */
diff --git a/sdk/include/oraca.h b/sdk/include/oraca.h
new file mode 100755
index 0000000..5f49c94
--- /dev/null
+++ b/sdk/include/oraca.h
@@ -0,0 +1,156 @@
+/*
+ * $Header: oraca.h 24-apr-2003.12:50:59 mkandarp Exp $ oraca.h 
+ */
+
+/* Copyright (c) 1985, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/*
+NAME
+  ORACA : Oracle Communications Area.
+FUNCTION
+  Contains no code. Provides supplementary communications to/from
+  Oracle (in addition to standard SQLCA).
+NOTES
+  **************************************************************
+  ***                                                        ***
+  *** This file is SOSD.  Porters must change the data types ***
+  *** appropriately on their platform.  See notes/pcport.doc ***
+  *** for more information.                                  ***
+  ***                                                        ***
+  **************************************************************
+
+  oracchf : Check cursor cache consistency flag. If set AND oradbgf
+            is set, then directs SQLLIB to perform cursor cache
+            consistency checks before every cursor operation
+            (OPEN, FETCH, SELECT, INSERT, etc.).
+  oradbgf : Master DEBUG flag. Used to turn all DEBUG options
+            on or off.
+  orahchf : Check Heap consistency flag. If set AND oradbgf is set,
+            then directs SQLLIB to perform heap consistency checks
+            everytime memory is dynamically allocated/free'd via
+            sqlalc/sqlfre/sqlrlc. MUST BE SET BEFORE 1ST CONNECT
+            and once set cannot be cleared (subsequent requests
+            to change it are ignored).
+  orastxtf: Save SQL stmt text flag. If set, then directs SQLLIB
+            to save the text of the current SQL stmt in orastxt
+            (in VARCHAR format).
+  orastxt : Saved len and text of current SQL stmt (in VARCHAR
+            format).
+  orasfnm : Saved len and text of filename containing current SQL
+            stmt (in VARCHAR format).
+  oraslnr : Saved line nr within orasfnm of current SQL stmt.
+ 
+  Cursor cache statistics. Set after COMMIT or ROLLBACK. Each
+  CONNECT'd DATABASE has its own set of statistics.
+ 
+  orahoc  : Highest Max Open OraCursors requested. Highest value
+            for MAXOPENCURSORS by any CONNECT to this DATABASE.
+  oramoc  : Max Open OraCursors required. Specifies the max nr
+            of OraCursors required to run this pgm. Can be higher
+            than orahoc if working set (MAXOPENCURSORS) was set
+            too low, thus forcing the PCC to expand the cache.
+  oracoc  : Current nr of OraCursors used.
+  oranor  : Nr of OraCursor cache reassignments. Can show the
+            degree of "thrashing" in the cache. Optimally, this
+            nr should be kept as low as possible (time vs space
+            optimization).
+  oranpr  : Nr of SQL stmt "parses".
+  oranex  : Nr of SQL stmt "executes". Optimally, the relation-
+            ship of oranex to oranpr should be kept as high as
+            possible.
+ 
+ 
+  If the symbol ORACA_NONE is defined, then there will be no ORACA
+  *variable*, although there will still be a struct defined.  This
+  macro should not normally be defined in application code.
+
+  If the symbol ORACA_INIT is defined, then the ORACA will be
+  statically initialized. Although this is not necessary in order
+  to use the ORACA, it is a good pgming practice not to have
+  unitialized variables. However, some C compilers/OS's don't
+  allow automatic variables to be init'd in this manner. Therefore,
+  if you are INCLUDE'ing the ORACA in a place where it would be
+  an automatic AND your C compiler/OS doesn't allow this style
+  of initialization, then ORACA_INIT should be left undefined --
+  all others can define ORACA_INIT if they wish.
+ 
+OWNER
+  Clare
+DATE
+  10/19/85
+MODIFIED
+    apopat     05/08/02  - [2362423] MVS PE to make lines shorter than 79
+    apopat     07/31/99 -  [707588] TAB to blanks for OCCS
+    lvbcheng   10/27/98 -  change long to int for oraca
+    pccint     10/03/96 -  Add IS_OSD for linting
+    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file
+    losborne   09/04/92 -  Make oraca variable optional 
+    Osborne    05/24/90 - Add ORACA_STORAGE_CLASS construct
+  Clare      02/20/86 - PCC [10101l] Feature: Heap consistency check.
+  Clare      03/04/86 - PCC [10101r] Port: ORACA init ifdef.
+  Clare      03/12/86 - PCC [10101ab] Feature: ORACA cuc statistics.
+*/
+/* IS_OSD */ 
+#ifndef  ORACA
+#define  ORACA     1
+ 
+struct   oraca
+         {
+    /* text */ char oracaid[8];      /* Reserved                            */
+    /* ub4  */ int oracabc;          /* Reserved                            */
+ 
+    /*       Flags which are setable by User. */
+ 
+   /* ub4 */ int  oracchf;           /* <> 0 if "check cur cache consistncy"*/
+   /* ub4 */ int  oradbgf;           /* <> 0 if "do DEBUG mode checking"    */
+   /* ub4 */ int  orahchf;           /* <> 0 if "do Heap consistency check" */
+   /* ub4 */ int  orastxtf;          /* SQL stmt text flag                  */
+#define  ORASTFNON 0                 /* = don't save text of SQL stmt       */
+#define  ORASTFERR 1                 /* = only save on SQLERROR             */
+#define  ORASTFWRN 2                 /* = only save on SQLWARNING/SQLERROR  */
+#define  ORASTFANY 3                 /* = always save                       */
+         struct
+           {
+  /* ub2  */ unsigned short orastxtl;
+  /* text */ char  orastxtc[70];
+           } orastxt;                /* text of last SQL stmt               */
+         struct
+           {
+  /* ub2  */   unsigned short orasfnml;
+  /* text */   char       orasfnmc[70];
+           } orasfnm;                /* name of file containing SQL stmt    */
+  /* ub4 */ int   oraslnr;           /* line nr-within-file of SQL stmt     */
+
+  /* ub4 */ int   orahoc;            /* highest max open OraCurs requested  */
+  /* ub4 */ int   oramoc;            /* max open OraCursors required        */
+  /* ub4 */ int   oracoc;            /* current OraCursors open             */
+  /* ub4 */ int   oranor;            /* nr of OraCursor re-assignments      */
+  /* ub4 */ int   oranpr;            /* nr of parses                        */
+  /* ub4 */ int   oranex;            /* nr of executes                      */
+         };
+
+#ifndef ORACA_NONE
+
+#ifdef ORACA_STORAGE_CLASS
+ORACA_STORAGE_CLASS struct oraca oraca
+#else
+struct oraca oraca
+#endif
+#ifdef ORACA_INIT
+         =
+         {
+         {'O','R','A','C','A',' ',' ',' '},
+         sizeof(struct oraca),
+         0,0,0,0,
+         {0,{0}},
+         {0,{0}},
+         0,
+         0,0,0,0,0,0
+         }
+#endif
+         ;
+
+#endif
+
+#endif
+/* end oraca.h */
diff --git a/sdk/include/oratypes.h b/sdk/include/oratypes.h
new file mode 100644
index 0000000..66ebbaa
--- /dev/null
+++ b/sdk/include/oratypes.h
@@ -0,0 +1,295 @@
+/* $RCSfile: oratypes.h $ $Date: 20-jul-00.13:44:19 
+   ----------------------------------------------------------------------
+   Copyright (c) 1982, 2003, Oracle.  All rights reserved.
+   ---------------------------------------------------------------------- */
+ 
+#ifndef ORATYPES
+# define ORATYPES
+# define SX_ORACLE
+# define SX3_ORACLE 
+
+#ifndef ORASTDDEF
+# include <stddef.h>
+# define ORASTDDEF
+#endif
+
+#ifndef ORALIMITS
+# include <limits.h>
+# define ORALIMITS
+#endif
+
+#ifndef TRUE
+# define TRUE  1
+# define FALSE 0
+#endif
+
+/* --- Signed/Unsigned one-byte scalar (sb1/ub1) --- */
+
+#ifndef lint
+  typedef unsigned char ub1;
+  typedef   signed char sb1;
+  typedef          char eb1;
+#else 
+# define ub1 unsigned char
+# define sb1 signed char
+# define eb1 char
+#endif
+
+#define UB1MAXVAL    ((ub1)UCHAR_MAX)
+#define UB1MINVAL    ((ub1)       0)
+#define SB1MAXVAL    ((sb1)SCHAR_MAX)
+#define SB1MINVAL    ((sb1)SCHAR_MIN)
+
+#define MINUB1MAXVAL ((ub1)  255)
+#define MAXUB1MINVAL ((ub1)    0)
+#define MINSB1MAXVAL ((sb1)  127)
+#define MAXSB1MINVAL ((sb1) -127)
+
+#define EB1MAXVAL    ((eb1)SCHAR_MAX)
+#define EB1MINVAL    ((eb1)        0)
+
+#define MINEB1MAXVAL ((eb1)  127)
+#define MAXEB1MINVAL ((eb1)    0)
+
+#define UB1BITS      CHAR_BIT
+#define UB1MASK      ((1 << ((uword)CHAR_BIT)) - 1)
+
+/* backwards compatibility */
+
+#ifndef lint
+  typedef sb1 b1;
+#else
+# define b1 sb1
+#endif
+
+#define B1MAXVAL SB1MAXVAL
+#define B1MINVAL SB1MINVAL
+
+/* --- Signed/Unsigned two-byte scalar (sb2/ub2) --- */
+
+#ifndef lint 
+  typedef unsigned short ub2;
+  typedef   signed short sb2;
+  typedef          short eb2;
+#else
+# define ub2 unsigned short
+# define sb2 signed short
+# define eb2 short
+#endif
+
+#define UB2MAXVAL    ((ub2)USHRT_MAX)
+#define UB2MINVAL    ((ub2)        0)
+#define SB2MAXVAL    ((sb2) SHRT_MAX)
+#define SB2MINVAL    ((sb2) SHRT_MIN)
+
+#define MINUB2MAXVAL ((ub2) 65535)
+#define MAXUB2MINVAL ((ub2)     0)
+#define MINSB2MAXVAL ((sb2) 32767)
+#define MAXSB2MINVAL ((sb2)-32767)
+
+#define EB2MAXVAL    ((eb2) SHRT_MAX)
+#define EB2MINVAL    ((eb2)        0)
+
+#define MINEB2MAXVAL ((eb2) 32767)
+#define MAXEB2MINVAL ((eb2)     0)
+
+/* backwards compatibility */
+
+#ifndef lint
+  typedef sb2 b2;
+#else
+# define b2 sb2
+#endif
+
+#define B2MAXVAL SB2MAXVAL
+#define B2MINVAL SB2MINVAL
+
+/* --- Signed/Unsigned four-byte scalar (sb4/ub4) --- */
+
+#ifndef lint 
+  typedef unsigned int ub4;
+  typedef   signed int sb4;
+  typedef          int eb4;
+#else
+# define ub4 unsigned int
+# define sb4 signed int
+# define eb4 int
+#endif
+
+#define UB4MAXVAL    ((ub4)UINT_MAX)
+#define UB4MINVAL    ((ub4)       0)
+#define SB4MAXVAL    ((sb4) INT_MAX)
+#define SB4MINVAL    ((sb4) INT_MIN)
+
+#define MINUB4MAXVAL ((ub4) 4294967295)
+#define MAXUB4MINVAL ((ub4)          0)
+#define MINSB4MAXVAL ((sb4) 2147483647)
+#define MAXSB4MINVAL ((sb4)-2147483647)
+
+#define EB4MAXVAL    ((eb4) INT_MAX)
+#define EB4MINVAL    ((eb4)       0)
+
+#define MINEB4MAXVAL ((eb4) 2147483647)
+#define MAXEB4MINVAL ((eb4)          0)
+
+/* --- Signed/Unsigned eight-byte scalar (orasb8/oraub8) --- */
+# define ORAXB8_DEFINED
+# ifndef lint
+#  ifdef _LP64
+    typedef unsigned long oraub8;
+    typedef   signed long orasb8;
+#  else
+    typedef unsigned long long oraub8;
+    typedef   signed long long orasb8;
+#  endif /* _LP64 */
+   typedef oraub8 ub8;
+   typedef orasb8 sb8;
+# else
+#  define ub8 oraub8
+#  define sb8 orasb8
+#  ifdef _LP64
+#   define oraub8 unsigned long
+#   define orasb8 signed long
+#  else
+#   define oraub8 unsigned long long
+#   define orasb8 signed long long
+#  endif /* _LP64 */
+# endif /* !lint */
+
+# define ORAUB8MINVAL    ((oraub8)0)
+# define ORAUB8MAXVAL    ((oraub8)18446744073709551615)
+# define ORASB8MINVAL    ((orasb8)-9223372036854775808)
+# define ORASB8MAXVAL    ((orasb8) 9223372036854775807)
+
+# define MAXORAUB8MINVAL ((oraub8)0)
+# define MINORAUB8MAXVAL ((oraub8)18446744073709551615)
+# define MAXORASB8MINVAL ((orasb8)-9223372036854775807)
+# define MINORASB8MAXVAL ((orasb8) 9223372036854775807)
+
+/* backwards compatibility */
+
+#ifndef lint
+  typedef sb4 b4;
+#else
+# define b4 sb4
+#endif
+
+#define B4MAXVAL SB4MAXVAL
+#define B4MINVAL SB4MINVAL
+
+/* --- Character pointer --- */
+
+#ifdef lint
+# define oratext unsigned char
+#else
+  typedef unsigned char oratext;
+#endif
+
+#if !defined(LUSEMFC)
+# ifdef lint
+#  define text    unsigned char
+#  define OraText oratext
+# else
+   typedef oratext text;
+   typedef oratext OraText;
+# endif
+#endif
+
+#if !defined(MOTIF) && !defined(LISPL)  && !defined(__cplusplus) && \
+    !defined(LUSEMFC)
+  typedef OraText *string;        
+#endif 
+
+#ifndef lint
+  typedef unsigned short utext;
+#else
+# define utext  unsigned short
+#endif
+
+/* --- Boolean --- */
+
+#ifndef boolean
+# ifndef lint
+   typedef int boolean;
+# else
+#  define boolean int
+# endif
+#endif
+
+/* --- Other data types --- */
+
+#ifndef lint
+  typedef          int eword;
+  typedef unsigned int uword;
+  typedef   signed int sword;
+#else
+# define eword int
+# define uword unsigned int
+# define sword signed int
+#endif 
+
+#define  EWORDMAXVAL  ((eword) INT_MAX)
+#define  EWORDMINVAL  ((eword)       0)
+
+#define  UWORDMAXVAL  ((uword)UINT_MAX)
+#define  UWORDMINVAL  ((uword)       0)
+
+#define  SWORDMAXVAL  ((sword) INT_MAX)
+#define  SWORDMINVAL  ((sword) INT_MIN)
+
+#define  MINEWORDMAXVAL  ((eword)  2147483647)
+#define  MAXEWORDMINVAL  ((eword)           0)
+
+#define  MINUWORDMAXVAL  ((uword)  4294967295)
+#define  MAXUWORDMINVAL  ((uword)           0)
+
+#define  MINSWORDMAXVAL  ((sword)  2147483647)
+#define  MAXSWORDMINVAL  ((sword) -2147483647)
+
+#ifndef lint
+  typedef unsigned long  ubig_ora;             
+  typedef   signed long  sbig_ora;             
+#else
+# define ubig_ora unsigned long
+# define sbig_ora signed long
+#endif 
+
+#define UBIG_ORAMAXVAL ((ubig_ora)ULONG_MAX)
+#define UBIG_ORAMINVAL ((ubig_ora)        0)
+
+#define SBIG_ORAMAXVAL ((sbig_ora) LONG_MAX)
+#define SBIG_ORAMINVAL ((sbig_ora) LONG_MIN)
+
+#define MINUBIG_ORAMAXVAL ((ubig_ora) 4294967295)
+#define MAXUBIG_ORAMINVAL ((ubig_ora)          0)
+
+#define MINSBIG_ORAMAXVAL ((sbig_ora) 2147483647)
+#define MAXSBIG_ORAMINVAL ((sbig_ora)-2147483647)
+
+#define UBIGORABITS      (UB1BITS * sizeof(ubig_ora))
+
+/* --- Const --- */
+
+#undef CONST
+#define CONST const
+
+/* --- Misc --- */
+
+#define dvoid void
+
+typedef void (*lgenfp_t)( void );
+
+#ifndef ORASYS_TYPES
+# include <sys/types.h>
+# define ORASYS_TYPES
+#endif 
+
+#ifndef SIZE_TMAXVAL
+# define SIZE_TMAXVAL UBIG_ORAMAXVAL
+#endif
+
+#ifndef MINSIZE_TMAXVAL
+# define MINSIZE_TMAXVAL (size_t)4294967295
+#endif
+
+#endif /* ORATYPES */
diff --git a/sdk/include/ori.h b/sdk/include/ori.h
new file mode 100644
index 0000000..60ea1b9
--- /dev/null
+++ b/sdk/include/ori.h
@@ -0,0 +1,2095 @@
+/* Copyright (c) 1994, 2006, Oracle. All rights reserved.  */
+
+/*
+  NAME
+    ORI - OCI navigational interface
+
+  DESCRIPTION
+
+    This section is intended to give a brief introduction to the navigational
+    interfaces.  Readers can refer to the documents listed in the section 
+    'RELATED DOCUMENTS' for more information. 
+
+    PURPOSE 
+       The Oracle Call Interface (OCI) supports navigational access of objects.
+       In the navigational paradigm, data is represented as a graph of objects 
+       connected by references.  Objects in the graph are reached by following
+       the references.
+
+    OBJECT ENVIRONMENT
+
+      The object environment is initialized when the OCI environment handle is
+      initialized with the object option.  An object environment contains a
+      heap which buffers type instances in memory.  The object environment also
+      contains an object cache which keeps track of the objects in the object 
+      environment.  Readers can refer to the "Functional Specification for 
+      Programmatic Interface" for more information about the object 
+      environment. 
+
+    INSTANCE, OBJECT AND VALUE
+
+      An OTS instance is an occurence of a type specified by the Oracle Type 
+      System (OTS). This section describes how an OTS instance can be 
+      represented in OCI. In OCI, an OTS instance can be classified based on
+      the type, the lifetime and referencability (see the figure below):
+
+      1) A persistent object is an instance of an object type. A persistent
+         object resides in a row of a table in the server and can exist longer
+         than the duration of a session (connection). Persistent objects can be
+         identified by object references which contain the object identifiers.
+         A persistent object is obtained by pinning its object reference.
+
+      2) A transient object is an instance of an object type. A transient 
+         object cannot exist longer than the duration of a session, and it is 
+         used to contain temporary computing results. Transient objects can 
+         also be identified by references which contain transient object
+         identifiers.
+
+      3) A value is an instance of an user-defined type (object type or 
+         collection type) or any built-in OTS type.  Unlike objects, values of 
+         object types are identified by memory pointers, rather than by 
+         references.  
+
+         A value can be standalone or embbeded.  A standalone value is usually
+         obtained by issuing a select statement.  OCI also allows the client
+         program to select a row of object table into a value by issuing a SQL
+         statement.  Thus, a referenceable object (in the database) can be 
+         represented as a value (which cannot be identified by a reference).
+         A standalone value can also be an out-of-line attribute in an object 
+         (e.g varchar, raw) or an out-of-line element in a collection (e.g.
+         varchar, raw, object).
+      
+         An embedded value is phyiscally included in a containing instance.
+         An embedded value can be an in-line attribute in an object (e.g.
+         number, nested object) or an in-line element in a collection.
+
+         All values are considered to be transient by OCI, e.g. OCI does not
+         support automatic flushing a value to the database, and the client has
+         to explicitly execute a SQL statement to store a value into the 
+         database. For embedded values, they are flushed when their containing
+         instance are flushed.
+
+
+                                OTS instance
+                                 |        |  
+                                 v        v
+                               object    value         (type)
+                               |    |
+                               v    v
+                       persistent  transient           (lifetime)
+                  
+ 
+                     persistent obj   transient obj     value  
+      ---------------------------------------------------------------
+      |              |              |               |  object type, |
+      | type         | object type  |  object type  |  built-in,    |
+      |              |              |               |  collection   |
+      ---------------------------------------------------------------
+      | maximum      | until object |  session      | session       |
+      | lifetime     | is deleted   |               |               | 
+      ---------------------------------------------------------------
+      | referencable |    yes       |     yes       |    no         |    
+      ---------------------------------------------------------------
+      | embeddable   |    no        |     no        |    yes        |    
+      ---------------------------------------------------------------
+
+    REFERENCEABLE OBJECT, STANDALONE OBJECT, EMBEDDED OBJECT
+
+       In the reminding of this include file, the following term will be used:
+       1) The term 'object' can be generally referred to a persistent object,
+          a transient object, a standalone value of object type, or an embedded
+          value of object type.
+       2) The term 'referenceable object' refers to a persistent object or a 
+          transient object.
+       3) The term 'standalone object' refers to a persistent object, a
+          transient object or a standalone value of object type.
+       4) The term 'embedded object' referes to a embbeded value of object 
+          type.
+
+    META ATTRIBUTES 
+
+      There is a set of meta-attributes that are defined for standalone 
+      objects.  A meta-attribute can be transient or persistent. A 
+      transient meta-attribute is applicable to an instance only when it is 
+      in memory. A persistent meta-attribute can be applicable to an instance 
+      that is in the disk. 
+
+      The set of user visible meta-attributes for persistent objects are:
+      1) existent (persistent) : Does the object exist?
+      2) nullness (persistent) : Null information of the instance
+      3) locked   (persistent) : Is the object locked?
+      4) pinned    (transient) : Is the object being accessed by the client?
+      5) dirty     (transient) : Has the object been modified?
+      6) allocation duration (transient) : see below
+      7) pin duration        (transient) : see below
+
+      The set of user visible meta-attributes for transient objects are:
+      1) existent  (transient) : Does the object exist?
+      2) nullness  (transient) : Null information of the instance 
+      3) pinned    (transient) : Is the object being accessed by the client? 
+      4) dirty     (transient) : Has the object been modified?
+      4) allocation duration (transient) : see below
+      5) pin duration        (transient) : see below
+
+      The set of user visible meta-attributes for standalone values of object  
+      type or collections are:
+      1) allocation duration (transient) : see below
+      2) nullness            (transient) : Null information of the instance 
+                                           (of an object type)
+
+    NULLNESS OF AN INSTANCE 
+
+      Each standalone object is associated with a null structure which keeps 
+      the null information about the object.  A null indicates the absence of 
+      data. The null structure itself contains null indicators that represent:
+        1) atomic nullness : a null value that pertains to the whole object 
+        2) null status of the individual attribute in the object 
+
+      The layout of a null structure in memory resembles that of the object,
+      except that the null structure has additional indicators to represent 
+      the atomic nullness for each object. 
+
+      An non-existent object is different than an object that is atomically 
+      null. A atomically null object is an existing object that has no data. 
+
+    MEMORY LAYOUT OF AN OBJECT
+
+      A standalone object in memory is composed of a top level memory chunk, 
+      a null structure and optionally, a number of secondary memory chunks. 
+      For a DEPARTMENT object type,
+
+          OBJECT TYPE department
+          {
+              dep_name      varchar2(20),
+              budget        number,
+              manager       person,              /o person is an object type o/
+              employees     collection of person
+          }
+
+      Each instance of DEPARTMENT will has a top level memory chunk which
+      contains the top level attributes such as dep_name, budget, manager and
+      employees.  The attributes dep_name and employees are themselves pointers
+      to the additional memory (the secondary memory chunks). The secondary
+      memory is for the out-of-line attribute (e.g. varray).
+
+    CONSISTENCY MODEL
+
+      Each pin operation behaves like a distinct SQL select.  Thus, the object 
+      cache does not guarantee consistency for a graph of objects.  In order to
+      retrieve a consistent graph of objects, the user has to explicitly start 
+      a serializable transaction or a read-only transaction. 
+
+    DURATION
+      In OCI, a duration is used to specify 
+
+        1) the length of memory allocation of an instance 
+           When each instance is allocated, it is associate with an allocation
+           duration.  The memory occupied by the object is freed automatically 
+           at the end of its allocation duration. The allocation duration of an
+           instance cannot be changed.  
+
+        2) the length of pinning of an object
+           When each object is pinned, the client has to give a pin duration 
+           which specify the length of time that the object is intended to be
+           used.  It is an user error to specify a pin duration longer than an
+           allocation duration of the object. An object is completely unpinned 
+           at the end of its pin duration (see OCIObjectUnpin()). 
+
+      An OCI program can use the allocation duration and the pin duration to 
+      automatically free the memory of the instances:
+       1) Transient objects and values are freed at the end of the allocation
+          duration.
+       2) Persistent objects ARE freed at the end of the allocation duration.
+          Persistent objects CAN be freed at the end of the pin duration when
+          the objects are completely unpinned. The persistent objects are said
+          to be aged out. See OCIObjectUnpin() for more details.
+
+      There are 3 predefined duration: session, transaction, call.  The time 
+      spans of these durations are defined based on the programming model 
+      presented by OCI. The call duration is mapped to the transaction 
+      duration in the client-side environment. See oro.h for the macros defined
+      for these 3 durations.
+
+      A pin duration can be promoted. For example, if an object is pinned with
+      duration 1, and the object is later pinned with duration 2, the pin 
+      routine will try to find a duration that is longer or equal to the 
+      length of both duration 1 and duration 2.  The pin duration of the object
+      is set to the that duration. The object is automatically unpinned only 
+      after both duration 1 and duration 2 are terminated. 
+
+  RELATED DOCUMENTS
+    "Functional Specification for Oracle Object RDBMS" 
+    "Functional Specification for Programmatic Interfaces" 
+    "Functional Specification for the Oracle Type System (OTS)" 
+
+  INSPECTION STATUS 
+    Inspection date:
+    Inspection status:
+    Estimated increasing cost defects per page:
+    Rule sets:        
+
+  ACCEPTANCE REVIEW STATUS 
+    Review date:   
+    Review status:
+    Reviewers: 
+
+  PUBLIC FUNCTIONS
+    OCIObjectNew - OCI new a standalone instance 
+    OCIObjectPin - OCI pin an object by reference
+    OCIObjectUnpin - OCI unpin a referenceable object
+    OCIObjectPinCountReset - OCI reset the pin count of a referenceable object 
+    OCIObjectLock - OCI lock a persistent object
+    OCIObjectLockNoWait - OCI lock a persistent object
+    OCIObjectMarkUpdate - OCI mark a referenceable object as updated
+    OCIObjectUnmark - OCI unmark a dirtied referenceable object 
+    OCIObjectUnmarkByRef - OCI unmark a dirtied object by reference 
+    OCIObjectFree - OCI free a standalone instance 
+    OCIObjectMarkDelete - OCI mark a referenceable object as deleted 
+    OCIObjectMarkDeleteByRef - OCI mark a referenceable object as deleted by 
+                               giving a reference
+    OCIObjectFlush - OCI flush a persistent object
+    OCIObjectRefresh - OCI refresh a persistent object 
+    OCIObjectCopy - OCI CoPy one object to another
+    OCIObjectGetTypeRef - OCI get the Type Reference of a standalone object 
+    OCIObjectGetObjectRef - OCI get the Object's Reference 
+    OCIObjectGetInd - OCI get Null Structure of an standalone object 
+    OCIObjectExists - OCI get the existence of a referenceable object
+    OCIObjectGetProperty - get object property
+    OCIObjectIsLocked - OCI get the lock status of a referenceable object
+    OCIObjectIsDirty - OCI get the dirty status of a referenceable object
+    OCIObjectPinTable - OCI get Table object 
+    OCIObjectArrayPin - OCI pin array of objects 
+    OCIObjectGetPrimayKeyTypeRef - OCI get the Ref for the primary key OID's 
+                                   type 
+    OCIObjectMakeObjectRef - OCI Create a pk or sys generated REF  
+
+    OCIObjectGetNewOID - OCI Create a new Object ID
+
+    OCICacheFlush - OCI flsuh the modified persistent objects in the cache
+    OCICacheRefresh - OCI refresh persistent objects in the cache 
+    OCICacheUnpin - OCI unpin referenceable objects in the cache
+    OCICacheFree - OCI free all instances in the environment
+    OCICacheUnmark - OCI unmark all dirty referenceable objects in the cache 
+
+  PRIVATE FUNCTIONS
+    None
+
+  EXAMPLES 
+
+    The following types will be used in the examples in this section: 
+
+    OBJECT TYPE professor
+    (
+        varchar2  name;
+        number    department;
+        number    num_of_students; 
+    );
+
+    OBJECT TYPE course 
+    (
+        varchar2   name;
+        number     grade; 
+    );
+
+    OBJECT TYPE student
+    (
+        vstring      name;
+        number       department;
+        ref          advisor;                      /o advisor is a professor o/
+        collection   courses;
+    );
+
+    EXAMPLE 1
+
+      Here is a set of examples to illustrate the usages of some of the
+      orio and oric functions.  
+
+      OCIenv    *env;              /o OCI environment handle o/
+      OCIError  *err;              /o OCI error handle o/
+      OCISvcCtx *svc;              /o OCI service handle o/
+
+      void   *stu_tbl;            /o pointer to the student table o/
+      OCIType *stu_tdo;            /o student type tdo o/
+
+      OCIRef    *stu2_ref;         /o object reference to student object o/
+      student   *stu1;             /o pointer to the student object o/
+      student   *stu2;             /o pointer to the student object o/
+      professor *pro;              /o pointer to the professor object o/
+
+      /o Initialize the OCI environment handle, error handle and service
+         handle and login to the database o/ 
+      ...
+
+      /o CREATE A PERSISTENT OBJECT o/
+
+      /o get the table object of student o/
+      if (OCIObjectPinTable(env, err, svc, "ORACLEU", sizeof("ORACLEU"), 
+          "STUDENT_TABLE", sizeof("STUDENT_TABLE"), (OCIRef *)0, 
+          OCI_DURATION_NULL, &stu_tbl) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o get type object of student o/
+      if (OCITypeByName(env, err, svc, "ORACLEU", sizeof("ORACLEU"), 
+          "STUDENT", sizeof("STUDENT"), OCI_DURATION_NULL, OCI_TYPEGET_HEADER,
+          &stu_tdo) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o create a persistent object 'mark' (of type student) o/ 
+      if (OCIObjectNew(env, err, svc, OCI_TYPECODE_ADT, stu_tdo, stu_tbl, 
+            OCI_DURATION_TRANS, (ub1)FALSE, (void **)&stu1) != OCI_SUCCESS)
+          /o error handling code o/
+
+      /o RETRIEVE OBJECTS IN PERSISTENT STORES o/ 
+
+      /o Use OCI to retrieve a reference to student object 'joe'.
+       o The retrieved reference is bound to the variable stu2_ref.
+       o/ 
+
+      /o pin/retrieve the student "joe" by reference o/ 
+      if (OCIObjectPin(env, err, &stu2_ref, (OCIComplexObject *)0, OCI_PIN_ANY,
+                  OCI_DURATION_TRANS, OCI_LOCK_X, &stu2) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o pin/retrieve the advisor of student "joe" by reference o/ 
+      if (OCIObjectPin(env, err, &stu2->advisor, (OCIComplexObject *)0,
+          OCI_PIN_ANY, OCI_DURATION_TRANS, OCI_LOCK_X, &pro) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o MODIFY OBJECTS o/
+
+      /o initialize the newly created object "mark" o/
+      DISCARD OCIStringAssignText(env, err, "mark", sizeof("mark"), 
+                                    &stu1->name);
+      department = 522;
+      DISCARD OCINumberFromInt(err, &department, sizeof(department), 
+                                    OCI_NUMBER_UNSIGNED, &stu1->department);
+
+      /o assign advisor to student "mark" o/
+      DISCARD OCIRefAssign(env, err, &stu2->advisor, &stu1->advisor);
+
+      /o update student "joe". o/  
+      department = 533;
+      DISCARD OCINumberFromInt(err, &department, sizeof(department), 
+                                    OCI_NUMBER_UNSIGNED, &stu2->department);
+      DISCARD OCIObjectMarkUpdate(env, err, stu2);
+
+      /o UNPIN OBJECTS AFTER FINSIHED PROCESSING THEM o/ 
+
+      /o unpin the student object "mark" o/
+      if (OCIObjectUnpin(env, err, stu1) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the student object "joe" o/
+      if (OCIObjectUnpin(env, err, stu2) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the professor object o/
+      if (OCIObjectUnpin(env, err, pro) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the type object o/
+      if (OCIObjectUnpin(env, err, stu_tdo) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the table object o/
+      if (OCIObjectUnpin(env, err, stu_tbl) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o FLUSH MODIFIED OBJECTS BACK TO PERSISTENT STORE o/
+
+      if (OCICacheFlush(env, err, svc, (void *)0, ((OCIRef*)(*)())0, 
+                       (OCIRef *)0) != OCI_SUCCESS)
+          /o error handling code o/
+
+      /o commit transaction o/
+
+    END OF EXAMPLE 1
+
+  NOTES
+    This file has been subsetted to contain only the routines that will
+    be in the first release.
+
+  MODIFIED
+    dmukhin    06/29/05 - ANSI prototypes; miscellaneous cleanup 
+    srseshad   03/12/03 - convert oci public api to ansi
+    aahluwal   06/03/02 - bug 2360115
+    bpalaval   02/09/01 - Change text to oratext.
+    rkasamse   06/21/00 - add ociobjectgetnewoid
+    rkasamse   05/24/00 - add OCIObjectSetData
+    whe        09/01/99 - 976457:check __cplusplus for C++ code
+    smuralid   10/29/98 - add comments for OCIObjectMakeObjectRef              
+    mkrishna   08/19/98 - change OCIGetPkTypeRef to OCIObjectGetPrimaryKeyTypeR
+    mkrishna   08/10/98 - add OCIObjectMakeObjectRef & OCIObjectGetPkTypeRef
+    rkasamse   06/22/98 - add comments for OCIDurationBegin(End)
+    pmitra     04/01/98 - OCIObjectLockNoWait added                            
+    pmitra     11/05/97 - [573769] OCIObjectArrayPin pos parameter cannot be NU
+    cxcheng    07/29/97 - fix compile for short names
+    skrishna   07/14/97 - add OCIObjectGetProperty
+    skrishna   04/30/97 - OCIObjectFlushRefresh: remove duplicate declaration
+    skrishna   04/24/97 - flag unsupported functions
+    sthakur    03/20/97 - modify flag argument to OCIObjectFree
+    skrishna   03/18/97 - fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/19/97 - remove short names support
+    cxcheng    02/06/97 - take out short name support except with SLSHORTNAME
+    sthakur    12/20/96 - fix a typepo in OCIOBjectArrayPin
+    jboonleu   11/07/96 - modify comments
+    cxcheng    10/28/96 - more beautification changes
+    jboonleu   10/24/96 - add flag to OCIObjectFree
+    jboonleu   10/22/96 - change interface of OCICacheFlush
+    cxcheng    10/18/96 - rename OCIObjectPinArray to OCIObjectArrayPin
+    cxcheng    10/14/96 - more renaming of types
+    jboonleu   10/09/96 - add new interfaces
+    cxcheng    10/09/96 - more lint fixes
+    cxcheng    10/08/96 - more lint fixes
+    jboonleu   09/27/96 - fix lint errors
+    jboonleu   10/07/96 - beautify ori.h after conversion to long names
+    cxcheng    10/04/96 - replace short names with long names
+    sthakur    08/20/96 - add COR context to OCIObjectPin
+    mluong     07/17/96 - add back orioglk, oriogdr, oriogiv, and oriocur.
+    jboonleu   07/17/96 - rename refresh option to conherency option 
+    jboonleu   07/16/96 - change comment for cache consistency
+    jwijaya    07/03/96 - add ANSI prototypes
+    jboonleu   06/12/96 - update comment
+    jboonleu   05/08/96 -  change description of OCIDurationGetParent
+    jboonleu   05/01/96 -  add OROOCOSFN
+    skrishna   04/08/96 -  change ori*() to take OCIEnv* and OCIError* instead
+                           of oroenv*
+    jboonleu   01/04/96 -  interface change
+    jboonleu   10/24/95 -  support of variable ref
+    jboonleu   02/15/95 -  new interface
+    sthakur    01/05/95 -  pass username to origrgc 
+    skotsovo   12/07/94 -  update example 
+    jwijaya    11/15/94 -  rename ORONSPTAB to ORONSPEXT 
+    jwijaya    10/06/94 -  add namespace to oriopnm() 
+    jwijaya    10/02/94 -  connection handle -> connection number 
+    jboonleu   08/16/94 -  fix lint errors 
+    jboonleu   07/20/94 -  change interface of OCICacheFlush 
+    tanguyen   07/18/94 -  add oriocpe, change OCIObjectCopy to oriocps
+    tcheng     07/15/94 -  add init param maximum_sga_heap_size 
+    tcheng     07/13/94 -  change origini to get param string 
+    jboonleu   07/05/94 -  change sccs string from sccid to a comment 
+    jboonleu   07/01/94 -  Add examples to ORIO* and ORIC* functions 
+    tanguyen   06/30/94 -  Fix the ORI_ORACLE ifdef
+    skotsovo   06/27/94 -  include all public functions in public functions 
+                           list at top of header file
+    tcheng     06/27/94 -  modify comments according to new template 
+    tanguyen   06/24/94 -  fix comments for OCIObjectCopy 
+    tcheng     06/24/94 -  fix comments in origrgc()
+    tanguyen   06/21/94 -  fix comments and format 
+    tcheng     06/20/94 -  commenting origini/trm/err/rgc/urg() functions
+    tanguyen   06/16/94 -  fix descriptions of ref operations 
+    tanguyen   06/16/94 -  clarifies refs comparison 
+    tanguyen   05/12/94 -  adds more interfaces (OCIObjectMarkUpdate)
+    jwijaya    05/10/94 -  fix examples, add origurg, change origcon to origrgc
+    tanguyen   05/03/94 -  remove unnecessary 'type' argument from 
+                           'OCIObjectCopy'
+    tanguyen   03/08/94 -  clarifies comments
+    jwijaya    02/16/94 -  more questions
+    jwijaya    02/11/94 -  more comments
+    jwijaya    02/10/94 -  identify optional arguments
+    jwijaya    02/07/94 -  Creation
+*/
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef ORI_ORACLE
+#define ORI_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCIDurationBegin                 origbgu
+#define OCIDurationEnd                   origedu
+#define OCIDurationGetParent             origpdr
+#define OCICacheFlushRefresh             oricfrh
+#define OCICacheUnpin                    oricunp
+#define OCICacheFree                     oricfre
+#define OCICacheUnmark                   oricumk
+#define OCICacheGetObjects               oricgpr
+#define OCICacheRegister                 oricscb
+#define OCIObjectUnpin                   oriounp
+#define OCIObjectPinCountReset           orioupz
+#define OCIObjectLock                    oriolck
+#define OCIObjectLockNoWait              oriolnw
+#define OCIObjectMarkUpdate              orioupd
+#define OCIObjectUnmark                  orioumk
+#define OCIObjectUnmarkByRef             orioumr
+#define OCIObjectAlwaysLatest            oriomkl
+#define OCIObjectNotAlwaysLatest         oriouml
+#define OCIObjectMarkDeleteByRef         oriordl
+#define OCIObjectMarkDelete              oriopdl
+#define OCIObjectFlush                   oriofls
+#define OCIObjectFlushRefresh            oriofrh
+#define OCIObjectCopy                    oriocpy
+#define OCIObjectGetTypeRef              oriogtr
+#define OCIObjectGetObjectRef            oriogor
+#define OCIObjectGetInd                  oriogns
+#define OCIObjectExists                  oriogex
+#define OCIObjectGetProperty             oriogpr
+#define OCIObjectRefresh                 oriorfs
+#define OCIObjectPinTable                oriogtb
+#define OCIObjectGetPrimaryKeyTypeRef    oriogpf
+#define OCIObjectMakeObjectRef           oriomrf
+
+#define OCIObjectNew                     orionew
+#define OCIObjectPin                     oriopin
+#define OCIObjectFree                    oriofre
+#define OCIObjectArrayPin                orioapn
+#define OCIObjectIsDirty                 oriodrt
+#define OCIObjectIsDirtied               oriodrd
+#define OCIObjectIsLoaded                orioldd
+#define OCICacheFlush                    oricfls
+#define OCICacheRefresh                  oricrfs
+
+#endif                                                        /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------*/
+/*                       PUBLIC TYPES AND CONSTANTS                          */
+/*---------------------------------------------------------------------------*/
+
+/* Also see oro.h. */
+
+/*---------------------------------------------------------------------------*/
+/*                           PUBLIC FUNCTIONS                                */
+/*---------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*                       OBJECT/INSTANCE OPERATIONS                          */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCIObjectNew ----------------------------------*/
+sword OCIObjectNew(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc,
+                       OCITypeCode typecode, OCIType *tdo, void  *table, 
+                       OCIDuration duration, boolean value, 
+                       void  **instance    );
+/*
+   NAME: OCIObjectNew - OCI new (create) a standalone instance
+   PARAMETERS:
+        env  (IN/OUT) - OCI environment handle initialized in object mode
+        err  (IN/OUT) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                        OCIErrorGet().
+        svc      (IN) - OCI service handle.  
+        typecode (IN) - the typecode of the type of the instance. 
+        tdo      (IN, optional) - pointer to the type descriptor object. The 
+                        TDO describes the type of the instance that is to be 
+                        created. Refer to OCITypeByName() for obtaining a TDO. 
+                        The TDO is required for creating a named type (e.g. an
+                        object or a collection).
+        table (IN, optional) - pointer to a table object which specifies a 
+                        table in the server.  This parameter can be set to NULL
+                        if no table is given. See the description below to find
+                        out how the table object and the TDO are used together
+                        to determine the kind of instances (persistent, 
+                        transient, value) to be created. Also see 
+                        OCIObjectPinTable() for retrieving a table object.
+        duration (IN) - this is an overloaded parameter. The use of this
+                        parameter is based on the kind of the instance that is 
+                        to be created.
+                        a) persistent object. This parameter specifies the
+                           pin duration.
+                        b) transient object. This parameter specififes the 
+                           allocation duration and pin duration. 
+                        c) value. This parameter specifies the allocation
+                           duration. 
+        value    (IN)  - specifies whether the created object is a value.
+                         If TRUE, then a value is created. Otherwise, a 
+                         referenceable object is created.  If the instance is 
+                         not an object, then this parameter is ignored.
+        instance (OUT) - address of the newly created instance
+                  
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function creates a new instance of the type specified by the 
+        typecode or the TDO. Based on the parameters 'typecode' (or 'tdo'), 
+        'value' and 'table', different kinds of instances can be created:
+            
+                                     The parameter 'table' is not NULL?
+
+                                               yes              no
+             ----------------------------------------------------------------
+             | object type (value=TRUE)   |   value         |   value       |
+             ----------------------------------------------------------------
+             | object type (value=FALSE)  | persistent obj  | transient obj |
+       type  ----------------------------------------------------------------
+             | built-in type              |   value         |   value       |
+             ----------------------------------------------------------------
+             | collection type            |   value         |   value       |
+             ----------------------------------------------------------------
+
+        This function allocates the top level memory chunk of an OTS instance.
+        The attributes in the top level memory are initialized (e.g. an 
+        attribute of varchar2 is initialized to a vstring of 0 length). 
+
+        If the instance is an object, the object is marked existed but is 
+        atomically null. 
+
+        FOR PERSISTENT OBJECTS:
+        The object is marked dirty and existed.  The allocation duration for 
+        the object is session. The object is pinned and the pin duration is 
+        specified by the given parameter 'duration'.
+
+        FOR TRANSIENT OBJECTS:
+        The object is pinned. The allocation duration and the pin duration are 
+        specified by the given parameter 'duration'.
+
+        FOR VALUES:
+        The allocation duration is specified by the given parameter 'duration'.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectPin ----------------------------------*/
+sword OCIObjectPin(    OCIEnv *env, OCIError *err, OCIRef *object_ref, 
+                       OCIComplexObject *corhdl, OCIPinOpt pin_option, 
+                       OCIDuration pin_duration, 
+                       OCILockOpt lock_option, void  **object    );
+/*
+   NAME: OCIObjectPin - OCI pin a referenceable object
+   PARAMETERS:
+        env        (IN/OUT) - OCI environment handle initialized in object mode
+        err        (IN/OUT) - error handle. If there is an error, it is
+                              recorded in 'err' and this function returns 
+                              OCI_ERROR. The error recorded in 'err' can be 
+                              retrieved by calling OCIErrorGet().
+        object_ref     (IN) - the reference to the object. 
+        corhdl         (IN) - handle for complex object retrieval. 
+        pin_option     (IN) - See description below.
+        pin_duration   (IN) - The duration of which the object is being accesed
+                              by a client. The object is implicitly unpinned at
+                              the end of the pin duration. 
+                              If OCI_DURATION_NULL is passed, there is no pin 
+                              promotion if the object is already loaded into 
+                              the cache. If the object is not yet loaded, then 
+                              the pin duration is set to OCI_DURATION_DEFAULT. 
+        lock_option    (IN) - lock option (e.g., exclusive). If a lock option
+                              is specified, the object is locked in the server.
+                              See 'oro.h' for description about lock option. 
+        object        (OUT) - the pointer to the pinned object.
+
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+
+        This function pins a referenceable object instance given the object
+        reference. The process of pinning serves three purposes:
+
+        1) locate an object given its reference. This is done by the object
+           cache which keeps track of the objects in the object heap.  
+
+        2) notify the object cache that an object is being in use. An object 
+           can be pinned many times. A pinned object will remain in memory 
+           until it is completely unpinned (see OCIObjectUnpin()). 
+
+        3) notify the object cache that a persistent object is being in use 
+           such that the persistent object cannot be aged out.  Since a 
+           persistent object can be loaded from the server whenever is needed, 
+           the memory utilization can be increased if a completely unpinned 
+           persistent object can be freed (aged out), even before the 
+           allocation duration is expired.  
+
+        Also see OCIObjectUnpin() for more information about unpinning.
+
+        FOR PERSISTENT OBJECTS:
+
+        When pinning a persistent object, if it is not in the cache, the object
+        will be fetched from the persistent store. The allocation duration of
+        the object is session. If the object is already in the cache, it is
+        returned to the client.  The object will be locked in the server if a 
+        lock option is specified. 
+
+        This function will return an error for a non-existent object.  
+
+        A pin option is used to specify the copy of the object that is to be 
+        retrieved: 
+
+        1) If option is OCI_PIN_ANY (pin any), if the object is already 
+           in the environment heap, return this object. Otherwise, the object 
+           is retrieved from the database.  This option is useful when the 
+           client knows that he has the exclusive access to the data in a 
+           session.
+
+        2) If option is OCI_PIN_LATEST (pin latest), if the object is 
+           not cached, it is retrieved from the database.  If the object is 
+           cached, it is refreshed with the latest version. See 
+           OCIObjectRefresh() for more information about refreshing.
+
+        3) If option is OCI_PIN_RECENT (pin recent), if the object is loaded
+           into the cache in the current transaction, the object is returned.
+           If the object is not loaded in the current transaction, the object
+           is refreshed from the server.
+
+        FOR TRANSIENT OBJECTS:
+
+        This function will return an error if the transient object has already 
+        been freed. This function does not return an error if an exclusive 
+        lock is specified in the lock option. 
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------------ OCIObjectUnpin -----------------------------*/
+sword OCIObjectUnpin(    OCIEnv *env, OCIError *err, void  *object    );
+/*
+   NAME: OCIObjectUnpin - OCI unpin a referenceable object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by 
+                         calling OCIErrorGet().
+        object    (IN) - pointer to an object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function unpins an object.  An object is completely unpinned when 
+          1) the object was unpinned N times after it has been pinned N times
+             (by calling OCIObjectPin()).
+          2) it is the end of the pin duration
+          3) the function OCIObjectPinCountReset() is called 
+
+        There is a pin count associated with each object which is incremented
+        whenever an object is pinned. When the pin count of the object is zero,
+        the object is said to be completely unpinned. An unpinned object can
+        be freed without error.
+
+        FOR PERSISTENT OBJECTS:
+        When a persistent object is completely unpinned, it becomes a candidate
+        for aging. The memory of an object is freed when it is aged out. Aging
+        is used to maximize the utilization of memory.  An dirty object cannot 
+        be aged out unless it is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The pin count of the object is decremented. A transient can be freed
+        only at the end of its allocation duration or when it is explicitly
+        deleted by calling OCIObjectFree().
+
+        FOR VALUE:
+        This function will return an error for value.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectPinCountReset -----------------------*/
+sword OCIObjectPinCountReset(    OCIEnv *env, OCIError *err, void  *object   );
+/*
+   NAME: OCIObjectPinCountReset - OCI resets the pin count of a referenceable
+                                  object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to an object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function completely unpins an object.  When an object is 
+        completely unpinned, it can be freed without error.  
+
+        FOR PERSISTENT OBJECTS:
+        When a persistent object is completely unpinned, it becomes a candidate
+        for aging. The memory of an object is freed when it is aged out. Aging
+        is used to maximize the utilization of memory.  An dirty object cannot 
+        be aged out unless it is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The pin count of the object is decremented. A transient can be freed
+        only at the end of its allocation duration or when it is explicitly
+        freed by calling OCIObjectFree().
+
+        FOR VALUE:
+        This function will return an error for value.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectLock ---------------------------------*/
+sword OCIObjectLock(    OCIEnv *env, OCIError *err, void  *object    );
+/*
+   NAME: OCIObjectLock - OCI lock a persistent object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function locks a persistent object at the server. Unlike
+        OCIObjectLockNoWait() this function waits if another user currently
+        holds a lock on the desired object. This function
+        returns an error if:
+          1) the object is non-existent.
+
+        This function will return an error for transient objects and values.
+        The lock of an object is released at the end of a transaction.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*------------------------ OCIObjectLockNoWait ------------------------------*/
+sword OCIObjectLockNoWait(    OCIEnv *env, OCIError *err, void  *object    );
+/*
+   NAME: OCIObjectLockNoWait - OCI lock a persistent object, do not wait for
+                               the lock, return error if lock not available
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function locks a persistent object at the server. Unlike
+        OCIObjectLock() this function will not wait if another user holds
+        the lock on the desired object. This function returns an error if:
+          1) the object is non-existent.
+          2) the object is currently locked by another user in which
+             case this function returns with an error.
+
+        This function will return an error for transient objects and values.
+        The lock of an object is released at the end of a transaction.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*--------------------------- OCIObjectMarkUpdate ---------------------------*/
+sword OCIObjectMarkUpdate(    OCIEnv *env, OCIError *err, void  *object    );
+/*
+   NAME: OCIObjectMarkUpdate - OCI marks an object as updated
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        FOR PERSISTENT OBJECTS:
+        This function marks the specified persistent object as updated. The
+        persistent objects will be written to the server when the object cache
+        is flushed.  The object is not locked or flushed by this function. It
+        is an error to update a deleted object.  
+
+        After an object is marked updated and flushed, this function must be
+        called again to mark the object as updated if it has been dirtied
+        after it is being flushed.
+
+        FOR TRANSIENT OBJECTS:
+        This function marks the specified transient object as updated. The
+        transient objects will NOT be written to the server. It is an error
+        to update a deleted object.
+
+        FOR VALUES:
+        It is an no-op for values.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*----------------------------- OCIObjectUnmark -----------------------------*/
+sword OCIObjectUnmark(    OCIEnv *env, OCIError *err, void  *object    );
+/*
+   NAME: OCIObjectUnmark - OCI unmarks an object 
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        FOR PERSISTENT OBJECTS AND TRANSIENT OBJECTS:
+        This function unmarks the specified persistent object as dirty. Changes
+        that are made to the object will not be written to the server. If the
+        object is marked locked, it remains marked locked.  The changes that
+        have already made to the object will not be undone implicitly. 
+ 
+        FOR VALUES:
+        It is an no-op for values.
+ 
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*----------------------------- OCIObjectUnmarkByRef ------------------------*/
+sword OCIObjectUnmarkByRef(    OCIEnv *env, OCIError *err, OCIRef *ref    );
+/*
+   NAME: OCIObjectUnmarkByRef - OCI unmarks an object by Ref
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        ref   (IN) - reference of the object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        FOR PERSISTENT OBJECTS AND TRANSIENT OBJECTS:
+        This function unmarks the specified persistent object as dirty. Changes
+        that are made to the object will not be written to the server. If the
+        object is marked locked, it remains marked locked.  The changes that
+        have already made to the object will not be undone implicitly.
+ 
+        FOR VALUES:
+        It is an no-op for values.
+ 
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectFree ---------------------------------*/
+sword OCIObjectFree(    OCIEnv *env, OCIError *err, void  *instance, 
+                        ub2 flags   );
+/*
+   NAME: OCIObjectFree - OCI free (and unpin) an standalone instance 
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        instance   (IN) - pointer to a standalone instance.
+        flags      (IN) - If OCI_OBJECT_FREE_FORCE is set, free the object
+                          even if it is pinned or dirty.
+                          If OCI_OBJECT_FREE_NONULL is set, the null
+                          structure will not be freed. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance to be freed must be standalone.
+        - If the instance is a referenceable object, the object must be pinned.
+   DESCRIPTION:
+        This function deallocates all the memory allocated for an OTS instance,
+        including the null structure.
+
+        FOR PERSISTENT OBJECTS:
+        This function will return an error if the client is attempting to free 
+        a dirty persistent object that has not been flushed. The client should 
+        either flush the persistent object or set the parameter 'flag' to  
+        OCI_OBJECT_FREE_FORCE.
+
+        This function will call OCIObjectUnpin() once to check if the object 
+        can be completely unpin. If it succeeds, the rest of the function will 
+        proceed to free the object.  If it fails, then an error is returned 
+        unless the parameter 'flag' is set to OCI_OBJECT_FREE_FORCE.
+ 
+        Freeing a persistent object in memory will not change the persistent 
+        state of that object at the server.  For example, the object will 
+        remain locked after the object is freed.
+
+        FOR TRANSIENT OBJECTS:
+
+        This function will call OCIObjectUnpin() once to check if the object 
+        can be completely unpin. If it succeeds, the rest of the function will 
+        proceed to free the object.  If it fails, then an error is returned 
+        unless the parameter 'flag' is set to OCI_OBJECT_FREE_FORCE. 
+
+        FOR VALUES:
+        The memory of the object is freed immediately. 
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*----------------------- OCIObjectMarkDeleteByRef --------------------------*/
+sword OCIObjectMarkDeleteByRef(    OCIEnv *env, OCIError *err, 
+                                   OCIRef *object_ref);
+/*
+   NAME: OCIObjectMarkDeleteByRef - OCI "delete" (and unpin) an object given
+                                    a reference
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        object_ref  (IN) - ref of the object to be deleted
+
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function marks the object designated by 'object_ref' as deleted.
+
+        FOR PERSISTENT OBJECTS:
+        If the object is not loaded, then a temporary object is created and is 
+        marked deleted. Otherwise, the object is marked deleted.  
+
+        The object is deleted in the server when the object is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The object is marked deleted.  The object is not freed until it is
+        unpinned.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectMarkDelete ---------------------------*/
+sword OCIObjectMarkDelete(    OCIEnv *env, OCIError *err, void  *instance    );
+/*
+   NAME: OCIObjectMarkDelete - OCI "delete" an instance given a Pointer 
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        instance   (IN) - pointer to the instance 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - If the instance is a referenceable object, then it must be pinned.
+   DESCRIPTION:
+
+        FOR PERSISTENT OBJECTS:
+        The object is marked deleted.  The memory of the object is not freed.
+        The object is deleted in the server when the object is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The object is marked deleted.  The memory of the object is not freed.
+
+        FOR VALUES: 
+        This function frees a value immediately. 
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectFlush -------------------------------*/
+sword OCIObjectFlush(    OCIEnv *env, OCIError *err, void  *object    );
+/*
+   NAME: OCIObjectFlush - OCI flush a persistent object
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        object     (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function flushes a modified persistent object to the server.
+        An exclusive lock is obtained implicitly for the object when flushed.
+
+        When the object is written to the server, triggers may be fired.
+        Objects can be modified by the triggers at the server.  To keep the  
+        objects in the object cache being coherent with the database, the
+        clients can free or refresh the objects in the cache. 
+
+        This function will return an error for transient objects and values.
+        
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------ OCIObjectRefresh ---------------------------------*/
+sword OCIObjectRefresh(    OCIEnv *env, OCIError *err, void  *object    );
+/*
+   NAME: OCIObjectRefresh - OCI refresh a persistent object
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        object     (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function refreshes an unmarked object with data retrieved from the
+        latest snapshot in the server. An object should be refreshed when the 
+        objects in the cache are inconsistent with the objects at 
+        the server:
+        1) When an object is flushed to the server, triggers can be fired to
+           modify more objects in the server.  The same objects (modified by 
+           the triggers) in the object cache become obsolete.
+        2) When the user issues a SQL or executes a PL/SQL procedure to modify
+           any object in the server, the same object in the cache becomes
+           obsolete.
+
+        The object that is refreshed will be 'replaced-in-place'. When an
+        object is 'replaced-in-place', the top level memory of the object will 
+        be reused so that new data can be loaded into the same memory address. 
+        The top level memory of the null structre is also reused. Unlike the
+        top level memory chunk, the secondary memory chunks may be resized and
+        reallocated.  The client should be careful when holding onto a pointer 
+        to the secondary memory chunk (e.g. assigning the address of a 
+        secondary memory to a local variable), since this pointer can become 
+        invalid after the object is refreshed.
+
+        The object state will be modified as followed after being refreshed: 
+          - existent : set to appropriate value
+          - pinned   : unchanged 
+          - allocation duration : unchanged 
+          - pin duration : unchanged 
+        
+        This function is an no-op for transient objects or values.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectCopy --------------------------------*/
+sword OCIObjectCopy(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                        void  *source, void  *null_source,
+                        void  *target, void  *null_target, OCIType *tdo, 
+                        OCIDuration duration, ub1 option    );
+/*
+   NAME: OCIObjectCopy - OCI copy one instance to another
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        svc         (IN) - OCI service context handle
+        source      (IN) - pointer to the source instance 
+        null_source (IN) - pointer to the null structure of the source
+        target      (IN) - pointer to the target instance
+        null_target (IN) - pointer to the null structure of the target 
+        tdo         (IN) - the TDO for both source and target
+        duration    (IN) - allocation duration of the target memory
+        option      (IN) - specify the copy option:
+                        OROOCOSFN - Set Reference to Null. All references
+                        in the source will not be copied to the target. The
+                        references in the target are set to null. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - If source or target is referenceable, it must be pinned.
+        - The target or the containing instance of the target must be already
+          be instantiated (e.g. created by OCIObjectNew()).
+        - The source and target instances must be of the same type. If the
+          source and target are located in a different databases, then the
+          same type must exist in both databases.
+   DESCRIPTION:
+        This function copies the contents of the 'source' instance to the
+        'target' instance. This function performs a deep-copy such that the 
+        data that is copied/duplicated include:
+        a) all the top level attributes (see the exceptions below)
+        b) all the secondary memory (of the source) that is reachable from the
+           top level attributes.
+        c) the null structure of the instance
+
+        Memory is allocated with the specified allocation duration. 
+
+        Certain data items are not copied: 
+        a) If the option OCI_OBJECTCOPY_NOREF is specified, then all references
+           in the source are not copied. Instead, the references in the target
+           are set to null.
+        b) If the attribute is a LOB, then it is set to null.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectGetTypeRef --------------------------*/
+sword OCIObjectGetTypeRef(    OCIEnv *env, OCIError *err, void  *instance, 
+                              OCIRef *type_ref    );
+/*
+   NAME: OCIObjectGetTypeRef - get the type reference of a standalone object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns 
+                         OCI_ERROR.  The error recorded in 'err' can be 
+                         retrieved by calling OCIErrorGet().
+        instance  (IN) - pointer to an standalone instance 
+        type_ref (OUT) - reference to the type of the object.  The reference 
+                         must already be allocated.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - If the object is referenceable, the specified object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function returns a reference to the TDO of a standalone instance. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectGetObjectRef -------------------------*/
+sword OCIObjectGetObjectRef(    OCIEnv *env, OCIError *err, void  *object, 
+                                OCIRef *object_ref    );
+/*
+   NAME: OCIObjectGetObjectRef - OCI get the object reference of an 
+                                 referenceable object
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        object      (IN) - pointer to a persistent object
+        object_ref (OUT) - reference of the given object. The reference must 
+                           already be allocated.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function returns a reference to the given object.  It returns an 
+        error for values. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectMakeObjectRef -----------------------*/
+sword OCIObjectMakeObjectRef(    OCIEnv *env, OCIError *err, 
+                                 const OCISvcCtx *svc, void  * table,
+                                 void  **values, ub4 array_len, 
+                                 OCIRef *object_ref    );
+/*
+   NAME: OCIObjectMakeObjectRef - OCI Create an object reference to a 
+                                 referenceable object.
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        svc         (IN) - the service context
+        table       (IN) - A pointer to the table object (must be pinned)
+        attrlist    (IN) - A list of values (OCI type values) from which
+                           the ref is to be created.
+        attrcnt     (IN)  - The length of the attrlist array. 
+        object_ref (OUT) - reference of the given object. The reference must 
+                           already be allocated. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified table object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function creates a reference given the values that make up the 
+        reference and also a pointer to the table object. 
+        Based on the table's OID property, whether it is a pk based OID or
+        a system generated OID, the function creates a sys-generated REF or
+        a pk based REF.
+        In case of system generated REFs pass in a OCIRaw which is 16 bytes
+        long contatining the sys generated OID.
+        In case of PK refs pass in the OCI equivalent for numbers, chars etc..
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectGetPrimaryKeyTypeRef --------------- */ 
+sword OCIObjectGetPrimaryKeyTypeRef( OCIEnv *env, OCIError *err,
+                                     const OCISvcCtx *svc, void  *table, 
+                                     OCIRef *type_ref );
+/*
+   NAME: OCIObjectGetPrimaryKeyTypeRef - OCI get the REF to the pk OID type 
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        svc     (IN)     - the service context 
+        table   (IN)     - pointer to the table object
+        type_ref   (OUT) - reference of the pk type. The reference must 
+                           already be allocated.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified table object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function returns a reference to the pk type.  It returns an 
+        error for values.  If the table is not a Pk oid table/view, then
+        it returns error.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*-------------------------- OCIObjectGetInd --------------------------------*/
+sword OCIObjectGetInd(    OCIEnv *env, OCIError *err, void  *instance, 
+                          void  **null_struct    );
+/*
+   NAME: OCIObjectGetInd - OCI get the null structure of a standalone object  
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        instance      (IN) - pointer to the instance 
+        null_struct (OUT) - null structure 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The object must be standalone.
+        - If the object is referenceable, the specified object must be pinned.
+   DESCRIPTION:
+        This function returns the null structure of an instance. This function
+        will allocate the top level memory of the null structure if it is not
+        already allocated. If an null structure cannot be allocated for the 
+        instance, then an error is returned. This function only works for 
+        ADT or row type instance. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------- OCIObjectExists --------------------------------*/
+sword OCIObjectExists(OCIEnv *env, OCIError *err, void  *ins, boolean *exist); 
+/*
+   NAME: OCIObjectExist - OCI checks if the object exists 
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns 
+                             OCI_ERROR.  The error recorded in 'err' can be 
+                             retrieved by calling OCIErrorGet().
+        ins           (IN) - pointer to an instance 
+        exist        (OUT) - return TRUE if the object exists
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The object must be standalone.
+        - if object is a referenceable, it must be pinned.
+   DESCRIPTION:
+        This function returns the existence of an instance. If the instance
+        is a value, this function always returns TRUE.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------- OCIObjectGetProperty ---------------------------*/
+sword OCIObjectGetProperty(OCIEnv *envh, OCIError *errh, const void  *obj, 
+                           OCIObjectPropId propertyId,
+                           void  *property, ub4 *size );
+/*
+   NAME: OCIObjectGetProperty - OCIObject Get Property of given object
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns
+                             OCI_ERROR.  The error recorded in 'err' can be
+                             retrieved by calling OCIErrorGet().
+        obj           (IN) - object whose property is returned
+        propertyId    (IN) - id which identifies the desired property
+        property     (OUT) - buffer into which the desired property is
+                             copied
+        size      (IN/OUT) - on input specifies the size of the property buffer
+                             passed by caller, on output will contain the 
+                             size in bytes of the property returned.
+                             This parameter is required for string type 
+                             properties only (e.g OCI_OBJECTPROP_SCHEMA,
+                             OCI_OBJECTPROP_TABLE). For non-string
+                             properties this parameter is ignored since
+                             the size is fixed.
+   DESCRIPTION:
+        This function returns the specified property of the object.
+        The desired property is identified by 'propertyId'. The property
+        value is copied into 'property' and for string typed properties
+        the string size is returned via 'size'. 
+        
+        Objects are classified as persistent, transient and value
+        depending upon the lifetime and referenceability of the object.
+        Some of the properties are applicable only to persistent
+        objects and some others only apply to persistent and 
+        transient objects. An error is returned if the user tries to 
+        get a property which in not applicable to the given object. 
+        To avoid such an error, the user should first check whether
+        the object is persistent or transient or value 
+        (OCI_OBJECTPROP_LIFETIME property) and then appropriately
+        query for other properties.
+
+        The different property ids and the corresponding type of 
+        'property' argument is given below.
+
+          OCI_OBJECTPROP_LIFETIME 
+            This identifies whether the given object is a persistent
+            object (OCI_OBJECT_PERSISTENT) or a 
+            transient object (OCI_OBJECT_TRANSIENT) or a
+            value instance (OCI_OBJECT_VALUE).
+            'property' argument must be a pointer to a variable of 
+            type OCIObjectLifetime.
+            
+          OCI_OBJECTPROP_SCHEMA
+            This returns the schema name of the table in which the 
+            object exists. An error is returned if the given object 
+            points to a transient instance or a value. If the input 
+            buffer is not big enough to hold the schema name an error 
+            is returned, the error message will communicate the 
+            required size. Upon success, the size of the returned 
+            schema name in bytes is returned via 'size'.
+            'property' argument must be an array of type text and 'size'
+            should be set to size of array in bytes by the caller.
+
+          OCI_OBJECTPROP_TABLE
+            This returns the table name in which the object exists. An 
+            error is returned if the given object points to a 
+            transient instance or a value. If the input buffer is not 
+            big enough to hold the table name an error is returned, 
+            the error message will communicate the required size. Upon 
+            success, the size of the returned table name in bytes is 
+            returned via 'size'. 'property' argument must be an array 
+            of type text and 'size' should be set to size of array in 
+            bytes by the caller.
+            
+          OCI_OBJECTPROP_PIN_DURATION
+            This returns the pin duration of the object.
+            An error is returned if the given object points to a value 
+            instance. Valid pin durations are: OCI_DURATION_SESSION and
+            OCI_DURATION_TRANS.
+            'property' argument must be a pointer to a variable of type 
+            OCIDuration.
+            
+          OCI_OBJECTPROP_ALLOC_DURATION
+            This returns the allocation duration of the object.
+            Valid allocation durations are: OCI_DURATION_SESSION and
+            OCI_DURATION_TRANS.
+            'property' argument must be a pointer to a variable of type 
+            OCIDuration.
+            
+          OCI_OBJECTPROP_LOCK
+            This returns the lock status of the 
+            object. The possible lock status is enumerated by OCILockOpt.
+            An error is returned if the given object points to a transient
+            or value instance.
+            'property' argument must be a pointer to a variable of 
+            type OCILockOpt.
+            Note, the lock status of an object can also be retrieved by
+            calling OCIObjectIsLocked().
+
+          OCI_OBJECTPROP_MARKSTATUS
+            This returns the status flag which indicates whether the
+            object is a new object, updated object and/or deleted object.
+            The following macros can be used to test the mark status
+            flag:
+
+              OCI_OBJECT_IS_UPDATED(flag)
+              OCI_OBJECT_IS_DELETED(flag)
+              OCI_OBJECT_IS_NEW(flag)
+              OCI_OBJECT_IS_DIRTY(flag)
+
+            An object is dirty if it is a new object or marked deleted or 
+            marked updated.
+            An error is returned if the given object points to a transient
+            or value instance. 'property' argument must be of type 
+            OCIObjectMarkStatus.
+            
+          OCI_OBJECTPROP_VIEW
+            This identifies whether the specified object is a view object
+            or not. If property value returned is TRUE, it indicates the
+            object is a view otherwise it is not.
+            'property' argument must be of type boolean.
+
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR. Possible errors are TBD
+ */
+
+/*---------------------------- OCIObjectIsLocked --------------------------*/
+sword OCIObjectIsLocked(    OCIEnv *env, OCIError *err, void  *ins,
+                              boolean *lock);
+/*
+   NAME: OCIObjectIsLocked - OCI get the lock status of a standalone object
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns
+                             OCI_ERROR.  The error recorded in 'err' can be
+                             retrieved by calling OCIErrorGet().
+        ins           (IN) - pointer to an instance
+        lock         (OUT) - return value for the lock status.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - If the object is referenceable, the specified object must be pinned.
+   DESCRIPTION:
+        This function returns the lock status of an instance. If the instance
+        is a value, this function always returns FALSE.
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------- OCIObjectIsDirty ------------------------------*/
+sword OCIObjectIsDirty(    OCIEnv *env, OCIError *err, void  *ins,
+                           boolean *dirty);
+/*
+   NAME: OCIObjectIsDirty - OCI get the dirty status of a standalone object
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns
+                             OCI_ERROR.  The error recorded in 'err' can be
+                             retrieved by calling OCIErrorGet().
+        ins           (IN) - pointer to an instance
+        dirty        (OUT) - return value for the dirty status.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - if instance is an object, the instance must be pinned.
+   DESCRIPTION:
+        This function returns the dirty status of an instance. If the instance
+        is a value, this function always returns FALSE.
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectPinTable -----------------------------*/
+sword OCIObjectPinTable(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                  const oratext *schema_name, 
+                  ub4 s_n_length, const oratext *object_name, ub4 o_n_length, 
+                  const OCIRef *scope_obj_ref, OCIDuration pin_duration, 
+                  void ** object    );
+/*
+   NAME: OCIObjectPinTable - OCI get table object 
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns 
+                             OCI_ERROR.  The error recorded in 'err' can be 
+                             retrieved by calling OCIErrorGet().
+        svc                     (IN) - OCI service context handle
+        schema_name   (IN, optional) - schema name of the table 
+        s_n_length    (IN, optional) - length of the schema name
+        object_name   (IN) - name of the table 
+        o_n_length    (IN) - length of the table name
+        scope_obj_ref (IN, optional) - reference of the scoping object
+        pin_duration  (IN) - pin duration. See description in OCIObjectPin(). 
+        object       (OUT) - the pinned table object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function pin a table object with the specified pin duration. 
+        The client can unpin the object by calling OCIObjectUnpin(). See 
+        OCIObjectPin() and OCIObjectUnpin() for more information about pinning
+        and unpinning. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------- OCIObjectArrayPin -------------------------------*/
+sword OCIObjectArrayPin(OCIEnv *env, OCIError *err, OCIRef **ref_array, 
+                  ub4 array_size, OCIComplexObject **cor_array,
+                  ub4 cor_array_size, OCIPinOpt pin_option, 
+                  OCIDuration pin_duration, OCILockOpt lock, 
+                  void  **obj_array, ub4 *pos    );
+/*
+   NAME: OCIObjectArrayPin - ORIO array pin 
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns 
+                             OCI_ERROR.  The error recorded in 'err' can be 
+                             retrieved by calling OCIErrorGet().
+        ref_array     (IN) - array of references to be pinned 
+        array_size    (IN) - number of elements in the array of references 
+        pin_option    (IN) - pin option. See OCIObjectPin().
+        pin_duration  (IN) - pin duration. See OCIObjectPin(). 
+        lock_option   (IN) - lock option. See OCIObjectPin().
+        obj_array    (OUT) - If this argument is not NULL, the pinned objects 
+                             will be returned in the array. The user must 
+                             allocate this array with element type being 
+                             'void *'. The size of this array is identical to
+                             'array'. 
+        pos          (OUT) - If there is an error, this argument will contain
+                             the element that is causing the error.  Note that
+                             this argument is set to 1 for the first element in
+                             the ref_array. 
+   REQUIRE:
+        - a valid OCI environment handle must be given.
+        - If 'obj_array' is not NULL, then it must already be allocated and
+             the size of 'obj_array' is 'array_size'. 
+   DESCRIPTION:
+        This function pin an array of references.  All the pinned objects are 
+        retrieved from the database in one network roundtrip.  If the user 
+        specifies an output array ('obj_array'), then the address of the 
+        pinned objects will be assigned to the elements in the array. See
+        OCIObjectPin() for more information about pinning.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------------------------------------------------------*/
+/*                           HEAP/CACHE OPERATIONS                           */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCICacheFlush ---------------------------------*/
+sword OCICacheFlush(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                  void  *context, OCIRef *(*get)(void  *context, ub1 *last),
+                  OCIRef **ref  );
+/*
+   NAME: OCICacheFlush - OCI flush persistent objects 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                      recorded in 'err' and this function returns 
+                      OCI_ERROR.  The error recorded in 'err' can be 
+                      retrieved by calling OCIErrorGet().
+        svc      (IN) [optional] - OCI service context.  If null pointer is
+                      specified, then the dirty objects in all connections
+                      will be flushed.
+        context  (IN) [optional] - specifies an user context that is an 
+                      argument to the client callback function 'get'. This 
+                      parameter is set to NULL if there is no user context.
+        get      (IN) [optional] - an client-defined function which acts an 
+                      iterator to retrieve a batch of dirty objects that need 
+                      to be flushed. If the function is not NULL, this function
+                      will be called to get a reference of a dirty object.  
+                      This is repeated until a null reference is returned by 
+                      the client function or the parameter 'last' is set to 
+                      TRUE. The parameter 'context' is passed to get() 
+                      for each invocation of the client function.  This 
+                      parameter should be NULL if user callback is not given.
+                      If the object that is returned by the client function is
+                      not a dirtied persistent object, the object is ignored.
+                      All the objects that are returned from the client
+                      function must be from newed or pinned the same service 
+                      context, otherwise, an error is signalled. Note that the 
+                      returned objects are flushed in the order in which they
+                      are marked dirty.
+        ref     (OUT) [optional] - if there is an error in flushing the 
+                      objects, (*ref) will point to the object that
+                      is causing the error.  If 'ref' is NULL, then the object 
+                      will not be returned.  If '*ref' is NULL, then a 
+                      reference will be allocated and set to point to the 
+                      object.  If '*ref' is not NULL, then the reference of
+                      the object is copied into the given space. If the
+                      error is not caused by any of the dirtied object,
+                      the given ref is initalized to be a NULL reference
+                      (OCIRefIsNull(*ref) is TRUE).
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function flushes the modified persistent objects from the 
+        environment heap to the server. The objects are flushed in the order 
+        that they are marked updated or deleted. 
+
+        See OCIObjectFlush() for more information about flushing.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCICacheRefresh -------------------------------*/
+sword OCICacheRefresh(OCIEnv *env, OCIError *err, const OCISvcCtx *svc,
+                  OCIRefreshOpt option, void  *context,
+                  OCIRef *(*get)(void  *context), OCIRef **ref);
+/*
+   NAME: OCICacheRefresh - OCI ReFreSh persistent objects 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns 
+                       OCI_ERROR.  The error recorded in 'err' can be 
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context.  If null pointer is
+                      specified, then the persistent objects in all connections
+                      will be refreshed. 
+        option   (IN) [optional] - if OCI_REFRESH_LOAD is specified, all
+                      objects that is loaded within the transaction are
+                      refreshed. If the option is OCI_REFERSH_LOAD and the
+                      parameter 'get' is not NULL, this function will ignore
+                      the parameter. 
+        context  (IN) [optional] - specifies an user context that is an 
+                      argument to the client callback function 'get'. This 
+                      parameter is set to NULL if there is no user context.
+        get      (IN) [optional] - an client-defined function which acts an 
+                      iterator to retrieve a batch of objects that need to be
+                      refreshed. If the function is not NULL, this function
+                      will be called to get a reference of an object.  If 
+                      the reference is not NULL, then the object will be 
+                      refreshed.  These steps are repeated until a null 
+                      reference is returned by this function.  The parameter
+                      'context' is passed to get() for each invocation of the
+                      client function.  This parameter should be NULL if user 
+                      callback is not given.
+        ref     (OUT) [optional] - if there is an error in refreshing the
+                      objects, (*ref) will point to the object that
+                      is causing the error.  If 'ref' is NULL, then the object
+                      will not be returned.  If '*ref' is NULL, then a
+                      reference will be allocated and set to point to the
+                      object.  If '*ref' is not NULL, then the reference of
+                      the object is copied into the given space. If the
+                      error is not caused by any of the object,
+                      the given ref is initalized to be a NULL reference
+                      (OCIRefIsNull(*ref) is TRUE).
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function refreshes all pinned persistent objects. All unpinned 
+        persistent objects are freed.  See OCIObjectRefresh() for more 
+        information about refreshing.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCICacheUnpin --------------------------------*/
+sword OCICacheUnpin(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc    );
+/*
+   NAME: OCICacheUnpin - OCI UNPin objects 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns 
+                       OCI_ERROR.  The error recorded in 'err' can be 
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context. If null pointer is
+                       specified, then the objects in all connections
+                       will be unpinned.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        If a connection is specified, this function completely unpins the 
+        persistent objects in that connection. Otherwise, all persistent 
+        objects in the heap are completely unpinned. All transient objects in 
+        the heap are also completely unpinned. See OCIObjectUnpin() for more 
+        information about unpinning.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*----------------------------- OCICacheFree --------------------------------*/
+sword OCICacheFree(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc    ); 
+/*
+   NAME: OCICacheFree - OCI FREe instances 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns 
+                       OCI_ERROR.  The error recorded in 'err' can be 
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context. If null pointer is
+                       specified, then the objects in all connections
+                       will be freed.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        If a connection is specified, this function frees the persistent 
+        objects, transient objects and values allocated for that connection.  
+        Otherwise, all persistent objects, transient objects and values in the 
+        heap are freed. Objects are freed regardless of their pin count.  See 
+        OCIObjectFree() for more information about freeing an instance.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*---------------------------- OCICacheUnmark -------------------------------*/
+sword OCICacheUnmark(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc    );
+/*
+   NAME: OCICacheUnmark - OCI Unmark all dirty objects
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns
+                       OCI_ERROR.  The error recorded in 'err' can be
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context. If null pointer is
+                       specified, then the objects in all connections
+                       will be unmarked. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        If a connection is specified, this function unmarks all dirty objects 
+        in that connection.  Otherwise, all dirty objects in the cache are
+        unmarked. See OCIObjectUnmark() for more information about unmarking
+        an object.
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+
+sword OCIDurationBegin(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                           OCIDuration parent, OCIDuration *dur    );
+/*
+   NAME: OCIDurationBegin - OCI DURATION BEGIN
+   PARAMETERS:
+        env  (IN/OUT) - OCI environment handle initialized in object mode
+                        This should be passed NULL, when cartridge services
+                        are to be used.
+        err  (IN/OUT) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                       OCIErrorGet().
+        svc  (IN/OUT) - OCI service handle.  
+        parent   (IN) - parent for the duration to be started.
+        dur     (OUT) - newly created user duration 
+   REQUIRES:
+        - a valid OCI environment handle must be given for non-cartridge
+          services.
+        - For cartridge services, NULL should be given for environment handle
+        - A valid service handle must be given in all cases.
+   DESCRIPTION:
+        This function starts a new user duration.  A user can have multiple
+        active user durations simultaneously. The user durations do not have
+        to be nested.
+ 
+        The object subsystem predefines 3 durations :
+          1) session     - memory allocated with session duration comes from
+                           the UGA heap (OCI_DURATION_SESSION). A session 
+                           duration terminates at the end of the user session.
+          2) transaction - memory allocated with transaction duration comes
+                           from the UGA heap (OCI_DURATION_TRANS). A trans-
+                           action duration terminates at the end of the user
+                           transaction.
+          3) call        - memory allocated with call duration comes from PGA
+                           heap (OCI_DURATION_CALL). A call duration terminates
+                           at the end of the user call.
+ 
+        Each user duration has a parent duration.  A parent duration can be a
+        predefined duration or another user duration.  The relationship between
+        a user duration and its parent duration (child duration) are:
+ 
+         1) An user duration is nested within the parent duration. When its
+             parent duration terminates, the user duration will also terminate.
+         2) The memory allocated with an user duration comes from the heap of
+             its parent duration. For example, if the parent duration of an
+             user duration is call, then the memory allocated with the user
+             duration will also come from the PGA heap.
+
+        This function can be used as both part of cartridge services as well 
+        as without cartridge services.
+        The difference in the function in the case of cartridge and 
+        non-cartridge services is:
+                In case of cartridge services, as descibed above a new user
+        duration is created as a child of the "parent" duration.
+                But when used for non-cartridge purposes, when a pre-defined
+        duration is passed in as parent, it is mapped to the cache duration
+        for that connection (which is created if not already present) and 
+        the new user duration will be child of the cache duration.
+
+   RETURNS:
+        if environment handle and service handle is null or if error 
+        handle is null return OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+
+sword OCIDurationEnd(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                         OCIDuration duration    );
+/*
+   NAME: OCIDurationEnd - OCI DURATION END
+   PARAMETERS:
+        env  (IN/OUT) - OCI environment handle initialized in object mode
+                        This should be passed NULL, when cartridge services
+                        are to be used.
+        err  (IN/OUT) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                       OCIErrorGet().
+        svc  (IN/OUT) - OCI service handle.  
+        dur     (OUT) - a previously created user duration using 
+                        OCIDurationBegin()
+   REQUIRES:
+        - a valid OCI environment handle must be given for non-cartridge
+          services.
+        - For cartridge services, NULL should be given for environment handle
+        - A valid service handle must be given in all cases.
+   DESCRIPTION:
+        This function terminates a user duration.  All memory allocated for
+        this duration is freed.
+
+        This function can be used as both part of cartridge services as well 
+        as without cartridge services.  In both cased, the heap duration
+        is freed and all the allocated memory for that duration is freed.
+        The difference in the function in the case of cartridge and 
+        non-cartridge services is:
+                In case of non-cartridge services, if the duration is pre-
+        defined, the associated cache duration (see OCIDurationBegin())
+        is also terminated and the following is done.
+          1) The child durations are terminated.
+          2) All objects pinned for this duration are unpinned.
+          3) All instances allocated for this duration are freed.
+
+                In case of cartridge services, only the heap duration is
+        freed.  All the context entries allocated for that duration are 
+        freed from the context hash table..
+
+   RETURNS:
+        if environment handle and service handle is null or if error 
+        handle is null return OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/******************************************************************************
+**          DO  NOT  USE  THE  FUNCTIONS  BELOW!                             **
+**          UNSUPPORTED INTERFACE                                            **
+**          WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                      **
+******************************************************************************/
+
+sword OCIDurationGetParent(    OCIEnv *env, OCIError *err, 
+                               OCIDuration duration, OCIDuration *parent    );
+
+sword OCIObjectAlwaysLatest(    OCIEnv *env, OCIError *err, void  *object    );
+
+sword OCIObjectNotAlwaysLatest(    OCIEnv *env, OCIError *err, 
+                                   void  *object    );
+
+sword OCIObjectFlushRefresh(    OCIEnv *env, OCIError *err, void  *object);
+
+sword OCIObjectIsLoaded(    OCIEnv *env, OCIError *err, void  *ins, 
+                              boolean *load);
+
+sword OCIObjectIsDirtied(    OCIEnv *env, OCIError *err, void  *ins,
+                              boolean *dirty);
+
+sword OCICacheGetObjects(       OCIEnv *env, OCIError *err,
+                                const OCISvcCtx *svc,
+                                OCIObjectProperty property,
+                                void  *client_context,
+                                void (*client_callback)(
+                                    void  *client_context,
+                                    void  *object  ));
+
+sword OCICacheRegister(      OCIEnv *env, OCIError *err,
+                             OCIObjectEvent event,
+                             void  *client_context,
+                             void (*client_callback)(
+                                    void  *client_context,
+                                    OCIObjectEvent event,
+                                    void  *object));
+
+sword OCICacheFlushRefresh(    OCIEnv *env, OCIError *err, 
+                               const OCISvcCtx *svc, void  *context,
+                               OCIRef *(*get)(void  *context, ub1 *last),
+                               OCIRef **ref    );
+
+sword OCIObjectSetData(OCIEnv *env, OCIError *err, void  *obj_hdr, 
+        void  *data);
+
+sword OCIObjectGetNewOID(OCIEnv *env, OCIError *err, OCISvcCtx *svc, 
+        ub1 *oid);
+
+
+#endif /* ORI_ORACLE */
diff --git a/sdk/include/orid.h b/sdk/include/orid.h
new file mode 100644
index 0000000..a105f64
--- /dev/null
+++ b/sdk/include/orid.h
@@ -0,0 +1,373 @@
+/* Copyright (c) 1994, 2006, Oracle. All rights reserved.  */
+
+/*
+  Author:             Tin Nguyen
+  Date:               02/07/94
+  Source documents:   "Functional Specification for C Object Interface, Object
+                       Management Subsystem", "Oracle C Coding Standards
+                       version 2.2", and the header file template
+  Rule sets:          the generic and .h file rule sets
+  Quality status:     not exited
+  Identification tag: [ one or more letters to identify the .h file ] 
+  Revision code:      [ date of the last revision of the .h file ]
+
+  Note to the user of this header file:
+
+    Anything in this header file that is marked private is not supported and
+    must not be used.  Private sections are included in the header file to 
+    improve internal maintenance.
+
+  NAME
+
+    ORID - Oracle Object Interface for Dynamic Data Access
+
+  DESCRIPTION
+
+    This file contains declarations for C object interface functions including
+    the dynamic object data access operations that allow callers to dynamically
+    access and manipulate objects; these operations include getting and setting
+    attributes of an object.  These dynamic object operations are for accessing
+    and manipulation objects whose types are not known at compile-time.
+
+  RELATED DOCUMENTS
+  
+     Functional Specification for C Object Interface / Object Management System
+
+  PUBLIC FUNCTIONS
+
+    OCIObjectSetAttr - ORID SET attribute value
+    OCIObjectGetAttr - ORID GET attribute value
+
+  PRIVATE FUNCTIONS
+
+    None
+
+  EXAMPLES 
+
+    EXAMPLE 1
+
+    /o
+     o This example illustrates how an interative program can use the dynamic
+     o attribute access to display and modify attributes of an ADT instance.
+     o The interactive program does not know the type of the object at 
+     o compile time.
+     o/
+
+    void display(adt_ref, object, null_struct, names, names_count, 
+                          names_length, indexes, indexes_count)
+    {
+      /o Pin the ADT o/
+      if (OCIObjectPin(env, &adt_ref, OROOPOCUR, OROOPDTRA, OROOLMNON, &adt) 
+            != OROSTASUC)
+         /o error handling code o/ 
+
+      /o 
+       o Call the type manager to obtain all the attributes in the object.
+       o Display the content of each attribute in the ADT instance. If the 
+       o attribute is an array, display each element of the array. If the
+       o attribute is an ADT instance, recursively call this routine to
+       o display the embedded ADT instance.
+       o/ 
+      numAttrs = OCITypeAttrs(env, adt);
+      for (i= 1; i <= numAttrs; i++)
+      {
+         /o get attribute descriptor o/
+         if (ortgabp(env, adt, i, &ado_ref, &ado) != OROSTASUC)
+           /o error handling code o/ 
+
+         /o get attribute name o/
+         names[names_count] = OCITypeElemName(env, ado, 
+                   &names_length[names_count]);
+      
+         /o dynamically get the attr o/
+         if (OCIObjectGetAttr(env, object, null_struct, 0, adt_ref, names, 
+                     names_length, names_count+1, indexes, indexes_count, 0, 
+                     &null, &null_info, &attr) != OROSTASUC)
+            /o error handling code o/  
+
+         /o check if attribute is null o/
+         if (null) continue;
+
+         /o get typecode of attribute o/
+         typecode = OCITypeElemTypeCode(env, ado);
+
+         /o if attribute is a varray, display each element in varray o/
+         if (typecode == OCI_TYPECODE_VARRAY)
+         {
+            /o get the reference to the type of the element of the array o/ 
+            if (OCITypeElemParameterizedTyper(env, ado, &attr_type_ref) 
+               != OROSTASUC)
+               /o error handling code o/ 
+
+            /o get the size of array o/
+            if (orlasiz(env, &attr_type_ref, (orlva *)attr,  
+                         &numElm) != OROSTASUC)
+               /o error handling code o/  
+
+            /o get the typecode of the element of the array o/
+            if (ortty2r(env, attr_type_ref, &typecode) != OROSTASUC)
+               /o error handling code o/  
+
+            /o iterate the array o/
+            for (j=0; j < numElm; j++)
+            {
+              /o get an element in the array o/
+              if (OCIObjectGetAttr(env, attr, null_info, j+1, attr_type_ref,
+                  names, names_length, 0, indexes, 0, 0, &null, &null_info, 
+                  &element) != OROSTASUC)
+                  /o error handling code o/  
+
+              /o check if element is null o/
+              if (null) continue;
+
+              /o if attr is an ADT instance, recursively call this routine o/
+              if (typecode == OCI_TYPECODE_ADT || typecode == 
+                  OCI_TYPECODE_UNNAMEDADT) 
+              {
+                /o display the element as an adt o/
+                display(attr_type_ref, element, null_info, names, lengths, 
+                   0, indexes, 0);
+              }
+      
+              /o if attribute is scalar, print the value to the screen o/
+              else output_to_screen(element, typecode);
+            }
+         }
+
+         /o if attribute is an ADT instance, recursively call this routine o/
+         else if (typecode == OCI_TYPECODE_ADT || typecode == 
+              OCI_TYPECODE_UNNAMEDADT)
+         {
+            /o get the type ref of the attribute o/
+            if (ortgarf(env, ado, &attr_type_ref) != OROSTASUC)
+               /o error handling code o/ 
+
+             display(attr_type_ref, attr, null_info, 0, names, 0, names_length,
+                      indexes, 0);
+         }
+
+         /o if attribute is scalar, print the value to the screen o/
+         else output_to_screen(attr, typecode);
+      }
+    }
+
+    /o ******** main routine *********** o/
+    .... 
+
+    /o 
+     o Allocate the arrays for storing the path expression 
+     o/
+
+    /o get the tdo of type 'long' o/
+    if (orttypget(&env, con, "SYS", sizeof("SYS"), "SINT32", sizeof("SINT32"), 
+          OROOPDSES, &long_ref, &long_tdo) != OROSTASUC)
+          /o error handling code o/
+
+    /o get the tdo of type 'varchar' o/
+    if (orttypget(&env, con, "SYS", sizeof("SYS"), "SQL_VARCHAR2", 
+          sizeof("SQL_VARCHAR2"), OROOPDSES, &vchar_ref, &vchar_tdo) 
+          != OROSTASUC)
+          /o error handling code o/
+
+    /o allocate the varrays for the path expression o/ 
+    if (orlalloc(env, &vchar_ref, MAX_ARR_SIZE, &attr_names) != OROSTASUC)
+       /o error handling code o/ 
+
+    if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_lengths) 
+                != OROSTASUC)
+       /o error handling code o/ 
+
+    if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_indexes) 
+                != OROSTASUC)
+       /o error handling code o/ 
+
+    /o 
+     o Get an ADT instance. The ref to the ADT instance can be obtained
+     o by through ORI or OSCI. 
+     o/
+    if (OCIObjectPin(env, &obj_ref, OROOPOCUR, OROOPDTRA, OROOLMUPD, &object) 
+          != OROSTASUC)
+       /o error handling code o/ 
+
+    /o get the null structure of the ADT instance o/
+    if (OCIObjectGetInd(gp, object, &null_struct) != OROSTASUC)
+       /o error handling code o/ 
+
+    /o 
+     o Get the type of the ADT instance
+     o/
+
+    /o find out the type of the ADT instance o/
+    if (oriogto(env, object, &adt_ref) != OROSTASUC)
+       /o error handling code o/ 
+
+    /o display the object o/
+    display(adt_ref, object, null_struct, attr_names, 0, attr_names_lengths,
+                     attr_names_indexes, 0);
+
+    /o After the object is displayed, the program waits for the user to 
+     o respond.  The user modifies the values of an attribute and the
+     o program generates a path expression for the attribute and calls 
+     o OCIObjectSetAttr() to set the value. 
+     o/
+
+    if (OCIObjectSetAttr(env, object, null_struct, adt_ref, 
+                (text **)attr_names, (ub4 *)attr_name_lengths, 
+                attr_names_count, (ub4 *)attr_array_indexes, 
+                attr_array_indexes_count, 
+                (void *)0, FALSE, (void *)value) != OROSTASUC)
+       /o error handling code o/ 
+
+    END OF EXAMPLE 1
+
+  NOTES
+
+    This file has been subsetted to contain only the routines that will
+    be in the first release.
+
+  MODIFIED
+    dmukhin    06/29/05  - ANSI prototypes; miscellaneous cleanup 
+    srseshad   03/12/03  - convert oci public api to ansi
+    aahluwal   06/03/02  - bug 2360115
+    bpalaval   02/09/01  - Change text to oratext.
+    whe        09/01/99 -  976457:check __cplusplus for C++ code
+    sthakur    09/18/97 -  collection indexing not supported
+    cxcheng    08/05/97 -  fix compile with short names
+    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
+    cxcheng    10/17/96 -  final renaming of functions
+    jboonleu   10/07/96 -  beautify with OCI long names
+    cxcheng    10/07/96 -  change short names to long names for readability
+    jboonleu   09/27/96 -  fix lint
+    jwijaya    07/03/96 -  add ANSI prototypes
+    jboonleu   04/13/95 -  new interface
+    jwijaya    10/11/94 -  fix the sccs header and add namespace
+    tanguyen   08/22/94 -  fix example 
+    tanguyen   08/09/94 -  remove Sccsid declaration 
+    tanguyen   07/20/94 -  fix OCIObjectSetAttr and OCIObjectGetAttr to 
+                           use position descriptor 
+    tanguyen   07/18/94 -  change 'object' type to become ptr to object 
+    tanguyen   06/30/94 -  Fix the ORID_ORACLE ifdef 
+    tanguyen   06/27/94 -  update to template format 
+    skotsovo   05/12/94 -  replace ado with attribute position 
+    jweisz     05/11/94 -  test new checkin facility 
+    jwijaya    05/05/94 - orienv/ref/typ -> oroenv/ref/typ
+    jwijaya    02/07/94 - Creation
+
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORID_ORACLE
+#define ORID_ORACLE
+
+#ifdef SLSHORTNAME
+
+#define OCIObjectSetAttr oridset
+#define OCIObjectGetAttr oridget
+
+#endif /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------*/
+/*                           PUBLIC FUNCTIONS                                */
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------- OCIObjectSetAttr ----------------------------*/
+sword OCIObjectSetAttr(    OCIEnv *env, OCIError *err, void  *instance, 
+                  void  *null_struct, struct OCIType *tdo, 
+                  const oratext **names, const ub4 *lengths, 
+                  const ub4 name_count, const ub4 *indexes, 
+                  const ub4 index_count, const OCIInd null_status, 
+                  const void  *attr_null_struct, const void  *attr_value    );
+/*
+   NAME: OCIObjectSetAttr - ORID SET value
+   PARAMETERS:
+        env  (IN) - OCI environment handle initialized in object mode
+        err  (IN) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                        OCIErrorGet().
+        instance    (IN) - pointer to an ADT instance
+        null_struct (IN) - the null structure of the ADT instance or array
+        tdo         (IN) - pointer to the TDO
+        names       (IN) - array of attribute names. This is used to specify
+                           the names of the attributes in the path expression.
+        lengths     (IN) - array of lengths of attribute names.
+        name_count  (IN) - number of element in the array 'names'.
+        indexes     (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
+        index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
+        attr_null_status (IN) - the null status of the attribute if the type of
+                                 attribute is primitive.
+        attr_null_struct (IN) - the null structure of an ADT or collection
+                                 attribute.
+        attr_value       (IN) - pointer to the attribute value.
+   REQUIRES:
+   DESCRIPTION:
+        This function set the attribute of the given object with the given 
+        value.  The position of the attribute is specified as a path 
+        expression which is an array of names and an array of indexes. 
+   RETURNS:
+        one of OROSTA*
+   EXAMPLES:
+        For path expression stanford.cs.stu[5].addr, the arrays will look like
+          names = {"stanford", "cs", "stu", "addr"} 
+          lengths = {8, 2, 3, 4}
+          indexes = {5}
+        
+        Also see the above example.
+ */
+
+/*-------------------------- OCIObjectGetAttr ----------------------------*/
+sword OCIObjectGetAttr(    OCIEnv *env, OCIError *err, void  *instance, 
+                  void  *null_struct, struct OCIType *tdo, 
+                  const oratext **names, const ub4 *lengths, 
+                  const ub4 name_count, const ub4 *indexes, 
+                  const ub4 index_count, OCIInd *attr_null_status, 
+                  void  **attr_null_struct, void  **attr_value, 
+                  struct OCIType **attr_tdo    );
+/*
+   NAME: OCIObjectGetAttr - ORID GET value
+   PARAMETERS:
+        env  (IN) - OCI environment handle initialized in object mode
+        err  (IN) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                        OCIErrorGet().
+        instance    (IN) - pointer to an ADT instance 
+        null_struct (IN) - the null structure of the ADT instance or array
+        tdo         (IN) - pointer to the TDO 
+        names       (IN) - array of attribute names. This is used to specify
+                           the names of the attributes in the path expression.
+        lengths     (IN) - array of lengths of attribute names. 
+        name_count  (IN) - number of element in the array 'names'.
+        indexes     (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
+        index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
+        attr_null_status (OUT) - the null status of the attribute if the type 
+                                 of attribute is primitive. 
+        attr_null_struct (OUT) - the null structure of an ADT or collection
+                                 attribute.
+        attr_value       (OUT) - pointer to the attribute value.
+        attr_tdo         (OUT) - pointer to the TDO of the attribute.
+   REQUIRES:
+      - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function gets a value from an ADT instance or from an array.
+        If the parameter 'instance' points to an ADT instance, then the path
+        expression specifies the location of the attribute in the ADT. 
+        It is assumed that the object is pinned and that the value returned 
+        is valid until the object is unpinned.
+   RETURNS:
+        one of OROSTA*
+   EXAMPLES:
+        See example in OCIObjectSetAttr(). Also see the above example.
+ */
+
+#endif /* ORID_ORACLE */
diff --git a/sdk/include/orl.h b/sdk/include/orl.h
new file mode 100644
index 0000000..5aa3d88
--- /dev/null
+++ b/sdk/include/orl.h
@@ -0,0 +1,3633 @@
+/* Copyright (c) 1993, 2006, Oracle. All rights reserved.  */
+
+/*
+  Author:             Srinath Krishnaswamy
+  Date:               11/24/93
+  Source documents:   "Functional Specification for C Language Mapping of
+                      OTS Types, Object Management Subsystem", "Oracle C
+                      Coding Standards version 2.2", and the header file
+                      template
+  Rule sets:          the generic and .h file rule sets
+  Quality status:     not exited
+  Identification tag: [ one or more letters to identify the .h file ]
+  Revision code:      11/24/93
+ 
+  NAME
+
+    ORL - ORacle's external C Language interface to primitive OTS types
+ 
+  DESCRIPTION
+
+    This header file contains C langauge interface to the OTS primitive
+    types. The interface includes C mapping of OTS primitive types and
+    the prototype of the pre-defined operations on the primitive types.
+ 
+    ***********************************************************************
+    *** NOTE: The OCI functions for objects requires the                ***
+    ***       application to be running in OBJECT mode. That is, during ***
+    ***       process initialization OCIInitialize(), the mode          ***
+    ***       specified should be OBJECT mode.                          ***
+    **                OCIInitialize(OCI_OBJECT, ..);                    ***
+    ***********************************************************************
+
+  RELATED DOCUMENTS
+
+    [1] Krishnaswamy, Srinath and Nguyen, Tin A., "Functional Specification
+        for C Language Mapping of OTS Types, Object Management Subsystem",
+        March 1994.
+    [2] Nguyen, Tin A., "The Open Type System", Oracle Corporation,
+        February 1994.
+    [3] Klein, Jonathan D., "Large Field Management", Oracle Corporation,
+        October 1993.
+ 
+  PUBLIC FUNCTIONS
+ 
+    OCI - OCI functions to manipulate Oracle Number, float and decimal
+      ARITHMETIC
+        OCINumberInc - OCINumber INCrement (optimized)
+        OCINumberDec - OCINumber DECrement (optimized)
+        OCINumberAdd - OCINumber ADD numbers
+        OCINumberSub - OCINumber SUBtract numbers
+        OCINumberMul - OCINumber MULtiply numbers
+        OCINumberDiv - OCINumber DIVide numbers
+        OCINumberMod - OCINumber MODulo division
+        OCINumberIntPower - OCINumber integer PoWeR
+        OCINumberShift - OCINumber decimal ShiFT number
+        OCINumberNeg - OCINumber NEGate number
+        OCINumberAbs - OCINumber ABSolute value
+        OCINumberCeil - OCINumber CEiling of number
+        OCINumberFloor - OCINumber FLooR of number
+        OCINumberSqrt - OCINumber SQuare Root of number
+        OCINumberSign - OCINumber get SIGN of number
+      NATIVE TYPE CONVERSION
+        OCINumberToInt  - OCINumber convert number TO machine-format Integer
+        OCINumberFromInt - OCINumber convert machine-format Integer TO Number
+        OCINumberToReal  - OCINumber convert number TO machine-format Real
+        OCINumberToRealArray  - OCINumber convert array of numbers TO
+                                machine-format Real
+        OCINumberFromReal - OCINumber convert machine-format Real TO Number
+      TEXT STRING CONVERSION
+        OCINumberToText  - OCINumber convert number TO String
+        OCINumberFromText - OCINumber convert String TO Number
+      COMPARISON
+        OCINumberCmp - OCINumber CoMPare numbers
+        OCINumberIsZero - OCINumber comparison with ZERo
+        OCINumberIsInt - OCINumber Is an Integer
+      ASSIGNMENT
+        OCINumberAssign - OCINumber ASsiGn number
+        OCINumberSetZero - OCINumber Set number to Zero value
+        OCINumberSetPi - OCINumber Set number to Pi
+      ROUNDING
+        OCINumberTrunc - OCINumber TRUncate an Oracle number
+        OCINumberRound - OCINumber ROUnd number
+        OCINumberPrec - OCINumber round to Precision digits
+      TRANSCENDENTAL
+        OCINumberSin - OCINumber SINe
+        OCINumberArcSin - OCINumber Arc SINe
+        OCINumberHypSin - OCINumber SiNe Hyperbolic
+        OCINumberCos - OCINumber COSine
+        OCINumberArcCos - OCINumber Arc COSine
+        OCINumberHypCos - OCINumber CoSine Hyperbolic
+        OCINumberTan - OCINumber TANgent
+        OCINumberArcTan - OCINumber Arc TANgent
+        OCINumberArcTan2 - OCINumber Arc TaNgent 2
+        OCINumberHypTan - OCINumber TaNgent Hyperbolic
+        OCINumberPower - OCINumber arbitrary Base EXponentiation
+        OCINumberExp - OCINumber EXPonentiation to base e
+        OCINumberLn  - OCINumber Logarithm Natural
+        OCINumberLog - OCINumber LOGarithm to arbitrary base
+
+    OCIDate - OCI functions to manipulate OCI Date
+      OCIDateToExternal - OCIDate convert date to external form
+      OCIDateFromExternal - OCIDate convert external form of date into OCIDate
+      OCIDateAssign - OCIDate Assignment
+      OCIDateToText  - OCIDate convert date TO String
+      OCIDateFromText - OCIDate convert String TO Date
+      OCIDateZoneToZone - OCIDate convert date from one time 
+                        Zone TO another Zone
+      OCIDateCompare - OCIDate CoMPare dates
+      OCIDateAddMonths - OCIDate ADd or subtract Months
+      OCIDateAddDays - OCIDate ADd or subtract Days
+      OCIDateLastDay - OCIDate get date of LaST day of month
+      OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+      OCIDateNextDay - OCIDate get date of Next DaY
+      OCIDateCheck - OCIDate CHecK if the given date is valid
+      OCIDateSysDate - OCIDate get current SYStem date and time
+
+    OCIString - OCI String functions to manipulate Variable-length string
+      OCIStringAssign - OCIString Assign string to string
+      OCIStringAssignText - OCIString Assign Text string to string
+      OCIStringResize - OCIString ReSiZe string
+      OCIStringSize - OCIString get String Size
+      OCIStringPtr - OCIString get String PoinTeR
+      OCIStringAllocSize - OCIString get Allocated SiZe
+ 
+    OCIRaw - OCI Raw functions to manipulate variable-length raW
+      OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to raw
+                        (of type OCIRaw*)
+      OCIRawResize - OCIRaw Resize raw
+      OCIRawSize - OCIRaw get Raw Size
+      OCIRawPtr  - OCIRaw get Raw data Pointer
+      OCIRawAllocSize - OCIRaw get Allocated Size
+
+    OCIColl - OCI Collection generic functions. These functions can be 
+                used to manipulate both variable-length array (varray) and 
+                nested table.
+      OCICollSize  - OCIColl return current SIZe of the given collection
+                (in number of elements)
+      OCICollMax  - OCIColl return the MAXimum number of elements in the
+                collection (i.e. upper-bound)
+      OCICollGetElem  - OCIColl GET pointer to the element at the given 
+                position
+      OCICollAssignElem  - OCIColl assign to element at given index
+      OCICollAssign  - OCIColl ASsiGn collection; perform deep-copy of source 
+                collection to target collection
+      OCICollAppend  - OCIColl aPPend the given element to the end of the
+                collection
+      OCICollTrim  - OCIColl trim (delete) the given number of elements 
+                from the end of the collection
+      OCICollIsLocator - OCIColl indicates whether a collection is locator
+                         based or not.
+      OCIIterCreate  - OCIColl Create an ITerator to scan the collection 
+                elements
+      OCIIterDelete  - OCIColl Delete ITerator
+      OCIIterInit  - OCIColl Initialize ITerator to scan the given collection
+      OCIIterGetCurrent - OCIColl Iterator based, get CURrent 
+                collection element
+      OCIIterNext - OCIColl Iterator based, get NeXT collection element
+      OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+ 
+      OCITable - OCI functions to manipulate nested Table. The OCIColl*() and 
+                OCITable*() functions can be used to manipulate nested table
+      OCITableDelete(i) - OCITable if element(i) exists then the element is 
+                marked as deleted else the function returns false. So 
+                delete's create "holes".
+      OCITableExists(i) - OCITable return true iff an element at
+                position i EXIsts
+      OCITableFirst  - OCITable return the smallest value of i for which
+                exists(i) is true.
+      OCITableLast  - OCITable return the largest value of i for which 
+                exists(i) is true.
+      OCITableNext(i) - OCITable return pointer to the smallest position j, 
+                greater than i, such that OCITableExists(j) is true
+      OCITablePrev(i) - OCITable return pointer to the largest position j,
+                less than i, such that OCITableExists(j) is true
+      OCITableSize - OCITable return current SIZe of the given nested table not
+                including deleted elements
+
+    OCIRef - OCI functions to manipulate object Reference
+      OCIRefClear  - OCIRef CLeaR or nullify a ref
+      OCIRefAssign  - OCIRef ASsiGn a ref to another
+      OCIRefIsEqual  - OCIRef compare two refs for EQUality
+      OCIRefIsNull  - OCIRef test if a ref is NULl 
+      OCIRefFromHex  - OCIRef convert a Hexadecimal string TO a Ref
+      OCIRefToHex   - OCIRef convert a ref to a Hexadecimal string
+      OCIRefHexSize  - OCIRef get size of buffer in bytes to store hexadecimal
+                string
+
+  OBSOLETE: to be replaced by functions from oci.h:
+
+    ORLL - ORL functions to manipulate lob Locators
+      orllasg   - ORLL AsiGn one locator to another
+      orllequ   - ORLL compare two locators for EQUality
+      orlliini  - ORLL Is the locator INItialized?
+      orllgsz   - ORLL Get locator SiZe
+      orllgcid  - ORLL Get Character set ID
+
+      NOTE: The following are specific to FILE lobs:
+
+      orllsnm - ORLL Set directory alias and file NaMe in the locator
+      orllgnm - ORLL Get directory alias and file NaMe from the locator
+ 
+  EXAMPLES
+
+    Examples are given in the description of each function where
+    relevant.
+ 
+  NOTES
+
+    This file has been subsetted to contain ONLY the routines that will
+    be in the first release.
+ 
+  QUESTIONS
+     
+  MODIFIED
+    bkhaladk   08/01/05 - add defn for OCIBinXmlReposCtx 
+    dmukhin    06/29/05 - ANSI prototypes; miscellaneous cleanup 
+    srseshad   03/12/03 - convert oci public api to ansi
+    rpingte    11/21/02 - Add OCICollGetElemArray and OCINumberToRealArray
+    aahluwal   06/03/02 - bug 2360115
+    gayyappa   02/01/02 - fix 2210776 : change Dom to DOM 
+    whe        09/25/01 - add OCIXMLType & OCIDomDocument opaque types
+    bpalaval   02/09/01   - Change text to oratext.
+    rkasamse   09/20/99 -   lint changes
+    whe        09/01/99 -   976457:check __cplusplus for C++ code
+    hsbedi     08/11/99 -   Add macro
+    rxgovind   10/14/98 -  make non exposed calls (OCIRowType etc) private
+    rxgovind   06/09/98 -  update OCIRowTypeCreate
+    nmantrav   05/11/98 -  add OCIRowTypeGetCount
+    rxgovind   03/29/98 -  add OCIRowType and OCIRowData interfaces
+    jwijaya    05/06/98  - add OCICollIsLocator                                
+    rxgovind   03/18/98 -  opaque types: move to kolo.h
+    etucker    02/02/98 -  add comments for Dec and Inc
+    etucker    01/29/98 -  Finish core5 integration
+    rxgovind   11/11/97 -  opaque types
+    etucker    10/28/97 -  add ORLN functions for SDK
+    cxcheng    07/28/97 -  remove OCILobLocator #define
+    skmishra   05/13/97 -  stdcc compatibility changes
+    skrishna   04/25/97 -  rename OCINumber*(): Exp Power TanHyp Zero Init
+                           TanToArc Sqr Truncate and Compare 
+    skotsovo   03/31/97 -  remove OCILobLocatorSize
+    skrishna   03/25/97 -  remove orld2i and orldi2d
+    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
+    skrishna   01/06/97 -  update OCITableSize() comments
+    skrishna   12/27/96 -  fix OCIDateGet/OCIDateSet
+    skrishna   12/12/96 -  update OCICollGelElem comments
+    skrishna   11/07/96 -  OCICollGetElem: interface change
+    skrishna   11/05/96 -  add OCIDate Get/Set and OCIDateAssign
+    cxcheng    10/31/96 -  change OCINumberTanHyp to OCINumberHypTan
+    cxcheng    10/30/96 -  #define orll short names to long names
+    dchatter   10/26/96 -  fix some OCI file long names
+    cxcheng    10/24/96 -  remove unnecessary comment in front
+    cxcheng    10/14/96 -  disable long name mapping for LOB functions
+    skrishna   10/13/96 -  continue beautification
+    skotsovo   10/16/96 -  update ocilob names
+    cxcheng    10/09/96 -  add structure members in #define for date/time
+    cxcheng    10/09/96 -  more lint fixes
+    skrishna   10/09/96 -  continue beautification
+    cxcheng    10/09/96 -  more fixes
+    skrishna   10/09/96 -  change fixed-char rep. to orlvstr*
+    jwijaya    10/08/96 -  continue beautification
+    jwijaya    10/07/96 -  beautify
+    cxcheng    10/07/96 -  more changes
+    cxcheng    10/04/96 -  replace short names with long names
+    skrishna   10/01/96 -  orlcsiz, orltsiz: change prototype to take errhdl
+    skrishna   09/23/96 -  fix lint errors
+    skotsovo   09/23/96 -  remove orllmkcur().
+    jwijaya    09/17/96 -  comments on null ref
+    skrishna   09/19/96 -  change orlraw format
+    skotsovo   09/19/96 -  add orlliini and remove orllnul
+    skrishna   08/14/96 -  orlvstr: change format to ub4 followed by text
+    jboonleu   08/06/96 -  update comment
+    skotsovo   08/08/96 -  revert to locators instead of descriptors as input t
+    jboonleu   07/23/96 -  remove orlrcur
+    skrishna   07/06/96 -  add orltsiz
+    skrishna   07/05/96 -  add orld2i and orldi2d
+    jwijaya    07/03/96 -  add ANSI prototypes
+    skrishna   06/27/96 -  document default string format in orlds2d & orld2s
+    skrishna   06/25/96 -  change max date value
+    skrishna   06/18/96 -  modify orld2s() comments
+    skotsovo   06/13/96 -  orll functions take lob descriptors instead of locat
+    rxgovind   06/05/96 -  change prototype of orlrcur to take ocienvh
+    skrishna   05/30/96 -  support collection trimming
+    skrishna   05/30/96 -  remove orlralo/fre and orllalo/fre instead use 
+                           orionew/fre
+    skrishna   05/28/96 -  add orlt*() and modify orla*()
+    skotsovo   05/23/96 -  add orlbl typedefs for pro*c
+    jboonleu   05/14/96 -  add orlrcur
+    rxgovind   05/08/96 -  changes for 3gl callbacks
+    skotsovo   05/01/96 -  in orllasg, no need to alloc orlbl*
+    skrishna   04/21/96 -  merge changes from 960418 object branch into big
+    skrishna   04/17/96 -  rename orlrcpy to orlrasg
+    skrishna   04/12/96 -  add orlr2h and orlrh2r functions
+    skotsovo   04/15/96 -  add fnt to make the lob locator current
+    skrishna   04/08/96 -  change orl*() to take ocienvh* and ocierrh* instead
+                           of oroenv*
+    skotsovo   03/22/96 -  add locator functions
+    skotsovo   03/22/96 -  add locator functions
+    skrishna   02/27/96 -  remove mlslabel interface
+    skotsovo   02/20/96 -  remove orlbty and use dty type instead.
+    skotsovo   02/14/96 -  add text file lobs.
+    skrishna   01/31/96 -  update comments of orln2r, orldchk, orlds2d & orld2s
+    skrishna   01/31/96 -  change orld2s() and orln2s() to return string length
+    skrishna   01/21/96 -  remove old raw interface 
+    skrishna   12/14/95 -  add raw interface
+    skotsovo   01/03/96 -  change LOB offsets and lengths from ub4 to ubig_ora
+                           to support 64 bit machines.
+    skotsovo   10/30/95 -  add orlblsiz() to get lob locator size
+    skrishna   10/24/95 -  move ref functions from ori and update the ref
+                           functions to support variable-length ref
+    cxcheng    10/20/95 -  add more comments on number versions
+    cxcheng    10/13/95 -  add more number functions
+    cxcheng    08/29/95 -  Support for segmented varrays
+    cxcheng    08/18/95 -  modifiy orlmls structure
+    skrishna   06/06/95 -  rename orln, orld, orlvs and orlva to orlnum,
+                           orldat, orlvstr and orlvary respectively 
+    skrishna   11/15/94 -  remove orlnget() function 
+    skrishna   09/20/94 -  modify orldbtw() to return number of days only 
+    skrishna   08/24/94 -  change format string length type from ub4 to ub1 
+    skrishna   07/19/94 -  Rename orln2c & orlnc2n to orln2s & orlns2n 
+    skrishna   06/29/94 -  Add blob interface; add examples 
+    skrishna   06/23/94 -  Update comments and format 
+    skrishna   05/19/94 -  update varray append comments 
+    skrishna    05/05/94 -  Subsetting 
+    skrishna    11/24/93 -  Creation
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORL_ORACLE
+#define ORL_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCIArray                        orlvary
+#define OCIColl                         orlcol
+#define OCICollAppend                   orlcapp
+#define OCICollAssign                   orlcasg
+#define OCICollAssignElem               orlcase
+#define OCICollGetElem                  orlcget
+#define OCICollGetElemArray             orlcgeta
+#define OCICollMax                      orlcmax
+#define OCICollSize                     orlcsiz
+#define OCICollTrim                     orlctrm
+#define OCICollIsLocator                orlcilc
+#define OCIDate                         orldat
+#define OCIDateAddDays                  orldadd
+#define OCIDateAddMonths                orldadm
+#define OCIDateCheck                    orldchk
+#define OCIDateCompare                  orldcmp
+#define OCIDateDD                       day_orldat
+#define OCIDateDaysBetween              orldbtw
+#define OCIDateFromText                 orlds2d
+#define OCIDateLastDay                  orldlst
+#define OCIDateMM                       mon_orldat
+#define OCIDateNextDay                  orldndy
+#define OCIDateSysDate                  orldsys
+#define OCIDateTime                     time_orldat
+#define OCIDateYYYY                     gye_orldat
+#define OCIDateZoneToZone               orldz2z
+#define OCIIter                         orlcitr
+#define OCIIterCreate                   orlccit
+#define OCIIterDelete                   orlcdit
+#define OCIIterGetCurrent               orlcicur
+#define OCIIterInit                     orlciit
+#define OCIIterNext                     orlcinxt
+#define OCIIterPrev                     orlciprv
+#define OCINumber                       orlnum
+#define OCINumberAbs                    orlnabs
+#define OCINumberAdd                    orlnadd
+#define OCINumberArcCos                 orlnacos
+#define OCINumberArcSin                 orlnasin
+#define OCINumberArcTan                 orlnatan
+#define OCINumberAssign                 orlnasg
+#define OCINumberCeil                   orlncel
+#define OCINumberCos                    orlncos
+#define OCINumberDiv                    orlndiv
+#define OCINumberPower                  orlnbex
+#define OCINumberFloor                  orlnflr
+#define OCINumberFromInt                orlni2n
+#define OCINumberFromReal               orlnr2n
+#define OCINumberFromText               orlns2n
+#define OCINumberHypCos                 orlncsh
+#define OCINumberHypSin                 orlnsnh
+#define OCINumberSetZero                orlnini
+#define OCINumberSetPi                  orlnspi
+#define OCINumberInc                    orlninc
+#define OCINumberDec                    orlndec
+#define OCINumberIntPower               orlnpwr
+#define OCINumberLn                     orlnln
+#define OCINumberLog                    orlnlog
+#define OCINumberMod                    orlnmod
+#define OCINumberMul                    orlnmul
+#define OCINumberNeg                    orlnneg
+#define OCINumberPart                   orlnpart
+#define OCINumberExp                    orlnexp
+#define OCINumberRound                  orlnrou
+#define OCINumberPrec                   orlnpre
+#define OCINumberShift                  orlnsft
+#define OCINumberSign                   orlnsgn
+#define OCINumberSin                    orlnsin
+#define OCINumberSqrt                   orlnsqr
+#define OCINumberSub                    orlnsub
+#define OCINumberTan                    orlntan
+#define OCINumberHypTan                 orlntnh
+#define OCINumberArcTan2                orlnatn2
+#define OCINumberToInt                  orln2i
+#define OCINumberToReal                 orln2r
+#define OCINumberToRealArray            orln2ra
+#define OCINumberToText                 orln2s
+#define OCINumberTrunc                  orlntru
+#define OCINumberCmp                    orlncmp
+#define OCINumberIsZero                 orlnzer
+#define OCINumberIsInt                  orlnint
+#define OCIRaw                          orlraw
+#define OCIRawAllocSize                 orlwasz
+#define OCIRawAssignBytes               orlwabr
+#define OCIRawAssignRaw                 orlwarr
+#define OCIRawPtr                       orlwgrp
+#define OCIRawResize                    orlwrsz
+#define OCIRawSize                      orlwgsz
+#define OCIRefAssign                    orlrasg
+#define OCIRefClear                     orlrclr
+#define OCIRefFromHex                   orlrh2r
+#define OCIRefHexSize                   orlrhsz
+#define OCIRefIsEqual                   orlrequ
+#define OCIRefIsNull                    orlrnul
+#define OCIRefToHex                     orlr2h
+#define OCIString                       orlvstr
+#define OCIStringAllocSize              orlvasz
+#define OCIStringAssign                 orlvass
+#define OCIStringAssignText             orlvats
+#define OCIStringPtr                    orlvgsp
+#define OCIStringResize                 orlvrsz
+#define OCIStringSize                   orlvgsz
+#define OCITable                        orltbl
+#define OCITableDelete                  orltdel
+#define OCITableExists                  orltexi
+#define OCITableFirst                   orltfst
+#define OCITableLast                    orltlst
+#define OCITableNext                    orltnxt
+#define OCITablePrev                    orltprv
+#define OCITableSize                    orltsiz
+#define OCITime                         orldtm
+#define OCITimeHH                       orldtmhh
+#define OCITimeMI                       orldtmmm
+#define OCITimeSS                       orldtmss
+#define OCI_LOBMODE_READONLY            ORLBMORO
+#define OCI_LOBMODE_READWRITE           ORLBMORW
+
+#endif                                                        /* SLSHORTNAME */
+
+/*****************************************************************************/
+/*                         NUMBER/FLOAT/DECIMAL TYPE                         */
+/*****************************************************************************/
+
+#define OCI_NUMBER_SIZE 22
+struct OCINumber
+{
+  ub1 OCINumberPart[OCI_NUMBER_SIZE];
+};
+typedef struct OCINumber OCINumber;
+
+/* 
+ * OCINumber - OCI Number mapping in c
+ *
+ * The OTS types: NUMBER, NUMERIC, INT, SHORTINT, REAL, DOUBLE PRECISION,
+ * FLOAT and DECIMAL are represented by OCINumber.
+ * The contents of OCINumber is opaque to clients. 
+ *
+ * For binding variables of type OCINumber in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_VNU.
+ */
+
+/*
+   EXAMPLE 
+
+   The following example shows how to manipulate an attribute of type 
+   oracle number.
+  
+     struct person
+     {
+       OCINumber sal;
+     };
+     typedef struct person person;
+
+     OCIError *err;
+     person* joe;
+     person* tom;
+     person* debbie;
+     OCINumber  *joesal;
+     OCINumber  *tomsal;
+     OCINumber *debsal;
+     sword   status;
+     int     inum;
+     double  dnum;
+     OCINumber ornum;
+     char    buffer[21];
+     ub4     buflen;
+     sword   result;
+     
+     /o See oci.h for an example of how to initialize OCIError.
+      o For this example, assume the OCIEnv and OCIError has been
+      o initialized.
+      o/
+
+     /o Pin joe, tom and debbie person objects in the object cache. See ori.h
+      o for an example on pinning objects. For this example, assume that
+      o joe, tom and debbie are pointing to pinned objects.
+      o/
+     joesal = &joe->sal;
+     tomsal = &tom->sal;
+     debsal = &debbie->sal;
+
+     /o initialize joe's salary to be $12,000 o/
+     inum = 12000;
+     status = OCINumberFromInt(err, &inum, sizeof(inum), OCI_NUMBER_SIGNED,
+                               joesal);
+     if (status != OCI_SUCCESS)
+                              /o goto to handle error from OCINumberFromInt o/;
+
+     /o initialize tom's salary to be same as joe o/
+     OCINumberAssign(err, joesal, tomsal);
+
+     /o initialize debbie's salary to be 20% more than joe's o/
+     dnum = 1.2;
+     status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromReal o/;
+     status = OCINumberMul(err, joesal, &ornum, debsal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberMul o/;
+
+     /o give tom a 50% raise o/
+     dnum = 1.5;
+     status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromReal o/;
+     status = OCINumberMul(err, tomsal, &ornum, tomsal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberMul o/;
+
+     /o double joe's salary o/
+     status = OCINumberAdd(err, joesal, joesal, joesal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberAdd o/;
+
+     /o get joe's salary in integer o/
+     status = OCINumberToInt(err, joesal, sizeof(inum), OCI_NUMBER_SIGNED,
+                             &inum);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToInt o/;
+     /o inum is set to 24000 o/
+
+     /o get debbie's salary in double o/
+     status = OCINumberToReal(err, debsal, sizeof(dnum), &dnum);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToReal o/;
+     /o dnum is set to 14400 o/
+
+     /o print tom's salary as DEM0001`8000.00 o/
+     buflen = sizeof(buffer);
+     status = OCINumberToText(err, tomsal, "C0999G9999D99", 13, 
+                 "NLS_NUMERIC_CHARACTERS='.`' NLS_ISO_CURRENCY='Germany'", 54,
+                 &buflen, buffer);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToText o/;
+     printf("tom's salary = %s\n", buffer);
+
+     /o compare joe and tom's salary o/
+     status = OCINumberCmp(err, joesal, tomsal, &result);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberCmp o/;
+     /o result is positive o/
+
+     /o read debbie's new salary from string o/
+     status = OCINumberFromText(err, "48`000.00", 9, "99G999D99", 9,
+                      "NLS_NUMERIC_CHARACTERS='.`'", 27, debsal);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromText o/;
+     /o debbie's salary is now 48000.00 o/
+
+*/
+
+/*----------------------------- OCINumberInc --------------------------------*/
+
+sword OCINumberInc(    OCIError *err, OCINumber *number    );
+/*
+   NAME: OCINumberInc - OCINumber INCrement numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN/OUT) a positive Oracle number to be incremented
+   DESCRIPTION:
+        Increment Oracle number in place. It is assumed that the input is
+        an integer between 0 and 100^21-2. If the is input too large, it will
+        be treated as 0 - the result will be an Oracle number 1. If the input
+        is not a positive integer, the result will be unpredictable.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDec --------------------------------*/
+
+sword OCINumberDec(    OCIError *err, OCINumber *number    );
+/*
+   NAME: OCINumberDec - OCINumber DECrement numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN/OUT) - a positive Oracle number to be decremented
+   DESCRIPTION:
+        Decrement Oracle number in place. It is assumed that the input is an
+        integer between 1 and 100^21-2. If the input is too large, it will be
+        treated as 1 - the result will be an Oracle number 0. If the input is
+        not a positive integer, the result will be unpredictable.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberSetZero -------------------------------*/
+
+void OCINumberSetZero(    OCIError *err, OCINumber *num    );
+/*
+   NAME: OCINumberSetZero - OCINumber Set number to Zero value
+   PARAMETERS:
+        err (IN/OUT) - pointer to OCI error handle
+        num (OUT) - set to zero value
+   DESCRIPTION:
+        Initialize the given number to value 0.
+ */
+
+/*--------------------------- OCINumberSetPi --------------------------------*/
+
+void OCINumberSetPi(    OCIError *err, OCINumber *num    );
+/*
+   NAME: OCINumberSetPi - OCINumber Set number to Pi
+        err (IN/OUT) - pointer to OCI error handle
+        num (OUT) - set to zero value
+   DESCRIPTION:
+        Initialize the given number to value Pi.
+ */
+
+/*----------------------------- OCINumberAdd --------------------------------*/
+
+sword OCINumberAdd(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberAdd - OCINumber ADD numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be added
+        result (OUT) - result of adding 'number1' with 'number2'
+   DESCRIPTION:
+        Add 'number1' with 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSub --------------------------------*/
+
+sword OCINumberSub(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberSub - OCINumber SUBtract numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - 'number2' subtracted from 'number1'
+        result (OUT) - subtraction result
+   DESCRIPTION:
+        Subtract 'number2' from 'number1' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberMul --------------------------------*/
+
+sword OCINumberMul(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberMul - OCINumber MULtiply numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be multiplied
+        result (OUT) - multiplication result
+   DESCRIPTION:
+        Multiply 'number1' with 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDiv --------------------------------*/
+
+sword OCINumberDiv(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberDiv - OCINumber DIVide numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - pointer to the numerator
+        number2 (IN) - pointer to the denominator
+        result (OUT) - division result
+   DESCRIPTION:
+        Divide 'number1' by 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          underflow errorr
+          overflow errorr
+          divide by zero errorr
+ */
+
+/*----------------------------- OCINumberMod --------------------------------*/
+
+sword OCINumberMod(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberMod - OCINumber MODulous
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - pointer to the numerator
+        number2 (IN) - pointer to the denominator
+        result (OUT) - remainder of the result
+   DESCRIPTION:
+        Finds the remainder of the division of two Oracle numbers.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          divide by zero errorr
+ */
+
+/*------------------------ OCINumberIntPower --------------------------------*/
+
+sword OCINumberIntPower(    OCIError *err, const OCINumber *base,
+                            const sword exp, OCINumber *result    );
+/*
+   NAME: OCINumberIntPower - OCINumber takes an arbitary base to an arbitary
+                             integer PoWeR
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the exponentiation
+        exp (IN) - exponent to which the base is to be raised
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Takes an arbitary base to an arbitary integer power.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberShift ---------------------------------*/
+
+sword OCINumberShift(    OCIError *err, const OCINumber *number,
+                            const sword nDig, OCINumber *result    );
+/*
+   NAME: OCINumberShift - OCINumber multiplies by a power of 10.
+
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Oracle Number to be shifted.
+        nDig   (IN) - number of decimal places to shift.
+        result (OUT) - shift result.
+   DESCRIPTION:
+        Multiplies number by 10^NDig and sets product to the result.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberNeg --------------------------------*/
+
+sword OCINumberNeg(    OCIError *err, const OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberNeg - OCINumber NEGate number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be negated
+        result (OUT) - will contain negated value of 'number'
+   DESCRIPTION:
+        Negates an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*------------------------- OCINumberToText ---------------------------------*/
+
+sword OCINumberToText(    OCIError *err, const OCINumber *number, 
+                          const oratext *fmt, ub4 fmt_length,
+                          const oratext *nls_params, ub4 nls_p_length,
+                          ub4 *buf_size, oratext *buf    );
+/*
+   NAME: OCINumberToText - OCINumber convert number TO String 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Oracle number to be converted
+        fmt (IN) - conversion format
+        fmt_length (IN) - length of the 'fmt' parameter
+        nls_params (IN) - nls format specification, if null string 
+                i.e. (oratext *)0, then the default parameters for the 
+                session is used
+        nls_p_length (IN) - length of the 'nls_params' parameter
+        buf_size (IN/OUT) - size of the buffer must be passed as input by
+                the caller, this function will return the length of the 
+                resulting string in bytes via this parameter. The length 
+                does not include the terminating null ('\0').
+        buf (OUT) - buffer into which the converted string is placed. The
+                resulting string is null terminated.
+   DESCRIPTION:
+        Converts the given number to a character string 
+        according to the specified format. Refer to "TO_NUMBER" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format and NLS parameters.
+        The converted number string is stored in the buffer 'buf', up to 
+        a max of '*buf_size' bytes. Length of the resulting string is
+        returned via 'buf_size'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'buf' is null
+          buffer too small
+          invalid format
+          invalid nls format
+          number to text translation for the given format causes overflow
+ */
+
+/*-------------------------- OCINumberFromText ------------------------------*/
+
+sword OCINumberFromText(    OCIError *err, const oratext *str, 
+                          ub4 str_length, const oratext *fmt, ub4 fmt_length, 
+                          const oratext *nls_params, ub4 nls_p_length, 
+                          OCINumber *number    );
+/*
+   NAME: OCINumberFromText - OCINumber convert String TO Number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        str (IN) - input string to be converted to Oracle number
+        str_length (IN) - size of the input string
+        fmt (IN) - conversion format
+        fmt_length (IN) - length of the 'fmt' parameter
+        nls_params (IN) - nls format specification, if null string 
+                i.e. (oratext *)0, then the default parameters for the 
+                session is used
+        nls_p_length (IN) - length of the 'nls_params' parameter
+        number (OUT) - given string converted to number
+   DESCRIPTION:
+        Converts the given string to a number
+        according to the specified format. Refer to "TO_NUMBER" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format and NLS parameters.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'str' is null
+          'str_length' is 0
+          invalid format
+          invalid nls format
+          invalid input string
+ */
+
+/*-------------------------- OCINumberToInt ---------------------------------*/
+
+#define OCI_NUMBER_UNSIGNED 0                        /* Unsigned type -- ubX */
+#define OCI_NUMBER_SIGNED   2                          /* Signed type -- sbX */
+
+sword OCINumberToInt(    OCIError *err, const OCINumber *number,
+                         uword rsl_length, uword rsl_flag, void  *rsl    );
+/*
+   NAME: OCINumberToInt - OCINumber convert number TO Integer
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be converted
+        rsl_length (IN) - size of the desired result
+        rsl_s_flag (IN) - flag denoting the desired sign of the output; valid 
+                values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+        rsl (OUT) - pointer to space for the result
+   DESCRIPTION:
+        Native type conversion function.
+        Converts the given Oracle number into an xbx (e.g. ub2, ub4, sb2 etc.)
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          integer value of 'number' is too big -- overflow
+          integer value of 'number' is too small -- underflow
+          invalid sign flag value ('rsl_s_flag')
+ */
+
+/*--------------------------- OCINumberFromInt ------------------------------*/
+
+sword OCINumberFromInt(    OCIError *err, const void  *inum, uword inum_length,
+                         uword inum_s_flag, OCINumber *number    );
+/*
+   NAME: OCINumberFromInt - OCINumber convert Integer TO Number 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        inum (IN) - pointer to the integer to be converted
+        inum_length (IN) - size of the integer
+        inum_s_flag (IN) - flag that designates the sign of the integer; valid 
+                values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+        number (OUT) - given integer converted to Oracle number
+   DESCRIPTION:
+        Native type conversion function. Converts any Oracle standard
+        machine-native integer type (xbx) to an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'inum' is null
+          integer too BIG -- the number is too large to fit into an Oracle
+                number
+          invalid sign flag value ('inum_s_flag')
+ */
+
+/*------------------------- OCINumberToReal ---------------------------------*/
+
+sword OCINumberToReal(    OCIError *err, const OCINumber *number,
+                          uword rsl_length, void  *rsl    );
+/*
+   NAME: OCINumberToReal - OCINumber convert number TO Real
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be converted
+        rsl_length (IN) - is the size of the desired result, 
+                sizeof( float | double | long double)
+        rsl (OUT) - pointer to space for storing the result
+   DESCRIPTION:
+        Native type conversion function. Converts an Oracle number into a
+        machine-native real type. This function only converts numbers up to
+        LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+        trailing zeroes. The above constants are defined in float.h
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          'rsl_length' is 0
+ */
+
+/*------------------------- OCINumberToRealArray ----------------------------*/
+
+sword OCINumberToRealArray(  OCIError *err, const OCINumber **number,
+                             uword elems, uword rsl_length, void  *rsl    );
+/*
+   NAME: OCINumberToRealArray - OCINumber convert array of numbers TO Real
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Pointer to array of number to be converted
+        elems (IN) - Upper bound of number array
+        rsl_length (IN) - is the size of the desired result,
+                                          sizeof( float | double | long double)
+        rsl (OUT) - pointer to array of space for storing the result
+   DESCRIPTION:
+        Native type conversion function. Converts an Oracle number into a
+        machine-native real type. This function only converts numbers up to
+        LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+        trailing zeroes. The above constants are defined in float.h
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          'rsl_length' is 0
+ */
+
+/*-------------------------- OCINumberFromReal ------------------------------*/
+
+sword OCINumberFromReal(    OCIError *err, const void  *rnum,
+                            uword rnum_length, OCINumber *number    );
+/*
+   NAME: OCINumberFromReal - OCINumber convert Real TO Number 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rnum (IN) - pointer to the floating point number to be converted
+        rnum_length (IN) - size of the desired result, i.e.
+                sizeof({float | double | long double})
+        number (OUT) - given float converted to Oracle number
+   DESCRIPTION:
+        Native type conversion function. Converts a machine-native floating
+        point type to an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rnum' is null
+          'rnum_length' is 0
+ */
+
+/*----------------------------- OCINumberCmp --------------------------------*/
+
+sword OCINumberCmp(    OCIError *err, const OCINumber *number1, 
+                       const OCINumber *number2, sword *result    );
+/*
+   NAME: OCINumberCmp - OCINumber CoMPare numbers 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be compared
+        result (OUT) - 0 if equal, negative if number1 < number2, 
+                positive if number1 > number2 
+   DESCRIPTION:
+        The function OCINumberCmp compares two numbers.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number1' or 'number2' or 'result' is null 
+ */
+
+/*---------------------------- OCINumberSign --------------------------------*/
+
+sword OCINumberSign(    OCIError *err, const OCINumber *number,
+                        sword *result    );
+/*
+   NAME: OCINumberSign - OCINumber obtains SiGN of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number whose sign is returned
+        result (OUT) - 0 if number == 0, -1 if number < 0, 
+                1 if number > 0 
+   DESCRIPTION:
+        Obtains sign of an Oracle number
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsZero ------------------------------*/
+
+sword OCINumberIsZero(    OCIError *err, const OCINumber *number,
+                          boolean *result    );
+/*
+   NAME: OCINumberIsZero - OCINumber comparison with ZERo
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - numbers to be compared
+        result (OUT) - set to TRUE if equal to zero else FALSE
+   DESCRIPTION:
+        Test if the given number is equal to zero.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsInt -------------------------------*/
+
+sword OCINumberIsInt(    OCIError *err, const OCINumber *number,
+                          boolean *result    );
+/*
+   NAME: OCINumberIsInt - OCINumber Is Integer value.
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be tested
+        result (OUT) - set to TRUE if integer value else FALSE
+   DESCRIPTION:
+        Test if the given number is an integer value.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*-------------------------- OCINumberAssign --------------------------------*/
+ 
+sword OCINumberAssign(    OCIError *err, const OCINumber *from,
+                          OCINumber *to    );
+/*
+   NAME: OCINumberAssign - OCINumber ASsiGn number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        from (IN) - number to be assigned
+        to (OUT) - number copied into
+   DESCRIPTION:
+        Assign number 'from' to 'to'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'from' or 'to' is null
+ */
+
+/*----------------------------- OCINumberAbs --------------------------------*/
+
+sword OCINumberAbs(    OCIError *err, const OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberAbs - OCINumber compute ABSolute value
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the absolue value of the
+                input number
+   DESCRIPTION:
+        Computes the absolute value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*---------------------------- OCINumberCeil --------------------------------*/
+
+sword OCINumberCeil(    OCIError *err, const OCINumber *number,
+                        OCINumber *result    );
+/*
+   NAME: OCINumberCeil - OCINumber compute the CEiL value of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the ceil value of the
+                input number
+   DESCRIPTION:
+        Computes the ceil value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberFloor --------------------------------*/
+
+sword OCINumberFloor(    OCIError *err, const OCINumber *number, 
+                         OCINumber *result    );
+/*
+   NAME: OCINumberFloor - OCINumber compute the FLooR value of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the floor value of the
+                input number
+   DESCRIPTION:
+        Computes the floor value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSqrt -------------------------------*/
+
+sword OCINumberSqrt(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberSqrt - OCINumber compute the SQuare Root of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the square root of the
+                input number
+   DESCRIPTION:
+        Computes the square root of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is negative
+ */
+
+/*--------------------------- OCINumberTrunc --------------------------------*/
+
+sword OCINumberTrunc(    OCIError *err, const OCINumber *number, 
+                         sword decplace, OCINumber *result    );
+/*
+   NAME: OCINumberTrunc - OCINumber TRUncate an Oracle number at a 
+                          specified decimal place
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        decplace (IN) - number of decimal digits to the right of the 
+                decimal point to truncate at. Negative values are allowed.
+        result (OUT) - output of truncation
+   DESCRIPTION:
+        Truncate an Oracle number at a specified decimal place
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberPower ------------------------------*/
+
+sword OCINumberPower(    OCIError *err, const OCINumber *base, 
+                         const OCINumber *number, OCINumber *result    );
+/*
+   NAME: OCINumberPower - OCINumber takes an arbitary Base to an 
+                          arbitary Power
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the exponentiation
+        number (IN) - exponent to which the base is to be raised
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Takes an arbitary base to an arbitary power.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberRound --------------------------------*/
+
+sword OCINumberRound(    OCIError *err, const OCINumber *number,
+                         sword decplace, OCINumber *result    );
+/*
+   NAME: OCINumberRound - OCINumber ROUnds an Oracle number to a specified 
+                  decimal place
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - round this number and return result in 'result'
+        decplace (IN) - number of decimal digits to the right of the 
+                decimal point to round to. Negative values are allowed.
+        result (OUT) - output of rounding
+   DESCRIPTION:
+        Rounds an Oracle number to a specified decimal place
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberPrec ---------------------------------*/
+
+sword OCINumberPrec(    OCIError *err, const OCINumber *number,
+                         sword nDigs, OCINumber *result    );
+/*
+   NAME: OCINumberPrec - Rounds an Oracle number to a specified number of
+                         decimal digits.
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number for which to set precision.
+        nDig   (IN) - number of decimal digits desired in the result.
+        result (OUT) - result.
+   DESCRIPTION:
+        Performs a floating point round with respect to the number
+        of digits.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSin --------------------------------*/
+
+sword OCINumberSin(    OCIError *err, const OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberSin - OCINumber takes the SINe of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the sine in radians
+        result (OUT) - result of the sine
+   DESCRIPTION:
+        Takes the sine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcSin --------------------------------*/
+
+sword OCINumberArcSin(    OCIError *err, const OCINumber *number,
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcSin - OCINumber takes the Arc SINe of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc sine
+        result (OUT) - result of the arc sine in radians
+   DESCRIPTION:
+        Takes the arc sine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypSin --------------------------------*/
+
+sword OCINumberHypSin(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypSin - OCINumber takes the SiNe Hyperbolic of an 
+                           Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the sine hyperbolic
+        result (OUT) - result of the sine hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic sine of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberCos --------------------------------*/
+
+sword OCINumberCos(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberCos - OCINumber takes the COSine of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the cosine in radians
+        result (OUT) - result of the cosine
+   DESCRIPTION:
+        Takes the cosine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcCos --------------------------------*/
+
+sword OCINumberArcCos(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcCos - OCINumber takes the Arc COSine of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc cosine
+        result (OUT) - result of the arc cosine in radians
+   DESCRIPTION:
+        Takes the arc cosine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypCos --------------------------------*/
+
+sword OCINumberHypCos(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypCos - OCINumber takes the CoSine Hyperbolic of an 
+                           Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the cosine hyperbolic
+        result (OUT) - result of the cosine hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic cosine of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberTan --------------------------------*/
+
+sword OCINumberTan(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberTan - OCINumber takes the TANgent of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the tangent in radians
+        result (OUT) - result of the tangent
+   DESCRIPTION:
+        Takes the tangent in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcTan --------------------------------*/
+
+sword OCINumberArcTan(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcTan - OCINumber takes the Arc TANgent of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc tangent
+        result (OUT) - result of the arc tangent in radians
+   DESCRIPTION:
+        Takes the arc tangent in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*------------------------ OCINumberArcTan2 ---------------------------------*/
+
+sword OCINumberArcTan2(    OCIError *err, const OCINumber *number1, 
+                           const OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberArcTan2 - OCINumber takes the ATan2 of 2 Oracle numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - first argument of atan2(y,x) function which 
+                corresponds to 'y' parameter in the function
+        number2 (IN) - second argument of atan2(y,x) function which 
+                corresponds to 'x' parameter in the function
+        result (OUT) - result of the atan2() in radians
+   DESCRIPTION:
+        Takes the atan2(number1, number2).
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number2' is 0
+ */
+
+/*----------------------------- OCINumberHypTan -----------------------------*/
+
+sword OCINumberHypTan(    OCIError *err, const OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypTan - OCINumber takes the TaNgent Hyperbolic of an Oracle
+                           number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the tangent hyperbolic
+        result (OUT) - result of the tangent hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic tangent of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*--------------------------- OCINumberExp ----------------------------------*/
+
+sword OCINumberExp(    OCIError *err, const OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberExp - OCINumber EXPonential
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - e raised to this Oracle number power
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Raises e to the specified Oracle number power
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberLn ---------------------------------*/
+
+sword OCINumberLn(    OCIError *err, const OCINumber *number, 
+                      OCINumber *result    );
+/*
+   NAME: OCINumberLn - OCINumber Logarithm Natural
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - logarithm of this number is computed
+        result (OUT) - logarithm result
+   DESCRIPTION:
+        Takes the logarithm of the given Oracle number with respect
+        to the given base.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is <= 0
+ */
+
+/*----------------------------- OCINumberLog --------------------------------*/
+
+sword OCINumberLog(    OCIError *err, const OCINumber *base, 
+                       const OCINumber *number, OCINumber *result    );
+/*
+   NAME: OCINumberLog - OCINumber LOGarithm any base
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the logarithm
+        number (IN) - opearnd
+        result (OUT) - logarithm result
+   DESCRIPTION:
+        Takes the logarithm with the specified base of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is <= 0
+          'base' is <= 0
+ */
+
+/*****************************************************************************/
+/*                             ORACLE DATE TYPE                              */
+/*****************************************************************************/
+ 
+struct OCITime
+{
+  ub1 OCITimeHH;                          /* hours; range is 0 <= hours <=23 */
+  ub1 OCITimeMI;                     /* minutes; range is 0 <= minutes <= 59 */
+  ub1 OCITimeSS;                     /* seconds; range is 0 <= seconds <= 59 */
+};
+typedef struct OCITime OCITime;
+
+/* 
+ * OCITime - OCI TiMe portion of date
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetTime/OCIDateSetTime 
+ * to manipulate time portion of OCIDate.
+ */
+
+struct OCIDate
+{
+  sb2 OCIDateYYYY;         /* gregorian year; range is -4712 <= year <= 9999 */
+  ub1 OCIDateMM;                          /* month; range is 1 <= month < 12 */
+  ub1 OCIDateDD;                             /* day; range is 1 <= day <= 31 */
+  OCITime OCIDateTime;                                               /* time */
+};
+typedef struct OCIDate OCIDate;
+
+/* 
+ * OCIDate - OCI oracle Date representation in C
+ *
+ * OCIDate represents the C mapping of Oracle date.
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetDate/OCIDateSetDate
+ * to access/initialize OCIDate.
+ *
+ * For binding variables of type OCIDate in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_ODT.
+ */
+
+/*
+   EXAMPLE 
+
+   The following example shows how to manipulate an attribute of type 
+   oracle date.
+  
+     #define FMT "Month dd, YYYY, HH:MI A.M."
+     #define LANG "American"
+
+     struct person
+     {
+       OCIDate start_date;
+     };
+     typedef struct person person;
+
+     OCIError *err;
+     person *joe;
+     sword status;                                           /o error status o/
+     
+     /o See oci.h for an example of how to initialize OCIError.
+      o For this example, assume the OCIEnv and OCIError has been
+      o initialized.
+      o/
+
+     /o Pin joe person object in the object cache. See ori.h
+      o for an example on pinning objects. For this example, assume that
+      o joe is pointing to the pinned object.
+      o/
+
+     /o set the start date of joe o/
+     OCIDateSetTime(&joe->start_date, 8, 0, 0);
+     OCIDateSetDate(&joe->start_date, 1990, 10, 5); 
+
+     /o check if the date is valid o/
+     uword invalid;
+     if (OCIDateCheck(err, &joe->start_date, &invalid) != OCI_SUCCESS)
+       /o error handling code o/
+     if (invalid)
+       /o error handling code o/
+
+     /o convert date for display purposes o/
+     char str[100];
+     ub4 strlen = sizeof(str);
+     if (OCIDateToText(err, &joe->start_date, FMT, sizeof(FMT)-1, LANG,
+                sizeof(LANG)-1, &strlen, str) != OCI_SUCCESS)
+       /o error handling code o/
+
+ */
+
+/*--------------------------- OCIDateGetTime --------------------------------*/
+/* void OCIDateGetTime(/o_ const OCIDate *date, ub1 *hour, ub1 *min, 
+                           ub1 *sec _o/); */
+#define OCIDateGetTime(date, hour, min, sec) \
+  { \
+     *hour = (date)->OCIDateTime.OCITimeHH; \
+     *min = (date)->OCIDateTime.OCITimeMI; \
+     *sec = (date)->OCIDateTime.OCITimeSS; \
+  }
+/*
+   NAME: OCIDateGetTime - OCIDate Get Time portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose time data is retrieved
+        hour (OUT) - hour value returned
+        min (OUT) - minute value returned
+        sec (OUT) - second value returned
+   DESCRIPTION:
+        Return time inforamtion stored in the given date. The time
+        information returned is: hour, minute and seconds.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateGetDate --------------------------------*/
+/* void OCIDateGetDate(/o_ const OCIDate *date, sb2 *year, ub1 *month, 
+                           ub1 *day _o/); */
+#define OCIDateGetDate(date, year, month, day) \
+  { \
+     *year = (date)->OCIDateYYYY; \
+     *month = (date)->OCIDateMM; \
+     *day = (date)->OCIDateDD; \
+  }
+/*
+   NAME: OCIDateGetDate - OCIDate Get Date (year, month, day) portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose year, month, day data is retrieved
+        year (OUT) - year value returned
+        month (OUT) - month value returned
+        day (OUT) - day value returned
+   DESCRIPTION:
+        Return year, month, day inforamtion stored in the given date.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateSetTime --------------------------------*/
+/* void OCIDateSetTime(/o_ OCIDate *date, ub1 hour, ub1 min, 
+                           ub1 sec _o/); */
+#define OCIDateSetTime(date, hour, min, sec) \
+  { \
+     (date)->OCIDateTime.OCITimeHH = hour; \
+     (date)->OCIDateTime.OCITimeMI = min; \
+     (date)->OCIDateTime.OCITimeSS = sec; \
+  }
+/*
+   NAME: OCIDateSetTime - OCIDate Set Time portion of date
+   PARAMETERS:
+        date (OUT) - Oracle date whose time data is set
+        hour (IN) - hour value to be set 
+        min (IN) - minute value to be set
+        sec (IN) - second value to be set
+   DESCRIPTION:
+        Set the date with the given time inforamtion.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateSetDate --------------------------------*/
+/* void OCIDateSetDate(/o_ OCIDate *date, sb2 year, ub1 month, ub1 day _o/); */
+#define OCIDateSetDate(date, year, month, day) \
+  { \
+     (date)->OCIDateYYYY = year; \
+     (date)->OCIDateMM = month; \
+     (date)->OCIDateDD = day; \
+  }
+/*
+   NAME: OCIDateSetDate - OCIDate Set Date (year, month, day) portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose year, month, day data is set
+        year (OUT) - year value to be set
+        month (OUT) - month value to be set
+        day (OUT) - day value to be set
+   DESCRIPTION:
+        Set the date with the given year, month, day inforamtion.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateAssign ---------------------------------*/
+
+sword OCIDateAssign(    OCIError *err, const OCIDate *from, 
+                        OCIDate *to    );
+/*
+   NAME: OCIDateAssign - OCIDate Assignment
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        from (IN) - date to be assigned
+        to (OUT) - lhs of assignment
+   DESCRIPTION:
+        Performs date assignment.
+   RETURNS:
+        OCI_SUCCESS
+ */
+
+/*--------------------------- OCIDateToText ---------------------------------*/
+
+sword OCIDateToText(    OCIError *err, const OCIDate *date, 
+                        const oratext *fmt, ub1 fmt_length, 
+                        const oratext *lang_name, ub4 lang_length, 
+                        ub4 *buf_size, oratext *buf    );
+/*
+   NAME: OCIDateToText - OCIDate convert date TO String 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - Oracle date to be converted
+        fmt (IN) - conversion format, if null string pointer (oratext*)0, then
+                the date is converted to a character string in the
+                date format "DD-MON-YY".
+        fmt_length (IN) - length of the 'fmt' parameter
+        lang_name (IN) - specifies the language in which the names and 
+                abbreviations of months and days are returned;
+                default language of session is used if 'lang_name' 
+                is null i.e. (oratext *)0
+        lang_length (IN) - length of the 'nls_params' parameter
+        buf_size (IN/OUT) - size of the buffer; size of the resulting string
+                is returned via this parameter
+        buf (OUT) - buffer into which the converted string is placed
+   DESCRIPTION:
+        Converts the given date to a string according to the specified format.
+        Refer to "TO_DATE" conversion function described in
+        "Oracle SQL Language Reference Manual" for a description of format
+        and NLS arguments. The converted null-terminated date string is
+        stored in the buffer 'buf'.
+ 
+        An error is reported upon overflow, e.g. trying to convert a number
+        of value 10 using format '9' causes an overflow.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          buffer too small
+          invalid format
+          unknown language
+          overflow error
+ */
+
+/*---------------------------- OCIDateFromText ------------------------------*/
+
+sword OCIDateFromText(    OCIError *err, const oratext *date_str, 
+                        ub4 d_str_length, const oratext *fmt, ub1 fmt_length, 
+                        const oratext *lang_name, ub4 lang_length, 
+                        OCIDate *date    );
+/*
+   NAME: OCIDateFromText - OCIDate convert String TO Date
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date_str (IN) - input string to be converted to Oracle date
+        d_str_length (IN) - size of the input string, if the length is -1
+                then 'date_str' is treated as a null terminated  string
+        fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+                the string is expected to be in 'DD-MON-YY' format.
+        fmt_length (IN) - length of the 'fmt' parameter
+        lang_name (IN) - language in which the names and abbreviations of
+                days and months are specified, if null i.e. (oratext *)0,
+                the default language of session is used, 
+        lang_length (IN) - length of the 'lang_name' parameter
+        date (OUT) - given string converted to date
+   DESCRIPTION:
+        Converts the given string to Oracle date
+        according to the specified format. Refer to "TO_DATE" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid format
+          unknown language
+          invalid input string
+          <to be discovered>
+ */
+
+/*----------------------------- OCIDateCompare ------------------------------*/
+
+sword OCIDateCompare(    OCIError *err, const OCIDate *date1, 
+                     const OCIDate *date2, sword *result    );
+/*
+   NAME: OCIDateCompare - OCIDate CoMPare dates
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1, date2 (IN) - dates to be compared
+        result (OUT) - comparison result, 0 if equal, -1 if date1 < date2, 
+                1 if date1 > date2
+   DESCRIPTION:
+        The function OCIDateCompare compares two dates. It returns -1 if date1 
+        is smaller than date2, 0 if they are equal, and 1 if date1 is greater 
+        than date2.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*------------------------- OCIDateAddMonths --------------------------------*/
+
+sword OCIDateAddMonths(    OCIError *err, const OCIDate *date, sb4 num_months,
+                           OCIDate *result    );
+/*
+   NAME: OCIDateAddMonths - OCIDate ADd or subtract Months
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - 'num_months' added or subtracted from 'date'
+        num_months (IN) - number of months to be added or subtracted 
+                (a negative value will be subtracted)
+        result (IN/OUT) - result of adding or subtracting to 'date'
+   DESCRIPTION:
+        The function OCIDateAddDays adds or subtracts num_months from the 
+        date 'date'.
+          If the input 'date' is the last day of a month, then 
+        appropriate adjustments are made to ensure that the output date is 
+        also the last day of the month. For example, Feb. 28 + 1 month =
+        March 31, and November 30 - 3 months = August 31. Otherwise the
+        'result' date has the same day component as 'date'. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateAddDays --------------------------------*/
+
+sword OCIDateAddDays(    OCIError *err, const OCIDate *date, sb4 num_days,
+                         OCIDate *result    );
+/*
+   NAME: OCIDateAddDays - OCIDate ADd or subtract Days
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - 'num_days' added or subtracted from 'date'
+        num_days (IN) - number of days to be added or subtracted 
+                (a negative value will be subtracted)
+        result (IN/OUT) - result of adding or subtracting to 'date'
+   DESCRIPTION:
+        The function OCIDateAddDays adds or subtracts num_days from the 
+        date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateLastDay --------------------------------*/
+
+sword OCIDateLastDay(    OCIError *err, const OCIDate *date, 
+                         OCIDate *last_day    );
+/*
+   NAME: OCIDateLastDay - OCIDate get date of the LaST day of the month
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - input date
+        last_day (OUT) - last day of the month in date 'date'
+   DESCRIPTION:
+        The function OCIDateLastDay returns the date of the last day of the
+        month in date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*----------------------- OCIDateDaysBetween --------------------------------*/
+
+sword OCIDateDaysBetween(    OCIError *err, const OCIDate *date1, 
+                             const OCIDate *date2, sb4 *num_days    );
+/*
+   NAME: OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1, date2 (IN) - input dates
+        num_days (OUT) - number of days between date1 and date2
+   DESCRIPTION:
+        The function OCIDateDaysBetween returns the number of days between 
+        date1 and date2. The time is ignored in this computation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*------------------------ OCIDateZoneToZone --------------------------------*/
+
+sword OCIDateZoneToZone(    OCIError *err, const OCIDate *date1,
+                            const oratext *zon1,
+                            ub4 zon1_length, const oratext *zon2, 
+                            ub4 zon2_length, OCIDate *date2    );
+/*
+   NAME: OCIDateZoneToZone - OCIDate convert date from one Zone TO another Zone
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1 (IN) - date to be converted
+        zon1 (IN) - zone of input date
+        zon1_length (IN) - length in bytes of string 'zon1'
+        zon2 (IN) - zone to be converted to
+        zon2_length (IN) - length in bytes of string 'zon2'
+        date2 (OUT) - converted date (in 'zon2')
+   DESCRIPTION:
+        Converts date from one time zone to another. Given date 'date1' 
+        in time zone 'zon1' returns date 'date2' in time zone 'zon2'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invlid date
+          invald input time zone
+          invald output time zone
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateNextDay --------------------------------*/
+
+sword OCIDateNextDay(    OCIError *err, const OCIDate *date, 
+                         const oratext *day_p, ub4 day_length, 
+                         OCIDate *next_day    );
+/*
+   NAME: OCIDateNextDay - OCIDate get date of Next DaY
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - returned date should be later than this date
+        day (IN) - first day of week named by this is returned
+        day_length (IN) - length in bytes of string 'day'
+        next_day (OUT) - first day of the week named by 'day' later than 'date'
+   DESCRIPTION:
+        Returns the date of the first day of the
+        week named by 'day' that is later than date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          invalid day
+          <to be discovered>
+ */
+
+/*----------------------------- OCIDateCheck --------------------------------*/
+
+/* Listing of error bits used by OCIDateCheck() */
+#define OCI_DATE_INVALID_DAY            0x1                       /* Bad DAy */
+#define OCI_DATE_DAY_BELOW_VALID        0x2   /* Bad DAy Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MONTH          0x4                     /* Bad MOnth */
+#define OCI_DATE_MONTH_BELOW_VALID      0x8 /* Bad MOnth Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_YEAR           0x10                     /* Bad YeaR */
+#define OCI_DATE_YEAR_BELOW_VALID       0x20 /* Bad YeaR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_HOUR           0x40                     /* Bad HouR */
+#define OCI_DATE_HOUR_BELOW_VALID       0x80 /* Bad HouR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MINUTE         0x100                  /* Bad MiNute */
+#define OCI_DATE_MINUTE_BELOW_VALID     0x200
+                                           /* Bad MiNute Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_SECOND         0x400                  /* Bad SeCond */
+#define OCI_DATE_SECOND_BELOW_VALID     0x800
+                                           /* bad second Low/high bit (1=low)*/
+#define OCI_DATE_DAY_MISSING_FROM_1582  0x1000
+                                  /* Day is one of those "missing" from 1582 */
+#define OCI_DATE_YEAR_ZERO              0x2000    /* Year may not equal zero */
+#define OCI_DATE_INVALID_FORMAT         0x8000      /* Bad date format input */
+
+sword OCIDateCheck(    OCIError *err, const OCIDate *date, uword *valid    );
+/*
+   NAME: OCIDateCheck - OCIDate CHecK if the given date is valid
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - date to be checked
+        valid (OUT) -  returns zero for a valid date, otherwise 
+                the ORed combination of all error bits specified below:
+  
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_DATE_INVALID_DAY         0x1             Bad day
+   OCI_DATE_DAY_BELOW_VALID     0x2             Bad DAy Low/high bit (1=low)
+   OCI_DATE_INVALID_MONTH       0x4             Bad MOnth
+   OCI_DATE_MONTH_BELOW_VALID   0x8             Bad MOnth Low/high bit (1=low)
+   OCI_DATE_INVALID_YEAR        0x10            Bad YeaR
+   OCI_DATE_YEAR_BELOW_VALID    0x20            Bad YeaR Low/high bit (1=low)
+   OCI_DATE_INVALID_HOUR        0x40            Bad HouR
+   OCI_DATE_HOUR_BELOW_VALID    0x80            Bad HouR Low/high bit (1=low)
+   OCI_DATE_INVALID_MINUTE      0x100           Bad MiNute
+   OCI_DATE_MINUTE_BELOW_VALID  0x200           Bad MiNute Low/high bit (1=low)
+   OCI_DATE_INVALID_SECOND      0x400           Bad SeCond
+   OCI_DATE_SECOND_BELOW_VALID  0x800           bad second Low/high bit (1=low)
+   OCI_DATE_DAY_MISSING_FROM_1582 0x1000        Day is one of those "missing"
+                                                from 1582
+   OCI_DATE_YEAR_ZERO           0x2000          Year may not equal zero
+   OCI_DATE_INVALID_FORMAT      0x8000          Bad date format input
+  
+   So, for example, if the date passed in was 2/0/1990 25:61:10 in
+   (month/day/year hours:minutes:seconds format), the erroor returned
+   would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+   OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+   DESCRIPTION:
+        Check if the given date is valid.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'date' and 'valid' pointers are NULL pointers
+ */
+
+/*--------------------------- OCIDateSysDate --------------------------------*/
+
+sword OCIDateSysDate(    OCIError *err, OCIDate *sys_date    );
+/*
+   NAME: OCIDateSysDate - OCIDate get current SYStem date and time
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        sys_date (OUT) - current system date and time
+   DESCRIPTION:
+        Returns the current system date and time.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          <to be discovered>
+ */
+
+/*****************************************************************************/
+/*                  FIXED-LENGTH STRING - CHAR (N)                           */
+/*****************************************************************************/
+
+/*
+ * An ADT attribute declared as "x CHAR(n)" is mapped to "OCIString *x;".
+ * The representation of OCIString * is shown below.
+ */
+
+/*****************************************************************************/
+/*                  VARIABLE-LENGTH STRING                                   */
+/*****************************************************************************/
+
+/*
+ * The variable-length string is represented in C as a pointer to OCIString
+ * structure. The OCIString structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length string.
+ *     
+ * A variable-length string can be declared as:
+ *
+ * OCIString *vstr;
+ *
+ * For binding variables of type OCIString* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_VST.
+ */
+typedef struct OCIString OCIString;
+
+/*-------------------------- OCIStringAssign --------------------------------*/
+ 
+sword OCIStringAssign(    OCIEnv *env, OCIError *err, const OCIString *rhs, 
+                          OCIString **lhs    );
+/*
+   NAME: OCIStringAssign - OCIString Assign String to String
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is also OCIString
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+        resized depending upon the size of the 'rhs'. The assigned string is
+        null-terminated. The 'length' field will not include the extra byte
+        needed for null termination.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+ 
+/*---------------------- OCIStringAssignText --------------------------------*/
+ 
+sword OCIStringAssignText(    OCIEnv *env, OCIError *err, const oratext *rhs, 
+                              ub4 rhs_len, OCIString **lhs    );
+/*
+   NAME: OCIStringAssignText - OCIString Assign Text string to String
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is a text string
+        rhs_len (IN) - length of the 'rhs' string
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+        resized depending upon the size of the 'rhs'. The assigned string is
+        null-terminated. The 'length' field will not include the extra byte
+        needed for null termination.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*-------------------------- OCIStringResize --------------------------------*/
+
+sword OCIStringResize(    OCIEnv *env, OCIError *err, ub4 new_size, 
+                          OCIString **str    );
+/*
+   NAME: OCIStringResize - OCIString ReSiZe string memory
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        new_size (IN) - new memory size of the string in bytes
+        str (IN/OUT) - allocated memory for the string is freed from the 
+                OOCI heap
+   DESCRIPTION:
+        This function resizes the memory of the given variable-length string in
+        the object cache. The contents of the string are NOT preserved.
+        This function may allocate the string in a new memory region in
+        which case the original memory occupied by the given string will
+        be freed. If the input string is null (str == NULL), then this
+        function will allocate memory for the string.
+ 
+        If the new_size is 0, then this function frees the memory occupied
+        by 'str' and a null pointer value is returned.
+ 
+        NOTE: The caller must compute 'new_size' taking into account space
+        for the null character ('\0').
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*---------------------------- OCIStringSize --------------------------------*/
+
+ub4 OCIStringSize(    OCIEnv *env, const OCIString *vs    );
+/*
+   NAME: OCIStringSize - OCIString Get String siZe
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        vs (IN) - string whose size is returned
+   DESCRIPTION:
+        Return the size of the given string.
+   RETURNS:
+        size of the string in bytes is returned
+ */
+
+/*----------------------------- OCIStringPtr --------------------------------*/
+
+oratext *OCIStringPtr(    OCIEnv *env, const OCIString *vs    );
+/*
+   NAME: OCIStringPtr - OCIString Get String Pointer
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        vs (IN) - pointer to the text of this string is returned
+   DESCRIPTION:
+        Return the pointer to the text of the given string.
+   RETURNS:
+        pointer to the text of the string is returned
+ */
+
+/*----------------------- OCIStringAllocSize --------------------------------*/
+ 
+sword OCIStringAllocSize(    OCIEnv *env, OCIError *err, const OCIString *vs, 
+                             ub4 *allocsize    );
+/*
+   NAME: OCIStringAllocSize - OCIString get Allocated SiZe of string memory 
+                              in bytes
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        vs (IN) - string whose allocated size in bytes is returned
+        allocsize (OUT) - allocated size of string memory in bytes is returned
+   DESCRIPTION:
+        Return the allocated size of the string memory in bytes. The
+        allocated size is >= actual string size.
+   REQUIRES:
+        vs is a non-null pointer
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR on error
+ */
+
+/*****************************************************************************/
+/*                       VARIABLE-LENGTH RAW                                 */
+/*****************************************************************************/
+
+/*
+ * The variable-length raw is represented in C as a pointer to OCIRaw
+ * structure. The OCIRaw structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length raw.
+ *     
+ * A variable-length raw can be declared as:
+ *
+ * OCIRaw *raw;
+ *
+ * For binding variables of type OCIRaw* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_LVB.
+ */
+typedef struct OCIRaw OCIRaw;
+
+/*-------------------------- OCIRawAssignRaw --------------------------------*/
+ 
+sword OCIRawAssignRaw(    OCIEnv *env, OCIError *err, const OCIRaw *rhs, 
+                          OCIRaw **lhs    );
+/*
+   NAME: OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to
+                   Raw (of type OCIRaw*)
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is also OCIRaw
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+        resized depending upon the size of the 'rhs'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+ 
+/*------------------------ OCIRawAssignBytes --------------------------------*/
+ 
+sword OCIRawAssignBytes(    OCIEnv *env, OCIError *err, const ub1 *rhs, 
+                            ub4 rhs_len, OCIRaw **lhs    );
+/*
+   NAME: OCIRawAssignBytes - OCIRaw Assign raw Bytes (of type ub1*) to Raw 
+                   (of type OCIRaw*)
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is ub1 *
+        rhs_len (IN) - length of the 'rhs' raw
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+        resized depending upon the size of the 'rhs'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*---------------------------- OCIRawResize ---------------------------------*/
+ 
+sword OCIRawResize(    OCIEnv *env, OCIError *err, ub4 new_size, 
+                       OCIRaw **raw    );
+/*
+   NAME: OCIRawResize - OCIRaw ReSiZe memory of variable-length raw
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        new_size (IN) - new size of the raw data in bytes
+        raw (IN) - variable-length raw pointer; the raw is
+                resized to 'new_size'
+   DESCRIPTION:
+        This function resizes the memory of the given variable-length raw in
+        the object cache. 
+        The previous contents of the raw are NOT preserved.
+        This function may allocate the raw in a new memory region in
+        which case the original memory occupied by the given raw will
+        be freed. If the input raw is null (raw == NULL), then this
+        function will allocate memory for the raw data.
+ 
+        If the new_size is 0, then this function frees the memory occupied
+        by 'raw' and a null pointer value is returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*------------------------------- OCIRawSize --------------------------------*/
+
+ub4 OCIRawSize(    OCIEnv * env, const OCIRaw *raw    );
+/*
+   NAME: OCIRawSize - OCIRaw Get Raw siZe
+   PARAMETERS:
+        env (IN)  - pointer to OCI environment handle
+        raw (INT) - raw whose size is returned
+   DESCRIPTION:
+        Return the size of the given raw.
+   RETURNS:
+        size of the raw in bytes is returned
+ */
+
+/*--------------------------------- OCIRawPtr -------------------------------*/
+ub1 *OCIRawPtr(    OCIEnv * env, const OCIRaw *raw    );
+/*
+   NAME: OCIRawPtr - OCIRaw Get Raw data Pointer
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        raw (IN) - pointer to the data of this raw is returned
+   DESCRIPTION:
+        Return the pointer to the data of the given raw.
+   RETURNS:
+        pointer to the data of the raw is returned
+ */
+
+/*------------------------------ OCIRawAllocSize ----------------------------*/
+ 
+sword OCIRawAllocSize(    OCIEnv *env, OCIError *err, const OCIRaw *raw,
+                          ub4 *allocsize    );
+/*
+   NAME: OCIRawAllocSize - OCIRaw get Allocated SiZe of raw memory in bytes
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        raw (IN) - raw whose allocated size in bytes is returned
+        allocsize (OUT) - allocated size of raw memory in bytes is returned
+   DESCRIPTION:
+        Return the allocated size of the raw memory in bytes. The
+        allocated size is >= actual raw size.
+   REQUIRES:
+        raw is a non-null pointer
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR upon error
+ */
+
+/*****************************************************************************/
+/*                     OBJECT REFERENCE OPERATIONS                           */
+/*****************************************************************************/
+
+/* 
+ * See the definition of OCIRef in oro.h.
+ *
+ * For binding variables of type OCIRef* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the code SQLT_REF.
+ * 
+ */
+
+/*---------------------------- OCIRefClear ----------------------------------*/
+void OCIRefClear(    OCIEnv *env, OCIRef *ref    );
+/*
+   NAME: OCIRefClear - OCIRef CLeaR or nullify a ref
+   PARAMETERS:
+        env (IN)     - pointer to OCI environment handle
+        ref (IN/OUT) - ref to clear
+   DESCRIPTION:
+        Clear or nullify the given ref. A ref is considered to be a null ref
+        if it does not contain a valid OID (and thus doesn't point to an
+        object). Logically, a null ref is a dangling ref.
+
+        Note that a null ref is still a valid SQL value and is not SQL-ly null.
+        It can be used as a valid non-null constant ref value for NOT NULL
+        column or attribute of a row in a table.
+        
+        If a null pointer value is passed as a ref,
+        then this function is a no-op.
+ */
+
+/*--------------------------- OCIRefAssign ----------------------------------*/
+sword OCIRefAssign(    OCIEnv *env, OCIError *err, const OCIRef *source, 
+                       OCIRef **target    );
+/*
+   NAME: OCIRefAssign - OCIRef CoPY a ref to another
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        source (IN) - ref to copy from
+        target (IN/OUT) - ref to copy to
+   DESCRIPTION:
+        Copy 'source' ref to 'target' ref; both then reference the same
+        object. If the target ref pointer is null (i.e. *target == NULL)
+        then the copy function will allocate memory for the target ref
+        in OOCI heap prior to the copy.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          1) out of memory
+ */
+
+/*-------------------------- OCIRefIsEqual ----------------------------------*/
+boolean OCIRefIsEqual(    OCIEnv *env, const OCIRef *x, const OCIRef *y    );
+/*
+   NAME: OCIRefIsEqual - OCIRef compare two refs for EQUality
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        x (IN)   - ref to compare
+        y (IN)   - ref to compare
+   DESCRIPTION:
+        Compare the given refs for equality.
+        Two refs are equal if and only if:
+          - they are both referencing the same persistent object, or
+          - they are both referencing the same transient object.
+
+        NOTE THAT TWO NULL REFS ARE CONSIDERED NOT EQUAL BY THIS FUNCTION.
+   RETURNS:
+        TRUE if the two refs are equal
+        FALSE if the two refs are not equal, or X is NULL, or Y is NULL
+ */
+
+/*--------------------------- OCIRefIsNull ----------------------------------*/
+boolean OCIRefIsNull(    OCIEnv *env, const OCIRef *ref    );
+/*
+   NAME: OCIRefIsNull - OCIRef test if a ref is NULl
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        ref (IN) - ref to test for null
+   DESCRIPTION:
+        Return TRUE if the given ref is null; otherwise, return FALSE.
+        A ref is null if and only if:
+        - it is supposed to be referencing a persistent object, but
+          its OID is null, or
+        - it is supposed to be referencing a transient object, but it is
+          currently not pointing to an object.
+        A ref is a dangling ref if the object that it points to does not
+        exist.
+   RETURNS:
+        TRUE if the given ref is NULL
+        FALSE if the given ref is not NULL
+ */
+
+/*-------------------------- OCIRefHexSize ----------------------------------*/
+ub4 OCIRefHexSize(    OCIEnv *env, const OCIRef *ref    );
+/*
+   NAME: OCIRefHexSize - OCIRef Hexadecimal buffer SiZe in bytes
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        ref (IN) - ref whose size in hexadecimal representation in bytes is
+                returned
+   DESCRIPTION:
+        Return the size of the buffer in bytes required for the hexadecimal
+        representation of the ref. A buffer of at-least this size must be
+        passed to ref-to-hex (OCIRefToHex) conversion function.
+   RETURNS:
+        size of hexadecimal representation of ref
+ */
+
+/*-------------------------- OCIRefFromHex ---------------------------------*/
+sword OCIRefFromHex(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                        const oratext *hex, ub4 length, OCIRef **ref    );
+/*
+   NAME:
+        OCIRefFromHex - OCIRef convert a Hexadecimal string TO a Ref
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by
+                calling OCIErrorGet().
+        svc (IN) - OCI service context handle; if the resulting ref is
+                initialized with this service context
+        hex (IN) - hexadecimal string (that was produced by 'OCIRefToHex()"
+                previously) to be convert into a ref
+        length (IN) - length of the hexadecimal string
+        ref (IN/OUT) - ref is initialized with the given value ('hex').
+                If *ref is null, then space for the ref is allocated in the
+                object cache, otherwise the memory occupied by the given ref
+                is re-used.
+   DESCRIPTION:
+        Convert the given hexadecimal string into a ref. This function
+        ensures that the resulting ref is well formed. It does NOT ensure
+        that the object pointed to by the resulting ref exists or not.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+ */
+
+/*--------------------------- OCIRefToHex -----------------------------------*/
+sword OCIRefToHex(    OCIEnv *env, OCIError *err, const OCIRef *ref, 
+                      oratext *hex, ub4 *hex_length    );
+/*
+   NAME:
+        OCIRefToHex - OCIRef convert ref to a Hexadecimal string
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by
+                calling OCIErrorGet().
+        ref (IN) - ref to be converted into a hexadecimal string; if the
+                ref is a null ref (i.e. OCIRefIsNull(ref) == TRUE) then
+                a zero hex_length value is returned
+        hex (OUT) - buffer that is large enough to contain the resulting
+                hexadecimal string; the contents of the string is opaque
+                to the caller
+        hex_length (IN/OUT) - on input specifies the size of the 'hex' buffer,
+                on output specifies the actual size of the hexadecimal
+                string being returned in 'hex'
+   DESCRIPTION:
+        Convert the given ref into a hexadecimal string, and return the length
+        of the string. The resulting string is opaque to the caller.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          the given buffer is not big enough to hold the resulting string
+ */
+
+
+/*****************************************************************************/
+/*                          COLLECTION FUNCTIONS                             */
+/*****************************************************************************/
+
+/* 
+   The generic collection is represented by the type 'OCIColl'. The following
+   operations OCIColl*() are provided on a generic collection:
+     - get current size of collection
+     - get upper bound of collection
+     - get pointer to an element given its index
+     - set element at given index (assign element)
+     - append an element 
+     - trim the given number of elements from the end of the collection
+     - collection assignment
+
+   The following iterator based scanning functions are also provided on a
+   generic collection. These functions make use of an iterator which is
+   defined to be of type OCIIter.
+
+     - create an iterator for scanning collection
+     - destroy iterator
+     - reset iterator to the beginning of collection
+     - get pointer to current element pointed by iterator
+     - get pointer to next element
+     - get pointer to previous element
+
+   The collections variable-length array (varray) and nested table
+   are sub-types of generic collection. This means that the OCIColl*() 
+   functions can also be used to manipulate varray and nested table.
+
+   The varray is represented by OCIArray type and nested table by OCITable.
+   Besides OCIColl*() functions no additional functions are provided for
+   manipulating varrays. The OCIColl*() functions are a complete set of 
+   functions to manipulate varrays.
+
+   Besides OCIColl*() functions, the following functions OCITable*() can be 
+   used to manipulate nested table. The OCITable*() functions operate on 
+   nested tables only and should not be used on a varray.
+
+     - delete an element at index i. Note that the position
+       ordinals of the remaining elements of the table is not changed by the
+       delete operation. So delete creates "holes" in the table.
+     - check if an element exists at the given index i
+     - return the smallest value of i for which exists(i) is true
+     - return the largest value of i for which exists(i) is true
+     - return pointer to the smallest position j, greater than i, such that 
+       OCITableExists(j) is true
+     - return pointer to the largest position j, less than i, such that 
+       OCITableExists(j) is true
+
+   For binding variables of type OCIColl* or OCITable* in OCI calls
+   (OCIBindByName(), OCIBindByPos() and OCIDefineByPos()) use the external
+   type code SQLT_NTY.
+ */
+
+/* OCIColl - generic collection type */
+typedef struct OCIColl OCIColl;
+
+/* OCIArray - varray collection type */
+typedef OCIColl OCIArray;
+
+/* OCITable - nested table collection type */
+typedef OCIColl OCITable;
+
+/* OCIIter - collection iterator */
+typedef struct OCIIter OCIIter;
+
+/*----------------------------- OCICollSize ---------------------------------*/
+
+sword OCICollSize( OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                   sb4 *size );
+/*
+   NAME: OCICollSize - OCIColl return current SIZe of the given collection
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection whose number of elements is returned
+        size (OUT) - current number of elements in the collection
+   DESCRIPTION:
+          Returns the current number of elements in the given collection.
+
+          For collections of type nested table wherein 'delete element'
+          operation is allowed, the count returned by OCICollSize() will
+          NOT be decremented upon deleting elements. For example:
+
+            OCICollSize(...); 
+            // assume 'size' returned is equal to 5
+            OCITableDelete(...); // delete one element
+            OCICollSize(...);
+            // 'size' returned will still be 5
+
+          To get the count minus the deleted elements use OCITableSize(). 
+          Continuing the above example,
+
+            OCITableSize(...)
+            // 'size' returned will be equal to 4
+
+          Note, a trim operation (OCICollTrim) will decrement the count 
+          by the number of trimmed elements. Continuing the above example,
+
+            OCICollTrim(..,1..); // trim one element
+            OCICollSize(...);
+            // 'size' returned will be equal to 4
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          error during loading of collection into object cache
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCICollMax ---------------------------------*/
+
+sb4 OCICollMax(    OCIEnv *env, const OCIColl *coll    );
+/*
+   NAME: OCICollMax - OCIColl return MAXimum size (upper-bound) of the
+                   given collection (in number of elements)
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        coll (IN) - collection whose upper-bound in number of elements 
+                is returned
+   DESCRIPTION:
+        Returns the max number of elements that the given collection can hold.
+        A value 0 indicates that the collection has no upper-bound.
+   REQUIRES:
+        coll must point to a valid collection descriptor
+   RETURNS:
+        upper-bound of the given collection
+ */
+
+/*-------------------------- OCICollGetElem ---------------------------------*/
+
+sword OCICollGetElem(    OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                         sb4 index, boolean *exists, void  **elem, 
+                         void  **elemind    );
+/*
+   NAME: OCICollGetElem - OCIColl GET pointer to the element at the given index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - pointer to the element in this collection is returned
+        index (IN) - index of the element whose pointer is returned
+        exists (OUT) - set to FALSE if element at the specified index does 
+                not exist else TRUE
+        elem (OUT) - address of the desired element is returned
+        elemind (OUT) [optional] - address of the null indicator information 
+                is returned; if (elemind == NULL) then the null indicator
+                information will NOT be returned
+   DESCRIPTION:
+        Get the address of the element at the given position. Optionally
+        this function also returns the address of the element's null indicator
+        information.
+ 
+        The following table describes for each collection element type
+        what the corresponding element pointer type is. The element pointer
+        is returned via the 'elem' parameter of OCICollGetElem().
+ 
+           Element Type                       *elem is set to
+        -----------------------               ---------------
+         Oracle Number (OCINumber)              OCINumber*
+         Date (OCIDate)                         OCIDate*
+         Variable-length string (OCIString*)    OCIString**
+         Variable-length raw (OCIRaw*)          OCIRaw**
+         object reference (OCIRef*)             OCIRef**
+         lob locator (OCILobLocator*)           OCILobLocator**
+         object type (e.g. person)              person*
+ 
+        The element pointer returned by OCICollGetElem() is in a form
+        such that it can not only be used to access the
+        element data but also is in a form that can be used as the target
+        (i.e left-hand-side) of an assignment statement.
+ 
+        For example, assume the user is iterating over the elements of
+        a collection whose element type is object reference (OCIRef*). A call
+        to OCICollGetElem() returns pointer to a reference handle
+        (i.e. OCIRef**). After getting, the pointer to the collection
+        element, the user may wish to modify it by assigning a new reference.
+        This can be accomplished via the ref assignment function shown below:
+ 
+        sword OCIRefAssign( OCIEnv *env, OCIError *err, const OCIRef *source,
+                            OCIRef **target );
+ 
+        Note that the 'target' parameter of OCIRefAssign() is of type
+        'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+        If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+        and returned via the 'target' parameter.
+ 
+        Similarly, if the collection element was of type string (OCIString*),
+        OCICollGetElem() returns pointer to string handle
+        (i.e. OCIString**). If a new string is assigned, via
+        OCIStringAssign() or OCIStringAssignText() the type of the target
+        must be 'OCIString **'.
+ 
+        If the collection element is of type Oracle number, OCICollGetElem()
+        returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+ 
+        sword OCINumberAssign(OCIError *err, const OCINumber *from,
+                              OCINumber *to);
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------- OCICollGetElemArray -----------------------------*/
+
+sword OCICollGetElemArray(  OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                            sb4 index, boolean *exists, void  **elem, 
+                            void  **elemind, uword *nelems);
+/*
+   NAME: OCICollGetElemArray - OCIColl GET pointers to elements from given index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - pointers to the elements in this collection is returned
+        index (IN) - starting index of the element
+        exists (OUT) - set to FALSE if element at the specified index does 
+                not exist else TRUE
+        elem (OUT) - address of the desired elements is returned
+        elemind (OUT) [optional] - address of the null indicators information 
+                is returned; if (elemind == NULL) then the null indicator
+                information will NOT be returned
+        nelems(IN/OUT) - Upper bound of elem and/or elemind array
+   DESCRIPTION:
+        Get the address of the elements from the given position. Optionally
+        this function also returns the address of the element's null indicator
+        information.
+ 
+        The following table describes for each collection element type
+        what the corresponding element pointer type is. The element pointer
+        is returned via the 'elem' parameter of OCICollGetElem().
+ 
+           Element Type                       *elem is set to
+        -----------------------               ---------------
+         Oracle Number (OCINumber)              OCINumber*
+         Date (OCIDate)                         OCIDate*
+         Variable-length string (OCIString*)    OCIString**
+         Variable-length raw (OCIRaw*)          OCIRaw**
+         object reference (OCIRef*)             OCIRef**
+         lob locator (OCILobLocator*)           OCILobLocator**
+         object type (e.g. person)              person*
+ 
+        The element pointer returned by OCICollGetElem() is in a form
+        such that it can not only be used to access the
+        element data but also is in a form that can be used as the target
+        (i.e left-hand-side) of an assignment statement.
+ 
+        For example, assume the user is iterating over the elements of
+        a collection whose element type is object reference (OCIRef*). A call
+        to OCICollGetElem() returns pointer to a reference handle
+        (i.e. OCIRef**). After getting, the pointer to the collection
+        element, the user may wish to modify it by assigning a new reference.
+        This can be accomplished via the ref assignment function shown below:
+ 
+        sword OCIRefAssign( OCIEnv *env, OCIError *err, const OCIRef *source,
+                            OCIRef **target );
+ 
+        Note that the 'target' parameter of OCIRefAssign() is of type
+        'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+        If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+        and returned via the 'target' parameter.
+ 
+        Similarly, if the collection element was of type string (OCIString*),
+        OCICollGetElem() returns pointer to string handle
+        (i.e. OCIString**). If a new string is assigned, via
+        OCIStringAssign() or OCIStringAssignText() the type of the target
+        must be 'OCIString **'.
+ 
+        If the collection element is of type Oracle number, OCICollGetElem()
+        returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+ 
+        sword OCINumberAssign(OCIError *err, const OCINumber *from,
+                              OCINumber *to);
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*----------------------- OCICollAssignElem ---------------------------------*/
+
+sword OCICollAssignElem(    OCIEnv *env, OCIError *err, sb4 index, 
+                            const void  *elem, 
+                            const void  *elemind, OCIColl *coll    );
+/*
+   NAME: OCICollAssignElem - OCIColl ASsign Element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - index of the element whose is assigned to
+        elem (IN) - element which is assigned from (source element)
+        elemind (IN) [optional] - pointer to the element's null indicator 
+                information; if (elemind == NULL) then the null indicator
+                information of the assigned element will be set to non-null.
+        coll (IN/OUT) - collection to be updated
+   DESCRIPTION:
+        Assign the given element value 'elem' to the element at coll[index].
+        If the collection is of type nested table, the element at the given 
+        index may not exist (i.e. may have been deleted). In this case, the 
+        given element is inserted at index 'index'.
+        Otherwise, the element at index 'index' is updated with the value
+        of 'elem'.
+  
+        Note that the given element is deep-copied and 
+        'elem' is strictly an input parameter.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          given index is out of bounds of the given collection
+ */
+
+/*--------------------------- OCICollAssign ---------------------------------*/
+
+sword OCICollAssign(    OCIEnv *env, OCIError *err, const OCIColl *rhs, 
+                        OCIColl *lhs    );
+/*
+   NAME: OCICollAssign - OCIColl ASsiGn collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - collection to be assigned from
+        lhs (OUT) - collection to be assigned to
+   DESCRIPTION:
+        Assign 'rhs' to 'lhs'. The 'lhs' collection may be decreased or 
+        increased depending upon the size of 'rhs'. If the 'lhs' contains 
+        any elements then the elements will be deleted prior to the 
+        assignment. This function performs a deep-copy. The memory for the 
+        elements comes from the object cache.
+ 
+        An error is returned if the element types of the lhs and rhs 
+        collections do not match. Also, an error is returned if the 
+        upper-bound of the lhs collection is less than the current number of 
+        elements in the rhs collection.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          type mis-match of lhs and rhs collections
+          upper-bound of lhs collection is less than the current number of 
+          elements in the rhs collection
+ */
+
+/*--------------------------- OCICollAppend ---------------------------------*/
+
+sword OCICollAppend(    OCIEnv *env, OCIError *err, const void  *elem, 
+                        const void  *elemind, OCIColl *coll    );
+/*
+   NAME: OCICollAppend - OCIColl APPend collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the element which is appended to the end
+                of the given collection
+        elemind (IN) [optional] - pointer to the element's null indicator 
+                information; if (elemind == NULL) then the null indicator
+                information of the appended element will be set to non-null.
+        coll (IN/OUT) - updated collection
+   DESCRIPTION:
+        Append the given element to the end of the given collection. 
+        Appending an element is equivalent to:
+          - increasing the size of the collection by 1 element
+          - updating (deep-copying) the last element's data with the given 
+            element's data
+  
+        Note that the pointer to the given element 'elem' will not be saved 
+        by this function. So 'elem' is strictly an input parameter.
+        An error is returned if the current size of the collection
+        is equal to the max size (upper-bound) of the collection prior to 
+        appending the element.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          current size of collection == max size of the collection
+ */
+
+/*----------------------------- OCICollTrim ---------------------------------*/
+
+sword OCICollTrim(    OCIEnv *env, OCIError *err, sb4 trim_num, 
+                      OCIColl *coll    );
+/*
+   NAME: OCICollTrim - OCIColl Trim elements from the end of the collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        trim_num (IN) - number of elements to trim
+        coll (IN/OUT) - 'trim_num' of elements are removed (freed) from the
+                end of the collection
+   DESCRIPTION:
+        Trim the collection by the given number of elements. The elements are 
+        removed from the end of the collection.
+  
+        An error is returned if the 'trim_num' is greater than the current 
+        size of the collection.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          'trim_num' is greater than the current size of the collection.
+ */
+
+/*--------------------------- OCICollIsLocator ------------------------------*/
+
+sword OCICollIsLocator(OCIEnv *env, OCIError *err, const OCIColl *coll,
+                       boolean *result );
+/*
+Name: OCICollIsLocator - OCIColl indicates whether a collection is locator
+                         based or not.
+Parameters:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection item.
+        result (OUT) - TRUE if the collection item is a locator, FALSE
+                       otherwise
+Description:
+        Returns TRUE in the result OUT parameter if the collection item is a
+        locator, otherwise returns FALSE.
+Returns:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+*/
+
+/*---------------------------- OCIIterCreate --------------------------------*/
+
+sword OCIIterCreate(    OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                        OCIIter **itr    );
+/*
+   NAME: OCIIterCreate - OCIColl Create an ITerator to scan the collection
+                      elements
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection which will be scanned; the different 
+                collection types are varray and nested table
+        itr (OUT) - address to the allocated collection iterator is
+                returned by this function
+   DESCRIPTION:
+        Create an iterator to scan the elements of the collection. The
+        iterator is created in the object cache. The iterator is initialized
+        to point to the beginning of the collection.
+  
+        If the next function (OCIIterNext) is called immediately 
+        after creating the iterator then the first element of the collection 
+        is returned. 
+        If the previous function (OCIIterPrev) is called immediately after 
+        creating the iterator then "at beginning of collection" error is 
+        returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+ */
+
+/*----------------------------- OCIIterDelete ------------------------------*/
+
+sword OCIIterDelete(    OCIEnv *env, OCIError *err, OCIIter **itr    );
+/*
+   NAME: OCIIterDelete - OCIColl Delete ITerator
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - the allocated collection iterator is destroyed and
+                the 'itr' is set to NULL prior to returning
+   DESCRIPTION:
+        Delete the iterator which was previously created by a call to 
+        OCIIterCreate.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          to be discovered
+ */
+
+/*----------------------------- OCIIterInit ---------------------------------*/
+
+sword OCIIterInit(    OCIEnv *env, OCIError *err, const OCIColl *coll, 
+                      OCIIter *itr    );
+/*
+   NAME: OCIIterInit - OCIColl Initialize ITerator to scan the given 
+                   collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection which will be scanned; the different 
+                collection types are varray and nested table
+        itr (IN/OUT) - pointer to an allocated  collection iterator
+   DESCRIPTION:
+        Initializes the given iterator to point to the beginning of the 
+        given collection. This function can be used to:
+  
+        a. reset an iterator to point back to the beginning of the collection 
+        b. reuse an allocated iterator to scan a different collection
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------ OCIIterGetCurrent --------------------------------*/
+
+sword OCIIterGetCurrent(    OCIEnv *env, OCIError *err, const OCIIter *itr, 
+                            void  **elem, void  **elemind    );
+/*
+   NAME: OCIIterGetCurrent - OCIColl Iterator based, get CURrent collection
+                    element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN) - iterator which points to the current element
+        elem (OUT) - address of the element pointed by the iterator is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+   DESCRIPTION:
+        Returns pointer to the current element and its corresponding null
+        information.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterNext --------------------------------*/
+
+sword OCIIterNext(    OCIEnv *env, OCIError *err, OCIIter *itr, 
+                      void  **elem, void  **elemind, boolean *eoc    );
+/*
+   NAME: OCIIterNext - OCIColl Iterator based, get NeXT collection element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - iterator is updated to point to the next element
+        elem (OUT) - after updating the iterator to point to the next element,
+                address of the element is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+        eoc (OUT) - TRUE if iterator is at End Of Collection (i.e. next
+                element does not exist) else FALSE
+   DESCRIPTION:
+        Returns pointer to the next element and its corresponding null
+        information. The iterator is updated to point to the next element.
+  
+        If the iterator is pointing to the last element of the collection
+        prior to executing this function, then calling this function will 
+        set eoc flag to TRUE. The iterator will be left unchanged in this
+        situation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterPrev --------------------------------*/
+
+sword OCIIterPrev(    OCIEnv *env, OCIError *err, OCIIter *itr, 
+                      void  **elem, void  **elemind, boolean *boc    );
+/*
+   NAME: OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - iterator is updated to point to the previous 
+                element
+        elem (OUT) - after updating the iterator to point to the previous 
+                element, address of the element is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+        boc (OUT) - TRUE if iterator is at Beginning Of Collection (i.e.
+                previous element does not exist) else FALSE.
+   DESCRIPTION:
+        Returns pointer to the previous element and its corresponding null
+        information. The iterator is updated to point to the previous element.
+  
+        If the iterator is pointing to the first element of the collection
+        prior to executing this function, then calling this function will 
+        set 'boc' to TRUE. The iterator will be left unchanged in this 
+        situation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*****************************************************************************/
+/*           FUNCTIONS WHICH OPERATE ONLY ON NESTED TABLE OCITable*()        */
+/*****************************************************************************/
+
+/*---------------------------- OCITableSize ---------------------------------*/
+
+sword OCITableSize( OCIEnv *env, OCIError *err, const OCITable *tbl, 
+                    sb4 *size);
+/*
+   NAME: OCITableSize - OCITable return current SIZe of the given 
+                   nested table (not including deleted elements)
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - nested table whose number of elements is returned
+        size (OUT) - current number of elements in the nested table. The count
+                does not include deleted elements.
+   DESCRIPTION:
+        Returns the count of elements in the given nested table. 
+
+        The count returned by OCITableSize() will be decremented upon 
+        deleting elements from the nested table. So, this count DOES NOT 
+        includes any "holes" created by deleting elements. 
+        For example:
+
+            OCITableSize(...); 
+            // assume 'size' returned is equal to 5
+            OCITableDelete(...); // delete one element
+            OCITableSize(...);
+            // 'size' returned will be equal to 4
+
+        To get the count plus the count of deleted elements use 
+        OCICollSize(). Continuing the above example,
+
+            OCICollSize(...)
+            // 'size' returned will still be equal to 5
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          error during loading of nested table into object cache
+          any of the input parameters is null
+ */
+
+/*---------------------- OCITableExists ---------------------------------*/
+
+sword OCITableExists(    OCIEnv *env, OCIError *err, const OCITable *tbl,
+                             sb4 index, boolean *exists    );
+/*
+   NAME: OCITableExists - OCITable test whether element at the given index
+                    EXIsts
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table in which the given index is checked
+        index (IN) - index of the element which is checked for existence
+        exists (OUT) - set to TRUE if element at given 'index' exists
+                else set to FALSE
+   DESCRIPTION:
+        Test whether an element exists at the given 'index'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*--------------------------- OCITableDelete -------------------------------*/
+
+sword OCITableDelete(    OCIEnv *env, OCIError *err, sb4 index, 
+                      OCITable *tbl    );
+/*
+   NAME: OCITableDelete - OCITable DELete element at the specified index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - index of the element which must be deleted
+        tbl (IN) - table whose element is deleted
+   DESCRIPTION:
+        Delete the element at the given 'index'. Note that the position
+        ordinals of the remaining elements of the table is not changed by the
+        delete operation. So delete creates "holes" in the table.
+
+        An error is returned if the element at the specified 'index' has
+        been previously deleted.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          given index is not valid
+ */
+
+/*--------------------------- OCITableFirst ---------------------------------*/
+
+sword OCITableFirst(    OCIEnv *env, OCIError *err, const OCITable *tbl, 
+                        sb4 *index     );
+/*
+   NAME: OCITableFirst - OCITable return FirST index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table which is scanned
+        index (OUT) - first index of the element which exists in the given 
+                table is returned
+   DESCRIPTION:
+        Return the first index of the element which exists in the given 
+        table. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          table is empty
+ */
+
+/*---------------------------- OCITableLast ---------------------------------*/
+
+sword OCITableLast(    OCIEnv *env, OCIError *err, const OCITable *tbl, 
+                       sb4 *index     );
+/*
+   NAME: OCITableFirst - OCITable return LaST index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table which is scanned
+        index (OUT) - last index of the element which exists in the given 
+                table is returned
+   DESCRIPTION:
+        Return the last index of the element which exists in the given 
+        table. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          table is empty
+ */
+
+/*---------------------------- OCITableNext ---------------------------------*/
+
+sword OCITableNext(    OCIEnv *env, OCIError *err, sb4 index, 
+                       const OCITable *tbl, sb4 *next_index,
+                       boolean *exists    );
+/*
+   NAME: OCITableNext - OCITable return NeXT available index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - starting at 'index' the index of the next element
+                which exists is returned
+        tbl (IN) - table which is scanned
+        next_index (OUT) - index of the next element which exists 
+                is returned
+        exists (OUT) - FALSE if no next index available else TRUE
+   DESCRIPTION:
+        Return the smallest position j, greater than 'index', such that 
+        exists(j) is TRUE.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          no next index available
+ */
+
+/*---------------------------- OCITablePrev ---------------------------------*/
+
+sword OCITablePrev(    OCIEnv *env, OCIError *err, sb4 index, 
+                       const OCITable *tbl, sb4 *prev_index,
+                       boolean *exists    );
+/*
+   NAME: OCITablePrev - OCITable return PReVious available index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - starting at 'index' the index of the previous element
+                which exists is returned
+        tbl (IN) - table which is scanned
+        prev_index (OUT) - index of the previous element which exists 
+                is returned
+        exists (OUT) - FALSE if no next index available else TRUE
+   DESCRIPTION:
+        Return the largest position j, less than 'index', such that 
+        exists(j) is TRUE.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          no previous index available
+ */
+
+/*------------------------ OCINumberToLnx -----------------------------------*/
+/* void OCINumberToLnx(/o_ OCINumber *num _o/); */
+
+#define OCINumberToLnx(num) ((lnxnum_t *)num)
+
+/* 
+   NAME:   OCINumberToLnx
+   PARAMETERS:
+           num (IN) - OCINumber to convert ;
+   DESCRIPTION: 
+           Converts OCINumber to its internal lnx format 
+           This is not to be used in Public interfaces , but
+           has been provided due to special requirements from 
+           SQLPLUS development group as they require to call 
+           Core funtions directly . 
+*/
+
+/* OCI representation of XMLType */
+typedef struct OCIXMLType OCIXMLType;
+
+/* OCI representation of OCIDomDocument */
+typedef struct OCIDOMDocument OCIDOMDocument;
+
+/* OCI representation for the Binary XML repository context */
+typedef struct OCIBinXmlReposCtx OCIBinXmlReposCtx;
+
+#endif /* ORL_ORACLE */
diff --git a/sdk/include/oro.h b/sdk/include/oro.h
new file mode 100644
index 0000000..e825a5c
--- /dev/null
+++ b/sdk/include/oro.h
@@ -0,0 +1,883 @@
+/* Copyright (c) 1994, 2003, Oracle Corporation.  All rights reserved.  */
+
+/*
+  NAME
+    OCI - Oracle Object Interface for External/Internal/Kernel Clients
+
+  DESCRIPTION
+    This header file contains Oracle object interface definitions which
+    can be included by external user applications, tools, as well as
+    the kernel.  It defines types and constants that are common to all
+    object interface which is being defined in several other header files
+    (e.g., ori.h, ort.h, and orl.h).
+
+  RELATED DOCUMENTS
+    TBD
+
+  INSPECTION STATUS [[ deletable if no inspection ]]
+    Inspection date:    [[ date of the last logging meeting ]]
+    Inspection status:  [[ exited, not exited, or N/A if exit is not a goal ]]
+    Estimated increasing cost defects per page:
+    Rule sets:          [[ rule sets inspected against or planned to be 
+                           inspected against ]]
+
+  ACCEPTANCE REVIEW STATUS [[ deletable if no approval review ]]
+    Review date:    [[ date of the meeting where issues were logged and the 
+                       approval status was decided ]] 
+    Review status:  [[ current status:  accepted, conditionally accepted, 
+                       major revision required, rejected ]]
+    Reviewers:      [[ names of the members on the review team ]]
+
+  PUBLIC FUNCTIONS
+
+  EXAMPLES
+    Examples are given in the description of each function or macro where
+    relevant.
+
+  MODIFIED
+    mnanal     06/09/03 - backout of fix 2836388
+    mnanal     05/14/03 - bug-2836388
+    srseshad   11/27/02 - Change OCI_TYPECODE_BFLOAT/BDOUBLE codes
+    rxgovind   10/09/02 - add OCI_TYPECODE_UROWID
+    mxyang     09/17/02 - grabtrans 'mmorsi_obj_float'
+    srseshad   09/11/02 - 
+    srseshad   09/01/02 - 
+    aahluwal   06/03/02 - bug 2360115
+    celsbern   10/19/01 - merge LOG to MAIN
+    rxgovind   10/16/01 - update typecodes
+    rxgovind   09/19/01 - add typecodes
+    rkasamse   08/15/01 - add OCI_DURATION_USER_CALLBACK
+    jchai      09/24/01 - add type code for PLS_INTEGER
+    porangas   08/22/01 - Fix bug#1776434
+    schatter   04/09/01 - merge 1456235: define OCI_DURATION_INVALID
+    rdani      10/12/00 - 1449943 NOCOPY and PIPELINE
+    ciyer      05/26/00 - short names for abstract, overriding
+    rkasamse   05/25/00 - OCCI enhancements
+    smuralid   05/11/00 - OCITypeMethodFlags - add NOT INSTANTIABLE, OVERRIDING
+    rxgovind   05/09/00 - add OCI_TYPECODE_NONE
+    tnbui      07/28/99 - Remove OCI_TYPECODE_TIMESTAMP_ITZ                    
+    tnbui      07/21/99 - TS LOCAL TZ                                          
+    thoang     06/21/99 - Add OCI_TYPECODE_TIMESTAMP_ITZ
+    thoang     03/04/99 - Add datetime datatypes
+    rkasamse   10/20/98 - add OCI_ATTR_CACHE_ARRAYFLUSH
+    rkasamse   10/29/98 - add OCI_DURATION_CALLOUT
+    rkasamse   04/28/98 - OCI_OBJECT_DETECTCHANGE -> OCI_ATTR_OBJECT_DETECTCHAN
+    rkasamse   04/28/98 - OCI_OBJECT_NEWNOTNULL -> OCI_ATTR_OBJECT_NEWNOTNULL  
+    rkasamse   04/23/98 - add OCI_OBJECT_DETECTCHANGE
+    rkasamse   04/03/98 - add OCI_OBJECT_NEWNOTNULL                            
+    pmitra     04/01/98 - OCI_LOCK_X_NOWAIT added                              
+    rxgovind   02/18/98 - add OCI_TYPECODE_OPAQUE
+    rkasamse   02/13/98 - Add OCI_DURATION_PROCESS
+    cxcheng    07/28/97 - fix compile with SLSHORTNAME
+    skrishna   07/14/97 - add OCIObjectGetProperty
+    cxcheng    04/30/97 - make OCITypeParamMode values consistent with PL/SQL
+    skrishna   04/28/97 - undocument OCIObjectProperty & OCIObjectEvent
+    cxcheng    03/29/97 - remove all remaining short names
+    sthakur    03/20/97 - add casts to constants
+    cxcheng    02/21/97 - temporarily put SLSHORTNAME for PL/SQL
+    cxcheng    02/06/97 - take out short name support except with SLSHORTNAME
+    lchidamb   01/20/97 - update OCIRef comments
+    sgollapu   11/19/96 - Add OCI type codes for BOOL,REC,and TAB
+    cxcheng    11/19/96 - more typecode changes
+    cxcheng    11/13/96 - add #include for ocidfn.h
+    cxcheng    11/13/96 - add OCI_TYPECODE_ADT for compatibility
+    cxcheng    11/12/96 - add SQLT_NCO for named collection
+    cxcheng    11/11/96 - more changes to typecodes
+    cxcheng    11/07/96 - #define OCI_TYPECODE_MLSLABEL to SQLT_LAB
+    cxcheng    11/06/96 - fix #define omission for OROTCNAT
+    cxcheng    10/30/96 - move OCI_TYPECODE_* to ocidfn.h as SQLT_*
+    cxcheng    10/28/96 - more beautification changes
+    jboonleu   10/29/96 - add flags for freeing object
+    dchatter   10/26/96 - delete redef of OCISvcCtx, OCIError, OCIEnv
+    cxcheng    10/15/96 - more changes
+    cxcheng    10/14/96 - more final fixes to constants
+    mluong     10/11/96 -
+    mluong     10/11/96 -  KOCON and KONSP are in lowercase
+    mluong     10/11/96 -  add some define per Calvin
+    cxcheng    10/09/96 -  add #define for OROOCOSFN to OCI_COPY_NOREF
+    jboonleu   10/08/96 -  change OROOCOSFN to OCICopyFlag
+    jboonleu   10/07/96 -  use new OCI names for cache options
+    cxcheng    10/07/96 -  add OROTCS02 for KOTTCBRI and OROTCS03 as spare
+    cxcheng    10/07/96 -  more lint fixes
+    cxcheng    10/02/96 -  move oronsp to ko.h as konsp
+    cxcheng    10/01/96 -  add long names for readability
+    cxcheng    10/01/96 -  remove orotty and orotal
+    rjenkins   09/28/96 -  2k char 4k varchar2
+    jboonleu   09/27/96 -  add macro used only in beta2
+    cxcheng    09/27/96 -  move oroenv to oroenv.h
+    cxcheng    09/24/96 -  remove unnecessary orotyp
+    cxcheng    09/25/96 -  add typecode OROTCS01 as placeholder for lob pointer
+    cxcheng    09/20/96 -  add TDO load option orotgo
+    jboonleu   09/18/96 -  add OROOPOREC
+    jboonleu   09/10/96 -  add OROOPODFL
+    jweisz     08/27/96 -  add SQL internal typecode OROTCS00
+    cxcheng    08/02/96 -  add PLSQL internal typecodes OROTCP..
+    cxcheng    08/01/96 -  add OROTCFAR to fill up space left by OROTCCAR
+    jboonleu   07/16/96 -  new pin option
+    cxcheng    06/18/96 -  add casts to OROTNOPRE and OROTNOSCL
+    cxcheng    05/29/96 -  change OROTCNPT back to OROTCDOM
+    vkrishna   05/27/96 -  add OROTCCAR
+    cxcheng    05/17/96 -  replace OROTCFAR with OROTCCAR
+    cxcheng    05/08/96 -  change orotmf from ub1 to ub2
+    cxcheng    05/07/96 -  fix public defines for method types
+    cxcheng    04/30/96 -  change OROTCDOM to OROTCNPT
+    cxcheng    04/15/96 -  remove obsolete OROTTYICT
+    jboonleu   04/12/96 -  add new pin option
+    sthakur    04/12/96 -  add indicator type and indicator status
+    cxcheng    04/10/96 -  add function parameter codes for ORT/KOT
+    cxcheng    04/03/96 -  replace OROTCFAR as OROTCCAR
+    jwijaya    03/29/96 -  add OROTTCCAR
+    jwijaya    03/27/96 -  better comments for orotc
+    cxcheng    02/23/96 -  add typecodes for SMALLINT and VARCHAR2
+    skrishna   02/22/96 -  add oroind - null indicator type
+    cxcheng    02/21/96 -  change lob character codes to OROTCCLB, OROTCBLB...
+    jboonleu   02/06/96 -  new value for predefined duration
+    cxcheng    01/12/96 -  add OROTCCLO, OROTCBLO, OROTCFIL to orotc
+    cxcheng    12/05/95 -  add OROTCDOM and OROTCAAT to orotc
+    skotsovo   10/30/95 -  reserve space for internal 'oid' type
+    jwijaya    10/20/95 -  support variable-length ref
+    cxcheng    10/03/95 -  add OROTMFOR for ordering function to orotmf
+    cxcheng    10/03/95 -  Adding the ordering function type to orotmf
+    jboonleu   09/28/95 -  set OROODTPRE 
+    jboonleu   09/25/95 -  add oroodt
+    skotsovo   03/10/95 -  update to only include release 1 
+    jboonleu   02/15/95 -  add OROOPOREC, remove orocro, oroolo
+    skotsovo   01/30/95 -  add default max lengths for varrays and vstrings 
+    skotsovo   01/24/95 -  categorize sint32, double, and real as number types 
+                           (with precision and scale) instead of scalar types.
+    skotsovo   12/20/94 -  add release 1 types 
+    skotsovo   12/12/94 -  update according to new ots doc
+    skotsovo   12/01/94 -  add default precision and scale 
+    jwijaya    11/15/94 -  rename ORONSPTAB to ORONSPEXT 
+    jwijaya    10/25/94 -  tint 
+    jwijaya    10/06/94 -  add namespace 
+    jwijaya    10/02/94 -  connection handle -> connection number 
+    skotsovo   09/12/94 -  keep 0 as uninitialized value for ORT consts 
+    skotsovo   08/24/94 -  fix orotec 
+    skotsovo   08/17/94 -  modify type code names 
+    skotsovo   08/12/94 -  fix 141 lint errors 
+    skotsovo   07/25/94 -  modify categorization of complex types (orotc) 
+    skotsovo   07/07/94 -  change typecode enum values & add decimal type
+    skotsovo   07/01/94 -  change order of typecodes 
+    jwijaya    06/15/94 -  review 
+    jboonleu   06/13/94 -  add comments for the object cache options
+    jwijaya    06/13/94 -  adhere to the header file template 
+    skotsovo   06/09/94 -  make ots scalar type names consistent with the ots 
+                           document 
+    jwijaya    06/07/94 -  include oratypes.h instead of s.h 
+    skotsovo   05/24/94 -  change typecodes 
+    jwijaya    05/23/94 -  fix comments of ororef 
+    skotsovo   05/19/94 -  remove type composition 
+    skotsovo   05/09/94 -  modified orotc according to new OTS document
+    jwijaya    05/03/94 -  oroid and ororef
+    jwijaya    01/26/94 -  Creation
+*/
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN_ORACLE
+#include <ocidfn.h>
+#endif
+
+#ifndef ORO_ORACLE
+#define ORO_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCIDuration                     oroodt
+#define OCIInd                          oroind
+#define OCILockOpt                      oroolm
+#define OCIMarkOpt                      oroomo
+#define OCIObjectEvent                  orocev
+#define OCIObjectProperty               oroopr
+#define OCIPinOpt                       oroopo
+#define OCIRef                          ororef
+#define OCIRefreshOpt                   orooro
+#define OCITypeCode                     orotc
+#define OCITypeEncap                    orotec
+#define OCITypeGetOpt                   orotgo
+#define OCITypeMethodFlag               orotmf
+#define OCITypeParamMode                orotpm
+#define OCIObjectPropId                 oroopi
+#define OCIObjectLifetime               oroolft
+#define OCIObjectMarkstatus             oroomst
+#define OCI_LOCK_NONE                   OROOLMNUL
+#define OCI_LOCK_X                      OROOLMX
+#define OCI_LOCK_X_NOWAIT               OROOLMXNW
+#define OCI_MARK_DEFAULT                OROOMODFL
+#define OCI_MARK_NONE                   OROOMONON
+#define OCI_MARK_UPDATE                 OROOMOUPD
+#define OCI_OBJECTEVENT_AFTER_FLUSH     OROCEVAFL
+#define OCI_OBJECTEVENT_AFTER_REFRESH   OROCEVARF
+#define OCI_OBJECTEVENT_BEFORE_FLUSH    OROCEVBFL
+#define OCI_OBJECTEVENT_BEFORE_REFRESH  OROCEVBRF
+#define OCI_OBJECTEVENT_WHEN_LOCK       OROCEVWLK
+#define OCI_OBJECTEVENT_WHEN_MARK_DELETED OROCEVWDL
+#define OCI_OBJECTEVENT_WHEN_MARK_UPDATED OROCEVWUP
+#define OCI_OBJECTEVENT_WHEN_UNMARK     OROCEVWUM
+#define OCI_OBJECTPROP_DIRTIED          OROOPRDRT
+#define OCI_OBJECTPROP_LOADED           OROOPRLOD
+#define OCI_OBJECTPROP_LOCKED           OROOPRLCK
+#define OCI_PIN_ANY                     OROOPOANY
+#define OCI_PIN_DEFAULT                 OROOPODFL
+#define OCI_PIN_LATEST                  OROOPOLST
+#define OCI_PIN_RECENT                  OROOPOREC
+#define OCI_REFRESH_LOADED              OROOROLOD
+#define OCI_TYPEENCAP_PRIVATE           OROTECPVT
+#define OCI_TYPEENCAP_PUBLIC            OROTECPUB
+#define OCI_TYPEGET_ALL                 OROTGOALL
+#define OCI_TYPEGET_HEADER              OROTGOHDR
+#define OCI_TYPEMETHOD_CONSTANT         OROTMCON
+#define OCI_TYPEMETHOD_CONSTRUCTOR      OROTMCSTR
+#define OCI_TYPEMETHOD_DESTRUCTOR       OROTMDSTR
+#define OCI_TYPEMETHOD_INLINE           OROTMINL
+#define OCI_TYPEMETHOD_MAP              OROTMMAP
+#define OCI_TYPEMETHOD_OPERATOR         OROTMOP
+#define OCI_TYPEMETHOD_ORDER            OROTMOR
+#define OCI_TYPEMETHOD_RNDS             OROTMRDS
+#define OCI_TYPEMETHOD_RNPS             OROTMRPS
+#define OCI_TYPEMETHOD_SELFISH          OROTMSLF
+#define OCI_TYPEMETHOD_VIRTUAL          OROTMVRT
+#define OCI_TYPEMETHOD_WNDS             OROTMWDS
+#define OCI_TYPEMETHOD_WNPS             OROTMWPS
+#define OCI_TYPEMETHOD_ABSTRACT         OROTMABSTRACT
+#define OCI_TYPEMETHOD_OVERRIDING       OROTMOVERRIDING
+#define OCI_TYPEMETHOD_PIPELINED        OROTMPIPELINED
+#define OCI_TYPEPARAM_BYREF             OROTPMREF
+#define OCI_TYPEPARAM_IN                OROTPMIN
+#define OCI_TYPEPARAM_INOUT             OROTPMIO
+#define OCI_TYPEPARAM_OUT               OROTPMOUT
+#define OCI_TYPEPARAM_OUTNCPY           OROTPMOUTNCPY
+#define OCI_TYPEPARAM_INOUTNCPY         OROTPMIONCPY
+
+#endif                                                        /* SLSHORTNAME */
+
+
+/*---------------------------------------------------------------------------*/
+/*                    PUBLIC TYPES, CONSTANTS AND MACROS                     */
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+/*                  GENERAL OBJECT TYPES, CONSTANTS, MACROS                  */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- OBJECT REFERENCE (REF) --------------------------*/
+
+typedef struct OCIRef OCIRef;
+/*
+ * OCIRef - OCI object REFerence
+ *
+ * In the Oracle object runtime environment, an object is identified by an 
+ * object reference (ref) which contains the object identifier plus other 
+ * runtime information.  The contents of a ref is opaque to clients.  Use
+ * OCIObjectNew() to construct a ref.
+ */
+
+
+/*--------------------------- OBJECT INDICATOR ------------------------------*/
+
+typedef sb2 OCIInd;
+/*
+ * OCIInd -- a variable of this type contains (null) indicator information
+ */
+
+#define OCI_IND_NOTNULL (OCIInd)0                                /* not NULL */
+#define OCI_IND_NULL (OCIInd)(-1)                                    /* NULL */
+#define OCI_IND_BADNULL (OCIInd)(-2)                             /* BAD NULL */
+#define OCI_IND_NOTNULLABLE (OCIInd)(-3)                     /* not NULLable */
+
+/*---------------------------------------------------------------------------*/
+/*                               OBJECT CACHE                                */
+/*---------------------------------------------------------------------------*/
+
+/* To enable object change detection mode, set this to TRUE */
+#define OCI_ATTR_OBJECT_DETECTCHANGE            0x00000020
+
+/* To enable object creation with  non-NULL attributes by default, set the
+   following to TRUE.
+   By default, object is created with NULL attributes
+*/
+#define OCI_ATTR_OBJECT_NEWNOTNULL   0x00000010
+
+/* To enable sorting of the objects that belong to the same table
+   before being flushed through OCICacheFlush.
+   Please note that by enabling this object cache will not be flushing
+   the objects in the same order they were dirtied */
+#define OCI_ATTR_CACHE_ARRAYFLUSH 0x00000040
+
+/*--------------------------- OBJECT PIN OPTION -----------------------------*/
+
+enum OCIPinOpt
+{
+  /* 0 = uninitialized */
+  OCI_PIN_DEFAULT = 1,                                 /* default pin option */
+  OCI_PIN_ANY = 3,                          /* pin any copy of the object */
+  OCI_PIN_RECENT = 4,                    /* pin recent copy of the object */
+  OCI_PIN_LATEST = 5                     /* pin latest copy of the object */
+};
+typedef enum OCIPinOpt OCIPinOpt;
+
+/*
+ * OCIPinOpt - OCI object Pin Option 
+ *
+ * In the Oracle object runtime environment, the program has the option to
+ * specify which copy of the object to pin.  
+ *
+ * OCI_PINOPT_DEFAULT pins an object using the default pin option.  The default
+ * pin option can be set as an attribute of the OCI environment handle 
+ * (OCI_ATTR_PINTOPTION).  The value of the default pin option can be
+ * OCI_PINOPT_ANY, OCI_PINOPT_RECENT, or OCI_PIN_LATEST. The default option
+ * is initialized to OCI_PINOPT_ANY.
+ *
+ * OCI_PIN_ANY pins any copy of the object.  The object is pinned 
+ * using the following criteria:
+ *   If the object copy is not loaded, load it from the persistent store.
+ *   Otherwise, the loaded object copy is returned to the program. 
+ * 
+ * OCI_PIN_RECENT pins the latest copy of an object.  The object is 
+ * pinned using the following criteria:
+ *   If the object is not loaded, load the object from the persistent store
+ *       from the latest version.
+ *   If the object is not loaded in the current transaction and it is not 
+ *       dirtied, the object is refreshed from the latest version.
+ *   Otherwise, the loaded object copy is returned to the program. 
+ *
+ * OCI_PINOPT_LATEST pins the latest copy of an object.  The object copy is 
+ * pinned using the following criteria:
+ *   If the object copy is not loaded, load it from the persistent store.
+ *   If the object copy is loaded and dirtied, it is returned to the program.
+ *   Otherwise, the loaded object copy is refreshed from the persistent store.
+ */
+
+
+
+/*--------------------------- OBJECT LOCK OPTION ----------------------------*/
+
+enum OCILockOpt
+{
+  /* 0 = uninitialized */
+  OCI_LOCK_NONE = 1,                               /* null (same as no lock) */
+  OCI_LOCK_X = 2,                                          /* exclusive lock */
+  OCI_LOCK_X_NOWAIT = 3                      /* exclusive lock, do not wait  */
+};
+typedef enum OCILockOpt OCILockOpt;
+/*
+ * OCILockOpt - OCI object LOCK Option 
+ *
+ * This option is used to specify the locking preferences when an object is
+ * loaded from the server.
+ */
+
+
+/*------------------------- OBJECT MODIFYING OPTION -------------------------*/
+
+enum OCIMarkOpt
+{
+  /* 0 = uninitialized */
+  OCI_MARK_DEFAULT = 1,        /* default (the same as OCI_MARK_NONE) */
+  OCI_MARK_NONE = OCI_MARK_DEFAULT,   /* object has not been modified */
+  OCI_MARK_UPDATE                               /* object is to be updated */
+};
+typedef enum OCIMarkOpt OCIMarkOpt;
+/*
+ * OCIMarkOpt - OCI object Mark option
+ *
+ * When the object is marked updated, the client has to specify how the
+ * object is intended to be changed.  
+ */
+
+/*-------------------------- OBJECT Duration --------------------------------*/
+ 
+typedef ub2 OCIDuration;
+
+#define  OCI_DURATION_INVALID 0xFFFF                     /* Invalid duration */
+#define  OCI_DURATION_BEGIN (OCIDuration)10
+                                           /* beginning sequence of duration */
+#define  OCI_DURATION_NULL (OCIDuration)(OCI_DURATION_BEGIN-1)
+                                                            /* null duration */
+#define  OCI_DURATION_DEFAULT (OCIDuration)(OCI_DURATION_BEGIN-2) /* default */
+#define  OCI_DURATION_USER_CALLBACK (OCIDuration)(OCI_DURATION_BEGIN-3)
+#define  OCI_DURATION_NEXT (OCIDuration)(OCI_DURATION_BEGIN-4)
+                                                    /* next special duration */
+#define  OCI_DURATION_SESSION (OCIDuration)(OCI_DURATION_BEGIN)
+                                                  /* the end of user session */
+#define  OCI_DURATION_TRANS (OCIDuration)(OCI_DURATION_BEGIN+1)
+                                              /* the end of user transaction */
+/******************************************************************************
+**  DO NOT USE OCI_DURATION_CALL. IT  IS UNSUPPORTED                         **
+**  WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                              **
+******************************************************************************/
+#define  OCI_DURATION_CALL (OCIDuration)(OCI_DURATION_BEGIN+2)
+                                       /* the end of user client/server call */
+#define  OCI_DURATION_STATEMENT (OCIDuration)(OCI_DURATION_BEGIN+3)
+
+/* This is to be used only during callouts.  It is similar to that 
+of OCI_DURATION_CALL, but lasts only for the duration of a callout.
+Its heap is from PGA */
+#define  OCI_DURATION_CALLOUT (OCIDuration)(OCI_DURATION_BEGIN+4)
+
+#define  OCI_DURATION_LAST OCI_DURATION_CALLOUT 
+                                             /* last of predefined durations */
+
+/* This is not being treated as other predefined durations such as 
+   SESSION, CALL etc, because this would not have an entry in the duration
+   table and its functionality is primitive such that only allocate, free,
+   resize memory are allowed, but one cannot create subduration out of this
+*/ 
+#define  OCI_DURATION_PROCESS (OCIDuration)(OCI_DURATION_BEGIN-5) 
+ 
+/*
+ * OCIDuration - OCI object duration
+ *
+ * A client can specify the duration of which an object is pinned (pin
+ * duration) and the duration of which the object is in memory (allocation
+ * duration).  If the objects are still pinned at the end of the pin duration,
+ * the object cache manager will automatically unpin the objects for the
+ * client. If the objects still exist at the end of the allocation duration,
+ * the object cache manager will automatically free the objects for the client.
+ *
+ * Objects that are pinned with the option OCI_DURATION_TRANS will get unpinned
+ * automatically at the end of the current transaction.
+ *
+ * Objects that are pinned with the option OCI_DURATION_SESSION will get
+ * unpinned automatically at the end of the current session (connection).
+ *
+ * The option OCI_DURATION_NULL is used when the client does not want to set
+ * the pin duration.  If the object is already loaded into the cache, then the
+ * pin duration will remain the same.  If the object is not yet loaded, the
+ * pin duration of the object will be set to OCI_DURATION_DEFAULT.
+ */
+
+/*----------------------------- OBJECT PROPERTY -----------------------------*/
+ 
+/******************************************************************************
+**  DO NOT USE OCIObjectProperty. IT IS UNSUPPORTED                          **
+**  WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                              **
+******************************************************************************/
+enum OCIObjectProperty
+{
+  /* 0 = uninitialized */
+  OCI_OBJECTPROP_DIRTIED = 1,                               /* dirty objects */
+  OCI_OBJECTPROP_LOADED,                /* objects loaded in the transaction */
+  OCI_OBJECTPROP_LOCKED                                    /* locked objects */
+};
+typedef enum OCIObjectProperty OCIObjectProperty;
+/*
+ * OCIObjectProperty -- OCI Object Property
+ * This specifies the properties of objects in the object cache.
+ */
+
+/*------------------------- CACHE REFRESH OPTION ---------------------------*/
+
+enum OCIRefreshOpt
+{
+  /* 0 = uninitialized */
+  OCI_REFRESH_LOADED = 1        /* refresh objects loaded in the transaction */
+};
+typedef enum OCIRefreshOpt OCIRefreshOpt; 
+/*
+ * OCIRefreshOpt - OCI cache Refresh Option
+ * This option is used to specify the set of objects to be refreshed. 
+ *
+ * OCI_REFRESH_LOAD refreshes the objects that are loaded in the current  
+ * transaction. 
+ */
+
+/*-------------------------------- OBJECT EVENT -----------------------------*/
+
+/******************************************************************************
+**  DO NOT USE OCIObjectEvent. IT IS UNSUPPORTED                             **
+**  WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                              **
+******************************************************************************/
+enum OCIObjectEvent
+{
+   /* 0 = uninitialized */
+   OCI_OBJECTEVENT_BEFORE_FLUSH = 1,            /* before flushing the cache */
+   OCI_OBJECTEVENT_AFTER_FLUSH,                  /* after flushing the cache */
+   OCI_OBJECTEVENT_BEFORE_REFRESH,            /* before refreshing the cache */
+   OCI_OBJECTEVENT_AFTER_REFRESH,              /* after refreshing the cache */
+   OCI_OBJECTEVENT_WHEN_MARK_UPDATED,    /* when an object is marked updated */
+   OCI_OBJECTEVENT_WHEN_MARK_DELETED,    /* when an object is marked deleted */
+   OCI_OBJECTEVENT_WHEN_UNMARK,          /* when an object is being unmarked */
+   OCI_OBJECTEVENT_WHEN_LOCK               /* when an object is being locked */
+};
+typedef enum OCIObjectEvent OCIObjectEvent;
+/*
+ * OCIObjectEvent -- OCI Object Event 
+ * This specifies the kind of event that is supported by the object
+ * cache.  The program can register a callback that is invoked when the  
+ * specified event occurs.
+ */
+
+/*----------------------------- OBJECT COPY OPTION --------------------------*/
+#define OCI_OBJECTCOPY_NOREF (ub1)0x01 
+/*
+ * OCIObjectCopyFlag - Object copy flag
+ *
+ * If OCI_OBJECTCOPY_NOREF is specified when copying an instance, the 
+ * reference and lob will not be copied to the target instance.
+ */
+
+/*----------------------------- OBJECT FREE OPTION --------------------------*/
+#define OCI_OBJECTFREE_FORCE      (ub2)0x0001
+#define OCI_OBJECTFREE_NONULL     (ub2)0x0002
+#define OCI_OBJECTFREE_HEADER     (ub2)0x0004
+/*
+ * OCIObjectFreeFlag - Object free flag
+ *
+ * If OCI_OBJECTCOPY_FORCE is specified when freeing an instance, the instance
+ * is freed regardless it is pinned or diritied.
+ * If OCI_OBJECTCOPY_NONULL is specified when freeing an instance, the null 
+ * structure is not freed.
+ */
+
+/*----------------------- OBJECT PROPERTY ID -------------------------------*/
+
+typedef ub1 OCIObjectPropId;
+#define OCI_OBJECTPROP_LIFETIME 1       /* persistent or transient or value */
+#define OCI_OBJECTPROP_SCHEMA 2   /* schema name of table containing object */
+#define OCI_OBJECTPROP_TABLE 3     /* table name of table containing object */
+#define OCI_OBJECTPROP_PIN_DURATION 4             /* pin duartion of object */
+#define OCI_OBJECTPROP_ALLOC_DURATION 5         /* alloc duartion of object */
+#define OCI_OBJECTPROP_LOCK 6                      /* lock status of object */
+#define OCI_OBJECTPROP_MARKSTATUS 7                /* mark status of object */
+#define OCI_OBJECTPROP_VIEW 8            /* is object a view object or not? */
+
+/*
+ * OCIObjectPropId - OCI Object Property Id
+ * Identifies the different properties of objects.
+ */
+
+/*----------------------- OBJECT LIFETIME ----------------------------------*/
+
+enum OCIObjectLifetime
+{
+   /* 0 = uninitialized */
+   OCI_OBJECT_PERSISTENT = 1,                          /* persistent object */
+   OCI_OBJECT_TRANSIENT,                                /* transient object */
+   OCI_OBJECT_VALUE                                         /* value object */
+};
+typedef enum OCIObjectLifetime OCIObjectLifetime;
+/*
+ * OCIObjectLifetime - OCI Object Lifetime
+ * Classifies objects depending upon the lifetime and referenceability 
+ * of the object.
+ */
+
+/*----------------------- OBJECT MARK STATUS -------------------------------*/
+
+typedef uword OCIObjectMarkStatus;
+#define OCI_OBJECT_NEW     0x0001                             /* new object */
+#define OCI_OBJECT_DELETED 0x0002                  /* object marked deleted */
+#define OCI_OBJECT_UPDATED 0x0004                  /* object marked updated */
+/*
+ * OCIObjectMarkStatus - OCI Object Mark Status
+ * Status of the object - new or updated or deleted
+ */
+
+/* macros to test the object mark status */ 
+#define OCI_OBJECT_IS_UPDATED(flag) bit((flag), OCI_OBJECT_UPDATED)
+#define OCI_OBJECT_IS_DELETED(flag) bit((flag), OCI_OBJECT_DELETED)
+#define OCI_OBJECT_IS_NEW(flag) bit((flag), OCI_OBJECT_NEW)
+#define OCI_OBJECT_IS_DIRTY(flag) \
+  bit((flag), OCI_OBJECT_UPDATED|OCI_OBJECT_NEW|OCI_OBJECT_DELETED)
+
+/*---------------------------------------------------------------------------*/
+/*                               TYPE MANAGER                                */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------------ TYPE CODE ----------------------------------*/
+
+/*
+ * Type manager typecodes
+ *
+ * These are typecodes designed to be used with the type manager;
+ * they also include longer, more readable versions of existing SQLT names.
+ * Those types that are directly related to existing SQLT types are #define'd
+ * to their SQLT equivalents.
+ *
+ * The type manager typecodes are designed to be useable for all OCI calls.
+ * They are in the range from 192 to 320 for typecodes, so as not to conflict
+ * with existing OCI SQLT typecodes (see ocidfn.h).
+ */
+
+#define OCI_TYPECODE_REF         SQLT_REF        /* SQL/OTS OBJECT REFERENCE */
+#define OCI_TYPECODE_DATE        SQLT_DAT              /* SQL DATE  OTS DATE */
+#define OCI_TYPECODE_SIGNED8     27      /* SQL SIGNED INTEGER(8)  OTS SINT8 */
+#define OCI_TYPECODE_SIGNED16    28    /* SQL SIGNED INTEGER(16)  OTS SINT16 */
+#define OCI_TYPECODE_SIGNED32    29    /* SQL SIGNED INTEGER(32)  OTS SINT32 */
+#define OCI_TYPECODE_REAL        21                /* SQL REAL  OTS SQL_REAL */
+#define OCI_TYPECODE_DOUBLE      22  /* SQL DOUBLE PRECISION  OTS SQL_DOUBLE */
+#define OCI_TYPECODE_BFLOAT      SQLT_IBFLOAT       /* Binary float */ 
+#define OCI_TYPECODE_BDOUBLE     SQLT_IBDOUBLE  /* Binary double */
+#define OCI_TYPECODE_FLOAT       SQLT_FLT      /* SQL FLOAT(P)  OTS FLOAT(P) */
+#define OCI_TYPECODE_NUMBER      SQLT_NUM/* SQL NUMBER(P S)  OTS NUMBER(P S) */
+#define OCI_TYPECODE_DECIMAL     SQLT_PDN
+                                       /* SQL DECIMAL(P S)  OTS DECIMAL(P S) */
+#define OCI_TYPECODE_UNSIGNED8   SQLT_BIN
+                                       /* SQL UNSIGNED INTEGER(8)  OTS UINT8 */
+#define OCI_TYPECODE_UNSIGNED16  25  /* SQL UNSIGNED INTEGER(16)  OTS UINT16 */
+#define OCI_TYPECODE_UNSIGNED32  26  /* SQL UNSIGNED INTEGER(32)  OTS UINT32 */
+#define OCI_TYPECODE_OCTET       245                   /* SQL ???  OTS OCTET */
+#define OCI_TYPECODE_SMALLINT    246           /* SQL SMALLINT  OTS SMALLINT */
+#define OCI_TYPECODE_INTEGER     SQLT_INT        /* SQL INTEGER  OTS INTEGER */
+#define OCI_TYPECODE_RAW         SQLT_LVB          /* SQL RAW(N)  OTS RAW(N) */
+#define OCI_TYPECODE_PTR         32              /* SQL POINTER  OTS POINTER */
+#define OCI_TYPECODE_VARCHAR2    SQLT_VCS
+                                     /* SQL VARCHAR2(N)  OTS SQL_VARCHAR2(N) */
+#define OCI_TYPECODE_CHAR        SQLT_AFC    /* SQL CHAR(N)  OTS SQL_CHAR(N) */
+#define OCI_TYPECODE_VARCHAR     SQLT_CHR
+                                       /* SQL VARCHAR(N)  OTS SQL_VARCHAR(N) */
+#define OCI_TYPECODE_MLSLABEL    SQLT_LAB                    /* OTS MLSLABEL */
+#define OCI_TYPECODE_VARRAY      247         /* SQL VARRAY  OTS PAGED VARRAY */
+#define OCI_TYPECODE_TABLE       248              /* SQL TABLE  OTS MULTISET */
+#define OCI_TYPECODE_OBJECT      SQLT_NTY       /* SQL/OTS NAMED OBJECT TYPE */
+#define OCI_TYPECODE_OPAQUE       58                /*  SQL/OTS Opaque Types */
+#define OCI_TYPECODE_NAMEDCOLLECTION  SQLT_NCO
+                                            /* SQL/OTS NAMED COLLECTION TYPE */
+#define OCI_TYPECODE_BLOB        SQLT_BLOB    /* SQL/OTS BINARY LARGE OBJECT */
+#define OCI_TYPECODE_BFILE       SQLT_BFILE    /* SQL/OTS BINARY FILE OBJECT */
+#define OCI_TYPECODE_CLOB        SQLT_CLOB /* SQL/OTS CHARACTER LARGE OBJECT */
+#define OCI_TYPECODE_CFILE       SQLT_CFILE /* SQL/OTS CHARACTER FILE OBJECT */
+
+/* the following are ANSI datetime datatypes added in 8.1 */
+#define OCI_TYPECODE_TIME        SQLT_TIME                   /* SQL/OTS TIME */
+#define OCI_TYPECODE_TIME_TZ     SQLT_TIME_TZ             /* SQL/OTS TIME_TZ */
+#define OCI_TYPECODE_TIMESTAMP   SQLT_TIMESTAMP         /* SQL/OTS TIMESTAMP */
+#define OCI_TYPECODE_TIMESTAMP_TZ  SQLT_TIMESTAMP_TZ /* SQL/OTS TIMESTAMP_TZ */
+
+#define OCI_TYPECODE_TIMESTAMP_LTZ  SQLT_TIMESTAMP_LTZ /* TIMESTAMP_LTZ */
+
+#define OCI_TYPECODE_INTERVAL_YM SQLT_INTERVAL_YM   /* SQL/OTS INTRVL YR-MON */
+#define OCI_TYPECODE_INTERVAL_DS SQLT_INTERVAL_DS  /* SQL/OTS INTRVL DAY-SEC */
+#define OCI_TYPECODE_UROWID      SQLT_RDD                     /* Urowid type */
+
+
+#define OCI_TYPECODE_OTMFIRST    228     /* first Open Type Manager typecode */
+#define OCI_TYPECODE_OTMLAST     320                    /* last OTM typecode */
+#define OCI_TYPECODE_SYSFIRST    228     /* first OTM system type (internal) */
+#define OCI_TYPECODE_SYSLAST     235      /* last OTM system type (internal) */
+#define OCI_TYPECODE_PLS_INTEGER   266     /* type code for PLS_INTEGER */
+
+/* the following are PL/SQL-only internal. They should not be used */
+#define OCI_TYPECODE_ITABLE      SQLT_TAB             /* PLSQL indexed table */
+#define OCI_TYPECODE_RECORD      SQLT_REC                    /* PLSQL record */
+#define OCI_TYPECODE_BOOLEAN     SQLT_BOL                   /* PLSQL boolean */
+
+/* NOTE : The following NCHAR related codes are just short forms for saying
+   OCI_TYPECODE_VARCHAR2 with a charset form of SQLCS_NCHAR. These codes are
+   intended for use in the OCIAnyData API only and nowhere else. */
+#define OCI_TYPECODE_NCHAR       286
+#define OCI_TYPECODE_NVARCHAR2   287
+#define OCI_TYPECODE_NCLOB       288
+
+
+/* To indicate absence of typecode being specified */
+#define OCI_TYPECODE_NONE          0
+/* To indicate error has to be taken from error handle - reserved for
+   sqlplus use */
+#define OCI_TYPECODE_ERRHP         283
+
+/* The OCITypeCode type is interchangeable with the existing SQLT type
+   which is a ub2 */
+typedef ub2 OCITypeCode;
+
+
+/*----------------------- GET OPTIONS FOR TDO  ------------------------------*/
+
+enum OCITypeGetOpt
+{
+  OCI_TYPEGET_HEADER,
+                /* load only the header portion of the TDO when getting type */
+  OCI_TYPEGET_ALL       /* load all attribute and method descriptors as well */
+};
+typedef enum OCITypeGetOpt OCITypeGetOpt;
+
+/*
+ * OCITypeGetOpt
+ *
+ * This is the flag passed to OCIGetTypeArray() to indicate how the TDO is
+ * going to be loaded into the object cache.
+ * OCI_TYPEGET_HEADER implies that only the header portion is to be loaded
+ * initially, with the rest loaded in on a 'lazy' basis. Only the header is
+ * needed for PL/SQL and OCI operations. OCI_TYPEGET_ALL implies that ALL
+ * the attributes and methods belonging to a TDO will be loaded into the
+ * object cache in one round trip. Hence it will take much longer to execute,
+ * but will ensure that no more loading needs to be done when pinning ADOs
+ * etc. This is only needed if your code needs to examine and manipulate
+ * attribute and method information.
+ *
+ * The default is OCI_TYPEGET_HEADER.
+ */
+
+
+/*------------------------ TYPE ENCAPSULTATION LEVEL ------------------------*/
+
+enum OCITypeEncap
+{
+  /* 0 = uninitialized */
+  OCI_TYPEENCAP_PRIVATE,                /* private: only internally visible */
+  OCI_TYPEENCAP_PUBLIC /* public: visible to both internally and externally */
+};
+typedef enum OCITypeEncap OCITypeEncap;
+/*
+ * OCITypeEncap - OCI Encapsulation Level
+ */
+
+
+/*---------------------------- TYPE METHOD FLAGS ----------------------------*/
+
+enum OCITypeMethodFlag
+{
+  OCI_TYPEMETHOD_INLINE = 0x0001,                                  /* inline */
+  OCI_TYPEMETHOD_CONSTANT = 0x0002,                              /* constant */
+  OCI_TYPEMETHOD_VIRTUAL = 0x0004,                                /* virtual */
+  OCI_TYPEMETHOD_CONSTRUCTOR = 0x0008,                        /* constructor */
+  OCI_TYPEMETHOD_DESTRUCTOR = 0x0010,                          /* destructor */
+  OCI_TYPEMETHOD_OPERATOR  = 0x0020,                             /* operator */
+  OCI_TYPEMETHOD_SELFISH = 0x0040,     /* selfish method (generic otherwise) */
+
+  OCI_TYPEMETHOD_MAP = 0x0080,                    /* map (relative ordering) */
+  OCI_TYPEMETHOD_ORDER  = 0x0100,               /* order (relative ordering) */
+  /* OCI_TYPEMETHOD_MAP and OCI_TYPEMETHOD_ORDER are mutually exclusive */
+
+  OCI_TYPEMETHOD_RNDS= 0x0200,               /* Read no Data State (default) */
+  OCI_TYPEMETHOD_WNDS= 0x0400,                        /* Write no Data State */
+  OCI_TYPEMETHOD_RNPS= 0x0800,                      /* Read no Process State */
+  OCI_TYPEMETHOD_WNPS= 0x1000,                     /* Write no Process State */
+  OCI_TYPEMETHOD_ABSTRACT = 0x2000,    /* abstract (not instantiable) method */
+  OCI_TYPEMETHOD_OVERRIDING = 0x4000,                   /* overriding method */
+  OCI_TYPEMETHOD_PIPELINED = 0x8000                   /* method is pipelined */
+};
+typedef enum OCITypeMethodFlag OCITypeMethodFlag;
+
+/* macros to test the type method flags */
+#define OCI_METHOD_IS_INLINE(flag) bit((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_METHOD_IS_CONSTANT(flag) bit((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_METHOD_IS_VIRTUAL(flag) bit((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_METHOD_IS_CONSTRUCTOR(flag) bit((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_METHOD_IS_DESTRUCTOR(flag) bit((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_METHOD_IS_OPERATOR(flag) bit((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_METHOD_IS_SELFISH(flag) bit((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_METHOD_IS_MAP(flag) bit((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_METHOD_IS_ORDER(flag) bit((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_METHOD_IS_RNDS(flag) bit((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_METHOD_IS_WNDS(flag) bit((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_METHOD_IS_RNPS(flag) bit((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_METHOD_IS_WNPS(flag) bit((flag), OCI_TYPEMETHOD_WNPS)
+#define OCI_METHOD_IS_ABSTRACT(flag) bit((flag), OCI_TYPEMETHOD_ABSTRACT)
+#define OCI_METHOD_IS_OVERRIDING(flag) bit((flag), OCI_TYPEMETHOD_OVERRIDING)
+#define OCI_METHOD_IS_PIPELINED(flag) bit((flag), OCI_TYPEMETHOD_PIPELINED)
+
+#define OCI_TYPEMETHOD_IS_INLINE(flag) bit((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_IS_CONSTANT(flag) bit((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_IS_VIRTUAL(flag) bit((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_IS_CONSTRUCTOR(flag) \
+  bit((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_IS_DESTRUCTOR(flag) \
+  bit((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_IS_OPERATOR(flag) bit((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_IS_SELFISH(flag) bit((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_IS_MAP(flag) bit((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_IS_ORDER(flag) bit((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_IS_RNDS(flag) bit((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_IS_WNDS(flag) bit((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_IS_RNPS(flag) bit((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_IS_WNPS(flag) bit((flag), OCI_TYPEMETHOD_WNPS)
+#define OCI_TYPEMETHOD_IS_ABSTRACT(flag) bit((flag), OCI_TYPEMETHOD_ABSTRACT)
+#define OCI_TYPEMETHOD_IS_OVERRIDING(flag) \
+  bit((flag), OCI_TYPEMETHOD_OVERRIDING)
+#define OCI_TYPEMETHOD_IS_PIPELINED(flag) bit((flag), OCI_TYPEMETHOD_PIPELINED)
+
+/* macros to set the type method flags */
+#define OCI_TYPEMETHOD_SET_INLINE(flag) bis((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_SET_CONSTANT(flag) bis((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_SET_VIRTUAL(flag) bis((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_SET_CONSTRUCTOR(flag) \
+  bis((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_SET_DESTRUCTOR(flag) \
+  bis((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_SET_OPERATOR(flag) bis((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_SET_SELFISH(flag) bis((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_SET_MAP(flag) bis((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_SET_ORDER(flag) bis((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_SET_RNDS(flag) bis((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_SET_WNDS(flag) bis((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_SET_RNPS(flag) bis((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_SET_WNPS(flag) bis((flag), OCI_TYPEMETHOD_WNPS)
+
+/* macros to clear the type method flags */
+#define OCI_TYPEMETHOD_CLEAR_INLINE(flag) bic((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_CLEAR_CONSTANT(flag) \
+  bic((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_CLEAR_VIRTUAL(flag) bic((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_CLEAR_CONSTRUCTOR(flag) \
+  bic((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_CLEAR_DESTRUCTOR(flag) \
+  bic((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_CLEAR_OPERATOR(flag) \
+  bic((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_CLEAR_SELFISH(flag) bic((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_CLEAR_MAP(flag) bic((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_CLEAR_ORDER(flag) bic((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_CLEAR_RNDS(flag) bic((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_CLEAR_WNDS(flag) bic((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_CLEAR_RNPS(flag) bic((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_CLEAR_WNPS(flag) bic((flag), OCI_TYPEMETHOD_WNPS)
+
+/*--------------------------- TYPE PARAMETER MODE ---------------------------*/
+
+enum OCITypeParamMode
+{
+  /* PL/SQL starts this from 0 */
+  OCI_TYPEPARAM_IN = 0,                                                /* in */
+  OCI_TYPEPARAM_OUT,                                                  /* out */
+  OCI_TYPEPARAM_INOUT,                                             /* in-out */
+  OCI_TYPEPARAM_BYREF,              /* call by reference (implicitly in-out) */
+  OCI_TYPEPARAM_OUTNCPY,                         /* OUT with NOCOPY modifier */
+  OCI_TYPEPARAM_INOUTNCPY                     /* IN OUT with NOCOPY modifier */
+};
+typedef enum OCITypeParamMode OCITypeParamMode;
+
+
+/*-------------------------------- DEFAULTS ---------------------------------*/
+
+/* default binary and decimal precision and scale */
+
+#define OCI_NUMBER_DEFAULTPREC ((ub1)0)            /* no precision specified */
+#define OCI_NUMBER_DEFAULTSCALE ((sb1)MAXSB1MINVAL)
+                                        /* no binary/decimal scale specified */
+
+/* default maximum length for varrays and vstrings (used in sql.bsq) */
+
+#define OCI_VARRAY_MAXSIZE 4000
+                          /* default maximum number of elements for a varray */
+#define OCI_STRING_MAXLEN  4000     /* default maximum length of a vstring */
+
+/*---------------------------------------------------------------------------*/
+/* This set of macro is used only in beta2. They should be removed as soon as
+ * PLSQL has made the changes of not using these macros.
+ */
+ 
+/* Special duration for allocating memory only. No instance can be allocated
+ * given these durations.
+ */
+#define OCICoherency OCIRefreshOpt
+#define OCI_COHERENCY_NONE   (OCIRefreshOpt)2
+#define OCI_COHERENCY_NULL   (OCIRefreshOpt)4
+#define OCI_COHERENCY_ALWAYS (OCIRefreshOpt)5
+
+#endif /* ORO_ORACLE */
+
diff --git a/sdk/include/ort.h b/sdk/include/ort.h
new file mode 100644
index 0000000..9562f2e
--- /dev/null
+++ b/sdk/include/ort.h
@@ -0,0 +1,2594 @@
+/* @(#)ort.h    1.44 95/07/07 */
+
+/* Copyright (c) 1994, 2005, Oracle. All rights reserved.  */
+
+/* 
+  NAME
+
+    ORT - ORacle's external open Type interface to the open type manager (OTM)
+
+  DESCRIPTION
+
+    The open type manager interface includes dynamic type operations to
+    create, delete, update, and access types.  See the "Functional
+    Specification for Oracle Object Call Interface (Objects Project),
+    Version 1.0" for a user level description of the OTM.  For a more
+    detailed description, see the "Component Document for the Open Type
+    Manager, Version 1.0".
+
+    NOTE: MOST Of the functions in this header file are being desupported.
+          Please use the OCIDescribeAny interface as described in oci.h
+          instead.
+          The OCIType, OCITypeElem, OCITypeMethod abstract types continue
+          to be supported. The only two functions that remain to be documented
+          are OCITypeArrayByName and OCITypeArrayByRef.
+          All obsolete types/functions are marked accordingly below.
+
+  RELATED DOCUMENTS
+
+    For the functional specification for the OTM, see: 
+        [1] Kotsovolos, Susan, "Functional Specification for Oracle Object
+            Call Interface (Objects Project), Version 1.0", Oracle
+            Corporation, February 1995.
+    For the internal design of the OTM, see the following:
+        [2] Kotsovolos, Susan, "Component Document for the Open Type Manager",
+            Oracle Corporation, November 1994. 
+        [3] Kotsovolos, Susan, "Design for The Open Type Manager, Oracle 
+            Object Management Subsystem Version 1.0", Oracle Corporation, 
+            March 1994.
+        [4] Kotsovolos, Susan and Tin A. Nguyen, "The Open Type Manager",
+            Oracle Corporation, March 1994.
+        [5] Kotsovolos, Susan and Tin A. Nguyen, "Schema Evolution",
+            Oracle Corporation, March 1994.
+    For a description of the types the OTM must support, see:
+        [6] Nguyen, Tin A., "The Open Type System", Oracle Corporation, 
+            February 1994. 
+
+  INSPECTION STATUS 
+
+    Inspection date:    
+    Inspection status: 
+    Estimated increasing cost defects per page:
+    Rule sets:        
+
+  ACCEPTANCE REVIEW STATUS 
+
+    Review date:    
+    Review status:
+    Reviewers:  
+
+
+  **** ALL OBSOLETE FUNCTIONS/TYPES ARE MARKED ACCORDINGLY ***
+
+  EXPORT FUNCTIONS
+
+    None
+
+  PUBLIC DATA STRUCTURES
+
+      OCIType - type descriptor in the object cache
+      OCITypeElem - type element descriptor in the object cache
+            (used for attributes and paramters)
+      OCITypeCode  - Open Type System type code.
+      OCITypeMethod - method descriptor in the object cache
+      OCITypeParamMode - parameter modes (ie. IN, IN-OUT etc)
+
+  PUBLIC FUNCTIONS
+
+    ITERATOR (for OCITypeAttrNext and OCITypeMethodNext)
+
+      OCITypeIterNew  - ** OBSOLETE ** Create new instance of an iteraton.
+      OCITypeIterSet  - ** OBSOLETE ** Initialize iterator.
+      OCITypeIterFree - ** OBSOLETE ** Free instance of iterator.
+
+    TYPE GET
+
+      OCITypeByName      - ** OBSOLETE ** Get a type by name.
+      OCITypeArrayByName - Get an array of types by their names.
+      OCITypeByRef       - ** OBSOLETE ** Get a type by its CREF.
+      OCITypeArrayByRef  - Get an array of types by their CREFs.
+
+    TYPE ACCESSORS
+
+      OCITypeName     - ** OBSOLETE ** OCI Get a type's name.
+      OCITypeSchema   - ** OBSOLETE ** OCI Get a type's schema name.
+      OCITypeTypeCode - ** OBSOLETE ** OCI Get a type's type code.
+      OCITypeVersion  - ** OBSOLETE ** OCI Get a Type's user-readable Version.
+      OCITypeAttrs    - ** OBSOLETE ** OCI Get a Type's Number of Attributes.
+      OCITypeMethods  - ** OBSOLETE ** OCI Get a Type's Number of Methods.
+
+    TYPE ELEMENT ACCESSORS (they represent attributes/parameters/results)
+
+      OCITypeElemName      - ** OBSOLETE ** Get a type element's (only for
+                                attributes) name.
+      OCITypeElemType      - ** OBSOLETE ** Get a type element's type
+                                descriptor.
+      OCITypeElemTypeCode  - ** OBSOLETE ** Get a type element's typecode.
+      OCITypeElemParameterizedType - ** OBSOLETE ** Get a type element's
+                                        parameterized type's type descriptor.
+      OCITypeElemNumPrec   - ** OBSOLETE ** Get a number's precision.
+      OCITypeElemNumScale  - ** OBSOLETE ** Get a decimal or oracle Number's
+                                            Scale
+      OCITypeElemCharSetID - ** OBSOLETE ** Get a fixed or variable length
+                                            string's character set ID.
+      OCITypeElemCharSetForm - ** OBSOLETE ** Get a fixed or variable length
+                                              string's character set form (how
+                                              character set information has
+                                              been specified).
+      OCITypeElemLength    - ** OBSOLETE ** Get a raw, fixed or variable
+                                            length string's length.
+      OCITypeElemParamMode - ** OBSOLETE ** Get element's parameter's mode
+                                            (only valid for parameter).
+      OCITypeElemDefaultValue - ** OBSOLETE ** Get element's Default Value.
+
+    ATTRIBUTE ACCESSORS
+
+      OCITypeAttrByName - ** OBSOLETE ** Get an Attribute by Name.
+      OCITypeAttrNext   - ** OBSOLETE ** Get an Attribute by Iteration.
+
+    COLLECTION ACCESSORS
+
+      OCITypeCollTypeCode - ** OBSOLETE ** Get a named collection's typecode.
+      OCITypeCollElem     - ** OBSOLETE ** Get a named collection's element's
+                               type element information.
+      OCITypeCollSize     - ** OBSOLETE ** Get a named collection's size in
+                               number of elements.
+
+    METHOD ACCESSORS
+
+      OCITypeMethodOverload - ** OBSOLETE ** Get number of overloaded methods
+                                             with the given method name.
+                                             (no direct equivalent for
+                                              OCIDescribe interface)
+      OCITypeMethodByName   - ** OBSOLETE ** Get one or more methods by name.
+      OCITypeMethodNext     - ** OBSOLETE ** Iterate to the next method to
+                                             retrieve.
+      OCITypeMethodName     - ** OBSOLETE ** Get method's name.
+      OCITypeMethodEncap    - ** OBSOLETE ** Get method's encapsulation level. 
+      OCITypeMethodFlags    - ** OBSOLETE ** et method's flags.
+      OCITypeMethodMap      - ** OBSOLETE ** Get type's map function.
+      OCITypeMethodOrder    - ** OBSOLETE ** Get type's order function.
+      OCITypeMethodParams   - ** OBSOLETE ** Get a method's number of
+                                             parameters.
+
+    RESULT ACCESSORS
+
+      OCITypeResult - ** OBSOLETE ** OCI Get a method's Result.
+
+      See also ATTRIBUTE/PARAMETER/RESULT TYPE ACCESSORS.
+
+    PARAMETER ACCESSORS
+
+      OCITypeParamByPos  - ** OBSOLETE ** Get a Parameter in a method By
+                                          Position.
+      OCITypeParamByName - ** OBSOLETE ** Get a Parameter in a method By Name.
+      OCITypeParamPos    - ** OBSOLETE ** Get a Parameter's PoSition in a
+                                          method.
+
+  CALL GRAPHS:
+
+  Only type accessors are supported for 8.0.
+  ** OBSOLETE ** please use OCIDescribe interface
+
+  TYPE ACCESSOR EXAMPLE
+
+      CREATE TYPE CAR
+      (
+        name   vstring,
+        age    number,
+          number   car_age;                           /o Oracle number o/
+          weight   car_weight;                        /o abstract type o/
+
+        PUBLIC: 
+
+          /o methods o/
+          car(orlvs a_name, number an_age, WEIGHT a_weight);
+          ~car();
+          inline number get_age() const;
+          
+          /o relative ordering (map) functions o/
+          number car_map
+      );
+
+      /o the following code accesses the type created above o/
+
+      ub1      meth_flags;
+      ub4      i, j; 
+      ub4      text_len, position;
+      ub4      count;
+      ub4      length;
+      OCITypeCode    typecode;
+      OCIRef  *attr_ref;
+      OCIRef  *param_ref;
+      OCIType  *tdo, new_tdo, final_tdo;
+      OCITypeElem  *elem;
+      OCITypeIter  *iterator_ort;
+      oratext   (*names)[];
+      ub4      lengths[];
+      ub4     *positions;
+      oratext    *name;
+      oratext     name_buffer[M_IDEN];
+
+      /o initialize the references o/
+      DISCARD orlrini(env, err, (dvoid *)&attr_ref);
+      DISCARD orlrini(env, err, (dvoid *)&param_ref);
+
+      /o ----------------- GET INFORMATION ABOUT A TYPE ----------------- o/
+
+      /o start a transaction o/
+      
+      /o Pin the type until the end of the transaction.  Pinning the type is 
+       o required before using any type accessors. 
+       o/
+      if (OCITypeByName(env, err, svc, (oratext *)0, 0, "CAR", strlen("CAR"), 
+                  OCI_DURATION_TRANS, &car_ref, &car_tdo) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get the type's name o/
+      if (!memcmp(OCITypeName(env, err, car_tdo, &text_len), "person",
+                              text_len))
+        /o do something o/ ;
+
+      /o get the type's schema name o/
+      if (!memcmp(OCITypeSchema(env, err, car_tdo, &text_len), "john",
+                  text_len))
+        /o do something o/ ;
+
+      /o get the type code of the type o/
+      if (OCITypeTypeCode(env, err, car_tdo) == OCI_TYPECODE_ADT)
+        /o do something o/ ; 
+
+      /o get the type version o/
+      if (!memcmp(OCITypeVersion(env, err, car_tdo, &text_len), "1", text_len))
+         /o do something o/  ;
+
+      /o ------- GET FLATTENED POSITION OF AN ATTRIBUTES IN A TYPE ------- o/
+
+      names = malloc(sizeof(oratext *) * 2);
+      names[0] = malloc(strlen("car_weight"));
+      names[1] = malloc(strlen("ounces"));
+      memcpy(names[0], "car_weight", strlen("car_weight"));
+      memcpy(names[1], "ounces", strlen("ounces"));
+
+      lengths = malloc(sizeof(ub4) * 2);
+      lengths[0] = strlen("car_weight");
+      lengths[1] = strlen("ounces");
+
+      /o ---------- GET IMMEDIATE ATTRIBUTES IN A TYPE ---------- o/
+
+      /o loop through all attributes in the type with iterator o/
+      if (OCITypeIterNew(env, err, car_tdo, &iterator_ort) != OCI_SUCCESS)
+        /o do something o/
+
+      while (OCITypeAttrNext(env, err, iterator_ort, &ado) != OCI_NO_DATA)
+      {
+        /o get the attribute's name o/
+        if (!memcmp(OCITypeElemName(env, err, ado, &text_len),
+                                    "tiger", text_len))
+          /o do something o/  ;
+
+        /o get the attribute's type descriptor o/
+        if (OCITypeElemType(env, err, ado, &tdo) != OCI_SUCCESS)
+          /o error o/ ;
+
+        /o get the attribute's type code o/
+        typecode = OCITypeElemTypeCode(env, err, ado);
+
+        switch (typecode)
+        {
+        /o scalar types o/
+        case OCI_TYPECODE_DATE:                                     /o date o/
+        case OCI_TYPECODE_SIGNED8:                                  /o byte o/
+        case OCI_TYPECODE_SIGNED16:                                /o short o/
+        case OCI_TYPECODE_UNSIGNED8:                       /o unsigned byte o/
+        case OCI_TYPECODE_UNSIGNED16:                     /o unsigned short o/
+        case OCI_TYPECODE_OCTET:                                   /o octet o/
+        case OCI_TYPECODE_TABLE:                            /o nested table o/
+        case OCI_TYPECODE_CLOB:                            /o character lob o/
+        case OCI_TYPECODE_BLOB:                               /o binary lob o/
+        case OCI_TYPECODE_CFILE:                   /o character file object o/
+        case OCI_TYPECODE_BFILE:                      /o binary file object o/
+
+          /o do something o/
+          break;
+
+        /o number types o/
+        case OCI_TYPECODE_NUMBER:                          /o oracle number o/
+        case OCI_TYPECODE_DECIMAL:                               /o decimal o/
+          {
+            /o get the scale of the number o/
+            if (OCITypeElemNumScale(env, err, ado) == 3)
+              /o do something o/ ;
+          }
+          /o fall through to get the precision o/
+
+        case OCI_TYPECODE_FLOAT:                                   /o float o/
+        case OCI_TYPECODE_SIGNED32:                                 /o long o/
+        case OCI_TYPECODE_UNSIGNED32:                      /o unsigned long o/
+        case OCI_TYPECODE_REAL:                                     /o real o/
+        case OCI_TYPECODE_DOUBLE:                                 /o double o/
+          {
+            /o get the precision of the number o/
+            if (OCITypeElemNumPrec(env, err, ado) == 2)
+              /o do something o/ ;
+          }
+          break;
+
+        /o string types o/
+        case OCI_TYPECODE_CHAR:                      /o fixed length string o/
+        case OCI_TYPECODE_VARCHAR2:               /o variable length string o/
+        case OCI_TYPECODE_RAW:                                       /o raw o/
+          {
+            /o get the length of the fixed or variable length string o/
+            if (OCITypeElemLength(env, err, ado) < 100)
+              /o do something o/
+          }
+          break;
+
+        /o parameterized types o/
+        case OCI_TYPECODE_REF:                          /o reference o/
+        case OCI_TYPECODE_PTR:                            /o pointer o/
+          {
+            /o get the type stored in the parameterized type o/
+            if (OCITypeElemParameterizedType(env, err, ado, &tdo)
+                 != OCI_SUCCESS)
+              /o error o/ ;
+
+            /o do something o/
+            if (OCI_TYPEELEM_IS_REF(OCITypeElemFlags(env, err, ado)))...
+          }
+          break;
+
+        /o domain type o/
+        case OCI_TYPECODE_NAMEDCOLLECTION:
+          switch (OCITypeCollTypeCode(env, err, tdo))
+          {
+          case OCI_TYPECODE_VARRAY:                   /o variable array o/
+            ub4   num_elems;
+            OCIType *element_type;
+
+            /o get the number of elements in the farray or the maximum number
+             o of elements in the varray.
+             o/
+            OCITypeCollSize(env, err, tdo, &num_elems);
+
+            /o get the type of the array o/
+            OCITypeElemType(env, err, tdo, &element_type);
+          }
+          break;
+
+          case OCI_TYPECODE_TABLE:                         /o multiset o/
+          {
+            OCIType *table_type;
+
+            /o get the type of the multiset o/
+            OCITypeElemType(env, err, tdo, &table_type);
+
+            /o do something o/
+          }
+        }
+
+        /o abstract type o/
+        case OCI_TYPECODE_ADT:                 /o abstract data type o/
+          {
+            /o get the adt information o/
+            if (OCITypeElemType(env, err, ado, &tdo) != OCI_SUCCESS)
+              /o error o/ ;
+
+            /o do something o/
+          }
+          break;
+
+        default:
+          DISCARD printf("Error:  invalid type code\n");
+
+        } /o end of typecode switch o/
+
+      } /o end of loop through all attributes in a type o/
+
+
+      /o ------------ GET THE IMMEDIATE METHODS OF A TYPE ------------ o/
+
+      /o loop through all methods in the type by reusing iterator o/
+      if (OCITypeIterSet(env, err, car_tdo, iterator_ort) != OCI_SUCCESS)
+        /o do something o/
+
+      while (OCITypeMethodNext(env, err, iterator_ort) != OCI_NO_DATA)
+      {
+        /o get the method's name o/
+        if (!memcmp(OCITypeMethodName(env, err, mdo, &text_len), "car",
+                    text_len))
+          /o do something o/  ;
+
+        /o get the method's encapsulation o/
+        if (OCITypeMethodEncap(env, err, mdo) == OCI_TYPEENCAP_PUBLIC)
+          /o do something o/  ;
+
+        /o get the method's flags o/
+        meth_flags = OCITypeMethodFlags(env, err, mdo);
+        if (meth_flags & OCI_TYPEMETHOD_VIRTUAL)  
+          /o do something o/  ;
+
+
+        /o ------------ GET THE PARAMETERS IN A METHOD ------------ o/
+
+        /o loop through all parameters in the method o/
+        count = OCITypeMethodParams(env, err, mdo);
+        for (j = 1; j <= count; j++)
+        {
+          /o get the parameter information by position o/
+          if (OCITypeParamByPos(env, err, mdo, i, &elem) != OCI_SUCCESS)
+            /o error o/ ;
+
+          /o get the parameter's name o/
+          if (!memcmp(OCITypeElemName(env, err, elem, &text_len), "an_age",
+                      text_len))
+            /o do something o/ ;
+
+          /o get the parameter's mode o/
+          if (OCITypeElemMode(env, err, elem) == OCI_PARAM_OUT)
+            /o do something o/ ;
+   
+          /o get the parameter's required flag o/
+          if (ortgprq(env, err, elem))
+            /o do something o/ ;
+        }
+      }
+
+      /o get a method by name o/
+      if (OCITypeMethodByName(env, err, car_tdo, "car_constructor", 
+                              strlen("car_constructor"), NULLP(OCIRef), &mdo) 
+                              != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get a parameter in a method by name o/
+      if (OCITypeParamByName(env, err, mdo, "an_age", strlen("an_age"), &elem) 
+                  != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get a parameter's typecode o/
+      typecode = OCITypeElemTypeCode(env, err, elem);
+   
+      /o get a parameter's type object o/
+      if (OCITypeElemType(env, err, elem, &tdo)) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get a parameter's position in a method o/
+      if (ortgpps(env, err, mdo, "an_age", strlen("an_age"), 
+                  &position, NULLP(OCIRef), NULLP(OCITypeElem)) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o ------------ GET THE METHOD's RESULT ------------ o/
+     
+      /o get a method by name o/
+      if (OCITypeMethodByName(env, err, car_tdo, "get_age", strlen("get_age"),
+                  &mdo) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get the typecode of the method's result o/
+      typecode = OCITypeElemTypeCode(env, err, mdo);
+
+
+      /o ----------------- END ---------------- o/
+
+      /o free the references implicitly allocated o/
+      DISCARD orlrfre(env, err, (dvoid *)&attr_ref);
+      DISCARD orlrfre(env, err, (dvoid *)&param_ref);
+
+  NOTES
+
+  MODIFIED
+    dmukhin    06/29/05  - ANSI prototypes; miscellaneous cleanup 
+    srseshad   03/12/03  - convert oci public api to ansi
+    aahluwal   06/03/02  - bug 2360115
+    skabraha   04/16/02  - fix compiler warnings
+    rkasamse   03/02/01  - do not use iterator : keyword in MSVB
+    bpalaval   02/09/01  - Change text to oratext.
+    rxgovind   01/31/00  - add OCIType interfaces for transient types
+    whe        09/01/99 -  976457:check __cplusplus for C++ code
+    cxcheng    05/06/97 -  make OCI_TYPE?? test macros return either 1 or 0
+    cxcheng    04/22/97 -  add comment on desupporting OCIType functions
+    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/26/97 -  fix lint problem with oro names
+    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
+    cxcheng    01/15/97 -  change prototype of OCITypeElemParameterizedType()
+    cxcheng    01/03/97 -  replace bit in OCI_TYPEPARAM_IS_REQUIRED with bitwis
+    cxcheng    12/31/96 -  replace OCI_PARAM_IS_REQUIRED with OCI_TYPEPARAM_IS_
+    cxcheng    12/09/96 -  add prototype for OCITypeElemExtTypeCode and OCIType
+    cxcheng    11/25/96 -  add schema name parameter to OCITypeVTInsert()
+    cxcheng    11/20/96 -  fix prototype for OCITypeByName()
+    cxcheng    11/11/96 -  fix prototype for OCITypeByName()
+    cxcheng    11/05/96 -  remove OCITypeElemExtTypeCode and OCITypeCollExtType
+    dchatter   10/28/96 -  change ortgatyp to be OCITypeArrayByName
+    cxcheng    10/25/96 -  fix problem with ortgatyp at end
+    cxcheng    10/22/96 -  add OCITypeByRef and OCITypeArrayByRef
+    cxcheng    10/20/96 -  remove ortgtyp() from #define section at end
+    cxcheng    10/18/96 -  rename OCITypeGetArray to OCITypeArrayByName
+    cxcheng    10/17/96 -  final change to prototype for OCI_TYPEPARAM_IS_REQUI
+    cxcheng    10/15/96 -  rename OCIEncapLevel and OCIMethodFlag
+    cxcheng    10/14/96 -  change prototype of OCITypeResult
+    mluong     10/11/96 -  fix compile error
+    jwijaya    10/10/96 -  fix bug on OCI_PARAM_IS_REQUIRED
+    cxcheng    10/09/96 -  more lint and link fixes
+    cxcheng    10/08/96 -  more lint fixes
+    cxcheng    10/07/96 -  more changes
+    cxcheng    10/04/96 -  replace short names with long names
+    cxcheng    10/01/96 -  change to long names for readability
+    cxcheng    09/27/96 -  rename ortgatyp() to ortgtya() for lint
+    cxcheng    09/20/96 -  add ortgatyp() for array get type
+    cxcheng    09/18/96 -  add array pin and iterator functions
+    cxcheng    08/09/96 -  add version table calls
+    cxcheng    07/22/96 -  add OCITypeElemType() to top
+    jwijaya    07/03/96 -  add ANSI prototypes
+    cxcheng    06/28/96 -  add OCITypeElemCharSetForm()
+    cxcheng    06/26/96 -  fix comment on OCITypeParamByPos()/ortgpps()
+    cxcheng    06/18/96 -  fix comments on OCITypeResult()
+    cxcheng    06/17/96 -  improve comments
+    skrishna   06/03/96 -  change OCITypeCollElem() prototype
+    vkrishna   05/29/96 -  replace OROTCFAR with OROTCCAR
+    cxcheng    05/28/96 -  fix comments, remove non-beta1 functions
+    cxcheng    05/02/96 -  fix prototype bugs
+    cxcheng    04/29/96 -  rename OCITypeElemm() to ortanct()
+    cxcheng    04/26/96 -  add ortgrbp and ortftyi,
+                           fix comments and examples
+    cxcheng    04/22/96 -  big merge to main branch
+    cxcheng    04/17/96 -  fix syntax
+    cxcheng    04/08/96 -  change prototype to ortaty()
+    skrishna   04/08/96 -  change ort*() to take OCIEnv* and OCIError* instead
+                           of oroenv*
+    cxcheng    03/28/96 -  add ortslob(), change ortsstr() prototype
+    cxcheng    03/13/96 -  change alter type interface
+    cxcheng    03/11/96 -  ORT interface changes
+    cxcheng    02/27/96 -  correct comments
+    jboonleu   02/09/96 -  rename oroopd to OCIDuration
+    cxcheng    01/19/96 -  change ORTCTYVAL to ORTCTYEMB for embedded ADT
+    cxcheng    02/14/96 -  add more comments
+    jboonleu   02/09/96 -  rename oroopd to OCIDuration
+    cxcheng    02/07/96 -  fix comments and examples
+    cxcheng    01/19/96 -  new ORT interface without korfc's
+    cxcheng    01/08/96 -  consolidate collection functions
+    cxcheng    12/14/95 -  remove obsolete ortgcol() and ortrelease()
+    jweisz     12/12/95 -  merge screwup: ortdth twice
+    cxcheng    12/05/95 -  change multiset interface for new standard
+    skotsovo   12/01/95 -  merge from /vobs/rdbms/public/ort.h@@/main/
+                           st_rdbms_big_dev/st_rdbms_obj/
+                           st_rdbms_jwijaya_variable_ref
+    cxcheng    11/13/95 -  add ortaty()/orteaty()
+    cxcheng    11/13/95 -  add new collection type accessors
+    skotsovo   10/30/95 -  add 'oid' type b/c extent type uses it.
+    skotsovo   10/24/95 -  update according to new variable length ref
+    cxcheng    10/05/95 -  add null support, change prototypes to calls
+    cxcheng    10/03/95 -  add OCITypeMethodOrder() to get ORDER method
+    cxcheng    09/28/95 -  add OCITypeElemm() for collection types support
+    skotsovo   06/05/95 -  add adt_type parameter to ortsab() 
+    skotsovo   05/10/95 -  ifdef'd out ortgafp() 
+    skotsovo   03/07/95 -  update interface to only include release 1
+    skotsovo   02/22/95 -  add multiset accessors 
+    skotsovo   02/09/95 -  update according to new ots doc 
+    skotsovo   01/31/95 -  add rest of release 1 types 
+    skotsovo   01/24/95 -  categorize sint32, double, and real as number types 
+                           (with precision and scale) instead of scalar types.
+    skotsovo   01/12/95 -  remove dependency from ortdty interface 
+    skotsovo   01/03/95 -  remove orotyp accessors 
+    skotsovo   12/12/94 -  update comments 
+    skotsovo   12/05/94 -  change OCITypeElemParameterizedTyper interface 
+    skotsovo   10/26/94 -  add type version table 
+    skotsovo   10/17/94 -  fix ortgafp() comments 
+    skotsovo   10/14/94 -  modify ortgafp() parameters 
+    skotsovo   10/14/94 -  add examples 
+    skotsovo   10/13/94 -  add a few new routines 
+    jwijaya    10/07/94 -  add namespace to pin by name 
+    jwijaya    10/02/94 -  connection handle -> connection number 
+    skotsovo   09/13/94 -  modify example to use updated oririni interface 
+    skotsovo   08/25/94 -  change scale to sb1 from sb2 
+    skotsovo   07/28/94 -  add ortbeg() and ortend() 
+    skotsovo   07/14/94 -  add decimal type & call graph
+    skotsovo   06/28/94 -  subset by removing miscellaneous functions 
+    skotsovo   06/28/94 -  consistently put comments before typedefs 
+    skotsovo   06/27/94 -  modify according to new header file template, add
+                           more examples, and change ortcty() to return a
+                           reference to the type
+    skotsovo   06/24/94 -  add functions to get type information from orotyp 
+    skotsovo   06/20/94 -  finish modifying according to header template 
+    skotsovo   06/09/94 -  modify according to header file template 
+    skotsovo   06/08/94 -  replace s.h with oratypes.h 
+    skotsovo   05/24/94 -  modify comments & update example
+    skotsovo   05/23/94 -  modify fnt names for create, alter and drop type 
+    skotsovo   05/18/94 -  remove ortdme() -- delete a method 
+    skotsovo   05/17/94 -  add tdo parameter to all type modifiers 
+    skotsovo   05/11/94 -  return text* instead of including it in arglist 
+    skotsovo   11/16/93 -  creation
+
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#define ORT_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCITypeArrayByName              ortgatyp
+#define OCITypeAttrByName               ortgabn
+#define OCITypeAttrNext                 ortgabi
+#define OCITypeAttrs                    ortgtna
+#define OCITypeByRef                    ortgtbrf
+#define OCITypeCollElem                 ortgcel
+#define OCITypeCollExtTypeCode          ortgcsqt
+#define OCITypeCollSize                 ortgcne
+#define OCITypeCollTypeCode             ortgdttc
+#define OCITypeElem                     ortado
+#define OCITypeElemCharSetForm          ortgscform
+#define OCITypeElemCharSetID            ortgscid
+#define OCITypeElemDefaultValue         ortgpdv
+#define OCITypeElemExtTypeCode          ortgasqt
+#define OCITypeElemLength               ortgsl
+#define OCITypeElemName                 ortganm
+#define OCITypeElemNumPrec              ortgnp
+#define OCITypeElemNumScale             ortgns
+#define OCITypeElemParamMode            ortgpmo
+#define OCITypeElemParameterizedType    ortgpa
+#define OCITypeElemType                 ortgaty
+#define OCITypeElemTypeCode             ortgatc
+#define OCITypeIter                     ortitr
+#define OCITypeIterFree                 ortifre
+#define OCITypeIterNew                  ortinew
+#define OCITypeIterSet                  ortiset
+#define OCITypeMethod                   ortmdo
+#define OCITypeMethodByName             ortgmbn
+#define OCITypeMethodEncap              ortgmen
+#define OCITypeMethodFlags              ortgmfl
+#define OCITypeMethodMap                ortgmmap
+#define OCITypeMethodName               ortgmnm
+#define OCITypeMethodNext               ortgmbi
+#define OCITypeMethodOrder              ortgmor
+#define OCITypeMethodOverload           ortgmno
+#define OCITypeMethodParams             ortgmnp
+#define OCITypeMethods                  ortgtnm
+#define OCITypeName                     ortgtme
+#define OCITypeParamByName              ortgpbn
+#define OCITypeParamPos                 ortgpps
+#define OCITypeSchema                   ortgtsch
+#define OCITypeTypeCode                 ortgttc
+#define OCITypeVTInit                   ortvini
+#define OCITypeVTInsert                 ortvins
+#define OCITypeVTSelect                 ortvsel
+#define OCITypeVersion                  ortgtvn
+
+#endif                                                        /* SLSHORTNAME */
+
+
+/*============================*/        
+/* PUBLIC TYPES AND CONSTANTS */
+/*============================*/
+
+/*----------------------------- TYPE DESCRIPTION ----------------------------*/
+
+/*
+ * OCIType - OCI Type Description Object 
+ *
+ * The contents of an 'OCIType' is private/opaque to clients.  Clients just 
+ * need to declare and pass 'OCIType' pointers in to the type manage
+ * functions.
+ * The pointer points to the type in the object cache.  Thus, clients don't
+ * need to allocate space for this type and must NEVER free the pointer to the
+ * 'OCIType'.
+ */
+
+typedef struct OCIType OCIType;
+
+/*------------------------- TYPE ELEMENT DESCRIPTION ------------------------*/
+
+
+/*
+ * OCITypeElem - OCI Type Element object
+ *
+ * The contents of an 'OCITypeElem' is private/opaque to clients. Clients just 
+ * need to declare and pass 'OCITypeElem' pointers in to the type manager 
+ * functions.
+ *
+ * 'OCITypeElem' objects contains type element information such as the numeric
+ * precision for example, for number objects, and the number of elements for
+ * arrays.
+ * They ARE used to describe type attributes, collection elements,
+ * method parameters, and method results. Hence they are pass in or returned
+ * by attribute, collection, and method parameter/result accessors.
+ */
+
+typedef struct OCITypeElem OCITypeElem;
+
+
+/*--------------------------- METHOD DESCRIPTION ---------------------------*/
+
+
+/*
+ * OCITypeMethod - OCI Method Description object 
+ *
+ * The contents of an 'OCITypeMethod' is private/opaque to clients.  Clients
+ * just need to declare and pass 'OCITypeMethod' pointers in to the type
+ * manager functions.
+ * The pointer points to the method in the object cache.  Thus, clients don't
+ * need to allocate space for this type and must NEVER free the pointer to 
+ * the 'OCITypeMethod'.
+ */
+
+typedef struct OCITypeMethod OCITypeMethod;
+
+
+/*--------------------------- TYPE ACCESS ITERATOR --------------------------*/
+
+/*
+ * OCITypeIter- OCI Type Iterator
+ *
+ * The contents of an 'orti' is private/opaque to clients.  Clients just 
+ * need to declare and pass 'orti' pointers in to the type manager functions.
+ * The iterator is used to retreive MDO's and ADO's that belong to the TDO
+ * one at a time. It needs to be allocated by the 'OCITypeIterNew()' function
+ * call and deallocated with the 'OCITypeIterFree()' function call.
+ */
+
+typedef struct OCITypeIter OCITypeIter;
+
+
+/*==================*/
+/* PUBLIC FUNCTIONS */
+/*==================*/
+
+/*--------------------------------------------------------------------------*/
+/*                                  ITERATOR                                */
+/*--------------------------------------------------------------------------*/
+
+/*-----------------------_- OCITypeIterNew ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterNew(    OCIEnv *env, OCIError *err, OCIType *tdo, 
+                         OCITypeIter **iterator_ort    );
+
+/*
+  NAME: OCITypeIterNew - OCI Iterator NEW
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       tdo (IN) - pointer to the pinned type in the object cache to
+                initialize the iterator with
+       iterator_ort (OUT) - pointer to the pointer to the new iterator created
+  DESCRIPTION:
+       Create a new instance of a method/attribute iterator and initalize
+       it's values.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) error while allocating space for the iterator.
+*/
+
+/*------------------------ OCITypeIterSet ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterSet(    OCIEnv *env, OCIError *err, OCIType *tdo, 
+                  OCITypeIter *iterator_ort    );
+
+/*
+  NAME: OCITypeIterSet - OCI Iterator SET
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       tdo (IN) - pointer to the pinned type in the object cache to
+                initialize the iterator with
+       iterator_ort (IN/OUT) - pointer to the iterator to set
+  DESCRIPTION:
+       Initializes the iterator. This is used to reset the state of the
+       iterator.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+*/
+
+/*------------------------ OCITypeIterFree ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterFree(    OCIEnv *env, OCIError *err, OCITypeIter
+                          *iterator_ort    );
+
+/*
+  NAME: OCITypeIterFree - OCI Iterator FREe
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       iterator_ort (IN/OUT) - pointer to the iterator to free
+  DESCRIPTION:
+       Free space allocated for the iterator.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) error while freeing the iterator, probably bad iterator pointer.
+*/
+
+
+/*--------------------------------------------------------------------------*/
+/*                                  TYPE GET                                */
+/*--------------------------------------------------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeByName(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc, 
+                        const oratext *schema_name, ub4 s_length,
+                        const oratext *type_name, ub4 t_length,
+                        const oratext *version_name, ub4 v_length,
+                        OCIDuration pin_duration, OCITypeGetOpt get_option,
+                        OCIType **tdo    );
+/*
+  NAME: OCITypeByName - OCI Get the most current version of an existing TYPe
+                  by name.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       svc (IN) - OCI service handle
+       schema_name (IN, optional) - name of schema associated with the 
+                  type.  By default, the user's schema name is used.
+       s_length (IN) - length of the 'schema_name' parameter
+       type_name (IN) - name of the type to get
+       t_length (IN) - length of the 'type_name' parameter
+       version_name (IN, optional) - user readable version of the type.
+                  Pass (oratext *)0 for the most current version.
+       v_length (IN) - length of version_name in bytes. Should be 0 if
+                  the most current version is to be retrieved.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction).  See 'oro.h' for a description of
+                  each option.
+       get_option (IN) - options for loading the types. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - pointer to the pinned type in the object cache
+  DESCRIPTION:
+       Get a pointer to a version of the existing type associated
+       with schema/type name.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) the adt type associated with schema/type name does not exist.
+  NOTE:
+       Schema and type names are CASE-SENSITIVE. If they have been created
+       via SQL, you need to use uppercase names.
+*/
+
+sword OCITypeArrayByName(    OCIEnv *env, OCIError *err, const OCISvcCtx *svc,
+                             ub4 array_len,
+                             const oratext *schema_name[], ub4 s_length[],
+                             const oratext *type_name[], ub4 t_length[],
+                             const oratext *version_name[], ub4 v_length[],
+                             OCIDuration pin_duration,
+                             OCITypeGetOpt get_option, OCIType **tdo    );
+
+/*
+  NAME: OCITypeArrayByName - OCI Get array of TYPes by name.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       svc (IN) - OCI service handle
+       array_len (IN) - number of schema_name/type_name/version_name entries to
+                  be retrieved.
+       schema_name (IN, optional) - array of schema names associated with the
+                  types to be retrieved.  The array must have array_len
+                  elements if specified.
+                  If 0 is supplied, the default schema is assumed, otherwise
+                  it MUST have array_len number of elements.
+                  0 can be supplied for one or more of the entries to indicate
+                  that the default schema is desired for those entries.
+       s_length (IN) - array of schema_name lengths with each entry
+                  corresponding to the length of the corresponding schema_name
+                  entry in the schema_name array in bytes.
+                  The array must either have array_len number of elements or
+                  it MUST be 0 if schema_name is not specified.
+       type_name (IN) - array of the names of the types to retrieve. This
+                  MUST have array_len number of elements.
+       t_length (IN) - array of the lengths of type names in the type_name
+                  array in bytes.
+       version_name (IN) - array of the version names of the types to retrieve
+                  corresponding. This can be 0 to indicate retrieval of the
+                  most current versions, or it MUST have array_len number of
+                  elements.
+                  If 0 is supplied, the most current version is assumed,
+                  otherwise it MUST have array_len number of elements.
+                  0 can be supplied for one or more of the entries to indicate
+                  that the current version is desired for those entries.
+       v_length (IN) - array of the lengths of version names in the
+                  version_name array in bytes.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction) for the types retreieve.  See 'oro.h' for a
+                  description of each option.
+       get_option (IN) - options for loading the types. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - output array for the pointers to each pinned type in the
+                  object cache. It must have space for array_len pointers.
+                  Use OCIObjectGetObjectRef() to obtain the CREF to each
+                  pinned type descriptor.
+  DESCRIPTION:
+       Get pointers to the existing types associated with the schema/type name
+       array. This is similar to OCITypeByName() except that all the TDO's are
+       retreived via a single network roundtrip.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) one or more adt types associated with a schema/type name entry
+              does not exist.
+*/
+
+sword   OCITypeByRef(    OCIEnv *env, OCIError *err,
+                         const OCIRef *type_ref, OCIDuration pin_duration,
+                         OCITypeGetOpt get_option, OCIType **tdo    );
+
+/*
+  NAME: OCITypeArrayByRef - OCI Get array of TYPes by REF.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       type_ref (IN) - OCIRef * pointing to the particular version of
+                  the type descriptor object to obtain.
+                  The array must have array_len elements if specified.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction) for the type to retreieve.  See 'oro.h' for a
+                  description of each option.
+       get_option (IN) - options for loading the type. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - pointer to the pinned type in the object cache
+  DESCRIPTION:
+       Get pointers to the 
+       with the schema/type name array. This is similar to OCITypeByName()
+       except that all the TDO's are retreived via a single network roundtrip.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) one or more adt types associated with a schema/type name entry
+              does not exist.
+*/
+
+sword   OCITypeArrayByRef(    OCIEnv *env, OCIError *err,
+                              ub4 array_len, const OCIRef **type_ref,
+                              OCIDuration pin_duration,
+                              OCITypeGetOpt get_option, OCIType **tdo    );
+
+/*
+  NAME: OCITypeArrayByRef - OCI Get array of TYPes by REF.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       array_len (IN) - number of schema_name/type_name/version_name entries to
+                  be retrieved.
+       type_ref (IN) - array of OCIRef * pointing to the particular version of
+                  the type descriptor object to obtain.
+                  The array must have array_len elements if specified.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction) for the types retreieve.  See 'oro.h' for a
+                  description of each option.
+       get_option (IN) - options for loading the types. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - output array for the pointers to each pinned type in the
+                  object cache. It must have space for array_len pointers.
+                  Use OCIObjectGetObjectRef() to obtain the CREF to each
+                  pinned type descriptor.
+  DESCRIPTION:
+       Get pointers to the 
+       with the schema/type name array. This is similar to OCITypeByName()
+       except that all the TDO's are retreived via a single network roundtrip.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) one or more adt types associated with a schema/type name entry
+              does not exist.
+*/
+
+
+/*--------------------------------------------------------------------------*/
+/*                              TYPE ACCESSORS                              */
+/*--------------------------------------------------------------------------*/
+
+/*---------------------------- OCITypeName ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeName(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                      ub4 *n_length    );
+/*
+   NAME: OCITypeName -  ORT Get a Type's naME.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the returned type name.  The
+               caller must allocate space for the ub4 before calling this
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) All input parameters must not be NULL and must be valid.
+        3) 'n_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the name of the type.
+   RETURNS:
+        the name of the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------ OCITypeSchema ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeSchema(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                   ub4 *n_length    );
+/*
+   NAME: OCITypeSchema -  ORT Get a Type's SCHema name.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the returned schema name.  The
+               caller must allocate space for the ub4 before calling this
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'n_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the schema name of the type.
+   RETURNS:
+        the schema name of the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------ OCITypeTypeCode ---------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeTypeCode(    OCIEnv *env, OCIError *err,
+                                const OCIType *tdo    );
+/*
+   NAME: OCITypeTypeCode - OCI Get a Type's Type Code.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the type code of the type.
+   RETURNS:
+        The type code of the type.
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*----------------------- OCITypeCollTypeCode -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeCollTypeCode(    OCIEnv *env, OCIError *err,
+                                    const OCIType *tdo    );
+/*
+   NAME: OCITypeCollTypeCode - OCI Get a Domain Type's Type Code.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'tdo' MUST point to a named collection type.
+   DESCRIPTION:
+        Get the type code of the named collection type. For V8.0, named
+        collection types can only be variable length arrays and nested tables.
+   RETURNS:
+        OCI_TYPECODE_VARRAY for variable length array, and
+        OCI_TYPECODE_TABLE for nested tables.
+   NOTES:
+        The type descriptor, 'tdo', should be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------- OCITypeVersion ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeVersion(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                         ub4 *v_length    );
+/*
+   NAME: OCITypeVersion - OCI Get a Type's user-readable VersioN. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        v_length (OUT) - length (in bytes) of the returned user-readable 
+               version.  The caller must allocate space for the ub4 before 
+               calling this routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'v_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the user-readable version of the type.
+   RETURNS:
+        The user-readable version of the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*--------------------------- OCITypeAttrs ---------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeAttrs(    OCIEnv *env, OCIError *err, const OCIType *tdo    );
+/*
+   NAME: OCITypeAttrs - OCI Get a Type's Number of Attributes. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the number of attributes in the type.
+   RETURNS:
+        The number of attributes in the type. 0 for ALL non-ADTs.
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------- OCITypeMethods ---------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethods(    OCIEnv *env, OCIError *err, const OCIType *tdo    );
+/*
+   NAME: OCITypeMethods - OCI Get a Type's Number of Methods. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the number of methods in a type.
+   RETURNS:
+        The number of methods in the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/*                     TYPE ELEMENT INFORMATION ACCESSORS                   */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeElemName ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeElemName(    OCIEnv *env, OCIError *err, 
+                           const OCITypeElem *elem, ub4 *n_length    );
+/*
+   NAME: OCITypeElemName - OCI Get an Attribute's NaMe. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the returned attribute name.  
+               The caller must allocate space for the ub4 before calling this 
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'n_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the name of the attribute.
+   RETURNS:
+        the name of the attribute and the length in n_length
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeElemTypeCode ------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeElemTypeCode(    OCIEnv *env, OCIError *err,
+                                    const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemTypeCode - OCI Get an Attribute's TypeCode. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the typecode of an attribute's type.
+   RETURNS:
+        the typecode of the attribute's type.  If this is a scalar type, the 
+        typecode sufficiently describes the scalar type and no further calls 
+        need to be made.  Valid scalar types include: OCI_TYPECODE_SIGNED8,
+        OCI_TYPECODE_UNSIGNED8, OCI_TYPECODE_SIGNED16, OCI_TYPECODE_UNSIGNED16,
+        OCI_TYPECODE_SIGNED32, OCI_TYPECODE_UNSIGNED32, OCI_TYPECODE_REAL,
+        OCI_TYPECODE_DOUBLE, OCI_TYPECODE_DATE,
+        OCI_TYPECODE_MLSLABEL, OROTCOID, OCI_TYPECODE_OCTET, or OROTCLOB.
+        This function converts the CREF (stored in the attribute) into a
+        typecode.
+   NOTES:
+       The type must be unpinned when the accessed information is no 
+       longer needed.
+ */
+
+/*------------------------ OCITypeElemType ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeElemType(    OCIEnv *env, OCIError *err, const OCITypeElem *elem, 
+                          OCIType **elem_tdo    );
+/*
+  PARAMETERS
+     env (IN/OUT) - OCI environment handle initialized in object mode
+     err (IN/OUT) - error handle. If there is an error, it is
+             recorded in 'err' and this function returns OCI_ERROR.
+             The error recorded in 'err' can be retrieved by calling
+             OCIErrorGet().
+     elem (IN) - pointer to the type element descriptor in the object cache
+     elem_tdo (OUT) - If the function completes successfully, 'elem_tdo'
+            points to the type descriptor (in the object cache) of the type of
+            the element.
+
+  REQUIRES
+     1) All type accessors require that the type be pinned before calling
+        any accessor.  This can be done by calling 'OCITypeByName()'.
+     2) if 'elem' is not null, it must point to a valid type element descriptor
+        in the object cache.
+
+  DESCRIPTION
+     Get the type tdo of the type of this element.
+  RETURNS
+     OCI_SUCCESS if the function completes successfully.
+     OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+     OCI_ERROR if
+         1) any of the parameters is null.
+
+  NOTES
+     The type must be unpinned when the accessed information is no
+     longer needed.  This can be done by calling 'OCIObjectUnpin()'.
+ */
+
+/*------------------------- OCITypeElemFlags -------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeElemFlags(    OCIEnv *env, OCIError *err,
+                         const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemFlags - OCI Get a Elem's FLags
+                              (inline, constant, virtual, constructor,
+                              destructor). 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the flags of a type element (attribute, parameter).
+   RETURNS:
+        The flags of the type element.
+   NOTES:
+        The flag bits are not externally documented. Use only the macros
+        in the last section (ie. OCI_TYPEPARAM_IS_REQUIRED, and
+        OCI_TYPEELEM_IS_REF) to test for them only. The type must be unpinned
+        when the accessed information is no longer needed.
+ */
+
+/*------------------------ OCITypeElemNumPrec ------------------------------*/
+
+/* ** OBSOLETE ** */
+ub1 OCITypeElemNumPrec(    OCIEnv *env, OCIError *err,
+                           const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemNumPrec - Get a Number's Precision.  This includes float,
+                              decimal, real, double, and oracle number.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the precision of a float, decimal, long, unsigned long, real, 
+        double, or Oracle number type. 
+   RETURNS:
+        the precision of the float, decimal, long, unsigned long, real, double,
+        or Oracle number 
+ */
+
+/*------------------------- OCITypeElemNumScale -----------------------------*/
+
+/* ** OBSOLETE ** */
+sb1 OCITypeElemNumScale(    OCIEnv *env, OCIError *err,
+                            const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemNumScale - Get a decimal or oracle Number's Scale 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the scale of a decimal, or Oracle number type. 
+   RETURNS:
+        the scale of the decimal, or Oracle number 
+ */
+
+/*------------------------ OCITypeElemLength -------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeElemLength(    OCIEnv *env, OCIError *err,
+                          const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemLength - Get a raw, fixed or variable length String's
+                             length in bytes.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the length of a raw, fixed or variable length string type. 
+   RETURNS:
+        length of the raw, fixed or variable length string
+ */
+
+/*----------------------- OCITypeElemCharSetID -----------------------------*/
+
+/* ** OBSOLETE ** */
+ub2 OCITypeElemCharSetID(    OCIEnv *env, OCIError *err,
+                             const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemCharSetID - Get a fixed or variable length String's
+                                character set ID
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the character set ID of a fixed or variable length string type. 
+   RETURNS:
+        character set ID of the fixed or variable length string
+ */
+
+/*---------------------- OCITypeElemCharSetForm ----------------------------*/
+
+/* ** OBSOLETE ** */
+ub2 OCITypeElemCharSetForm(    OCIEnv *env, OCIError *err,
+                               const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemCharSetForm - Get a fixed or variable length String's
+                                  character set specification form.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the attribute information in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the character form of a fixed or variable length string type.
+        The character form is an enumerated value that can be one of the
+        4 values below:
+               SQLCS_IMPLICIT for CHAR, VARCHAR2, CLOB w/o a specified set
+               SQLCS_NCHAR    for NCHAR, NCHAR VARYING, NCLOB
+               SQLCS_EXPLICIT for CHAR, etc, with "CHARACTER SET ..." syntax
+               SQLCS_FLEXIBLE for PL/SQL "flexible" parameters
+   RETURNS:
+        character form of the fixed or variable string
+ */
+
+/*--------------------- OCITypeElemParameterizedType ------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeElemParameterizedType(    OCIEnv *env, OCIError *err,
+                                       const OCITypeElem *elem, 
+                                       OCIType **type_stored    );
+/*
+   NAME: OCITypeElemParameterizedType 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+        type_stored (OUT) - If the function completes successfully, 
+               and the parameterized type is complex, 'type_stored' is NULL.
+               Otherwise, 'type_stored' points to the type descriptor (in the 
+               object cache) of the type that is stored in the parameterized 
+               type.  The caller must allocate space for the OCIType* 
+               before calling this routine and must not write into the space.
+   REQUIRES:
+        All input parameters must be valid.
+   DESCRIPTION:
+        Get a descriptor to the parameter type of a parameterized type.
+        Parameterized types are types of the form:
+          REF T
+          VARRAY (n) OF T
+        etc, where T is the parameter in the parameterized type.
+        Additionally is_ref is set if the parameter is a PTR or REF.
+        For example, it is set for REF T or VARRAY(n) OF REF T.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) 'type_stored' is not NULL but points to NULL data.
+   NOTES:
+        Complex parameterized types will be in a future release (once 
+        typedefs are supported.  When setting the parameterized type 
+        information, the user must typedef the contents if it's a
+        complex parameterized type.  Ex. for varray<varray<car>>, use
+        'typedef varray<car> varcar' and then use varray<varcar>. 
+ */
+
+/*----------------------- OCITypeElemExtTypeCode ----------------------------*/
+ 
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeElemExtTypeCode(    OCIEnv *env, OCIError *err,
+                                       const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemExtTypeCode - OCI Get an element's SQLT constant.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the internal Oracle typecode associated with an attribute's type.
+        This is the actual typecode for the attribute when it gets mapped
+        to a column in the Oracle database.
+   RETURNS:
+        The Oracle typecode associated with the attribute's type.
+   NOTES:
+        The type must be unpinned when the accessed information is no
+        longer needed.
+ */
+
+/*--------------------------------------------------------------------------*/
+/*                           ATTRIBUTE ACCESSORS                            */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeAttrByName -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeAttrByName(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                            const oratext *name, ub4 n_length,
+                            OCITypeElem **elem    );
+/*
+   NAME: OCITypeAttrByName - OCI Get an Attribute By Name. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        name (IN) - the attribute's name 
+        n_length (IN) - length (in bytes) of the 'name' parameter
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected type element descriptor pertaining to the
+               attributein the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get an attribute given its name.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) the type does not contain an attribute with the input 'name'. 
+            3) 'name' is NULL.
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+        Schema and type names are CASE-SENSITIVE. If they have been created
+        via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeAttrNext ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeAttrNext(    OCIEnv *env, OCIError *err, 
+                        OCITypeIter *iterator_ort, OCITypeElem **elem    );
+
+/*
+   NAME: OCITypeAttrNext - OCI Get an Attribute By Iteration.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        iterator_ort (IN/OUT) - iterator for retrieving the next attribute;
+               see OCITypeIterNew() to initialize iterator.
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected type element descriptor pertaining to the
+               attributein the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+            any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Iterate to the next attribute to retrieve.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_NO_DATA if there are no more attributes to iterate on; use
+            OCITypeIterSet() to reset the iterator if necessary.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*--------------------------------------------------------------------------*/
+/*                           COLLECTION ACCESSORS                           */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeCollElem ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeCollElem(    OCIEnv *env, OCIError *err, const OCIType *tdo,
+                          OCITypeElem **element    );
+/*
+   NAME: OCITypeCollElem
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to the type descriptor in the object cache
+        element (IN/OUT) - If the function completes successfully, this
+               points to the descriptor for the collection's element.
+               It is stored in the same format as an ADT attribute's
+               descriptor.
+               If *element is NULL, OCITypeCollElem() implicitly allocates a
+               new instance of OCITypeElem in the object cache. This instance
+               will be
+               automatically freed at the end of the session, and does not have
+               to be freed explicitly.
+               If *element is not NULL, OCITypeCollElem() assumes that it
+               points to a valid OCITypeElem descriptor and will copy the
+               results into it.
+   REQUIRES:
+        All input parameters must be valid.
+   DESCRIPTION:
+        Get a pointer to the descriptor (OCITypeElem) of the element of an
+        array or the rowtype of a nested table.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) the type TDO does not point to a valid collection's type.
+   NOTES:
+        Complex parameterized types will be in a future release (once 
+        typedefs are supported.  When setting the parameterized type 
+        information, the user must typedef the contents if it's a
+        complex parameterized type.  Ex. for varray<varray<car>>, use
+        'typedef varray<car> varcar' and then use varray<varcar>. 
+ */
+
+/*------------------------ OCITypeCollSize ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeCollSize(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                          ub4 *num_elems    );
+/*
+   NAME: OCITypeCollSize - OCI Get a Collection's Number of Elements.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to the type descriptor in the object cache
+        num_elems (OUT) - number of elements in collection
+   REQUIRES:
+        All input parameters must be valid. tdo points to an array type
+        defined as a domain.
+   DESCRIPTION:
+        Get the number of elements stored in a fixed array or the maximum 
+        number of elements in a variable array.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) 'tdo' does not point to a domain with a collection type.
+   NOTES:
+        Complex parameterized types will be in a future release (once 
+        typedefs are supported.  When setting the parameterized type 
+        information, the user must typedef the contents if it's a
+        complex parameterized type.  Ex. for varray<varray<car>>, use
+        'typedef varray<car> varcar' and then use varray<varcar>. 
+ */
+
+/*------------------------ OCITypeCollExtTypeCode ---------------------------*/
+ 
+/* ** OBSOLETE ** */
+sword OCITypeCollExtTypeCode(    OCIEnv *env, OCIError *err,
+                               const OCIType *tdo, OCITypeCode *sqt_code    );
+/*
+   NAME: ortcsqt - OCI Get a Collection element's DTY constant.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to the type descriptor in the object cache
+        sqt_code (OUT) - SQLT code of type element.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the SQLT constant associated with an domain's element type.
+        The SQLT codes are defined in <sqldef.h> and are needed for OCI/OOCI
+        use.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) 'tdo' does not point to a domain with a collection type.
+   NOTES:
+        The type must be unpinned when the accessed information is no
+        longer needed.
+ */
+ 
+
+/*--------------------------------------------------------------------------*/
+/*                             METHOD ACCESSORS                             */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------- OCITypeMethodOverload --------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethodOverload(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                              const oratext *method_name, ub4 m_length    );
+/*
+   NAME: OCITypeMethodOverload - OCI Get type's Number of Overloaded names
+                                 for the given method name.
+   PARAMETERS:
+        gp (IN/OUT) - pga environment handle.  Any errors are recorded here.
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        method_name (IN) - the method's name
+        m_length (IN) - length (in bytes) of the 'method_name' parameter
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) if 'tdo' is not null, it must point to a valid type descriptor
+           in the object cache.
+   DESCRIPTION:
+        Overloading of methods implies that more than one method may have the
+        same method name.  This routine returns the number of methods that
+        have the given method name.  If there are no methods with the input
+        method name, 'num_methods' is 0.  The caller uses this information when
+        allocating space for the array of mdo and/or position pointers before
+        calling 'OCITypeMethodByName()' or 'ortgmps()'.
+   RETURNS:
+        The number of methods with the given name. 0 if none contains the
+        name.
+   NOTES:
+        Schema and type names are CASE-SENSITIVE. If they have been created
+        via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeMethodByName ------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodByName(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                              const oratext *method_name, ub4 m_length,
+                              OCITypeMethod **mdos    );
+/*
+   NAME: OCITypeMethodByName - OCI Get one or more Methods with Name. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        method_name (IN) - the methods' name  
+        m_length (IN) - length (in bytes) of the 'name' parameter
+        mdos (OUT) - If this function completes successfully, 'mdos' points to
+                the selected methods in the object cache.  The caller must
+                allocate space for the array of OCITypeMethod pointers before
+                calling this routine and must not write into the space.
+                The number of OCITypeMethod pointers that will be returned can
+                be obtained by calling 'OCITypeMethodOverload()'.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get one or more methods given the name.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) No methods in type has name 'name'.
+            3) 'mdos' is not NULL but points to NULL data.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+        Schema and type names are CASE-SENSITIVE. If they have been created
+        via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeMethodNext --------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodNext(    OCIEnv *env, OCIError *err, 
+                            OCITypeIter *iterator_ort,
+                            OCITypeMethod **mdo   );
+
+/*
+   NAME: OCITypeMethodNext - OCI Get a Method By Iteration.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        iterator_ort (IN/OUT) - iterator for retrieving the next method;
+               see OCITypeIterNew() to set iterator.
+        mdo (OUT) - If this function completes successfully, 'mdo' points to 
+               the selected method descriptor in the object cache.  Positions 
+               start at 1.  The caller must allocate space for the
+               OCITypeMethod* before calling this routine and must not write 
+               nto the space. 
+   REQUIRES:
+         1) All type accessors require that the type be pinned before calling 
+            any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Iterate to the next method to retrieve.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_NO_DATA if there are no more attributes to iterate on; use
+            OCITypeIterSet() to reset the iterator if necessary.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) 'mdo' is not NULL but points to NULL data.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodName --------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext *OCITypeMethodName(    OCIEnv *env, OCIError *err,
+                            const OCITypeMethod *mdo, ub4 *n_length    );
+/*
+   NAME: OCITypeMethodName - OCI Get a Method's NaMe. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the 'name' parameter.  The caller
+               must allocate space for the ub4 before calling this routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the (non-unique) real name of the method.
+   RETURNS:
+        the non-unique name of the method or NULL if there is an error.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodEncap -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeEncap OCITypeMethodEncap(    OCIEnv *env, OCIError *err,
+                                    const OCITypeMethod *mdo    );
+/*
+   NAME: OCITypeMethodEncap - Get a Method's ENcapsulation (private/public). 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the encapsulation (private, or public) of a method.
+   RETURNS:
+        the encapsulation (private, or public) of the method
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodFlags -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeMethodFlag OCITypeMethodFlags(    OCIEnv *env, OCIError *err,
+                                         const OCITypeMethod *mdo    );
+/*
+   NAME: OCITypeMethodFlags - OCI Get a Method's FLags
+                              (inline, constant, virtual, constructor,
+                              destructor). 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the flags (inline, constant, virutal, constructor, destructor) of
+        a method.
+   RETURNS:
+        the flags (inline, constant, virutal, constructor, destructor) of
+        the method
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodMap ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodMap(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                           OCITypeMethod **mdo    );
+/*
+   NAME: OCITypeMethodMap - OCI Get the Method's MAP function.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        mdo (OUT) - If this function completes successfully, and there is a 
+               map function for this type, 'mdo' points to the selected method 
+               descriptor in the object cache.  Otherwise, 'mdo' is null.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All required input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        A type may have only one map function.  'OCITypeMethodMap()' finds
+        this function, if it exists, and returns a reference and a pointer to
+        the method descriptor in the object cache.  If the type does not have a
+        map (relative ordering) function, then 'mdo_ref' and 'mdo' are set
+        to null and an error is returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            the type does not contain a map function.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodOrder -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodOrder(    OCIEnv *env, OCIError *err, const OCIType *tdo, 
+                             OCITypeMethod **mdo    );
+/*
+   NAME: OCITypeMethodOrder - OCI Get the Method's ORder function.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        mdo (OUT) - If this function completes successfully, and there is a 
+               map function for this type, 'mdo' points to the selected method 
+               descriptor in the object cache.  Otherwise, 'mdo' is null.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All required input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        A type may have only one ORder or MAP function. 'OCITypeMethodOrder()'
+        finds this function, if it exists, and returns a ref and a pointer
+        to the method descriptor in the object cache.  If the type does not
+        have a map (relative ordering) function, then 'mdo_ref' and 'mdo' are
+        set to null and an error is returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            the type does not contain a map function.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodParams ------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethodParams(    OCIEnv *env, OCIError *err,
+                            const OCITypeMethod *mdo    );
+/*
+   NAME: OCITypeMethodParams - OCI Get a Method's Number of Parameters. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the number of parameters in a method.
+   RETURNS:
+        the number of parameters in the method
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/*                             RESULT ACCESSORS                             */
+/*--------------------------------------------------------------------------*/
+
+/*-------------------------- OCITypeResult ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeResult(    OCIEnv *env, OCIError *err, const OCITypeMethod *mdo,
+                        OCITypeElem **elem    );
+/*
+   NAME: OCITypeResult - OCI Get a method's result type descriptor.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        elem (OUT) - If this function completes successfully, 'rdo' points to 
+               the selected result (parameter) descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor.
+        2) 'elem' MUST be the address of an OCITypeElem pointer.
+   DESCRIPTION:
+        Get the result of a method.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) method returns no results.
+   NOTES:
+        The method must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/*                           PARAMETER ACCESSORS                            */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeParamByPos -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamByPos(    OCIEnv *env, OCIError *err,
+                            const OCITypeMethod *mdo, ub4 position, 
+                            OCITypeElem **elem    );
+/*
+   NAME: OCITypeParamByPos - OCI Get a Parameter in a method By Position. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        position (IN) - the parameter's position.  Positions start at 1.
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected parameter descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+   DESCRIPTION:
+        Get a parameter given its position in the method.  Positions start 
+        at 1.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) 'position' is not >= 1 and <= the number of parameters in the
+               method.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeParamByName -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamByName(    OCIEnv *env, OCIError *err,
+                             const OCITypeMethod *mdo, 
+                             const oratext *name, ub4 n_length,
+                             OCITypeElem **elem    );
+/*
+   NAME: OCITypeParamByName - OCI Get a Parameter in a method By Name. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        name (IN) - the parameter's name
+        n_length (IN) - length (in bytes) of the 'name' parameter
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected parameter descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'mdo' is not null, it must point to a valid method descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get a parameter given its name.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) the method does not contain a parameter with the input 'name'. 
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeParamPos ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamPos(    OCIEnv *env, OCIError *err,
+                          const OCITypeMethod *mdo, 
+                          const oratext *name, ub4 n_length, ub4 *position, 
+                          OCITypeElem **elem    );
+/*
+   NAME: OCITypeParamPos - OCI Get a parameter's position in a method
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        name (IN) - the parameter's name
+        n_length (IN) - length (in bytes) of the 'name' parameter
+        position (OUT) - If this function completes successfully, 'position' 
+               points to the position of the parameter in the method starting 
+               at position 1. position MUST point to space for a ub4.
+        elem (OUT) - If this function completes successfully, and 
+               the input 'elem' is not NULL, 'elem' points to the selected 
+               parameter descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'mdo' is not null, it must point to a valid method descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get the position of a parameter in a method.  Positions start at 1.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) the method does not contain a parameter with the input 'name'. 
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeParamElemMode -----------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeParamMode OCITypeElemParamMode(    OCIEnv *env, OCIError *err,
+                                          const OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemParamMode - OCI Get a parameter's mode
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the parameter descriptor in the object cache
+                (represented by an OCITypeElem)
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the mode (in, out, or in/out) of the parameter.
+   RETURNS:
+        the mode (in, out, or in/out) of the parameter
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------- OCITypeElemDefaultValue -------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeElemDefaultValue(    OCIEnv *env, OCIError *err,
+                                  const OCITypeElem *elem,
+                                  ub4 *d_v_length    );
+/*
+   NAME: OCITypeElemDefaultValue - OCI Get the element's Default Value. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the parameter descriptor in the object cache
+                (represented by an OCITypeElem)
+        d_v_length (OUT) - length (in bytes) of the returned default value.
+               The caller must allocate space for the ub4 before calling this 
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the default value in text form (PL/SQL) of an element. For V8.0,
+        this only makes sense for a method parameter.
+   RETURNS:
+        The default value (text) of the parameter.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+ 
+
+/*--------------------------------------------------------------------------*/
+/*                           TYPE VERSION TABLE                             */
+/*--------------------------------------------------------------------------*/
+
+/* For V8.0, the type version table is meant to be an internal data structure
+   only for Oracle clients for type version maintanence purposes. A more
+   general version of the API may be made public in subsequent releases. */
+
+
+/*--------------------------- OCITypeVTInit --------------------------------*/
+ 
+/* ** OBSOLETE ** */
+sword OCITypeVTInit(    OCIEnv *env, OCIError *err    );
+/*
+   NAME: OCITypeVTInit - OCI type Version table INItialize
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+   REQUIRES:
+        none
+   DESCRIPTION:
+        Allocate space for and initialize the type version table and the type
+        version table's index.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if internal errors occurrs during initialization.
+ */
+ 
+/*--------------------------- OCITypeVTInsert -------------------------------*/
+ 
+/* ** OBSOLETE ** */
+sword OCITypeVTInsert(    OCIEnv *env, OCIError *err, 
+                          const oratext *schema_name, ub4 s_n_length, 
+                          const oratext *type_name, ub4 t_n_length, 
+                          const oratext *user_version, ub4 u_v_length    );
+/*
+   NAME: OCITypeVTInsert - OCI type Version table INSert entry.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        schema_name (IN, optional) - name of schema associated with the 
+                  type.  By default, the user's schema name is used.
+        s_n_length (IN) - length of the 'schema_name' parameter
+        type_name (IN) - type name to insert
+        t_n_length (IN) - length (in bytes) of the 'type_name' parameter
+        user_version (IN) - user readable version of the type
+        u_v_length (IN) - length (in bytes) of the 'user_version' parameter
+   REQUIRES:
+        none
+   DESCRIPTION:
+        Insert an entry into the type version table and the type version
+        table's index.  The entry's type name and user readable version
+        fields are updated with the input values.  All other fields are
+        initialized to null.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if
+            1) any of the parameters is invalid.
+            2) an entry for 'type_name' has already been registered in the
+               type version table.
+ */
+
+/*------------------------------ OCITypeVTSelect ----------------------------*/
+
+/* OCITypeVTSelect - OCI type VERSion table SELECT entry */
+/* ** OBSOLETE ** */
+sword OCITypeVTSelect(    OCIEnv *env, OCIError *err, 
+                          const oratext *schema_name, ub4 s_n_length, 
+                          const oratext *type_name, ub4 t_n_length, 
+                          oratext **user_version, ub4 *u_v_length,
+                        ub2 *version );
+/*
+   NAME: OCITypeVTSelect - OCI type Version table SELect entry.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        schema_name (IN, optional) - name of schema associated with the 
+                  type.  By default, the user's schema name is used.
+        s_n_length (IN) - length of the 'schema_name' parameter
+        type_name (IN) - type name to select
+        t_n_length (IN) - length (in bytes) of the 'type_name' parameter
+        user_version (OUT, optional) - pointer to user readable version of the
+                 type
+        u_v_length (OUT, optional) - length (in bytes) of the 'user_version'
+                 parameter
+        version (OUT, optional) - internal type version
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Select an entry in the type version table by name.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if
+            1) any of the parameters is invalid.
+            2) an entry with 'type_name' does not exist.
+ */
+
+/* Compatibility function - following function prototype retained for 
+   compatibility only */
+sword ortgcty(    OCIEnv *env, OCIError *err, OCIType *coll_tdo,
+                  OCIType **collelem_tdo    );
+
+/*---------------------------------------------------------------------------*/
+/*               Transient Type Construction functions                       */
+/*---------------------------------------------------------------------------*/
+
+sword OCITypeBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+                         OCIDuration dur, OCIType **type);
+/*
+   NAME: OCITypeBeginCreate - OCI Type Begin Creation of a transient type.
+   REMARKS
+       Begins the construction process for a transient type. The type will be
+       anonymous (no name). To create a persistent named type, the CREATE TYPE
+       statement should be used from SQL. Transient types have no identity.
+       They are pure values.
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context.
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       tc               - The TypeCode for the type. The Typecode could
+                          correspond to a User Defined Type or a Built-in type.
+                          Currently, the permissible values for User Defined 
+                          Types are OCI_TYPECODE_OBJECT for an Object Type
+                          (structured), OCI_TYPECODE_VARRAY for a VARRAY
+                          collection type or OCI_TYPECODE_TABLE for a nested
+                          table collection type. For Object types,
+                          OCITypeAddAttr() needs to be called to add each of
+                          the attribute types. For Collection types,
+                          OCITypeSetCollection() needs to be called.
+                          Subsequently, OCITypeEndCreate() needs to be called 
+                          to finish the creation process.
+                          The permissible values for Built-in type codes are
+                          specified in the user manual. Additional information
+                          on built-ins if any (like precision, scale for
+                          numbers, character set info for VARCHAR2s etc.) must
+                          be set with a subsequent call to OCITypeSetBuiltin().
+                          Subsequently OCITypeEndCreate() needs to be called
+                          to finish the creation process.
+       dur              - The allocation duration for the Type. Could be a
+                          predefined or a user defined duration.
+       type(OUT)        - The OCIType (Type Descriptor) that is being
+                          constructed.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+
+sword OCITypeSetCollection(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+                           OCIParam *collelem_info, ub4 coll_count);
+/*
+   NAME: OCITypeSetCollection - OCI Type Set Collection information
+   REMARKS :
+       Set Collection type information. This call can be called only if the
+       OCIType has been constructed with a collection typecode.
+   PARAMETERS:
+       svchp (IN)      -  The OCI Service Context.
+       errhp (IN/OUT)  -  The OCI error handle. If there is an error, it is 
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type(IN OUT)    -  The OCIType (Type Descriptor) that is being
+                          constructed.
+       collelem_info   -  collelem_info provides information on the collection
+                          element. It is obtained by allocating an OCIParam
+                          (parameter handle) and setting type information in
+                          the OCIParam using OCIAttrSet() calls.
+       coll_count      -  The count of elements in the collection. Pass 0 for
+                          a nested table (unbounded).
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+sword OCITypeSetBuiltin(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+                        OCIParam *builtin_info);
+/*
+   NAME: OCITypeSetBuiltin - OCI Type Set Builtin information.
+   REMARKS:
+       Set Built-in type information. This call can be called only if the
+       OCIType has been constructed with a built-in typecode
+       (OCI_TYPECODE_NUMBER etc.).
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context.
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is 
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type(IN OUT)     - The OCIType (Type Descriptor) that is being
+                          constructed.
+       builtin_info     - builtin_info provides information on the built-in
+                          (like precision, scale, charater set etc.). It is
+                          obtained by allocating an OCIParam (parameter handle)
+                          and setting type information in the OCIParam using
+                           OCIAttrSet() calls.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+sword OCITypeAddAttr(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+                     const oratext *a_name, ub4 a_length, 
+                     OCIParam *attr_info);
+/*
+   NAME: OCITypeAddAttr - OCI Type Add Attribute to an Object Type.
+   REMARKS:
+       Adds an attribute to an Object type (that was constructed earlier with
+       typecode OCI_TYPECODE_OBJECT).
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type (IN/OUT)    - The Type description that is being constructed.
+       a_name(IN)       - Optional. gives the name of the attribute.
+       a_length         - Optional. gives length of attribute name.
+       attr_info        - Information on the attribute. It is obtained by
+                          allocating an OCIParam (parameter handle) and setting
+                          type information in the OCIParam using OCIAttrSet()
+                          calls.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+sword OCITypeEndCreate(OCISvcCtx *svchp, OCIError *errhp, OCIType *type);
+/*
+   NAME: OCITypeEndCreate - OCI Type End Creation
+   REMARKS:
+       Finishes construction of a type description.Subsequently, only access
+       will be allowed.
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type (IN/OUT)    - The Type description that is being constructed.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+/*=========================*/
+/* PUBLIC MACROS AND FLAGS */
+/*=========================*/
+
+/*--------------------------------------------------------------------------*/
+/*                          TYPE ELEMENT FLAGS                              */
+/*--------------------------------------------------------------------------*/
+
+#define OCI_TYPEELEM_REF        0x8000                   /* element is a REF */
+#define OCI_TYPEPARAM_REQUIRED  0x0800              /* parameter is required */
+
+/* macros to test flags */
+#define OCI_TYPEELEM_IS_REF(elem_flag) \
+  (((elem_flag) & OCI_TYPEELEM_REF)!=0)
+#define OCI_TYPEPARAM_IS_REQUIRED(param_flag) \
+  (((param_flag) & OCI_TYPEPARAM_REQUIRED)!=0)
+
+
+#endif /* ORT_ORACLE */
+
diff --git a/sdk/include/sql2oci.h b/sdk/include/sql2oci.h
new file mode 100755
index 0000000..eb97d32
--- /dev/null
+++ b/sdk/include/sql2oci.h
@@ -0,0 +1,204 @@
+
+/*
+ * $Header: sql2oci.h 08-may-2002.12:13:40 apopat Exp $
+ */
+
+/* Copyright (c) 1996, 2002, Oracle Corporation.  All rights reserved.  */
+ 
+/* NOTE:  See 'header_template.doc' in the 'doc' dve under the 'forms' 
+      directory for the header file template that includes instructions. 
+*/
+ 
+/* 
+   NAME 
+     sql2oci.h - SQLLIB functions for V8 OCI interoperability
+
+   DESCRIPTION 
+     This file contains SQLLIB functions to obtain OCI environment handle
+     and OCI service context in a Pro*c program.
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     SQLEnvGet()
+     SQLSvcCtxGet()
+
+   PRIVATE FUNCTION(S)
+     NONE
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   apopat      05/08/02 - [2362423] MVS PE to make lines shorter than 79
+   apopat      07/31/99 - [707588] TAB to blanks for OCCS
+   apopat      04/06/99 - [563753] Allowing prototypes for C++
+   lvbcheng    06/23/98 - Add SQLRowidGet
+   sylin       02/25/98 - [600216] Add C++ support
+   lvbcheng    05/13/97 - Desupport wrappers
+   lvbcheng    01/13/97 - fix non-ANSI SQLNumberFromFloat error
+   lvbcheng    01/03/97 - test
+   lvbcheng    01/03/97 - Revert back to OCINumber *
+   lvbcheng    12/12/96 - Finalize
+   lvbcheng    12/06/96 - test
+   lvbcheng    12/06/96 - test
+   lvbcheng    12/05/96 - Add default context code
+   lvbcheng    12/05/96 - Add connection to sqlcpr.h and sql[a|k]pr.h
+   lvbcheng    12/05/96 - Remove merge conflicts
+   lvbcheng    12/02/96 - Change Interface of sql2oci wrappers
+   lvbcheng    10/21/96 - Add OCINumber set procedures
+   lvbcheng    10/21/96 - Add vstr wrappers
+   jbasu       08/02/96 - Remove private include files
+   jbasu       07/05/96 - [8.0] SQLSvcCtxGet() enhancements
+   jbasu       06/04/96 - Support for V80 objects
+   jbasu       06/04/96 - Creation
+
+*/
+
+#ifndef SQL2OCI_ORACLE
+#  define SQL2OCI_ORACLE
+
+#ifndef OCI_ORACLE
+#  include <oci.h>
+#endif /* OCI_ORACLE */
+
+#ifndef ORL_ORACLE
+#  include <orl.h>
+#endif /* ORL_ORACLE */
+
+#ifndef SQLCPR_ORACLE
+#  include <sqlcpr.h>
+#endif /* SQLCPR_ORACLE */
+
+#if defined (__STDC__) || defined (__cplusplus)
+
+/* --------------------- */
+/*  Includes for ANSI C  */
+/* --------------------- */
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+#ifndef SQLAPR_ORACLE
+#  include <sqlapr.h>
+#endif /* SQLAPR_ORACLE */
+
+/* Get Procedures for OCI Env and Svc Ctx */
+
+extern sword SQLEnvGet(dvoid *rctx, OCIEnv **oeh);
+
+extern sword SQLSvcCtxGet(dvoid *rctx, text *dbname, sb4 dbnamelen, 
+                          OCISvcCtx **svc);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#else   /* k&r style - non-ANSI code */
+
+/* -------------------- */
+/*  Includes for K&R C  */
+/* -------------------- */
+
+#ifndef SQLKPR_ORACLE
+#  include <sqlkpr.h>
+#endif /* SQLKPR_ORACLE */
+
+/* ------------------------------------ */
+/* Get rowid of last exec sql statement */
+/* ------------------------------------ */
+
+void SQLRowidGet(/*_ dvoid *rctx, OCIRowid **urid _*/);
+
+/* 
+   NAME: SQLRowidGet - SQLLIB Rowid Get
+
+   PARAMETERS:
+   rctx (IN): pointer to a sqllib runtime context
+   urid (OUT): pointer to an allocated rowid descriptor
+
+   DESCRIPTION:
+   Sets urid to be the rowid of the last row inserted,
+   updated or selected
+
+   */
+
+
+
+
+
+
+
+/* ------------------------------------------- */
+/*  Get 8.0 OCI environment handle from SQLLIB */
+/* ------------------------------------------- */
+
+sword SQLEnvGet(/*_ dvoid *rctx, OCIEnv **oeh _*/);
+/*
+   NAME: SQLEnvGet - SQLLIB Get Environment from the Runtime Context
+
+   PARAMETERS:
+   rctx (IN): pointer to a sqllib runtime context
+   oeh (IN/OUT): OCIEnv ptr
+   
+   DESCRIPTION:
+   Sets oeh to the OCIEnv corresponding to the runtime context.
+
+   RETURNS:
+   status - SQL_SUCCESS on success, SQL_ERROR on failure.
+
+   */
+
+/* ---------------------------------------------- */
+
+/* Get 8.0 OCI Service Context for a database connection in Pro*C */
+
+/* non-threaded, no Pro*C runtime context */
+sword SQLSvcCtxGet(/*_ dvoid *rctx, text *dbname, sb4 dbnamelen,
+                     OCISvcCtx **svc _*/);
+/*
+   NAME: SQLSvcCtxGet - SQLLIB Service Context Get
+
+   PARAMETERS:
+   rctx (IN): pointer to a sqllib runtime context
+   dbname (IN): buffer containing the "logical" name for this connection.
+   dbnamelen (IN): length of the dbname buffer
+   svc (IN/OUT): address of an OCISvcCtx ptr
+   
+   DESCRIPTION:
+   Sets svc to the OCI Service Context corresponding to the runtime context.
+
+   RETURNS:
+   status - SQL_SUCCESS on success, SQL_ERROR on failure.
+
+   NOTES:
+   'dbname' is the buffer containing the "logical" name for this connection.
+   This  would be the same identifier used in an AT clause in an embedded
+   SQL statement.  
+   
+   'dbnamelen' is the length of buffer containing dbname.
+   
+   If dbname is a NULL ptr or dbnamelen is 0, then the "default" database
+   connection is assumed (as in a SQL statement with no AT clause).
+   
+   A value of -1 for dbnamelen can be used to indicate that dbname 
+   is a NULL-terminated string.
+   
+   */
+
+#endif /* k&r style - non-ANSI code */
+
+#endif /* SQL2OCI_ORACLE */
diff --git a/sdk/include/sqlapr.h b/sdk/include/sqlapr.h
new file mode 100755
index 0000000..4510533
--- /dev/null
+++ b/sdk/include/sqlapr.h
@@ -0,0 +1,132 @@
+/*
+ * $Header: sqlapr.h 08-may-2002.12:13:40 apopat Exp $ 
+ */
+
+/* Copyright (c) 1994, 2002, Oracle Corporation.  All rights reserved.  */
+/*
+   NAME
+     sqlapr.h - SQLlib ANSI PRototypes
+   DESCRIPTION
+     Defines ANSI prototypes for externalized SQLLIB functions used in 
+     conjunction with OCI
+   PUBLIC FUNCTION(S)
+     sqllda: Get Logon Data Area for connection
+     sqlld2: Logon Data area form 2 -- with host name
+     sqlcda: Cursor data area from result set cursor
+     sqlcur: PCC cursor from cursor data area
+
+   NOTES
+
+   MODIFIED   (MM/DD/YY)
+    apopat     05/08/02 - [2362423] MVS PE to make lines shorter than 79
+    apopat     09/20/00 - [1356099] Clarification on use of sqllda
+    lvbcheng   01/16/97 - Fix for b2
+    jbasu      02/08/95 - Add new prototypes for thread entry pts
+    jbasu      09/21/94 - Update sqlcda,sqlcur; move sqlrcn,sqlfcn to sqlefn.h
+    jbasu      09/13/94 - Move XA prototypes to sqlefn.h
+    jbasu      08/16/94 - use OCI cda_def type from ocidfn.h instead of sqlold
+    jbasu      08/16/94 - Creation
+*/
+
+#ifndef SQLAPR
+#  define SQLAPR
+
+#ifndef OCIDFN
+#  include <ocidfn.h>
+#endif
+
+#define SQLLDAGetCurrent(arg1, arg2) sqlldat(arg1, arg2)
+
+void sqllda( Lda_Def *lda );
+   /* LDA version 1.   Creates an lda for use in OCI programs.
+   **   Assumes that we are logged on through an embedded SQL statement.
+   **   The lda is filled in using the connect information from the most 
+   **   recently executed embedded SQL statement.  So the ONLY way to use
+   **   sqllda() is to call sqllda() immediately after the 
+   **   EXEC SQL CONNECT... statement.
+   */
+
+void sqlldat(dvoid *sqluga, Lda_Def *lda );
+  /* Thread-safe version of sqllda.  Takes an extra parameter sqluga, which 
+   * is the SQLLIB runtime context. 
+   */
+
+/* **************************************************************************/
+/* ** SQLLD2 ** "sqlld2" is an extended version of                          */
+/*              the sqllda function used to pass a connection to OCI.       */
+/*              "sqlld2" can be used at any time to set up an "lda" for use */
+/*              by OCI.  It does not need to called immediately after a SQL */
+/*              statement using the particular connection (typically the    */
+/*              CONNECT itself).                                            */
+/****************************************************************************/
+
+#define SQLDAGetNamed(arg1, arg2, arg3, arg4) sqlld2t(arg1, arg2, arg3, arg4)
+
+void sqlld2( Lda_Def *lda, text *hname, sb4 *hnamel );
+   /* LDa version 2.  Creates an lda for use in OCI programs.  The difference
+   **      between sqlld2 and sqllda is that sqlld2 allows specification of
+   **      the database host name to determine the connection to use in
+   **      establishing the lda. 
+   **  hname - buffer containing the "logical" name for this connection.  This
+   **            would be the same identifier used in an AT clause in an
+   **            embedded SQL statement.  A null ptr indicates the "default"
+   **            database used when there is no AT clause in a SQL statement.
+   **  hnamel - length of buffer containing hname.
+   */
+
+void sqlld2t( dvoid *sqluga, Lda_Def *lda, text *hname, sb4 *hnamel );
+   /*  Thread-safe version of sqlld2. Takes an extra parameter sqluga, which 
+    *  is the SQLLIB runtime context. 
+    */ 
+
+#define SQLCDAFromResultSetCursor(arg1, arg2, arg3, arg4) \
+        sqlcdat(arg1, arg2, arg3, arg4) 
+
+void sqlcda( Cda_Def *cda, dvoid *cur, sword *retval );
+/* 
+ * Name: sqlcda() - SQLlib result set cursor to a Cursor Data Area in OCI
+ * Description: Translates a result set cursor in SQLLIB to a cursor data area
+ *              in OCI.  Both of these structs should have been previously 
+ *              created/allocated.
+ * Input   : cur   - pointer to a result set cursor struct allocated thru Pro*
+ * Output  : cda   - pointer to destination cursor data area in OCI
+ *           retval- Return value: 0 if no error,SQLLIB error number otherwise
+ *
+ * Notes: 1. In case of an error, the v2_rc and rc fields of the cda are
+ *           populated with the negative and positive error codes respectively.
+ *        2. The 'rows processed count' in the cda structure is NOT populated
+ *           in this routine.  This field is set to the correct value only
+ *           AFTER a fetch is done in OCI using the cda. Same
+ *           comment applies to other cda fields like the function type.
+ * ===========================================================================
+ */
+void sqlcdat(dvoid *sqluga, Cda_Def *cda, dvoid *cur, sword *retval );
+ /* Thread-safe version of sqlcda().  Takes an extra parameter sqluga, which 
+  * is the SQLLIB runtime context. 
+  */ 
+
+#define SQLCDAToResultSetCursor(SQL_SINGLE_RCTX, arg1, arg2, arg3) \
+        sqlcurt(arg1, arg2, arg3, arg4)
+
+void sqlcur( dvoid *cur, Cda_Def *cda, sword *retval );
+/*
+ * Name: sqlcur() - SQLlib result set CURsor from an oci cursor data area
+ * Description: Translates a cursor data area in OCI to a result set cursor
+ *              in SQLLIB.  Both of these structs should have been previously
+ *              created/allocated.
+ * Input   : cda    - pointer to a cursor data area in OCI
+ * Output  : cur    - pointer to a result set cursor struct (previously 
+ *                    allocated thru PCC)
+ *           retval - Return value: 0 if no error, error code otherwise.
+ * Notes  : The sqlca structure for PCC is NOT updated by this routine.  This 
+ *          structure gets populated (with error code, rows fetched count etc)
+ *          only AFTER a database operation is performed through PCC using the
+ *          translated cursor.
+ *============================================================================
+ */
+void sqlcurt(dvoid *sqluga, dvoid *cur, Cda_Def *cda, sword *retval );
+ /* Thread-safe version of sqlcur().  Takes an extra parameter sqluga, which 
+  * is the SQLLIB runtime context. 
+  */ 
+
+#endif /* SQLAPR */
diff --git a/sdk/include/sqlca.h b/sdk/include/sqlca.h
new file mode 100755
index 0000000..daaead7
--- /dev/null
+++ b/sdk/include/sqlca.h
@@ -0,0 +1,99 @@
+/*
+ * $Header: sqlca.h 24-apr-2003.12:50:58 mkandarp Exp $ sqlca.h 
+ */
+
+/* Copyright (c) 1985, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/*
+NAME
+  SQLCA : SQL Communications Area.
+FUNCTION
+  Contains no code. Oracle fills in the SQLCA with status info
+  during the execution of a SQL stmt.
+NOTES
+  **************************************************************
+  ***                                                        ***
+  *** This file is SOSD.  Porters must change the data types ***
+  *** appropriately on their platform.  See notes/pcport.doc ***
+  *** for more information.                                  ***
+  ***                                                        ***
+  **************************************************************
+
+  If the symbol SQLCA_STORAGE_CLASS is defined, then the SQLCA
+  will be defined to have this storage class. For example:
+ 
+    #define SQLCA_STORAGE_CLASS extern
+ 
+  will define the SQLCA as an extern.
+ 
+  If the symbol SQLCA_INIT is defined, then the SQLCA will be
+  statically initialized. Although this is not necessary in order
+  to use the SQLCA, it is a good pgming practice not to have
+  unitialized variables. However, some C compilers/OS's don't
+  allow automatic variables to be init'd in this manner. Therefore,
+  if you are INCLUDE'ing the SQLCA in a place where it would be
+  an automatic AND your C compiler/OS doesn't allow this style
+  of initialization, then SQLCA_INIT should be left undefined --
+  all others can define SQLCA_INIT if they wish.
+
+  If the symbol SQLCA_NONE is defined, then the SQLCA variable will
+  not be defined at all.  The symbol SQLCA_NONE should not be defined
+  in source modules that have embedded SQL.  However, source modules
+  that have no embedded SQL, but need to manipulate a sqlca struct
+  passed in as a parameter, can set the SQLCA_NONE symbol to avoid
+  creation of an extraneous sqlca variable.
+ 
+MODIFIED
+    lvbcheng   07/31/98 -  long to int
+    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file
+    losborne   08/11/92 -  No sqlca var if SQLCA_NONE macro set 
+  Clare      12/06/84 - Ch SQLCA to not be an extern.
+  Clare      10/21/85 - Add initialization.
+  Bradbury   01/05/86 - Only initialize when SQLCA_INIT set
+  Clare      06/12/86 - Add SQLCA_STORAGE_CLASS option.
+*/
+ 
+#ifndef SQLCA
+#define SQLCA 1
+ 
+struct   sqlca
+         {
+         /* ub1 */ char    sqlcaid[8];
+         /* b4  */ int     sqlabc;
+         /* b4  */ int     sqlcode;
+         struct
+           {
+           /* ub2 */ unsigned short sqlerrml;
+           /* ub1 */ char           sqlerrmc[70];
+           } sqlerrm;
+         /* ub1 */ char    sqlerrp[8];
+         /* b4  */ int     sqlerrd[6];
+         /* ub1 */ char    sqlwarn[8];
+         /* ub1 */ char    sqlext[8];
+         };
+
+#ifndef SQLCA_NONE 
+#ifdef   SQLCA_STORAGE_CLASS
+SQLCA_STORAGE_CLASS struct sqlca sqlca
+#else
+         struct sqlca sqlca
+#endif
+ 
+#ifdef  SQLCA_INIT
+         = {
+         {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '},
+         sizeof(struct sqlca),
+         0,
+         { 0, {0}},
+         {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '},
+         {0, 0, 0, 0, 0, 0},
+         {0, 0, 0, 0, 0, 0, 0, 0},
+         {0, 0, 0, 0, 0, 0, 0, 0}
+         }
+#endif
+         ;
+#endif
+ 
+#endif
+ 
+/* end SQLCA */
diff --git a/sdk/include/sqlcpr.h b/sdk/include/sqlcpr.h
new file mode 100755
index 0000000..54df232
--- /dev/null
+++ b/sdk/include/sqlcpr.h
@@ -0,0 +1,184 @@
+/*
+ * $Header: sqlcpr.h 28-dec-2005.15:32:23 apopat Exp $
+ */
+
+/* Copyright (c) 1988, 2005, Oracle. All rights reserved.  */
+ 
+/* NAME
+     sqlcpr.h
+   FUNCTION
+     Contains 'customer' prototypes for the sql* routines generated by the
+     precompiler.  
+     sqlald, sqlglm, sqlnul and sqlprc are included because, although we don't
+     generate calls to them, users may include calls to them.
+
+     'customer' prototypes for dynamic method 4 (i.e., sqlda) reside
+     in the sqlda.h public header file.
+
+   NOTES
+     There should be no 'modified' notes in this file when it goes to the
+     customer.  Remove them as they are put in.  */
+
+#ifndef SQLCA
+#  include <sqlca.h>
+#endif
+#ifndef ORACA
+#  include <oraca.h>
+#endif
+
+#ifndef SQLPRO
+#  define SQLPRO
+
+/* -------------------- */
+/* defines for sqlcpr.h */
+/* -------------------- */
+
+#define SQL_SUCCESS (sword)0
+#define SQL_ERROR (sword)-1
+
+#ifndef SQL_SINGLE_RCTX
+#define SQL_SINGLE_RCTX (dvoid *)0
+#endif /* SQL_SINGLE_RCTX */
+
+#define SQLErrorGetText(arg1, arg2, arg3, arg4) sqlglmt(arg1, arg2, arg3, arg4)
+
+#define SQLStmtGetText(arg1, arg2, arg3, arg4) sqlglst(arg1, arg2, arg3, arg4)
+
+#define SQLColumnNullCheck(arg1, arg2, arg3, arg4) \
+        sqlnult(arg1, arg2, arg3, arg4)
+
+#define SQLNumberPrecV6(arg1, arg2, arg3, arg4) sqlprct(arg1, arg2, arg3, arg4)
+
+#define SQLNumberPrecv7(arg1, arg2, arg3, arg4) sqlpr2t(arg1, arg2, arg3, arg4)
+
+#define SQLVarcharGetLength(arg1, arg2, arg3) sqlvcpt(arg1, arg2, arg3) 
+
+#define SQLGetStride(arg1, arg2, arg3, arg4) sqlstrdt(arg1, arg2, arg3, arg4)
+
+#if defined (__STDC__) || defined (__cplusplus)
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+/* user-callable functions - non-threaded */
+/* -------------------------------------- */
+
+extern void sqlglm( unsigned char*, size_t*, size_t* );
+extern void sqlgls( char*, size_t*, size_t* );
+extern void sqliem( unsigned char*, signed int* );
+extern void sqlnul( unsigned short*, unsigned short*, int* );
+extern void sqlprc( unsigned int*, int*, int* );
+extern void sqlpr2( unsigned int*, int*, int*);
+extern void sqlvcp( unsigned int*, unsigned int* );
+
+/* user-callable functions -- thread safe */
+/* -------------------------------------- */
+
+extern void sqlglmt( void*, unsigned char*, size_t*, size_t* ); 
+
+extern void sqlglst( void*, char*, size_t*, size_t* );
+
+extern void sqliemt( void*, unsigned char*, signed int*);
+
+extern void sqlnult( void*, unsigned short*, unsigned short*, int*);
+
+extern void sqlpr2t( void*, unsigned int*, int*, int*);
+
+extern void sqlprct( void*, unsigned int*, int*, int*);
+
+extern void sqlvcpt( void*, unsigned int*, unsigned int*);
+
+extern void SQLExtProcError( void*, char*, size_t );
+
+/* Removed generated Pro* 1.3 entry points */
+/* --------------------------------------- */
+
+/* Forms 3.0 compatibility functions */
+/* --------------------------------- */
+
+extern int iapprs( unsigned char* );      
+extern int iappfo( unsigned char*, unsigned char*, size_t );
+extern int exiterr( unsigned char* );
+
+/* user-callable functions - non-threaded */
+/* -------------------------------------- */
+
+extern struct SQLDA *sqlald( int, size_t, size_t );
+extern void sqlclu( struct SQLDA*);
+
+/* user-callable functions -- thread safe */
+/* -------------------------------------- */
+
+extern struct SQLDA *sqlaldt( void*, int, size_t, size_t );
+
+extern void sqlclut( void*, struct SQLDA*);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#else /* k&r C - not ANSI standard */
+
+
+/* user-callable functions - non-threaded */
+/* -------------------------------------- */
+
+extern void sqlglm( /*_ char*, size_t*, size_t* _*/ );
+extern void sqlgls( /*_ char*, size_t*, size_t* _*/);
+extern void sqliem( /*_ char*, int* _*/ );
+extern void sqlnul( /*_ unsigned short*, unsigned short*, int* _*/ );
+extern void sqlprc( /*_ unsigned int*, int*, int* _*/ );
+extern void sqlpr2( /*_ unsigned int*, int*, int* _*/);
+extern void sqlvcp( /*_ unsigned int *, unsigned int * _*/);
+extern void sqlstrd(/*_ ub1 *, ub1 *, size_t _*/);  
+
+/* user-callable functions -- thread safe */
+/* -------------------------------------- */
+
+extern void sqlglmt(/*_ void*, char*, size_t*, size_t* _*/ ); 
+
+extern void sqlglst(/*_ void*, char*, size_t*, size_t* _*/);
+
+extern void sqliemt(/*_ void*, char*, int* _*/ );
+
+extern void sqlnult(/*_ void*, unsigned short*, unsigned short*, int* _*/ );
+
+extern void sqlprct(/*_ void*, unsigned int*, int*, int* _*/ );
+
+extern void sqlpr2t(/*_ void*, unsigned int*, int*, int* _*/);
+
+extern void sqlvcpt(/*_ void*, unsigned int *, unsigned int * _*/);
+
+extern void sqlstrdt(/*_ void *, ub1 *, ub1 *, size_t _*/);
+
+extern void SQLExtProcError(/*_ void*, char*, size_t _*/);
+
+extern void SQLRowidGet(/*_ void*, OCIRowid **urid _*/);
+
+/* Removed generated Pro* 1.3 entry points */
+/* --------------------------------------- */
+
+
+/* Forms 3.0 compatibility functions */
+/* --------------------------------- */
+
+extern int iapprs( /*_ char* _*/ );      
+extern int iappfo( /*_ char*, char*, unsigned int _*/ );
+extern int exiterr( /*_ char* _*/ );
+
+/* user-callable functions - non-threaded */
+/* -------------------------------------- */
+
+extern struct SQLDA *sqlald( /*_ int, size_t, size_t _*/ );
+extern void sqlclu( /*_ struct SQLDA* _*/);
+
+/* user-callable functions -- thread safe */
+/* -------------------------------------- */
+
+extern struct SQLDA *sqlaldt(/*_ void*, int, size_t, size_t _*/ );
+extern void sqlclut(/*_ void*, struct SQLDA* _*/);
+
+#endif /* k&r C - not ANSI standard */
+
+#endif /* SQLPRO */
diff --git a/sdk/include/sqlda.h b/sdk/include/sqlda.h
new file mode 100755
index 0000000..d542c0a
--- /dev/null
+++ b/sdk/include/sqlda.h
@@ -0,0 +1,89 @@
+/*
+ * $Header: sqlda.h 08-may-2007.05:58:33 ardesai Exp $ sqlda.h 
+ */
+
+/***************************************************************
+*      The SQLDA descriptor definition                         *
+*--------------------------------------------------------------*
+*      VAX/3B Version                                          *
+*                                                              *
+* Copyright (c) 1987, 2007, Oracle. All rights reserved.  *
+***************************************************************/
+
+
+/* NOTES
+  **************************************************************
+  ***                                                        ***
+  *** This file is SOSD.  Porters must change the data types ***
+  *** appropriately on their platform.  See notes/pcport.doc ***
+  *** for more information.                                  ***
+  ***                                                        ***
+  **************************************************************
+*/
+
+/*  MODIFIED
+    ardesai    05/08/07  - Bug[6037057] Undef Y
+    apopat     05/08/02  - [2362423] MVS PE to make lines shorter than 79
+    apopat     07/31/99 -  [707588] TAB to blanks for OCCS
+    lvbcheng   10/27/98 -  change long to int for sqlda
+    lvbcheng   08/15/97 -  Move sqlda protos to sqlcpr.h
+    lvbcheng   06/25/97 -  Move sqlda protos to this file
+    jbasu      01/29/95 -  correct typo
+    jbasu      01/27/95 -  correct comment - ub2->sb2
+    jbasu      12/12/94 - Bug 217878: note this is an SOSD file
+    Morse      12/01/87 - undef L and S for v6 include files
+    Richey     07/13/87 - change int defs to long 
+    Clare      09/13/84 - Port: Ch types to match SQLLIB structs
+    Clare      10/02/86 - Add ifndef SQLDA
+*/
+
+#ifndef SQLDA_
+#define SQLDA_ 1
+ 
+#ifdef T
+# undef T
+#endif
+#ifdef F
+# undef F
+#endif
+
+#ifdef S
+# undef S
+#endif
+#ifdef L
+# undef L
+#endif
+
+#ifdef Y
+ # undef Y
+#endif
+ 
+struct SQLDA {
+  /* ub4    */ int        N; /* Descriptor size in number of entries        */
+  /* text** */ char     **V; /* Ptr to Arr of addresses of main variables   */
+  /* ub4*   */ int       *L; /* Ptr to Arr of lengths of buffers            */
+  /* sb2*   */ short     *T; /* Ptr to Arr of types of buffers              */
+  /* sb2**  */ short    **I; /* Ptr to Arr of addresses of indicator vars   */
+  /* sb4    */ int        F; /* Number of variables found by DESCRIBE       */
+  /* text** */ char     **S; /* Ptr to Arr of variable name pointers        */
+  /* ub2*   */ short     *M; /* Ptr to Arr of max lengths of var. names     */
+  /* ub2*   */ short     *C; /* Ptr to Arr of current lengths of var. names */
+  /* text** */ char     **X; /* Ptr to Arr of ind. var. name pointers       */
+  /* ub2*   */ short     *Y; /* Ptr to Arr of max lengths of ind. var. names*/
+  /* ub2*   */ short     *Z; /* Ptr to Arr of cur lengths of ind. var. names*/
+  };
+ 
+typedef struct SQLDA SQLDA;
+ 
+#endif
+
+/* ----------------- */
+/* defines for sqlda */
+/* ----------------- */
+
+#define SQLSQLDAAlloc(arg1, arg2, arg3, arg4) sqlaldt(arg1, arg2, arg3, arg4) 
+
+#define SQLSQLDAFree(arg1, arg2) sqlclut(arg1, arg2) 
+
+
+
diff --git a/sdk/include/sqlkpr.h b/sdk/include/sqlkpr.h
new file mode 100755
index 0000000..507c2ef
--- /dev/null
+++ b/sdk/include/sqlkpr.h
@@ -0,0 +1,134 @@
+/*
+ * $Header: sqlkpr.h 25-aug-2005.21:32:24 subanerj Exp $ 
+ */
+
+/* Copyright (c) 1994, 2005, Oracle. All rights reserved.  */
+/*
+   NAME
+     sqlkpr.h - SQLlib K&R PRototypes
+   DESCRIPTION
+     Defines k&r prototypes for externalized SQLLIB functions used in 
+     conjunction with OCI
+   PUBLIC FUNCTION(S)
+     sqllda: Get Logon Data Area for connection
+     sqlld2: Logon Data area form 2 -- with host name
+     sqlcda: Cursor data area from result set cursor
+     sqlcur: PCC cursor from cursor data area
+
+   NOTES
+
+   MODIFIED   (MM/DD/YY)
+    subanerj   08/25/05 - ANSI prototypes; miscellaneous cleanup
+    apopat     05/08/02 - [2362423] MVS PE to make lines shorter than 79
+    apopat     09/20/00 - [1356099] Clarification on use of sqllda
+    lvbcheng   01/16/97 - Fix for b2
+    jbasu      02/08/95 - Add prototypes for new thread entry pts
+    jbasu      09/21/94 - Update sqlcda,sqlcur; move sqlrcn,sqlfcn to sqlefn.h
+    jbasu      09/13/94 - Move XA prototypes to sqlefn.h
+    jbasu      08/16/94 - use OCI cda_def type from ocidfn.h instead of sqlold
+    jbasu      08/16/94 - Creation
+*/
+
+#ifndef SQLKPR
+#  define SQLKPR
+
+#ifndef OCIDFN
+#  include <ocidfn.h>
+#endif
+
+#define SQLLDAGetCurrent(arg1, arg2) sqlldat(arg1, arg2)
+
+void sqllda(Lda_Def *lda);
+   /* LDA version 1.   Creates an lda for use in OCI programs.
+   **   Assumes that we are logged on through an embedded SQL statement.
+   **   The lda is filled in using the connect information from the most 
+   **   recently executed embedded SQL statement.  So the ONLY way to use
+   **   sqllda() is to call sqllda() immediately after the 
+   **   EXEC SQL CONNECT... statement.
+   */
+
+
+void sqlldat(dvoid *sqluga, Lda_Def *lda);
+  /* Thread-safe version of sqllda.  Takes an extra parameter sqluga, which is 
+   * the SQLLIB runtime context. 
+   */
+
+/* **************************************************************************/
+/* ** SQLLD2 ** "sqlld2" is an extended version of                          */
+/*              the sqllda function used to pass a connection to OCI.       */
+/*              "sqlld2" can be used at any time to set up an "lda" for use */
+/*              by OCI.  It does not need to called immediately after a SQL */
+/*              statement using the particular connection (typically the    */
+/*              CONNECT itself).                                            */
+/****************************************************************************/
+
+#define SQLDAGetNamed(arg1, arg2, arg3, arg4) sqlld2t(arg1, arg2, arg3, arg4) 
+
+void sqlld2(Lda_Def *lda, text *hname, sb4 *hnamel);
+   /* LDa version 2.  Creates an lda for use in OCI programs.  The difference
+   **      between sqlld2 and sqllda is that sqlld2 allows specification of
+   **      the database host name to determine the connection to use in
+   **      establishing the lda. 
+   **  hname - buffer containing the "logical" name for this connection.  This
+   **            would be the same identifier used in an AT clause in an
+   **            embedded SQL statement.  A null ptr indicates the "default"
+   **            database used when there is no AT clause in a SQL statement.
+   **  hnamel - length of buffer containing hname.
+   */
+
+void sqlld2t(dvoid *sqluga, Lda_Def *lda, text *hname, sb4 *hnamel);
+   /* Thread-safe version of sqlld2. Takes an extra parameter sqluga, which is 
+    * the SQLLIB runtime context. 
+    */ 
+
+#define SQLCDAFromResultSetCursor(arg1, arg2, arg3, arg4) \
+        sqlcdat(arg1, arg2, arg3, arg4)
+
+void sqlcda(/*_ Cda_Def *cda, dvoid *cur, sword *retval _*/);
+/* 
+ * Name: sqlcda() - SQLlib result set cursor to a Cursor Data Area in OCI
+ * Description: Translates a result set cursor in SQLLIB to a cursor data area
+ *              in OCI.  Both of these structs should have been previously 
+ *              created/allocated.
+ * Input   : cur    -pointer to a result set cursor struct allocated thru Pro*
+ * Output  : cda    -pointer to destination cursor data area in OCI
+ *           retval -Return value: 0 if no error,SQLLIB error number otherwise
+ *
+ * Notes: 1.In case of an error, the v2_rc and rc fields of the cda are
+ *          populated with the negative and positive error codes respectively.
+ *        2.The 'rows processed count' in the cda structure is NOT populated
+ *          in this routine.  This field is set to the correct value only
+ *          AFTER a fetch is done in OCI using the cda. Same
+ *          comment applies to other cda fields like the function type.
+ * ===========================================================================
+ */
+void sqlcdat(/*_ dvoid *sqluga, Cda_Def *cda, dvoid *cur, sword *retval _*/);
+ /* Thread-safe version of sqlcda().  Takes an extra parameter sqluga, which 
+  * is the SQLLIB runtime context. 
+  */ 
+
+#define SQLCDAToResultSetCursor(SQL_SINGLE_RCTX, arg1, arg2, arg3) \
+        sqlcurt(arg1, arg2, arg3, arg4) 
+
+void sqlcur(/*_ dvoid *cur, Cda_Def *cda, sword *retval _*/);
+/*
+ * Name: sqlcur() - SQLlib result set CURsor from an oci cursor data area
+ * Description: Translates a cursor data area in OCI to a result set cursor
+ *              in SQLLIB.  Both of these structs should have been previously
+ *              created/allocated.
+ * Input   : cda    - pointer to a cursor data area in OCI
+ * Output  : cur    - pointer to a result set cursor struct (previously 
+ *                    allocated thru PCC)
+ *           retval - Return value: 0 if no error, error code otherwise.
+ * Notes   :The sqlca structure for PCC is NOT updated by this routine.  This 
+ *          structure gets populated (with error code, rows fetched count etc)
+ *          only AFTER a database operation is performed through PCC using the
+ *          translated cursor.
+ *============================================================================
+ */
+void sqlcurt(/*_ dvoid *sqluga, dvoid *cur, Cda_Def *cda, sword *retval _*/);
+ /* Thread-safe version of sqlcur().  Takes an extra parameter sqluga, which 
+  * is the SQLLIB runtime context. 
+  */ 
+
+#endif /* SQLKPR */
diff --git a/sdk/include/sqlucs2.h b/sdk/include/sqlucs2.h
new file mode 100755
index 0000000..f335d4f
--- /dev/null
+++ b/sdk/include/sqlucs2.h
@@ -0,0 +1,32 @@
+/*
+ORACLE, Copyright (c) 1998, 2000 ORACLE Corporation
+ORACLE Utilities, Copyright (c) 1981, 1982, 1983, 1986, 1990, 1991,, 1998, 2000 1995,
+ 1998 ORACLE Corp
+ 
+Restricted Rights
+This program is an unpublished work under the Copyright Act of the
+United States and is subject to the terms and conditions stated in
+your  license  agreement  with  ORACORP  including  retrictions on
+use, duplication, and disclosure.
+ 
+Certain uncopyrighted ideas and concepts are also contained herein.
+These are trade secrets of ORACORP and cannot be  used  except  in
+accordance with the written permission of ORACLE Corporation.
+*/
+
+#ifndef SQLUCS2_ORACLE
+#define SQLUCS2_ORACLE
+
+#ifndef ORATYPES
+#  ifndef S_ORACLE
+#    include <oratypes.h>
+#  endif  /* S_ORACLE */
+#endif  /* ORATYPES */
+
+struct uvarchar  {ub2 len;  utext arr[1];};
+typedef struct uvarchar uvarchar;
+
+struct ulong_varchar  {ub4 len;  utext arr[1];};
+typedef struct ulong_varchar ulong_varchar;
+
+#endif  /* SQLUCS2_ORACLE */
diff --git a/sdk/include/xa.h b/sdk/include/xa.h
new file mode 100755
index 0000000..9dcd519
--- /dev/null
+++ b/sdk/include/xa.h
@@ -0,0 +1,200 @@
+/* Copyright (c) 1992, 2006, Oracle. All rights reserved.  */
+
+/*
+   NAME
+     xa.h - <one-line expansion of the name>
+   DESCRIPTION
+     <short description of component this file declares/defines>
+   PUBLIC FUNCTION(S)
+     <list of external functions declared/defined - with one-line descriptions>
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+   RETURNS
+     <function return values, for .c file with single function>
+   NOTES
+     <other useful comments, qualifications, etc.>
+     
+     This is the public XA .h file
+
+   MODIFIED   (MM/DD/YY)
+    yohu       08/27/06  - XA/RAC project changes: XAER_AFFINITY
+    dmukhin    06/29/05  - ANSI prototypes; miscellaneous cleanup 
+    whe        09/01/99 -  976457:check __cplusplus for C++ code
+    ntang      10/20/98 -  Remove TMCACHE & TMFORCL
+    abhide     08/04/97 -  implement xaoforcl
+    abhide     07/23/97 -  XA OTS project changes
+    schandra   02/20/96 -  lint
+    abhide     04/07/94 -  merge changes from branch 1.1.710.1
+    abhide     02/14/94 -  Creation
+    abhide     02/10/94 -  Creation
+    abhide     02/10/94 -  Creation
+*/
+/*
+ * xa.h header
+ *      Typed in from X/Open doc of March 13, 1990
+ *      Updated to Parsippany II draft, March, 1991
+ *      Updated to Co Review draft, 19 Sep 1991
+ */
+
+#ifndef XA_H
+#define XA_H
+
+
+/* 
+ * Transaction branch identification: XID and NULLXID:
+ */
+
+
+#define XIDDATASIZE 128         /* size in bytes */
+#define MAXGTRIDSIZE    64      /* maximum size in bytes of gtrid */
+#define MAXBQUALSIZE    64      /* maximum size in bytes of bqual */
+struct xid_t {
+    long        formatID;       /* format identifier */
+    long        gtrid_length;   /* value from 1 through 64 */
+    long        bqual_length;   /* value from 1 through 64 */
+    char        data[XIDDATASIZE];
+};
+typedef struct xid_t XID;
+
+/*
+ * A value of -1 in formatID means that the XID is null.
+ */
+/*
+ * Declarations of routines by which RMs call TMs:
+ */
+
+int ax_reg(int, XID *, long);
+int ax_unreg(int, long);
+/*
+ * XA Switch Data Structure
+ */
+#define RMNAMESZ 32             /* length of resource manager name, */
+                                /* including the null terminator */
+#define MAXINFOSIZE 256         /* maximum size in bytes of xa_info strings, */
+                                /* including the null terminator */
+struct xa_switch_t {
+    char name[RMNAMESZ];        /* name of resource manager */
+    long flags;                 /* resource manager specific options */
+    long version;               /* must be 0 */
+
+    int  (*xa_open_entry)(char *, int, long);   /*xa_open function pointer*/
+    int  (*xa_close_entry)(char *, int, long);  /*xa_close function pointer*/
+    int  (*xa_start_entry)(XID *, int, long);   /*xa_start function pointer*/
+    int  (*xa_end_entry)(XID *, int, long);     /*xa_end function pointer*/
+    int  (*xa_rollback_entry)(XID *, int, long);
+                                               /*xa_rollback function pointer*/
+    int  (*xa_prepare_entry)(XID *, int, long); /*xa_prepare function pointer*/
+    int  (*xa_commit_entry)(XID *, int, long);  /*xa_commit function pointer*/
+    int  (*xa_recover_entry)(XID *, long, int, long);
+                                                /*xa_recover function pointer*/
+    int  (*xa_forget_entry)(XID *, int, long);  /*xa_forget function pointer*/
+    int  (*xa_complete_entry)(int *, int *, int, long);
+};
+
+/*
+ * Flag definition for the RM switch
+ */
+#define TMNOFLAGS       0x00000000L     /* no resource manager features
+                                           selected */  
+#define TMREGISTER      0x00000001L     /* resource manager dynamically
+                                           registers */
+#define TMNOMIGRATE     0x00000002L     /* resource manager does not support
+                                           association migration */
+#define TMUSEASYNC      0x00000004L     /* resource manager supports
+                                           asynchronous operations */
+/*
+ * Flag definitions for xa_ and ax_ routines
+ */
+/* Use TMNOFLAGS, defined above, when not specifying other flags */
+#define TMASYNC         0x80000000L     /* perform routine asynchronously */
+#define TMONEPHASE      0x40000000L     /* caller is using one-phase commit
+                                        optimisation */
+#define TMFAIL          0x20000000L     /* dissociates caller and marks
+                                           transaction branch rollback-only */
+#define TMNOWAIT        0x10000000L     /* return if blocking condition
+                                           exists */
+#define TMRESUME        0x08000000L     /* caller is resuming association
+                                           with suspended transaction branch */
+#define TMSUCCESS       0x04000000L     /* dissociate caller from transaction
+                                        branch */
+#define TMSUSPEND       0x02000000L     /* caller is suspending, not ending,
+                                           association */
+#define TMSTARTRSCAN    0x01000000L     /* start a recovery scan */
+#define TMENDRSCAN      0x00800000L     /* end a recovery scan */
+#define TMMULTIPLE      0x00400000L     /* wait for any asynchronous
+                                           operation */
+#define TMJOIN          0x00200000L     /* caller is joining existing
+                                        transaction branch */
+#define TMMIGRATE       0x00100000L     /* caller intends to perform
+                                        migration */
+
+/* 
+ * ax_() return codes (transaction manager reports to resource manager)
+ */
+#define TM_JOIN         2       /* caller is joining existing transaction
+                                branch */
+#define TM_RESUME       1       /* caller is resuming association with
+                                   suspended transaction branch */
+#define TM_OK   0               /* normal execution */
+#define TMER_TMERR      -1      /* an error occurred in the transaction
+                                manager */
+#define TMER_INVAL      -2      /* invalid arguments were given */
+#define TMER_PROTO      -3      /* routine invoked in an improper context */
+
+/* 
+ * xa_() return codes (resource manager reports to transaction manager)
+ */
+#define XA_RBBASE       100             /* The inclusive lower bound of the
+                                           rollback codes */
+#define XA_RBROLLBACK   XA_RBBASE       /* The rollback was caused by an
+                                           unspecified reason */
+#define XA_RBCOMMFAIL   XA_RBBASE+1     /* The rollback was caused by a
+                                           communication failure */
+#define XA_RBDEADLOCK   XA_RBBASE+2     /* A deadlock was detected */
+#define XA_RBINTEGRITY  XA_RBBASE+3     /* A condition that violates the
+                                           integrity of the resources was
+                                           detected */
+#define XA_RBOTHER      XA_RBBASE+4     /* The resource manager rolled back the
+                                           transaction for a reason not on this
+                                           list */
+#define XA_RBPROTO      XA_RBBASE+5     /* A protocal error occurred in the
+                                           resource manager */
+#define XA_RBTIMEOUT    XA_RBBASE+6     /* A transaction branch took too long*/
+#define XA_RBTRANSIENT  XA_RBBASE+7     /* May retry the transaction branch */
+#define XA_RBEND        XA_RBTRANSIENT  /* The inclusive upper bound of the
+                                           rollback codes */
+
+#define XA_NOMIGRATE    9               /* resumption must occur where
+                                           suspension occurred */
+#define XA_HEURHAZ      8               /* the transaction branch may have been
+                                           heuristically completed */
+#define XA_HEURCOM      7               /* the transaction branch has been
+                                           heuristically comitted */
+#define XA_HEURRB       6               /* the transaction branch has been
+                                           heuristically rolled back */
+#define XA_HEURMIX      5               /* the transaction branch has been
+                                           heuristically committed and rolled
+                                           back */
+#define XA_RETRY        4               /* routine returned with no effect
+                                           and may be re-issued */
+#define XA_RDONLY       3               /* the transaction was read-only
+                                           and has been committed */
+#define XA_OK           0               /* normal execution */
+#define XAER_ASYNC      -2              /* asynchronous operation already
+                                           outstanding */
+#define XAER_RMERR      -3              /* a resource manager error occurred
+                                        in the transaction branch */
+#define XAER_NOTA       -4              /* the XID is not valid */
+#define XAER_INVAL      -5              /* invalid arguments were given */
+#define XAER_PROTO      -6              /* routine invoked in an improper
+                                           context */
+#define XAER_RMFAIL     -7              /* resource manager unavailable */
+#define XAER_DUPID      -8              /* the XID already exists */
+#define XAER_OUTSIDE    -9              /* resource manager doing work */
+                                        /* outside global transaction */
+
+#define XAER_AFFINITY   -10             /* XA on RAC: resumption must occur on
+                                           RAC instance where the transaction
+                                           branch was created */
+                                          
+#endif /* ifndef XA_H */
diff --git a/sdk/ott b/sdk/ott
new file mode 100755
index 0000000..461ff54
--- /dev/null
+++ b/sdk/ott
@@ -0,0 +1,36 @@
+#! /bin/sh
+# Script for running ott in instant client.
+# Before running this script:
+#   set jdk1.5/bin in your PATH
+#   set LD_LIBRARY_PATH to include the directory containing the instant client 
+#       libraries
+#   set ottclasses.zip, ojdbc5.jar, orai18n.jar as part of your CLASSPATH
+
+OS=`uname`
+MACHINE=`uname -m`
+JREOPTIONS=
+
+if [ "$OS" = "HP-UX" ]; then
+        if [ "$MACHINE" = "ia64" -o "$MACHINE" = "9000/800" ]; then
+                JREOPTIONS=-d64
+        fi
+fi
+if [ "$OS" = "SunOS" ]; then
+        if [ "$MACHINE" = "sun4u" -o "$MACHINE" = "sun4v" ]; then
+                JREOPTIONS=-d64
+        fi
+fi
+
+while [ $# -gt 0 ]
+do
+      case $1 in
+      user*)
+              OTTUSER="$OTTUSER $1"
+              export OTTUSER ;;
+      *)
+              args="$args $1";;
+      esac
+shift
+done
+
+exec java $JREOPTIONS oracle.ott.c.CMain nlslang=${NLS_LANG} $args
diff --git a/sdk/ottclasses.zip b/sdk/ottclasses.zip
new file mode 100644
index 0000000..912ddb8
--- /dev/null
+++ b/sdk/ottclasses.zip
Binary files differ
diff --git a/sdk/proc b/sdk/proc
new file mode 100755
index 0000000..42391ed
--- /dev/null
+++ b/sdk/proc
Binary files differ
diff --git a/sdk/procob b/sdk/procob
new file mode 100755
index 0000000..c42be06
--- /dev/null
+++ b/sdk/procob
Binary files differ
diff --git a/uidrvci b/uidrvci
new file mode 100755
index 0000000..0d2f99d
--- /dev/null
+++ b/uidrvci
Binary files differ
diff --git a/xstreams.jar b/xstreams.jar
new file mode 100644
index 0000000..ee7ea46
--- /dev/null
+++ b/xstreams.jar
Binary files differ
