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