Author: byterock
Date: Thu Mar 20 07:23:43 2008
New Revision: 10962

Modified:
   dbd-oracle/trunk/Oracle.pm
   dbd-oracle/trunk/Oracle.xs
   dbd-oracle/trunk/dbdimp.h
   dbd-oracle/trunk/oci8.c

Log:
patch to enable  Data Interface for Persistent LOBs
this only work on 10.2 or later and it eliminates the need for lob locators for 
clobs blobs ect upto 2gb in size

added new bind attribute ora_pers_lob (Persistent) for this  and new types 
SQLT_CHR SQLT_BIN



Modified: dbd-oracle/trunk/Oracle.pm
==============================================================================
--- dbd-oracle/trunk/Oracle.pm  (original)
+++ dbd-oracle/trunk/Oracle.pm  Thu Mar 20 07:23:43 2008
@@ -22,7 +22,7 @@
            ORA_VARCHAR2 ORA_STRING ORA_NUMBER ORA_LONG ORA_ROWID ORA_DATE
            ORA_RAW ORA_LONGRAW ORA_CHAR ORA_CHARZ ORA_MLSLABEL ORA_NTY
            ORA_CLOB ORA_BLOB ORA_RSET ORA_VARCHAR2_TABLE ORA_NUMBER_TABLE
-           SQLT_INT SQLT_FLT  ORA_OCI      
+           SQLT_INT SQLT_FLT ORA_OCI SQLT_CHR SQLT_BIN     
        ) ],
         ora_session_modes => [ qw( ORA_SYSDBA ORA_SYSOPER ) ],
         ora_fetch_orient  => [ qw( OCI_FETCH_NEXT OCI_FETCH_CURRENT 
OCI_FETCH_FIRST 

Modified: dbd-oracle/trunk/Oracle.xs
==============================================================================
--- dbd-oracle/trunk/Oracle.xs  (original)
+++ dbd-oracle/trunk/Oracle.xs  Thu Mar 20 07:23:43 2008
@@ -50,7 +50,8 @@
        OCI_FETCH_PRIOR         = OCI_FETCH_PRIOR
        OCI_FETCH_ABSOLUTE      = OCI_FETCH_ABSOLUTE
        OCI_FETCH_RELATIVE      = OCI_FETCH_RELATIVE
-
+       SQLT_CHR    = SQLT_CHR
+       SQLT_BIN        = SQLT_BIN
     CODE:
     if (!ix) {
        if (!name) name = GvNAME(CvGV(cv));

Modified: dbd-oracle/trunk/dbdimp.h
==============================================================================
--- dbd-oracle/trunk/dbdimp.h   (original)
+++ dbd-oracle/trunk/dbdimp.h   Thu Mar 20 07:23:43 2008
@@ -70,6 +70,7 @@
     OCIDescribe        *dschp; /* oci describe handle */
        ub2                     stmt_type;      /* OCIAttrGet 
OCI_ATTR_STMT_TYPE        */
     U16                                auto_lob;       /* use auto lobs*/
+    int                                pers_lob; /*use dblink for lobs only 
for 10g Release 2. or later*/
     int                        has_lobs;   /* Statement has bound LOBS*/
 
     lob_refetch_t *lob_refetch;

Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c     (original)
+++ dbd-oracle/trunk/oci8.c     Thu Mar 20 07:23:43 2008
@@ -279,6 +279,7 @@
     dTHX;
     D_imp_dbh_from_sth;
     sword status                = 0;
+    IV  ora_pers_lob   =0; /*use dblink for lobs only for 10g Release 2. or 
later*/
     ub4        oparse_lng       = 1;  /* auto v6 or v7 as suits db connected 
to        */
     int ora_check_sql   = 1;   /* to force a describe to check SQL     */
     IV  ora_placeholders = 1;  /* find and handle placeholders */
@@ -315,11 +316,14 @@
                IV ora_auto_lob = 1;
                DBD_ATTRIB_GET_IV(  attribs, "ora_parse_lang", 14, svp, 
oparse_lng);
                DBD_ATTRIB_GET_IV(  attribs, "ora_placeholders", 16, svp, 
ora_placeholders);
-               DBD_ATTRIB_GET_IV(  attribs, "ora_auto_lob",   12, svp, 
ora_auto_lob);
+               DBD_ATTRIB_GET_IV(  attribs, "ora_auto_lob", 12, svp, 
ora_auto_lob);
+               DBD_ATTRIB_GET_IV(  attribs, "ora_pers_lob", 12, svp, 
ora_pers_lob);
+
                imp_sth->auto_lob = (ora_auto_lob) ? 1 : 0;
+               imp_sth->pers_lob = (ora_pers_lob) ? 1 : 0;
                /* ora_check_sql only works for selects owing to Oracle 
behaviour */
-               DBD_ATTRIB_GET_IV(  attribs, "ora_check_sql",  13, svp, 
ora_check_sql);
-               DBD_ATTRIB_GET_IV(  attribs, "ora_exe_mode",  12, svp, 
imp_sth->exe_mode);
+               DBD_ATTRIB_GET_IV(  attribs, "ora_check_sql", 13, svp, 
ora_check_sql);
+               DBD_ATTRIB_GET_IV(  attribs, "ora_exe_mode", 12, svp, 
imp_sth->exe_mode);
                DBD_ATTRIB_GET_IV(  attribs, "ora_prefetch_memory",  19, svp, 
imp_sth->prefetch_memory);
   
        }
@@ -1700,12 +1704,6 @@
                av_undef(obj->value);
        }
 
-
-
-
-
-
-
     return 1;
 
 }
@@ -2228,12 +2226,27 @@
        case 114:                               /* BFILE        */
                fbh->ftype  = fbh->dbtype;
                 /* do we need some addition size logic here? (lab) */
-               fbh->disize = fbh->dbsize *10 ; /* XXX! */
-               fbh->fetch_func = (imp_sth->auto_lob)
-                               ? fetch_func_autolob : fetch_func_getrefpv;
-               fbh->bless  = "OCILobLocatorPtr";
-               fbh->desc_t = OCI_DTYPE_LOB;
-               OCIDescriptorAlloc_ok(imp_sth->envhp, &fbh->desc_h, 
fbh->desc_t);
+        if (imp_sth->pers_lob){ /*this only works on 10.2 */
+        
+        
+                                
PerlIO_printf(DBILOGFP,"fbh->dbtype=%d\n",fbh->dbtype);
+                       
+               
+           fbh->disize = imp_sth->long_readlen; /*100 meg so it will not max 
out.*/
+           if (fbh->dbtype == 113){
+               fbh->ftype  = SQLT_BIN;
+           } else {
+                       fbh->ftype  = SQLT_CHR;
+               }
+               
+               } else {
+                       fbh->disize = fbh->dbsize *10 ; /* XXX! */
+                       fbh->fetch_func = (imp_sth->auto_lob) ? 
fetch_func_autolob : fetch_func_getrefpv;
+                       fbh->bless  = "OCILobLocatorPtr";
+                       fbh->desc_t = OCI_DTYPE_LOB;
+                       OCIDescriptorAlloc_ok(imp_sth->envhp, &fbh->desc_h, 
fbh->desc_t);
+               }
+
                break;
 
 #ifdef OCI_DTYPE_REF

Reply via email to