[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) \