Author: byterock
Date: Fri Feb 29 13:00:06 2008
New Revision: 10857

Added:
   dbd-oracle/branches/xml/xml.c
Modified:
   dbd-oracle/branches/xml/dbdimp.c

Log:
the patch

Modified: dbd-oracle/branches/xml/dbdimp.c
==============================================================================
--- dbd-oracle/branches/xml/dbdimp.c    (original)
+++ dbd-oracle/branches/xml/dbdimp.c    Fri Feb 29 13:00:06 2008
@@ -262,6 +262,7 @@
     case 116:  /* SQLT_RSET    OCI 8 cursor variable   */
        case ORA_VARCHAR2_TABLE: /* 201 */
     case ORA_NUMBER_TABLE: /* 202 */
+    case 108:   /* SQLT_NTY   Well realy only XML clobs not embedded objects  
*/
        return 1;
     }
     return 0;
@@ -1147,6 +1148,9 @@
     case SQL_LONGVARCHAR:
        return 8;       /* Oracle LONG          */
 
+    case SQL_UDT:
+               return 108;     /* Oracle NTY           */
+
     case SQL_CLOB:
        return 112;     /* Oracle CLOB          */
 
@@ -2259,6 +2263,69 @@
     return 1;
 }
 
+static int
+dbd_rebind_ph_nty( SV* sth, imp_sth_t *imp_sth, phs_t *phs)
+ {
+   dTHX;
+   dTHR;
+
+   OCIType *tdo = NULL;
+   sword status;
+   SV* ptr;
+
+     if (phs->is_inout)
+       croak("OUT binding for NTY is currently unsupported");
+
+     /* ensure that the value is a support named object type */
+     /* (currently only OCIXMLType*)                         */
+   if ( sv_isa(phs->sv, "OCIXMLTypePtr") ) {
+       OCITypeByName(imp_sth->envhp, imp_sth->errhp, imp_sth->svchp,
+                     (CONST text*)"SYS", 3,
+                     (CONST text*)"XMLTYPE", 7,
+                     (CONST text*)0, 0,
+                     OCI_DURATION_CALLOUT, OCI_TYPEGET_HEADER,
+                     &tdo);
+       ptr = SvRV(phs->sv);
+       phs->progv  = (void*) SvIV(ptr);
+       phs->maxlen = sizeof(OCIXMLType*);
+     }
+     else
+       croak("Unsupported named object type for bind parameter");
+
+
+     /* bind by name */
+
+     OCIBindByName_log_stat(imp_sth->stmhp, &phs->bndhp, imp_sth->errhp,
+                          (text*)phs->name, (sb4)strlen(phs->name),
+                          (dvoid *) NULL, /* value supplied in BindObject 
later */
+                          0,
+                          (ub2)phs->ftype, 0,
+                          NULL,
+                          0, 0,
+                          NULL,
+                          (ub4)OCI_DEFAULT,
+                          status
+                          );
+
+     if (status != OCI_SUCCESS) {
+       oci_error(sth, imp_sth->errhp, status, "OCIBindByName SQLT_NTY");
+       return 0;
+    }
+    if (DBIS->debug >= 3)
+       PerlIO_printf(DBILOGFP, "    pp_rebind_ph_nty: END\n");
+
+
+     /* bind the object */
+     OCIBindObject(phs->bndhp, imp_sth->errhp,
+                 (CONST OCIType*)tdo,
+                 (dvoid **)&phs->progv,
+                 (ub4*)NULL,
+                 (dvoid **)NULL,
+                 (ub4*)NULL);
+
+     return 2;
+ }
+
 
 static int
 dbd_rebind_ph(SV *sth, imp_sth_t *imp_sth, phs_t *phs)
@@ -2291,6 +2358,9 @@
     case SQLT_RSET:
            done = dbd_rebind_ph_rset(sth, imp_sth, phs);
            break;
+        case 108:
+           done =dbd_rebind_ph_nty(sth, imp_sth, phs);
+           break;
     default:
            done = dbd_rebind_ph_char(imp_sth, phs);
     }

