Author: byterock
Date: Fri Dec 21 09:59:43 2007
New Revision: 10448

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

Log:
Patches from RC5

Modified: dbd-oracle/trunk/Oracle.h
==============================================================================
--- dbd-oracle/trunk/Oracle.h   (original)
+++ dbd-oracle/trunk/Oracle.h   Fri Dec 21 09:59:43 2007
@@ -5,6 +5,42 @@
 
 */
 
+/* ====== Include Oracle Header Files ====== */
+
+#ifndef CAN_PROTOTYPE
+#define signed /* Oracle headers use signed */
+#endif
+
+/* The following define avoids a problem with Oracle >=7.3 where
+ * ociapr.h has the line:
+ *     sword  obindps(struct cda_def *cursor, ub1 opcode, text *sqlvar, ...
+ * In some compilers that clashes with perls 'opcode' enum definition.
+ */
+#define opcode opcode_redefined
+
+/* Hack to fix broken Oracle oratypes.h on OSF Alpha. Sigh.    */
+#if defined(__osf__) && defined(__alpha)
+#ifndef A_OSF
+#define A_OSF
+#endif
+#endif
+
+/* egcs-1.1.2 does not have _int64 */
+#if defined(__MINGW32__) || defined(__CYGWIN32__)
+#define _int64 long long
+#endif
+
+
+/* ori.h uses 'dirty' as an arg name in prototypes so we use this */
+/* hack to prevent ori.h being read (since we don't need it)     */
+//#define ORI_ORACLE
+#include <oci.h>
+#include <oratypes.h>
+#include <ocidfn.h>
+#include <orid.h>
+#include <ori.h>
+/* ------ end of Oracle include files ------ */
+
 
 #define NEED_DBIXS_VERSION 93
 

Modified: dbd-oracle/trunk/dbdimp.c
==============================================================================
--- dbd-oracle/trunk/dbdimp.c   (original)
+++ dbd-oracle/trunk/dbdimp.c   Fri Dec 21 09:59:43 2007
@@ -123,6 +123,11 @@
         return 0;
     return 1;
 #else
+    /* For gcc not to warn on unused parameters. */
+    if( key ){}
+    if( val ){}
+    if( data ){}
+    if( size ){}
     return 0;
 #endif
 }
@@ -273,9 +278,9 @@
     /* and setup the pointers in the head fb_ary struct        */
     Newz(42, fb_ary, sizeof(fb_ary_t), fb_ary_t);
     Newz(42, fb_ary->abuf,   size * bufl, ub1);
-    Newz(42, fb_ary->aindp,  size,        sb2);
-    Newz(42, fb_ary->arlen,  size,        ub2);
-    Newz(42, fb_ary->arcode, size,        ub2);
+    Newz(42, fb_ary->aindp,  (unsigned)size,        sb2);
+    Newz(42, fb_ary->arlen,  (unsigned)size,        ub2);
+    Newz(42, fb_ary->arcode, (unsigned)size,        ub2);
     fb_ary->bufl = bufl;
     return fb_ary;
 }
@@ -517,7 +522,8 @@
                     croak("ora_charset is not a string");
                 }
 
-                new_charsetid = OCINlsCharSetNameToId(imp_dbh->envhp, 
SvPV_nolen(*svp));
+                new_charsetid = OCINlsCharSetNameToId(imp_dbh->envhp, 
(oratext*)SvPV_nolen(*svp));
+               
                 if (!new_charsetid) {
                     croak("ora_charset value (%s) is not valid", 
SvPV_nolen(*svp));
                 }
@@ -529,7 +535,7 @@
                     croak("ora_ncharset is not a string");
                 }
 
-                new_ncharsetid = OCINlsCharSetNameToId(imp_dbh->envhp, 
SvPV_nolen(*svp));
+                new_ncharsetid = OCINlsCharSetNameToId(imp_dbh->envhp, 
(oratext*)SvPV_nolen(*svp));
                 if (!new_ncharsetid) {
                     croak("ora_ncharset value (%s) is not valid", 
SvPV_nolen(*svp));
                 }
