Author: byterock
Date: Mon Dec 10 05:07:24 2007
New Revision: 10396
Modified:
dbd-oracle/trunk/oci8.c
Log:
This version now works all over with no leaks
Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c (original)
+++ dbd-oracle/trunk/oci8.c Mon Dec 10 05:07:24 2007
@@ -1372,36 +1372,32 @@
sword status;
OCIIter *itr = (OCIIter *) 0;
dvoid *element = (dvoid *) 0;
- OCIInd *null_element;
- dvoid *attr_value = (dvoid *) 0;
- dvoid **null_struct = (dvoid *) 0;
+ dvoid *null_element = (dvoid *) 0;
+ dvoid *attr_value;
boolean eoc,exist;
ub2 pos;
- OCIInd *attr_null_ind= (OCIInd *) 0;
- dvoid *attr_null_struct= (dvoid *) 0;
+ OCIInd attr_null_ind;
+ dvoid *attr_null_struct;
OCIType *attr_tdo;
sb4 index;
fbh_obj_t *fld;
-
-
- if (DBIS->debug <= 5) {
+ if (DBIS->debug >= 5) {
PerlIO_printf(DBILOGFP, " getting attributes of object named
%s with typecode=%d\n",obj->type_name,obj->typecode);
}
switch (obj->typecode) {
- case OCI_TYPECODE_OBJECT : /*
embedded ADT */
-
+ case OCI_TYPECODE_OBJECT : /* embedded ADT */
- for (pos = 0; pos < obj->field_count; pos++){
+ 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,
-
(dvoid *) &attr_value, &attr_tdo);
+
(ub4 *)0, 0, &attr_null_ind, &attr_null_struct,
+
&attr_value, &attr_tdo);
if (status != OCI_SUCCESS) {
oci_error(sth, fbh->imp_sth->errhp,
status, "OCIObjectGetAttr");
@@ -1420,7 +1416,7 @@
}
- }
+ }
status = OCIObjectFree(fbh->imp_sth->envhp, fbh->imp_sth->errhp,
value,
OCI_OBJECTFREE_NONULL);
@@ -1428,7 +1424,6 @@
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 ");
@@ -1441,9 +1436,6 @@
case OCI_TYPECODE_TABLE :
/* nested table */
case OCI_TYPECODE_VARRAY :
/* variable array */
fld = &obj->fields[0]; /*get the field */
-
- PerlIO_printf(DBILOGFP, " ping 1\n");
-
OCIIterCreate_log_stat(fbh->imp_sth->envhp,
fbh->imp_sth->errhp,
(CONST OCIColl*) value, &itr,status);
@@ -1452,8 +1444,6 @@
(CONST OCIColl*)
value, itr );
PerlIO_printf(DBILOGFP, " ping 2%d\n",status);
if (status != OCI_SUCCESS) {
- PerlIO_printf(DBILOGFP, " ping
3%d\n",status);
-
/*not really an error just no
data
oci_error(sth,
fbh->imp_sth->errhp, status, "OCIIterCreate");*/
status = OCI_SUCCESS;
@@ -1462,9 +1452,9 @@
for(eoc =
FALSE;!OCIIterNext(fbh->imp_sth->envhp, fbh->imp_sth->errhp, itr,
(dvoid **) &element,
- &null_element, &eoc) && !eoc;)
+ (dvoid **)&null_element, &eoc) && !eoc;)
{
-PerlIO_printf(DBILOGFP, " ping 4 %d,%d\n",null_element,OCI_IND_BADNULL);
+
if (obj->element_typecode ==
OCI_TYPECODE_OBJECT){
fld->value = newAV();
get_object (sth,fld->value, fbh,
fld,element);
@@ -1474,7 +1464,6 @@
}
}
-
status=OCIIterDelete( fbh->imp_sth->envhp,
fbh->imp_sth->errhp, &itr );
if (status != OCI_SUCCESS) {
@@ -1488,25 +1477,11 @@
case OCI_TYPECODE_REF : /* nested table */
fld = &obj->fields[0]; /*get the field */
-
-
OCIIterCreate_log_stat(fbh->imp_sth->envhp, fbh->imp_sth->errhp,
- (CONST OCIColl*)
value, &itr,status);
- PerlIO_printf(DBILOGFP,
"status=%d\n",status);
-
- if (status != OCI_SUCCESS) {
-
/*not really an error just no data
-
oci_error(sth, fbh->imp_sth->errhp, status, "OCIIterCreate");*/
-
status = OCI_SUCCESS;
-
return 0;
- }
-
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;
-
return 0;
}
@@ -1517,7 +1492,6 @@
if (status != OCI_SUCCESS) {
oci_error(sth,
fbh->imp_sth->errhp, status, "OCICollGetElem");
-
return 0;
}
@@ -1527,6 +1501,7 @@
av_push(list, newRV_noinc((SV
*) fld->value));
}else{
+
get_attr_val(list, fbh, obj->type_name,
obj->element_typecode, element);
}
@@ -1535,6 +1510,7 @@
(CONST OCITable *) value,
&index, &exist) && exist;)
{
+
OCICollGetElem_log_stat(fbh->imp_sth->envhp,
fbh->imp_sth->errhp,
(CONST OCIColl *) value, index,
&exist, (dvoid **) &element,
@@ -1553,22 +1529,17 @@
get_attr_val(list, fbh, obj->type_name,
obj->element_typecode, element);
}
}
-
break;
default:
break;
}
break;
default:
-
if (value ) {
-
get_attr_val(list, fbh, obj->type_name, obj->typecode, value);
}
- else {
- return 1;
-
- }
+ else
+ return 1;
break;
}
return 1;
@@ -1594,7 +1565,6 @@
} else {
sv_setsv(dest_sv, sv_2mortal(newRV_noinc((SV *)
fbh->obj->value)));
return 1;
-
}
}
@@ -1604,8 +1574,7 @@
dTHX;
int pos=0;
fbh_obj_t *fld;
-
- switch (obj->typecode) {
+ switch (obj->element_typecode) {
case OCI_TYPECODE_OBJECT : /*
embedded ADT */
@@ -1616,7 +1585,6 @@
if (SvTYPE(fld->value) == SVt_PVAV){
av_clear(fld->value);
av_undef(fld->value);
-
}
} else {
@@ -1630,16 +1598,18 @@
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);
+ if (SvTYPE(fld->value)){
+ if (SvTYPE(fld->value) == SVt_PVAV){
+ av_clear(fld->value);
+ av_undef(fld->value);
+ }
}
break;
- default:
+ default:
break;
}
if (SvTYPE(fld->value) == SVt_PVAV){
- av_clear(obj->value);
+ av_clear(obj->value);
av_undef(obj->value);
}
return 1;
@@ -1648,8 +1618,9 @@
int
fetch_cleanup_oci_object(SV *sth, imp_fbh_t *fbh){
dTHX;
- if (fbh->obj){
+ if (fbh->obj){
if(fbh->obj->value){
+
empty_oci_object(fbh->obj);
}
}
@@ -1887,11 +1858,10 @@
if (obj->element_typecode == OCI_TYPECODE_OBJECT ||
obj->element_typecode == OCI_TYPECODE_VARRAY || obj->element_typecode ==
OCI_TYPECODE_TABLE || obj->element_typecode == OCI_TYPECODE_NAMEDCOLLECTION){
/*this is some sort of object or collection so lets drill down
some more*/
-
fbh_obj_t *fld;
Newz(1, obj->fields, 1, fbh_obj_t);
+ fld = &obj->fields[0]; /*get the field holder*/
obj->field_count=1; /*not really needed but used internally*/
- fld = &obj->fields[0]; /*get the field holder*/
status=describe_obj(sth,imp_sth,obj->parmap,fld,level+1);
}
@@ -1933,7 +1903,7 @@
}
-
+
int