Author: byterock
Date: Fri Dec  7 18:06:56 2007
New Revision: 10393

Modified:
   dbd-oracle/trunk/oci8.c

Log:
no mem leak but still a bleed in from Oracle

Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c     (original)
+++ dbd-oracle/trunk/oci8.c     Fri Dec  7 18:06:56 2007
@@ -1374,10 +1374,12 @@
        dvoid           *element = (dvoid *) 0;
        dvoid           *null_element = (dvoid *) 0;
        dvoid           *attr_value = (dvoid *) 0;
+               dvoid           **null_struct = (dvoid *) 0;
+
        boolean         eoc,exist;
        ub2             pos;
-       OCIInd          attr_null_ind;
-       dvoid           *attr_null_struct;
+       OCIInd          *attr_null_ind= (dvoid *) 0;
+       dvoid           *attr_null_struct= (dvoid *) 0;
        OCIType         *attr_tdo;
        sb4             index;
        fbh_obj_t       *fld;
@@ -1390,16 +1392,20 @@
        switch (obj->typecode) {
 
                case OCI_TYPECODE_OBJECT :                            /* 
embedded ADT */
-               
-                              
+
+                       status = OCIObjectGetInd ( fbh->imp_sth->envhp,
+                        fbh->imp_sth->errhp,
+                        value,
+                        null_struct );
+PerlIO_printf(DBILOGFP, "status =%d",status);
                        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,
+                                                                               
(ub4 *)0, 0, attr_null_ind, attr_null_struct,
                                                                                
(dvoid *) &attr_value, &attr_tdo);
-
+PerlIO_printf(DBILOGFP, "OCI_IND_BADNULL= %d,OCI_IND_NULL= %d,OCI_IND_NOTNULL= 
%d attr_null_ind= %d, attr_null_struct= 
2%d\n",OCI_IND_BADNULL,OCI_IND_NULL,OCI_IND_NOTNULL,attr_null_ind, 
attr_null_struct);
                                if (status != OCI_SUCCESS) {
                                        oci_error(sth, fbh->imp_sth->errhp, 
status, "OCIObjectGetAttr");
                                        return 0;
@@ -1410,22 +1416,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 ");
@@ -1469,7 +1475,7 @@
                                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 ) {
                                                /*oci_error(sth, 
fbh->imp_sth->errhp, status, "OCITableFirst");*/
                                                /*not really an error just no 
data */
@@ -1526,7 +1532,7 @@
                            }
                        }
                         PerlIO_printf(DBILOGFP, " bug #5\n");
-                       
+
                        break;
                default:
                                break;
@@ -1563,53 +1569,65 @@
        } 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){
+empty_oci_object(fbh_obj_t *obj){
        dTHX;
-       int i,x;
+       int pos=0;
+       fbh_obj_t       *fld;
 
-       for (i = 0; i < obj->field_count;i++){
-               fbh_obj_t *fld = &obj->fields[i];
-               printf("type_name=%s/n",fld->type_name);
+       switch (obj->typecode) {
+
+               case OCI_TYPECODE_OBJECT :                            /* 
embedded ADT */
 
-               if (fld->typecode == OCI_TYPECODE_OBJECT || fld->typecode == 
OCI_TYPECODE_VARRAY || fld->typecode == OCI_TYPECODE_TABLE || fld->typecode == 
OCI_TYPECODE_NAMEDCOLLECTION){
+                       for (pos = 0; pos < obj->field_count; pos++){
+                               fld = &obj->fields[pos]; /*get the field */
+                               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);
+                                       if (SvTYPE(fld->value) == SVt_PVAV){
+                                               av_clear(fld->value);
+                                               av_undef(fld->value);
 
-                        empty_oci_object(fld->value,fld);
+                       }
 
-                        for (x = 0; x < av_len(fld->value;x++){   
-               
-                        }                       
-                        av_clear(values);
-                        av_undef(values);
-       
-               } else {
-                 
-                    printf("SvTYPE=%d/n",SvTYPE(fld->value));
-                       sv_2mortal(fld->value);
-                 
-                       
-               }
-               
-    }
+                               } else {
+                                       return 1;
+                               }
+               }
+           break;
+
+               case OCI_TYPECODE_NAMEDCOLLECTION :
+                       fld = &obj->fields[0]; /*get the field */
+                       if (obj->element_typecode == OCI_TYPECODE_OBJECT){
+                               empty_oci_object(fld);
+                       }
+                       if (SvTYPE(fld->value) == SVt_PVAV){
+                               av_clear(fld->value);
+                               av_undef(fld->value);
+                       }
+                       break;
+                default:
+                       break;
+    }
+    if (SvTYPE(fld->value) == SVt_PVAV){
+               av_clear(obj->value);
+               av_undef(obj->value);
+       }
     return 1;
 }
-int 
+
+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);
-               
+               empty_oci_object(fbh->obj);
                }
-               
        }
-       
-    
        return 1;
 }
 
@@ -1890,7 +1908,7 @@
 }
 
 
-       
+
 
 
 int

Reply via email to