@@ -1263,16 +1269,16 @@
                if( phs->maxlen <=0 ){ /* Analyze maxlength only if not forced 
*/
                    STRLEN length=0;
                    if (!SvPOK(item)) {     /* normalizations for special cases 
    */
-                       if (SvOK(item)) {    /* ie a number, convert to string 
ASAP  */
-                           if (!(SvROK(item) && phs->is_inout)){
-                               sv_2pv(item, &length);
-                           }
-                       } else { /* ensure we're at least an SVt_PV (so SvPVX 
etc work)     */
-                           SvUPGRADE(item, SVt_PV);
-                       }
+                               if (SvOK(item)) {    /* ie a number, convert to 
string ASAP  */
+                                   if (!(SvROK(item) && phs->is_inout)){
+                                               sv_2pv(item, &length);
+                                   }
+                               } else { /* ensure we're at least an SVt_PV (so 
SvPVX etc work)     */
+                                   if(SvUPGRADE(item, SVt_PV)){}
+                               }
                    }
                    if( length == 0 ){
-                       length=SvCUR(item);
+                               length=SvCUR(item);
                    }
                    if( length+1 > maxlen ){
                        maxlen=length+1;
@@ -1310,13 +1316,13 @@
        if( phs->maxlen <=0 ){
            phs->maxlen=maxlen;
            if (trace_level >= 2){
-               PerlIO_printf(DBILOGFP, "dbd_rebind_ph_varchar2_table(): 
phs->maxlen calculated  =%d\n",
-                       (int)maxlen);
+               PerlIO_printf(DBILOGFP, "dbd_rebind_ph_varchar2_table(): 
phs->maxlen calculated  =%ld\n",
+                       (long)maxlen);
            }
        } else{
            if (trace_level >= 2){
-               PerlIO_printf(DBILOGFP, "dbd_rebind_ph_varchar2_table(): 
phs->maxlen forsed =%d\n",
-                       (int)maxlen);
+                       PerlIO_printf(DBILOGFP, 
"dbd_rebind_ph_varchar2_table(): phs->maxlen forsed =%ld\n",
+                                       (long)maxlen);
            }
        }
     }
@@ -1420,7 +1426,7 @@
        return 0;
     }
     OCIBindArrayOfStruct_log_stat(phs->bndhp, imp_sth->errhp,
-           phs->maxlen,            /* Skip parameter for the next data value */
+           (unsigned)phs->maxlen,  /* Skip parameter for the next data value */
            sizeof (OCIInd),        /* Skip parameter for the next indicator 
value */
            sizeof(unsigned short), /* Skip parameter for the next actual 
length value */
            0,                      /* Skip parameter for the next column-level 
error code */
@@ -1499,10 +1505,10 @@
     }
     if (trace_level >= 1){
        PerlIO_printf(DBILOGFP,
-               "dbd_phs_ora_varchar2_table_fixup_after_execute(): Called for 
'%s' : array_numstruct=%d, maxlen=%d \n",
+               "dbd_phs_ora_varchar2_table_fixup_after_execute(): Called for 
'%s' : array_numstruct=%d, maxlen=%ld \n",
                phs->name,
                phs->array_numstruct,
-               phs->maxlen
+               (long)phs->maxlen
                );
     }
     arr=(AV*)(SvRV(phs->sv));
@@ -1587,8 +1593,8 @@
     }
     if (trace_level >= 2){
        PerlIO_printf(DBILOGFP,
-               "dbd_phs_ora_varchar2_table_fixup_after_execute(): 
scalar(@arr)=%d.\n",
-               av_len(arr)+1);
+               "dbd_phs_ora_varchar2_table_fixup_after_execute(): 
scalar(@arr)=%ld.\n",
+               (long)av_len(arr)+1);
     }
     return 1;
 }
@@ -1601,7 +1607,7 @@
     AV *arr;
     int need_allocate_rows;
     int buflen;
-    int flag_data_is_utf8=0;
+    /*int flag_data_is_utf8=0;*/
 
     if( ( ! SvROK(phs->sv) )  || (SvTYPE(SvRV(phs->sv))!=SVt_PVAV) ) { /* 
Allow only array binds */
        croak("dbd_rebind_ph_number_table(): bad bind variable. ARRAY reference 
required, but got %s for '%s'.",
@@ -1651,8 +1657,8 @@
            phs->maxlen=sizeof(double);
     }
     if (trace_level >= 2){
-       PerlIO_printf(DBILOGFP, "dbd_rebind_ph_number_table(): phs->maxlen 
calculated  =%d\n",
-               (int)phs->maxlen);
+       PerlIO_printf(DBILOGFP, "dbd_rebind_ph_number_table(): phs->maxlen 
calculated  =%ld\n",
+               (long)phs->maxlen);
     }
 
     if( phs->array_numstruct == 0 ){
@@ -1665,12 +1671,12 @@
 
        if (trace_level >= 2){
            PerlIO_printf(DBILOGFP, "dbd_rebind_ph_number_table(): 
ora_maxarray_numentries assumed=phs->array_numstruct=%d\n",
-                   (int)phs->array_numstruct);
+                   phs->array_numstruct);
        }
     }else{
        if (trace_level >= 2){
            PerlIO_printf(DBILOGFP, "dbd_rebind_ph_number_table(): 
ora_maxarray_numentries=%d\n",
-                   (int)phs->ora_maxarray_numentries);
+                   phs->ora_maxarray_numentries);
        }
     }
 
@@ -1708,7 +1714,7 @@
                switch( phs->ora_internal_type ){
                    case SQLT_INT:
                        {
-                           int ival;
+                           int ival     =0;
                            int val_found=0;
                            /* Double values are converted as int(val) */
                            if( SvOK( item ) && ! SvIOK( item ) ){
@@ -1827,7 +1833,7 @@
        return 0;
     }
     OCIBindArrayOfStruct_log_stat(phs->bndhp, imp_sth->errhp,
-           phs->maxlen,            /* Skip parameter for the next data value */
+           (unsigned)phs->maxlen,  /* Skip parameter for the next data value */
            sizeof (OCIInd),        /* Skip parameter for the next indicator 
value */
            sizeof(unsigned short), /* Skip parameter for the next actual 
length value */
            0,                      /* Skip parameter for the next column-level 
error code */
@@ -1863,10 +1869,10 @@
     }
     if (trace_level >= 1){
        PerlIO_printf(DBILOGFP,
-               "dbd_phs_ora_number_table_fixup_after_execute(): Called for 
'%s' : array_numstruct=%d, maxlen=%d \n",
+               "dbd_phs_ora_number_table_fixup_after_execute(): Called for 
'%s' : array_numstruct=%d, maxlen=%ld \n",
                phs->name,
                phs->array_numstruct,
-               phs->maxlen
+               (long)phs->maxlen
                );
     }
     /* At this point, ora_internal_type can't be default. It must be set at 
bind time. */
@@ -2000,8 +2006,8 @@
     }
     if (trace_level >= 2){
        PerlIO_printf(DBILOGFP,
-               "dbd_phs_ora_number_table_fixup_after_execute(): 
scalar(@arr)=%d.\n",
-               av_len(arr)+1);
+               "dbd_phs_ora_number_table_fixup_after_execute(): 
scalar(@arr)=%ld.\n",
+               (long)av_len(arr)+1);
     }
     return 1;
 }
