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;
+}