Added: dbd-oracle/branches/xml/xml.c
==============================================================================
--- (empty file)
+++ dbd-oracle/branches/xml/xml.c       Fri Feb 29 13:00:06 2008
@@ -0,0 +1,140 @@
+#include "oci.h"
+#include <stdio.h>
+
+/*  This helper function creates an XMLType object from a string source.
+ *
+ *  The resulting object can be bound to a placeholder, if ora_type =>
+ *  SQLT_NTY is specified.
+ */
+
+static void checkerr(errhp, status)
+OCIError *errhp;
+sword status;
+{
+    text errbuf[512];
+    sb4 errcode;
+
+    switch (status)
+    {
+        case OCI_SUCCESS:
+            break;
+        case OCI_SUCCESS_WITH_INFO:
+            printf("Error - OCI_SUCCESS_WITH_INFO\n");
+            break;
+        case OCI_NEED_DATA:
+            printf("Error - OCI_NEED_DATA\n");
+            break;
+        case OCI_NO_DATA:
+            printf("Error - OCI_NO_DATA\n");
+            break;
+        case OCI_ERROR:
+            OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
+            errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR);
+            printf("Error - %s\n", errbuf);
+            break;
+        case OCI_INVALID_HANDLE:
+            printf("Error - OCI_INVALID_HANDLE\n");
+            break;
+        case OCI_STILL_EXECUTING:
+            printf("Error - OCI_STILL_EXECUTE\n");
+            break;
+        case OCI_CONTINUE:
+            printf("Error - OCI_CONTINUE\n");
+            break;
+        default:
+        break;
+    }
+}
+
+
+#define MAX_OCISTRING_LEN 32766
+
+
+SV*
+createxmlfromstring(SV* dbh, char* source)
+{
+
+  OCIXMLType *xml = NULL;
+  ub4 len;
+  ub1 src_type;
+  dvoid* src_ptr = NULL;
+  D_imp_dbh(dbh);
+  SV* sv_dest;
+
+  len = strlen(source);
+  if(len > MAX_OCISTRING_LEN) {
+      src_type = OCI_XMLTYPE_CREATE_CLOB;
+
+      printf("OCIDescriptorAlloc\n");
+      checkerr( imp_dbh->errhp,
+               OCIDescriptorAlloc((dvoid*)imp_dbh->envhp,
+                                  (dvoid **)&src_ptr,
+                                  (ub4)OCI_DTYPE_LOB,
+                                  (size_t)0,
+                                  (dvoid**)0) );
+
+      printf("OCILobCreateTemporary\n");
+      checkerr( imp_dbh->errhp,
+               OCILobCreateTemporary(imp_dbh->svchp,
+                                     imp_dbh->errhp,=20
+                                     (OCILobLocator*) src_ptr,
+                                     (ub2)0,=20
+                                     SQLCS_IMPLICIT,=20
+                                     OCI_TEMP_CLOB,=20
+                                     OCI_ATTR_NOCACHE,=20
+                                     OCI_DURATION_SESSION) );
+
+      printf("OCILobWrite\n");
+      checkerr (imp_dbh->errhp,
+               OCILobWriteAppend(imp_dbh->svchp,
+                                 imp_dbh->errhp,
+                                 (OCILobLocator*) src_ptr,
+                                 &len,=20
+                                 (ub1*)source,
+                                 len,
+                                 OCI_ONE_PIECE,
+                                 (dvoid *)0,=20
+                                 (sb4 (*)(dvoid*,dvoid*,ub4*,ub1 *))0,
+                                 0,
+                                 SQLCS_IMPLICIT));
+
+  } else {
+      src_type = OCI_XMLTYPE_CREATE_OCISTRING;
+
+      printf("OCIStringAssignText\n");
+      checkerr( imp_dbh->errhp,
+               OCIStringAssignText(imp_dbh->envhp,
+                                   imp_dbh->errhp,=20
+                                   (CONST text*) source,=20
+                                   (ub2) strlen(source),
+                                   (OCIString **) &src_ptr)
+         );
+  }
+
+  printf("OCIXMLTypeCreateFromSrc\n");
+  checkerr( imp_dbh->errhp,
+           OCIXMLTypeCreateFromSrc(imp_dbh->svchp,
+                                   imp_dbh->errhp,
+                                   (OCIDuration)OCI_DURATION_CALLOUT,
+                                   (ub1)src_type,
+                                   (dvoid *)src_ptr,
+                                   (sb4)OCI_IND_NOTNULL,
+                                   &xml)
+      );
+
+
+  /* free temporary resources */
+  if( src_type == OCI_XMLTYPE_CREATE_CLOB ) {
+      checkerr( imp_dbh->errhp,
+               OCILobFreeTemporary(imp_dbh->svchp, imp_dbh->errhp,
+                                   (OCILobLocator*) src_ptr) );
+
+      checkerr( imp_dbh->errhp,
+               OCIDescriptorFree((dvoid *) src_ptr, (ub4) OCI_DTYPE_LOB) );
+  }
+
+
+  sv_dest = newSViv(0);
+  sv_setref_pv(sv_dest, "OCIXMLTypePtr", xml);
+  return sv_dest;
+}

Reply via email to