Author: byterock
Date: Fri Dec  7 11:30:18 2007
New Revision: 10391

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

Log:
A little more leak fixing

Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c     (original)
+++ dbd-oracle/trunk/oci8.c     Fri Dec  7 11:30:18 2007
@@ -1373,7 +1373,7 @@
        OCIIter         *itr = (OCIIter *) 0;
        dvoid           *element = (dvoid *) 0;
        dvoid           *null_element = (dvoid *) 0;
-       dvoid           *attr_value;
+       dvoid           *attr_value = (dvoid *) 0;
        boolean         eoc,exist;
        ub2             pos;
        OCIInd          attr_null_ind;
@@ -1389,15 +1389,16 @@
 
        switch (obj->typecode) {
 
-       case OCI_TYPECODE_OBJECT :                            /* embedded ADT */
-
-              for (pos = 0; pos < obj->field_count; pos++){
+               case OCI_TYPECODE_OBJECT :                            /* 
embedded ADT */
+               
+                              
+                       for (pos = 0; pos < obj->field_count; pos++){
                                fld = &obj->fields[pos]; /*get the field */
                                status = OCIObjectGetAttr(fbh->imp_sth->envhp, 
fbh->imp_sth->errhp, value,
                                                                                
(dvoid *) 0, obj->obj_type,
                                                                                
&fld->type_name, &fld->type_namel, 1,
                                                                                
(ub4 *)0, 0, &attr_null_ind, &attr_null_struct,
-                                                                               
&attr_value, &attr_tdo);
+                                                                               
(dvoid *) &attr_value, &attr_tdo);
 
                                if (status != OCI_SUCCESS) {
                                        oci_error(sth, fbh->imp_sth->errhp, 
status, "OCIObjectGetAttr");
@@ -1409,15 +1410,22 @@
                                        attr_value = *(dvoid **)attr_value;
                                        get_object (sth,fld->fields[0].value, 
fbh, &fld->fields[0],attr_value);
                                        av_push(list, newRV_noinc((SV *) 
fld->fields[0].value));
-
+                                       
                 } else{  /* else, display the scaler type attribute */
 
                     get_attr_val(list, fbh, fld->type_name, fld->typecode, 
attr_value);
-
+                                       
                 }
-
-             }
-
+                               
+               }
+               
+            status = OCIObjectFree(fbh->imp_sth->envhp, fbh->imp_sth->errhp, 
value,
+                                                   OCI_OBJECTFREE_NONULL);
+               if (status != OCI_SUCCESS) {
+                               oci_error(sth, fbh->imp_sth->errhp, status, 
"OCIObjectFree");
+                               return 0;
+               }              
+                       
            break;
        case OCI_TYPECODE_REF :                               /* embedded ADT */
                        croak("panic: OCI_TYPECODE_REF objets () are not 
supported ");
@@ -1458,11 +1466,16 @@
                case OCI_TYPECODE_TABLE :                       /* nested table 
*/
 
                                fld = &obj->fields[0]; /*get the field */
+                               PerlIO_printf(DBILOGFP, " bug #1\n %d",value);
+
                                        
OCITableFirst_log_stat(fbh->imp_sth->envhp, fbh->imp_sth->errhp,(CONST 
OCITable*) value, &index,status);
-                                       if (status != OCI_SUCCESS ) {
+                               
+                                   if (status != OCI_SUCCESS ) {
                                                /*oci_error(sth, 
fbh->imp_sth->errhp, status, "OCITableFirst");*/
                                                /*not really an error just no 
data */
                                                status = OCI_SUCCESS;
+                                               PerlIO_printf(DBILOGFP, " bug 
#2\n");
+
                                                return 0;
                                }
 
@@ -1473,6 +1486,8 @@
 
                                        if (status != OCI_SUCCESS) {
                                                oci_error(sth, 
fbh->imp_sth->errhp, status, "OCICollGetElem");
+                                               PerlIO_printf(DBILOGFP, " bug 
#2\n");
+
                                                return 0;
                                }
 
@@ -1482,7 +1497,7 @@
                                                av_push(list, newRV_noinc((SV 
*) fld->value));
 
                                        }else{
-
+                                           PerlIO_printf(DBILOGFP, " bug 
#3\n");
                                get_attr_val(list, fbh, obj->type_name, 
obj->element_typecode, element);
                        }
 
@@ -1491,7 +1506,7 @@
                               (CONST OCITable *) value,
                               &index, &exist) && exist;)
                        {
-
+ PerlIO_printf(DBILOGFP, " bug #4\n");
                                OCICollGetElem_log_stat(fbh->imp_sth->envhp, 
fbh->imp_sth->errhp,
                                           (CONST OCIColl *)  value, index,
                                           &exist, (dvoid **) &element,
@@ -1510,6 +1525,8 @@
                                        get_attr_val(list, fbh, obj->type_name, 
obj->element_typecode, element);
                            }
                        }
+                        PerlIO_printf(DBILOGFP, " bug #5\n");
+                       
                        break;
                default:
                                break;
@@ -1546,29 +1563,36 @@
        } else {
                sv_setsv(dest_sv, sv_2mortal(newRV_noinc((SV *) 
fbh->obj->value)));
                return 1;
+               
        }
 
 }
 
 int