@@ -2010,7 +2016,7 @@
 
 
 static int
-dbd_rebind_ph_char(SV *sth, imp_sth_t *imp_sth, phs_t *phs, ub2 **alen_ptr_ptr)
+dbd_rebind_ph_char(imp_sth_t *imp_sth, phs_t *phs)
 {
        dTHX;
     STRLEN value_len;
@@ -2023,8 +2029,8 @@
                sv_2pv(phs->sv, &na);
        }
        else /* ensure we're at least an SVt_PV (so SvPVX etc work)     */
-           SvUPGRADE(phs->sv, SVt_PV);
-    }
+       if(SvUPGRADE(phs->sv, SVt_PV)){} /* For gcc not to warn on unused 
result)*/;
+       }
 
     if (DBIS->debug >= 2) {
                char *val = neatsvpv(phs->sv,0);
@@ -2228,7 +2234,7 @@
 dbd_rebind_ph(SV *sth, imp_sth_t *imp_sth, phs_t *phs)
 {
        dTHX;
-    ub2 *alen_ptr = NULL;
+    /*ub2 *alen_ptr = NULL;*/
     sword status;
     int done = 0;
     int at_exec;
@@ -2256,7 +2262,7 @@
            done = dbd_rebind_ph_rset(sth, imp_sth, phs);
            break;
     default:
-           done = dbd_rebind_ph_char(sth, imp_sth, phs, &alen_ptr);
+           done = dbd_rebind_ph_char(imp_sth, phs);
     }
     if (done == 2) { /* the dbd_rebind_* did the OCI bind call itself 
successfully */
        if (trace_level >= 3)
@@ -2957,7 +2963,8 @@
 
                  /*check to see if value sv is a null (undef) if it is upgrade 
it*/
                                if (!SvOK(sv))  {
-                                       SvUPGRADE(sv, SVt_PV);
+                                       if(SvUPGRADE(sv, SVt_PV)){} /* For GCC 
not to warn on unused result */
+       
                                }
                                else {
                        SvPV(sv, len);
@@ -2974,7 +2981,7 @@
                     phs[i]->maxlen = len;
 
                 /* Do OCI bind calls on last iteration. */
-                if(j == exe_count - 1) {
+                if( ((unsigned int) j ) == exe_count - 1 ) {                
                   if(!do_bind_array_exec(sth, imp_sth, phs[i])) {
                     Safefree(phs);
                   }
@@ -3308,6 +3315,7 @@
     STRLEN kl;
     SV *cachesv = NULL;
     char *key = SvPV(keysv,kl);
+    if( imp_sth ) { /* For GCC not to warn on unused argument */}    
 /*
     int on = SvTRUE(valuesv);
     int oraperl = DBIc_COMPAT(imp_sth); */

Modified: dbd-oracle/trunk/dbdimp.h
==============================================================================
--- dbd-oracle/trunk/dbdimp.h   (original)
+++ dbd-oracle/trunk/dbdimp.h   Fri Dec 21 09:59:43 2007
@@ -5,46 +5,6 @@
 
 */
 
-
-
-/* ====== Include Oracle Header Files ====== */
-
-#ifndef CAN_PROTOTYPE
-#define signed /* Oracle headers use signed */
-#endif
-
-/* The following define avoids a problem with Oracle >=7.3 where
- * ociapr.h has the line:
- *     sword  obindps(struct cda_def *cursor, ub1 opcode, text *sqlvar, ...
- * In some compilers that clashes with perls 'opcode' enum definition.
- */
-#define opcode opcode_redefined
-
-/* Hack to fix broken Oracle oratypes.h on OSF Alpha. Sigh.    */
-#if defined(__osf__) && defined(__alpha)
-#ifndef A_OSF
-#define A_OSF
-#endif
-#endif
-
-/* egcs-1.1.2 does not have _int64 */
-#if defined(__MINGW32__) || defined(__CYGWIN32__)
-#define _int64 long long
-#endif
-
-
-/* ori.h uses 'dirty' as an arg name in prototypes so we use this */
-/* hack to prevent ori.h being read (since we don't need it)     */
-#define ORI_ORACLE
-#include <oci.h>
-#include <oratypes.h>
-#include <ocidfn.h>
-#include <orid.h>
-#include <ori.h>
-/* ------ end of Oracle include files ------ */
-
-
-
 /* ====== define data types ====== */
 
 typedef struct imp_fbh_st imp_fbh_t;
@@ -220,7 +180,7 @@
     sword ftype;       /* external OCI field type              */
 
     SV *sv;            /* the scalar holding the value         */
-    int sv_type;       /* original sv type at time of bind     */
+    U32 sv_type;       /* original sv type at time of bind     */
     ub2 csid_orig;     /* original oracle default csid         */
     ub2 csid;          /* 0 for automatic                      */
     ub1 csform;                /* 0 for automatic                      */
@@ -240,8 +200,8 @@
     char *progv;
 
     int (*out_prepost_exec)_((SV *, imp_sth_t *, phs_t *, int pre_exec));
-    SV *ora_field;     /* from attribute (for LOB binds)       */
-    int alen_incnull;  /* 0 or 1 if alen should include null   */
+    SV *ora_field;             /* from attribute (for LOB binds)       */
+    ub4 alen_incnull;  /* 0 or 1 if alen should include null   */
     /* Array bind support */
     char   * array_buf;            /* Temporary buffer = malloc(array_buflen) 
*/
        int      array_buflen;         /* Allocated length of array_buf */

Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c     (original)
+++ dbd-oracle/trunk/oci8.c     Fri Dec 21 09:59:43 2007
@@ -226,6 +226,7 @@
      case OCI_HTYPE_SESSION:   return imp_dbh->authp;
      }
      croak("Can't get OCI handle type %d from DBI database handle", 
handle_type);
+     if( flags ) {/* For GCC not to warn on unused parameter */} 
      /* satisfy compiler warning, even though croak will never return */
      return 0;
 }
@@ -242,6 +243,7 @@
      case OCI_HTYPE_STMT:      return imp_sth->stmhp;
      }
      croak("Can't get OCI handle type %d from DBI statement handle", 
handle_type);
+     if( flags ) {/* For GCC not to warn on unused parameter */}
      /* satisfy compiler warning, even though croak will never return */
      return 0;
 }
@@ -372,14 +374,16 @@
        SV *sv;
        AV *av;
        SV **sv_p;
-
+       if( bindp ) { /* For GCC not to warn on unused parameter*/ }
+       
        /* Check for bind values supplied by tuple array. */
        tuples_av = phs->imp_sth->bind_tuples;
        if(tuples_av) {
           /* NOTE: we already checked the validity in 
ora_st_bind_for_array_exec(). */
-          sv_p = av_fetch(tuples_av, phs->imp_sth->rowwise ? iter : phs->idx, 
0);
+          sv_p = av_fetch(tuples_av, phs->imp_sth->rowwise ? (int)iter : 
phs->idx, 0);
           av = (AV*)SvRV(*sv_p);
-          sv_p = av_fetch(av, phs->imp_sth->rowwise ? phs->idx : iter, 0);
+          sv_p = av_fetch(av, phs->imp_sth->rowwise ? phs->idx : (int)iter, 0);
+
           sv = *sv_p;
           if(SvOK(sv)) {
             *bufpp = SvPV(sv, phs_len);
@@ -474,22 +478,23 @@
        dTHX;
     phs_t *phs = (phs_t*)octxp;        /* context */
     /*imp_sth_t *imp_sth = phs->imp_sth;*/
-
+    
+       if( bindp ) { /* For GCC not to warn on unused parameter */ }
+    
     if (phs->desc_h) {
-       *bufpp  = phs->desc_h;
-       phs->alen = 0;
-    }
-    else {
-       SV *sv = phs->sv;
-       if (SvTYPE(sv) == SVt_RV && SvTYPE(SvRV(sv)) == SVt_PVAV) {
-           if (index > 0)      /* finish-up handling previous element */
-               dbd_phs_avsv_complete(phs, (I32)index-1, DBIS->debug);
-           sv = *av_fetch((AV*)SvRV(sv), (IV)index, 1);
-           if (!SvOK(sv))
-               sv_setpv(sv,"");
-       }
-       *bufpp = SvGROW(sv, (size_t)(((phs->maxlen < 28) ? 28 : 
phs->maxlen)+1)/*for null*/);
-       phs->alen = SvLEN(sv);  /* max buffer size now, actual data len later */
+               *bufpp  = phs->desc_h;
+               phs->alen = 0;
+    } else {
+               SV *sv = phs->sv;
+               if (SvTYPE(sv) == SVt_RV && SvTYPE(SvRV(sv)) == SVt_PVAV) {
+                   if (index > 0)      /* finish-up handling previous element 
*/
+                               dbd_phs_avsv_complete(phs, (I32)index-1, 
DBIS->debug);
+                   sv = *av_fetch((AV*)SvRV(sv), (IV)index, 1);
+                   if (!SvOK(sv))
+                               sv_setpv(sv,"");
+               }
+               *bufpp = SvGROW(sv, (size_t)(((phs->maxlen < 28) ? 28 : 
phs->maxlen)+1)/*for null*/);
+               phs->alen = SvLEN(sv);  /* max buffer size now, actual data len 
later */
     }
     *alenpp = &phs->alen;
     *indpp  = &phs->indp;
@@ -620,6 +625,7 @@
     SV *sth_nested = (SV *)fbh->special;
     fbh->special = NULL;
 
+       if( sth ) { /* For GCC not to warn on unused parameter */ }
     if (sth_nested) {
        dTHR;
        D_impdata(imp_sth_nested, imp_sth_t, sth_nested);
@@ -665,7 +671,9 @@
     SPAGAIN;
     if (count != 2)
         croak("panic: DBI::_new_sth returned %d values instead of 2", count);
-    POPs;
+
+    if(POPs){} /* For GCC not to warn on unused result */
+    
     sv_setsv(dest_sv, POPs);
     SvREFCNT_dec(init_attr);
     PUTBACK; FREETMPS; LEAVE;
@@ -759,13 +767,12 @@
        return oci_error(sth, imp_sth->errhp, status, "OCIAttrSet 
OCI_ATTR_LOBEMPTY");
 
     if (!SvPOK(phs->sv)) {     /* normalizations for special cases     */
-       if (SvOK(phs->sv)) {    /* ie a number, convert to string ASAP  */
+               if (SvOK(phs->sv)) {    /* ie a number, convert to string ASAP  
*/
            if (!(SvROK(phs->sv) && phs->is_inout))
                sv_2pv(phs->sv, &na);
-       }
-       else { /* ensure we're at least an SVt_PV (so SvPVX etc work)     */
-            SvUPGRADE(phs->sv, SVt_PV);
-       }
+               } else { /* ensure we're at least an SVt_PV (so SvPVX etc work) 
    */
+               if(SvUPGRADE(phs->sv, SVt_PV)){} /* For GCC not to warn on 
unused result */
+        }
     }
     phs->indp   = (SvOK(phs->sv)) ? 0 : -1;
     phs->progv  = (char*)&phs->desc_h;
@@ -795,8 +802,8 @@
           imp_sth->stmt_type == OCI_STMT_DECLARE) {
        ub4 amtp;
 
-       SvUPGRADE(phs->sv, SVt_PV);     /* just in case */
-       amtp = SvCUR(phs->sv);          /* XXX UTF8? */
+      if(SvUPGRADE(phs->sv, SVt_PV)){/* For GCC not to warn on unused result 
*/};      /* just in case */
+      amtp = SvCUR(phs->sv);           /* XXX UTF8? */
 
        /* Create a temp lob for non-empty string */
 
@@ -1230,6 +1237,7 @@
 fetch_func_getrefpv(SV *sth, imp_fbh_t *fbh, SV *dest_sv)
 {
        dTHX;
+    if( sth ) { /* For GCC not to warn on unused parameter */ }
     /* See the Oracle::OCI module for how to actually use this! */
     sv_setref_pv(dest_sv, fbh->bless, (void*)fbh->desc_h);
     return 1;
@@ -1312,8 +1320,7 @@
          str_len = 200;
          OCIDateToText_log_stat(fbh->imp_sth->errhp, (CONST OCIDate *) 
attr_value,&str_len,str_buf,status);
          str_buf[str_len+1] = '\0';
-         av_push(list, newSVpv( (text *) str_buf,0));
-
+         av_push(list, newSVpv( (char *) str_buf,0));
          break;
      case OCI_TYPECODE_RAW :/* RAW*/
 
@@ -1332,7 +1339,7 @@
      case OCI_TYPECODE_VARCHAR :                                 /* varchar  */
      case OCI_TYPECODE_VARCHAR2 :                                /* varchar2 */
          vs = *(OCIString **) attr_value;
-          av_push(list, newSVpv((text *) OCIStringPtr(fbh->imp_sth->envhp, 
vs),0));
+          av_push(list, newSVpv((char *) OCIStringPtr(fbh->imp_sth->envhp, 
vs),0));
          break;
      case OCI_TYPECODE_SIGNED8 :                              /* BYTE - sb1  */
            av_push(list, newSVuv(*(sb1 *)attr_value));
@@ -1392,8 +1399,8 @@
           for (pos = 0; pos < obj->field_count; pos++){
                                fld = &obj->fields[pos]; /*get the field */
 
-                               
status=OCIObjectGetInd(fbh->imp_sth->envhp,fbh->imp_sth->errhp,value,&obj->obj_ind);
-
+                               
status=OCIObjectGetInd(fbh->imp_sth->envhp,fbh->imp_sth->errhp,value,(dvoid**)&obj->obj_ind);
+ 
 /*the little bastard above took me ages to find out
 seems Oracle does not like people to know that it can do this
 the concept is simple really
@@ -1405,8 +1412,7 @@
 
 The thing to remember is that OCI and C have no way of representing a DB NULLs 
so we use the OCIInd find out
 if the object or any of its properties are NULL, This is one little line in a 
20 chapter book and even then
-id only shows you examples with the C struct built in. Nowhere does it say you 
can do it this way.
- */
+id only shows you examples with the C struct built in and only a single 
record. Nowhere does it say you can do it this way. */
 
                                if (status != OCI_SUCCESS) {
                                        oci_error(sth, fbh->imp_sth->errhp, 
status, "OCIObjectGetInd");
@@ -1415,7 +1421,7 @@
 
                                status = OCIObjectGetAttr(fbh->imp_sth->envhp, 
fbh->imp_sth->errhp, value,
                                                                                
obj->obj_ind, obj->tdo,
-                                                                               
&fld->type_name, &fld->type_namel, 1,
+                                                                               
(CONST oratext**)&fld->type_name, &fld->type_namel, 1,
                                                                                
(ub4 *)0, 0, &attr_null_status, &attr_null_struct,
                                                                                
&attr_value, &attr_tdo);
 
@@ -1534,8 +1540,10 @@
 int
 empty_oci_object(fbh_obj_t *obj){
        dTHX;
-       int pos=0;
-       fbh_obj_t       *fld;
+       int       pos  = 0;
+       fbh_obj_t *fld;
+
+
        switch (obj->element_typecode) {
 
                case OCI_TYPECODE_OBJECT :                            /* 
embedded ADT */
@@ -1570,23 +1578,36 @@
                default:
                        break;
     }
-    if (SvTYPE(fld->value) == SVt_PVAV){
+    if (fld->value && SvTYPE(fld->value) == SVt_PVAV){ 
                av_clear(obj->value);
                av_undef(obj->value);
        }
+
+
+
+
+
+
+
     return 1;
+
 }
 
-int
+static void
 fetch_cleanup_oci_object(SV *sth, imp_fbh_t *fbh){
        dTHX;
-   if (fbh->obj){
+       
+       if( sth ) { /* For GCC not to warn on unused parameter*/  }     
+       
+       if (fbh->obj){
                if(fbh->obj->value){
-
                empty_oci_object(fbh->obj);
                }
        }
-       return 1;
+       
+       if (DBIS->debug >= 3)
+                   PerlIO_printf(DBILOGFP,"  fetch_cleanup_oci_object \n");
+       return;
 }
 
 
@@ -1739,7 +1760,7 @@
                }
 
                /*now get the differnt fields of this object add one field 
object for property*/
-               Newz(1, obj->fields, obj->field_count, fbh_obj_t);
+               Newz(1, obj->fields, (unsigned) obj->field_count, fbh_obj_t);
 
                /*a field is just another instance of an obj not a new struct*/
 
@@ -1839,20 +1860,20 @@
        int i;
 /*dumps the contents of the current fbh->obj*/
 
-       PerlIO_printf(DBILOGFP, " level=%d   type_name = 
%s\n",level,obj->type_name);
-       PerlIO_printf(DBILOGFP, "    type_namel = %d\n",obj->type_namel);
-       PerlIO_printf(DBILOGFP, "    parmdp = %d\n",obj->parmdp);
-       PerlIO_printf(DBILOGFP, "    parmap = %d\n",obj->parmap);
-       PerlIO_printf(DBILOGFP, "    tdo = %d\n",obj->tdo);
-       PerlIO_printf(DBILOGFP, "    typecode = %d\n",obj->typecode);
-       PerlIO_printf(DBILOGFP, "    col_typecode = %d\n",obj->col_typecode);
-       PerlIO_printf(DBILOGFP, "    element_typecode = 
%d\n",obj->element_typecode);
-       PerlIO_printf(DBILOGFP, "    obj_ref = %d\n",obj->obj_ref);
-       PerlIO_printf(DBILOGFP, "    obj_value = %d\n",obj->obj_value);
-       PerlIO_printf(DBILOGFP, "    obj_type = %d\n",obj->obj_type);
-       PerlIO_printf(DBILOGFP, "    field_count = %d\n",obj->field_count);
-       PerlIO_printf(DBILOGFP, "    fields = %d\n",obj->fields);
-
+       PerlIO_printf(DBILOGFP, " level=%d   type_name = 
%s\n",level,obj->type_name);
+       PerlIO_printf(DBILOGFP, "    type_namel = %u\n",obj->type_namel);
+       PerlIO_printf(DBILOGFP, "    parmdp = %p\n",obj->parmdp);
+       PerlIO_printf(DBILOGFP, "    parmap = %p\n",obj->parmap);
+       PerlIO_printf(DBILOGFP, "    tdo = %p\n",obj->tdo);
+       PerlIO_printf(DBILOGFP, "    typecode = %d\n",obj->typecode);
+       PerlIO_printf(DBILOGFP, "    col_typecode = %d\n",obj->col_typecode);
+       PerlIO_printf(DBILOGFP, "    element_typecode = 
%d\n",obj->element_typecode);
+       PerlIO_printf(DBILOGFP, "    obj_ref = %p\n",obj->obj_ref);
+       PerlIO_printf(DBILOGFP, "    obj_value = %p\n",obj->obj_value);
+       PerlIO_printf(DBILOGFP, "    obj_type = %p\n",obj->obj_type);
+       PerlIO_printf(DBILOGFP, "    field_count = %d\n",obj->field_count);
+       PerlIO_printf(DBILOGFP, "    fields = %p\n",obj->fields);
+ 
        for (i = 0; i < obj->field_count;i++){
                fbh_obj_t *fld = &obj->fields[i];
                PerlIO_printf(DBILOGFP, "  \n--->sub objects\n  ");
@@ -2193,8 +2214,8 @@
                                dump_struct(imp_sth,fbh->obj,0);
                        }
 
-                       
OCIDefineObject_log_stat(fbh->defnp,imp_sth->errhp,fbh->obj->tdo,&fbh->obj->obj_value,status);
-
+                       
OCIDefineObject_log_stat(fbh->defnp,imp_sth->errhp,fbh->obj->tdo,(dvoid**)&fbh->obj->obj_value,status);
+ 
                        if (status != OCI_SUCCESS) {
                                oci_error(h,imp_sth->errhp, status, 
"OCIDefineObject");
                                ++num_errors;
@@ -2380,7 +2401,7 @@
                }
 
                if (DBIS->debug >= 5){
-                           PerlIO_printf(DBILOGFP, "\n        %d (rc=%d): 
%s\n",        av, i,neatsvpv(sv,0));
+                   PerlIO_printf(DBILOGFP, "\n        %p (rc=%d): %s\n",       
 av, i,neatsvpv(sv,0));
                }
        }
     return (err) ? Nullav : av;
@@ -2816,6 +2837,7 @@
 int
 post_execute_lobs(SV *sth, imp_sth_t *imp_sth, ub4 row_count)  /* XXX leaks 
handles on error */
 {
+       
     /* To insert a new LOB transparently (without using 'INSERT . RETURNING 
.')        */
     /* we have to insert an empty LobLocator and then fetch it back from the   
*/
     /* server before we can call OCILobWrite on it! This function handles 
that.        */
@@ -2857,21 +2879,21 @@
                ora_sql_error(imp_sth,"OCIStmtExecute/LOB refetch"));
 
     for(i=0; i < lr->num_fields; ++i) {
-       imp_fbh_t *fbh = &lr->fbh_ary[i];
-       int rc = fbh->fb_ary->arcode[0];
-       phs_t *phs = (phs_t*)fbh->special;
-       ub4 amtp;
-
-        SvUPGRADE(phs->sv, SVt_PV);    /* just in case */
-       amtp = SvCUR(phs->sv);          /* XXX UTF8? */
-       if (rc == 1405) {               /* NULL - return undef */
-           sv_set_undef(phs->sv);
-           status = OCI_SUCCESS;
-       }
-       else if (amtp > 0) {    /* since amtp==0 & OCI_ONE_PIECE fail (OCI 
8.0.4) */
+               imp_fbh_t *fbh = &lr->fbh_ary[i];
+               int rc = fbh->fb_ary->arcode[0];
+               phs_t *phs = (phs_t*)fbh->special;
+               ub4 amtp;
+
+       if(SvUPGRADE(phs->sv, SVt_PV)){/* For GCC not to warn on unused result 
*/ };    /* just in case */
+  
+               amtp = SvCUR(phs->sv);          /* XXX UTF8? */
+               if (rc == 1405) {               /* NULL - return undef */
+                   sv_set_undef(phs->sv);
+                   status = OCI_SUCCESS;
+               } else if (amtp > 0) {  /* since amtp==0 & OCI_ONE_PIECE fail 
(OCI 8.0.4) */
             if( ! fbh->csid ) {
-               ub1 csform = SQLCS_IMPLICIT;
-               ub2 csid = 0;
+                               ub1 csform = SQLCS_IMPLICIT;
+                               ub2 csid = 0;
                 OCILobCharSetForm_log_stat( imp_sth->envhp, errhp, 
(OCILobLocator*)fbh->desc_h, &csform, status );
                 if (status != OCI_SUCCESS)
                     return oci_error(sth, errhp, status, "OCILobCharSetForm");
@@ -2882,36 +2904,36 @@
                     return oci_error(sth, errhp, status, "OCILobCharSetId");
 #endif /* OCI_ATTR_CHARSET_ID */
                /* if data is utf8 but charset isn't then switch to utf8 csid */
-               csid = (SvUTF8(phs->sv) && !CS_IS_UTF8(csid)) ? utf8_csid : 
CSFORM_IMPLIED_CSID(csform);
-                fbh->csid = csid;
-                fbh->csform = csform;
-            }
+                       csid = (SvUTF8(phs->sv) && !CS_IS_UTF8(csid)) ? 
utf8_csid : CSFORM_IMPLIED_CSID(csform);
+                                fbh->csid = csid;
+                                fbh->csform = csform;
+                       }
 
-            if (DBIS->debug >= 3)
+                       if (DBIS->debug >= 3)
                 PerlIO_printf(DBILOGFP, "      calling OCILobWrite 
fbh->csid=%d fbh->csform=%d amtp=%d\n",
                     fbh->csid, fbh->csform, amtp );
-           OCILobWrite_log_stat(imp_sth->svchp, errhp,
-                   (OCILobLocator*)fbh->desc_h, &amtp, 1, SvPVX(phs->sv), 
amtp, OCI_ONE_PIECE,
-                   0,0, fbh->csid ,fbh->csform, status);
+                       
+                       OCILobWrite_log_stat(imp_sth->svchp, errhp,
+                           (OCILobLocator*)fbh->desc_h, &amtp, 1, 
SvPVX(phs->sv), amtp, OCI_ONE_PIECE,
+                           0,0, fbh->csid ,fbh->csform, status);
+            
             if (status != OCI_SUCCESS) {
                 return oci_error(sth, errhp, status, "OCILobWrite in 
post_execute_lobs");
-            }
-       }
-       else {                  /* amtp==0 so truncate LOB to zero length */
-           OCILobTrim_log_stat(imp_sth->svchp, errhp, 
(OCILobLocator*)fbh->desc_h, 0, status);
+                       }
+               }else {                 /* amtp==0 so truncate LOB to zero 
length */
+                   OCILobTrim_log_stat(imp_sth->svchp, errhp, 
(OCILobLocator*)fbh->desc_h, 0, status);
             if (status != OCI_SUCCESS) {
                 return oci_error(sth, errhp, status, "OCILobTrim in 
post_execute_lobs");
-            }
-       }
-       if (DBIS->debug >= 3)
-           PerlIO_printf(DBILOGFP,
-               "       lob refetch %d for '%s' param: ftype %d, len %ld: %s 
%s\n",
-               i+1,fbh->name, fbh->dbtype, ul_t(amtp),
-               (rc==1405 ? "NULL" : (amtp > 0) ? "LobWrite" : "LobTrim"), 
oci_status_name(status)
-                );
-       if (status != OCI_SUCCESS) {
-           return oci_error(sth, errhp, status, "OCILobTrim/OCILobWrite/LOB 
refetch");
+        }
        }
+               if (DBIS->debug >= 3)
+                   PerlIO_printf(DBILOGFP,
+                       "       lob refetch %d for '%s' param: ftype %d, len 
%ld: %s %s\n",
+                       i+1,fbh->name, fbh->dbtype, ul_t(amtp),
+                       (rc==1405 ? "NULL" : (amtp > 0) ? "LobWrite" : 
"LobTrim"), oci_status_name(status));
+               if (status != OCI_SUCCESS) {
+                   return oci_error(sth, errhp, status, 
"OCILobTrim/OCILobWrite/LOB refetch");
+               }
     }
 
     if (DBIc_has(imp_dbh,DBIcf_AutoCommit))

Modified: dbd-oracle/trunk/ocitrace.h
==============================================================================
--- dbd-oracle/trunk/ocitrace.h (original)
+++ dbd-oracle/trunk/ocitrace.h Fri Dec 21 09:59:43 2007
@@ -40,7 +40,7 @@
     stat = OCIObjectPin(envhp,errhp,or,(OCIComplexObject 
*)0,OCI_PIN_LATEST,OCI_DURATION_TRANS,OCI_LOCK_NONE,ot);\
     (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        "%OCIObjectPin_log_stat(%p,%p,%d,%d)=%s\n",\
+                        "%sObjectPin_log_stat(%p,%p,%p,%p)=%s\n",\
                         OciTp, (void*)envhp, 
(void*)errhp,or,ot,oci_status_name(stat)),stat \
    : stat
 
@@ -49,7 +49,7 @@
     stat = OCICollGetElem(envhp,errhp, v,i,ex,e,ne);\
     (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        "%OCICollGetElem_log_stat(%p,%p,%d,%d,%d,%d,%d)=%s\n",\
+                        
"%sOCICollGetElem_log_stat(%p,%p,%d,%d,%d,%d,%d)=%s\n",\
                         OciTp, (void*)envhp, 
(void*)errhp,v,i,ex,e,ne,oci_status_name(stat)),stat \
    : stat
 
@@ -58,7 +58,7 @@
     stat = OCITableFirst(envhp,errhp,v,i);\
     (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        "%OCITableFirst_log_stat(%p,%p,%d,%d)=%s\n",\
+                        "%sOCITableFirst_log_stat(%p,%p,%d,%d)=%s\n",\
                         OciTp, (void*)envhp, 
(void*)errhp,v,i,oci_status_name(stat)),stat \
    : stat
 
@@ -66,7 +66,7 @@
     stat = OCIObjectGetAttr(errhp,errhp,v,no,ot,tn,tnl,1,(ub4 *)0, 
0,ani,ans,av,atdo,stat);\
     (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        
"%OCIObjectGetAttr_log_stat(%p,%p,%d,%d,%d,%d,%d,%d,%d,%d,%d)=%s\n",\
+                        
"%sOCIObjectGetAttr_log_stat(%p,%p,%d,%d,%d,%d,%d,%d,%d,%d,%d)=%s\n",\
                         OciTp, 
(void*)envhp,(void*)errhp,v,no,ot,tn,tnl,ani,ans,av,atdo,(void*)errhp,oci_status_name(stat)),stat
 \
    : stat
 
@@ -75,16 +75,16 @@
     stat = OCIDateToText(errhp, (CONST OCIDate *) d,(CONST text*) "Month dd, 
SYYYY, HH:MI A.M.",(ub1) 27, (CONST text*) "American", (ub4) 8,(ub4 *)sl,sb );\
     (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        "%OCIDateToText_log_stat(%p,%d,%d,%s)=%s\n",\
-                        OciTp, (void*)errhp, 
d,sl,sb,(void*)errhp,oci_status_name(stat)),stat \
-   : stat
+                        "%sDateToText_log_stat(%p,%p,%p,%s)=%s\n",\
+                        OciTp, (void*)errhp, 
d,sl,sb,oci_status_name(stat)),stat \
+  : stat
 
 
 #define OCIIterDelete_log_stat(envhp,errhp,itr,stat)\
        stat = OCIIterDelete(envhp,errhp,itr );\
        (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        "%OCIIterDelete_log_stat(%p,%p,%d)=%s\n",\
+                        "%sOCIIterDelete_log_stat(%p,%p,%d)=%s\n",\
                         OciTp, (void*)envhp, 
(void*)errhp,itr,oci_status_name(stat)),stat \
    : stat
 
@@ -93,15 +93,15 @@
     stat = OCIIterCreate(envhp,errhp,coll,itr);\
     (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        "%OCIIterCreate_log_stat(%p,%p,%d)=%s\n",\
-                        OciTp, (void*)envhp, 
(void*)errhp,oci_status_name(stat)),stat \
+                        "%sIterCreate_log_stat(%p,%p,%p)=%s\n",\
+                        OciTp, (void*)envhp, 
(void*)errhp,(void*)coll,oci_status_name(stat)),stat \
    : stat
 
 #define OCICollSize_log_stat(envhp,errhp,coll,coll_siz,stat)\
     stat = OCICollSize(envhp,errhp,(CONST OCIColl *)coll,coll_siz);\
     (DBD_OCI_TRACEON) \
                   ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                        "%OCICollSize_log_stat(%p,%p,%d)=%s\n",\
+                        "%sOCICollSize_log_stat(%p,%p,%d)=%s\n",\
                         OciTp, (void*)envhp, 
(void*)errhp,oci_status_name(stat)),stat \
    : stat
 
@@ -110,16 +110,16 @@
     stat = OCIDefineObject(defnp,errhp,tdo,eo_buff,0,0, 0);\
    (DBD_OCI_TRACEON) \
           ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                "%OCIDefineObject(%p,%p,%d)=%s\n",\
+                "%sOCIDefineObject(%p,%p,%d)=%s\n",\
                 OciTp, (void*)defnp, (void*)errhp, 
(void*)tdo,oci_status_name(stat)),stat \
    : stat
 
 #define OCITypeByName_log_stat(envhp,errhp,svchp,p1,l,tdo,stat)\
-    stat = 
OCITypeByName(envhp,errhp,svchp,"",0,p1,l,0,0,OCI_DURATION_TRANS,OCI_TYPEGET_ALL,tdo);\
+    stat = OCITypeByName(envhp,errhp,svchp,(const 
oratext*)"",0,p1,l,0,0,OCI_DURATION_TRANS,OCI_TYPEGET_ALL,tdo);\
     (DBD_OCI_TRACEON) \
           ?  PerlIO_printf(DBD_OCI_TRACEFP,\
-                "%OCITypeByName(%p,%p,%p,%s,%d)=%s\n",\
-                OciTp, (void*)envhp, (void*)errhp, (void*)svchp, 
(void*)(p1),(l),oci_status_name(stat)),stat \
+                "%sTypeByName(%p,%p,%p,%s,%d)=%s\n",\
+                OciTp, (void*)envhp, (void*)errhp, (void*)svchp, 
(char*)(p1),(l),oci_status_name(stat)),stat \
    : stat
 
 /* added by lab */

Reply via email to