[svn:dbd-oracle] r15218 - dbd-oracle/trunk

[email protected] Wed, 14 Mar 2012 08:00:39 -0700 (PDT)
Newsgroups perl.dbd.oracle.changes
Message-ID <[email protected]>
Author: mjevans
Date: Wed Mar 14 08:00:36 2012
New Revision: 15218

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

Log:
Fix rt 75163 - cannot fetch bfile lobs when ora_auto_lobs is off


Modified: dbd-oracle/trunk/Changes
==============================================================================
--- dbd-oracle/trunk/Changes	(original)
+++ dbd-oracle/trunk/Changes	Wed Mar 14 08:00:36 2012
@@ -14,6 +14,13 @@
    connect to Oracle or you cannot install from cpan if you have not
    set up a valid Oracle connection.
 
+ - Fixed 75163. Bfile lobs were not being opened before fetching if
+   ora_auto_lobs was disabled (Martin J. Evans).
+
+   Note: this has a minor impact on non bfile lobs when ora_auto_lobs
+   is not in force as an additional call to OCILobFileIsOpen will be
+   made.
+ 
  [DOCUMENTATION]
  - clarification of when StrictlyTyped/DiscardString can be used and
    LongReadLen (Martin J. Evans)

Modified: dbd-oracle/trunk/Oracle.xs
==============================================================================
--- dbd-oracle/trunk/Oracle.xs	(original)
+++ dbd-oracle/trunk/Oracle.xs	Wed Mar 14 08:00:36 2012
@@ -560,6 +560,21 @@
 	dest_sv = &PL_sv_undef;
 		return;
 	}
+    {
+        /* see rt 75163 */
+        boolean is_open;
+
+        OCILobFileIsOpen_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator, &is_open, status);
+        if (status == OCI_SUCCESS && !is_open) {
+            OCILobFileOpen_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
+                                    (ub1)OCI_FILE_READONLY, status);
+            if (status != OCI_SUCCESS) {
+                oci_error(dbh, imp_dbh->errhp, status, "OCILobFileOpen");
+                dest_sv = &PL_sv_undef;
+            }
+        }
+    }
+
 	OCILobRead_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
 		&amtp, (ub4)offset, /* offset starts at 1 */
 		bufp, (ub4)bufp_len,

Modified: dbd-oracle/trunk/dbdimp.c
==============================================================================
--- dbd-oracle/trunk/dbdimp.c	(original)
+++ dbd-oracle/trunk/dbdimp.c	Wed Mar 14 08:00:36 2012
@@ -3977,16 +3977,36 @@
 
 
 void
-ora_free_fbh_contents(imp_fbh_t *fbh)
+ora_free_fbh_contents(SV *sth, imp_fbh_t *fbh)
 {
 	dTHX;
+    D_imp_sth(sth);
+    D_imp_dbh_from_sth;
+
 	if (fbh->fb_ary)
 	fb_ary_free(fbh->fb_ary);
 	sv_free(fbh->name_sv);
-	if (fbh->desc_h)
-	OCIDescriptorFree_log(fbh->desc_h, fbh->desc_t);
-	if (fbh->obj)
+
+    /* see rt 75163 */
+	if (fbh->desc_h) {
+        boolean is_open;
+        sword status;
+
+        OCILobFileIsOpen_log_stat(imp_dbh->svchp, imp_dbh->errhp, fbh->desc_h, &is_open, status);
+        if (status == OCI_SUCCESS && is_open) {
+            OCILobFileClose_log_stat(imp_sth->svchp, imp_sth->errhp,
+                                     fbh->desc_h, status);
+        }
+
+
+        OCIDescriptorFree_log(fbh->desc_h, fbh->desc_t);
+    }
+
+	if (fbh->obj) {
+		if (fbh->obj->obj_value)
+			OCIObjectFree(fbh->imp_sth->envhp, fbh->imp_sth->errhp, fbh->obj->obj_value, (ub2)0);
 		Safefree(fbh->obj);
+	}
 
 }
 
@@ -4092,7 +4112,7 @@
 	imp_sth->eod_errno = 1403;
 	for(i=0; i < fields; ++i) {
 		imp_fbh_t *fbh = &imp_sth->fbh[i];
-		ora_free_fbh_contents(fbh);
+		ora_free_fbh_contents(sth, fbh);
 	}
 	Safefree(imp_sth->fbh);
 	if (imp_sth->fbh_cbuf)

Modified: dbd-oracle/trunk/dbdimp.h
==============================================================================
--- dbd-oracle/trunk/dbdimp.h	(original)
+++ dbd-oracle/trunk/dbdimp.h	Wed Mar 14 08:00:36 2012
@@ -321,7 +321,7 @@
 void dbd_init_oci _((dbistate_t *dbistate));
 void dbd_preparse _((imp_sth_t *imp_sth, char *statement));
 void dbd_fbh_dump(imp_fbh_t *fbh, int i, int aidx);
-void ora_free_fbh_contents _((imp_fbh_t *fbh));
+void ora_free_fbh_contents _((SV *sth, imp_fbh_t *fbh));
 void ora_free_templob _((SV *sth, imp_sth_t *imp_sth, OCILobLocator *lobloc));
 int ora_dbtype_is_long _((int dbtype));
 fb_ary_t *fb_ary_alloc _((ub4 bufl, int size));

Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c	(original)
+++ dbd-oracle/trunk/oci8.c	Wed Mar 14 08:00:36 2012
@@ -4651,7 +4651,7 @@
 
 	for(i=0; i < lr->num_fields; ++i) {
 		imp_fbh_t *fbh = &lr->fbh_ary[i];
-		ora_free_fbh_contents(fbh);
+		ora_free_fbh_contents(sth, fbh);
 	}
 	sv_free(lr->fbh_ary_sv);
 	Safefree(imp_sth->lob_refetch);

Modified: dbd-oracle/trunk/ocitrace.h
==============================================================================
--- dbd-oracle/trunk/ocitrace.h	(original)
+++ dbd-oracle/trunk/ocitrace.h	Wed Mar 14 08:00:36 2012
@@ -127,6 +127,13 @@
 				 OciTp,	(void*)svchp,(void*)envhp, src_type, src_ptr,oci_status_name(stat)),stat \
 	: stat
 
+#define OCILobFileIsOpen_log_stat(envhp,errhp,loc,is_open,stat)           \
+    stat = OCILobFileIsOpen(envhp,errhp,loc,is_open);\
+    (DBD_OCI_TRACEON) \
+            ? PerlIO_printf(DBD_OCI_TRACEFP, \
+                 "%sOCILobFileIsOpen_log_stat(%p,%p,%p,%p,%d)=%s\n",\
+                            OciTp, (void*)envhp, (void*)errhp, loc, is_open, *is_open,oci_status_name(stat)),stat : stat
+
 #define OCILobLocatorIsInit_log_stat(envhp,errhp,loc,is_initp,stat)\
 	stat =OCILobLocatorIsInit (envhp,errhp,loc,is_initp );\
 	(DBD_OCI_TRACEON) \