Thanks!
Tim.
On Wed, Oct 10, 2001 at 02:00:38PM -0700, David Hull wrote:
> The stock DBD-Oracle-1.12 causes Perl to dump core for me if I try to
> select from a BFILE column. The appended patch adds support for
> BFILEs. I'm not an Oracle OCI expert so I can't vouch that the code
> is 100% correct, but "it works for me." I hope that it is useful.
>
> David Hull
>
> --- oci8.c 2001/10/10 18:58:47 1.2
> +++ oci8.c 2001/10/10 20:43:27 1.3
> @@ -1,5 +1,5 @@
> /*
> - $Id: oci8.c,v 1.2 2001/10/10 18:58:47 hull Exp $
> + $Id: oci8.c,v 1.3 2001/10/10 20:43:27 hull Exp $
>
> Copyright (c) 1998,1999,2000,2001 Tim Bunce
>
> @@ -740,6 +740,16 @@
> SvGROW(dest_sv, buflen+1);
>
> if (loblen > 0) {
> + if (fbh->dbtype==114) {
> + OCILobFileOpen_log_stat(imp_sth->svchp, imp_sth->errhp, lobloc,
> + OCI_FILE_READONLY, status);
> + if (status != OCI_SUCCESS) {
> + oci_error(sth, imp_sth->errhp, status, "OCILobFileOpen");
> + (void)SvOK_off(dest_sv);
> + return 0;
> + }
> + }
> +
> OCILobRead_log_stat(imp_sth->svchp, imp_sth->errhp, lobloc,
> &amtp, 1, SvPVX(dest_sv), buflen, 0, 0, 0, SQLCS_IMPLICIT, status);
> if (DBIS->debug >= 3)
> @@ -747,6 +757,10 @@
> " OCILobRead field %d %s: LOBlen %ldc, LongReadLen %ldc, BufLen
>%ldb, Got %ldc\n",
> fbh->field_num+1, oci_status_name(status), ul_t(loblen),
> imp_sth->long_readlen, ul_t(buflen), ul_t(amtp));
> + if (fbh->dbtype==114) {
> + OCILobFileClose_log_stat(imp_sth->svchp, imp_sth->errhp,
> + lobloc, status);
> + }
> if (status != OCI_SUCCESS) {
> oci_error(sth, imp_sth->errhp, status, "OCILobRead");
> (void)SvOK_off(dest_sv);
> @@ -930,6 +944,7 @@
>
> case 112: /* CLOB */
> case 113: /* BLOB */
> + case 114: /* BFILE */
> fbh->ftype = fbh->dbtype;
> fbh->disize = fbh->dbsize;
> fbh->fetch_func = (imp_sth->auto_lob)
> --- ocitrace.h 2001/10/10 19:51:04 1.1
> +++ ocitrace.h 2001/10/10 20:43:28 1.2
> @@ -150,6 +150,20 @@
> OciTp, (void*)sh,(void*)eh,(void*)lh,pul_t(l), \
> oci_status_name(stat)),stat : stat
>
> +#define OCILobFileOpen_log_stat(sv,eh,lh,mode,stat) \
> + stat=OCILobFileOpen(sv,eh,lh,mode); \
> + (DBD_OCI_TRACEON) ? fprintf(DBD_OCI_TRACEFP, \
> + "%sLobFileOpen(%p,%p,%p,%u)=%s\n", \
> + OciTp, (void*)sv,(void*)eh,(void*)lh,(ub1)mode, \
> + oci_status_name(stat)),stat : stat
> +
> +#define OCILobFileClose_log_stat(sv,eh,lh,stat) \
> + stat=OCILobFileClose(sv,eh,lh); \
> + (DBD_OCI_TRACEON) ? fprintf(DBD_OCI_TRACEFP, \
> + "%sLobFileClose(%p,%p,%p)=%s\n", \
> + OciTp, (void*)sv,(void*)eh,(void*)lh, \
> + oci_status_name(stat)),stat : stat
> +
> #define OCILobRead_log_stat(sv,eh,lh,am,of,bp,bl,cx,cb,csi,csf,stat) \
> stat=OCILobRead(sv,eh,lh,am,of,bp,bl,cx,cb,csi,csf); \
> (DBD_OCI_TRACEON) ? fprintf(DBD_OCI_TRACEFP, \