I haven't used BFILEs myself, but shouldn't a non-existent BFILE be an
error?
--
Mac :})
** I normally forward private questions to the appropriate mail list. **
Give a hobbit a fish and he eats fish for a day.
Give a hobbit a ring and he eats fish for an age.
----- Original Message -----
From: "David Hull" <[EMAIL PROTECTED]>
To: "Tim Bunce" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Thursday, October 11, 2001 17:07
Subject: Re: Patch to DBD-Oracle-1.12 to add support for BFILE columns


> Since yesterday I discoved that my patch to DBD-Oracle-1.12 to support
> BFILE LOBs treats a non-existent BFILE as an error.  This patch causes
> them to be treated as if they exist but are of zero length.  I tried
> having the fetch function return undef instead, but this caused some
> higher-level DBD or DBI code to report an error on that row.
>
> The appended patch should be applied on top of my previous patch.
>
> David Hull
>
> --- oci8.c 2001/10/10 20:43:27 1.3
> +++ oci8.c 2001/10/11 20:29:26
> @@ -1,5 +1,5 @@
>  /*
> -   $Id: oci8.c,v 1.3 2001/10/10 20:43:27 hull Exp $
> +   $Id: oci8.c,v 1.4 2001/10/11 20:29:31 hull Exp $
>
>     Copyright (c) 1998,1999,2000,2001  Tim Bunce
>
> @@ -697,15 +697,27 @@
>      imp_sth_t *imp_sth = fbh->imp_sth;
>      OCILobLocator *lobloc = (OCILobLocator*)fbh->desc_h;
>      sword status;
> +    boolean exists = 1;
>
>      /* this function is not called for NULL lobs */
>
>      /* The length is expressed in terms of bytes for BLOBs and BFILEs, */
>      /* and in terms of characters for CLOBs */
> -    OCILobGetLength_log_stat(imp_sth->svchp, imp_sth->errhp, lobloc,
&loblen, status);
> -    if (status != OCI_SUCCESS) {
> - oci_error(sth, imp_sth->errhp, status, "OCILobGetLength");
> - return 0;
> +    if (fbh->dbtype==114) {
> + /* For BFILES, if the file doesn't exist treat it as length 0.  */
> + OCILobFileExists_log_stat(imp_sth->svchp, imp_sth->errhp, lobloc,
> +     &exists, status);
> + if (status != OCI_SUCCESS) {
> +     oci_error(sth, imp_sth->errhp, status, "OCILobFileExists");
> +     return 0;
> + }
> +    }
> +    if (exists) {
> + OCILobGetLength_log_stat(imp_sth->svchp, imp_sth->errhp, lobloc,
&loblen, status);
> + if (status != OCI_SUCCESS) {
> +     oci_error(sth, imp_sth->errhp, status, "OCILobGetLength");
> +     return 0;
> + }
>      }
>
>      amtp = (loblen > imp_sth->long_readlen) ? imp_sth->long_readlen :
loblen;
> --- ocitrace.h 2001/10/10 20:43:28 1.2
> +++ ocitrace.h 2001/10/11 20:07:08
> @@ -143,6 +143,13 @@
>     OciTp, ul_t(md),(void*)cp,(void*)mlf,(void*)rlf,(void*)mfp, \
>     oci_status_name(stat)),stat : stat
>
> +#define OCILobFileExists_log_stat(sh,eh,lh,exists,stat) \
> + stat=OCILobFileExists(sh,eh,lh,exists); \
> + (DBD_OCI_TRACEON) ? fprintf(DBD_OCI_TRACEFP, \
> +   "%sLobGetFileExists(%p,%p,%p,%p)=%s\n", \
> +   OciTp, (void*)sh,(void*)eh,(void*)lh,(void*)exists, \
> +   oci_status_name(stat)),stat : stat
> +
>  #define OCILobGetLength_log_stat(sh,eh,lh,l,stat)                      \
>   stat=OCILobGetLength(sh,eh,lh,l); \
>   (DBD_OCI_TRACEON) ? fprintf(DBD_OCI_TRACEFP, \



Reply via email to