-empty_oci_object(AV *values,fbh_obj_t *obj,int level){
+empty_oci_object(AV *values,fbh_obj_t *obj){
        dTHX;
-       int i;
+       int i,x;
 
        for (i = 0; i < obj->field_count;i++){
                fbh_obj_t *fld = &obj->fields[i];
+               printf("type_name=%s/n",fld->type_name);
+
                if (fld->typecode == OCI_TYPECODE_OBJECT || fld->typecode == 
OCI_TYPECODE_VARRAY || fld->typecode == OCI_TYPECODE_TABLE || fld->typecode == 
OCI_TYPECODE_NAMEDCOLLECTION){
 
-                       empty_oci_object(fld->value,fld,level+1);
+                        empty_oci_object(fld->value,fld);
+
+                        for (x = 0; x < av_len(fld->value;x++){   
+               
+                        }                       
                         av_clear(values);
                         av_undef(values);
        
                } else {
                  
-                   if (values && SvTYPE(values) <16){ 
-                               av_undef(values);
-                       }
-                       return 1;
+                    printf("SvTYPE=%d/n",SvTYPE(fld->value));
+                       sv_2mortal(fld->value);
+                 
+                       
                }
                
     }
@@ -1577,12 +1601,15 @@
 int 
 fetch_cleanup_oci_object(SV *sth, imp_fbh_t *fbh){
        dTHX;
-
        if (fbh->obj){
                if(fbh->obj->value){
-               empty_oci_object(fbh->obj->value,fbh->obj,0);
+               empty_oci_object(fbh->obj->value,fbh->obj);
+               
                }
+               
        }
+       
+    
        return 1;
 }
 

Modified: dbd-oracle/trunk/ocitrace.h
==============================================================================
--- dbd-oracle/trunk/ocitrace.h (original)
+++ dbd-oracle/trunk/ocitrace.h Fri Dec  7 11:30:18 2007
@@ -37,7 +37,7 @@
 */
 
 #define OCIObjectPin_log_stat(envhp,errhp,or,ot,stat)\
-    stat = OCIObjectPin(envhp,errhp,or,(OCIComplexObject 
*)0,OCI_PIN_LATEST,OCI_DURATION_SESSION,OCI_LOCK_NONE,ot);\
+    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",\
@@ -107,7 +107,7 @@
    : stat
 
 #define OCITypeByName_log_stat(envhp,errhp,svchp,p1,l,tdo,stat)\
-    stat = 
OCITypeByName(envhp,errhp,svchp,"",0,p1,l,0,0,OCI_DURATION_SESSION,OCI_TYPEGET_ALL,tdo);\
+    stat = 
OCITypeByName(envhp,errhp,svchp,"",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",\
@@ -398,12 +398,11 @@
          oci_status_name(stat)),stat : stat
 
 #define OCIStmtFetch_log_stat(sh,eh,nr,or,md,stat)                     \
-       stat=OCIStmtFetch(sh,eh,nr,or,md);                              \
+       stat=OCIStmtFetch2(sh,eh,nr,or,0,md);                           \
        (DBD_OCI_TRACEON) ? PerlIO_printf(DBD_OCI_TRACEFP,                      
\
          "%sStmtFetch(%p,%p,%lu,%u,%lu)=%s\n",                         \
          OciTp, (void*)sh,(void*)eh,ul_t(nr),(ub2)or,ul_t(md),         \
          oci_status_name(stat)),stat : stat
-
 #define OCIStmtPrepare_log_stat(sh,eh,s1,sl,l,m,stat)                   \
        stat=OCIStmtPrepare(sh,eh,s1,sl,l,m);                           \
        (DBD_OCI_TRACEON) ? PerlIO_printf(DBD_OCI_TRACEFP,                      
\

Reply via email to