Author: byterock
Date: Thu Jul 2 11:41:07 2009
New Revision: 12993
Modified:
dbd-oracle/trunk/oci8.c
Log:
object change for rtcpan 46613
Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c (original)
+++ dbd-oracle/trunk/oci8.c Thu Jul 2 11:41:07 2009
@@ -1776,7 +1776,7 @@
/*gets the properties of an object from a fetch by using the attributes saved
in the describe */
int
-get_object (SV *sth, AV *list, imp_fbh_t *fbh,fbh_obj_t
*base_obj,OCIComplexObject *value){
+get_object (SV *sth, AV *list, imp_fbh_t *fbh,fbh_obj_t
*base_obj,OCIComplexObject *value, OCIType *instance_tdo){
dTHX;
sword status;
@@ -1785,13 +1785,14 @@
boolean eoc;
ub2 pos;
dvoid *attr_null_struct;
- OCIInd attr_null_status;
- OCIInd *element_null;
+ OCIInd attr_null_status;
+ OCIInd *element_null;
OCIType *attr_tdo;
- OCIIter *itr;
+ OCIIter *itr;
fbh_obj_t *fld;
OCIInd *obj_ind;
fbh_obj_t *obj = base_obj;
+ OCIType *tdo = instance_tdo ? instance_tdo : obj->tdo;
if (DBIS->debug >= 5 || dbd_verbose >= 5 ) {
PerlIO_printf(DBILOGFP, " getting attributes of object named
%s with typecode=%s\n",obj->type_name,oci_typecode_name(obj->typecode));
@@ -1805,30 +1806,31 @@
OCIRef *type_ref=0;
sword status;
- OCIType *tdo;
-
- status = OCIObjectNew(fbh->imp_sth->envhp,
fbh->imp_sth->errhp, fbh->imp_sth->svchp,
-
OCI_TYPECODE_REF, (OCIType *)0,
-
(dvoid *)0, OCI_DURATION_DEFAULT, TRUE,
-
(dvoid **) &type_ref);
- if (status != OCI_SUCCESS) {
- oci_error(sth, fbh->imp_sth->errhp,
status, "OCIObjectNew");
- return 0;
- }
+ if (!instance_tdo) {
+ status =
OCIObjectNew(fbh->imp_sth->envhp, fbh->imp_sth->errhp, fbh->imp_sth->svchp,
+
OCI_TYPECODE_REF, (OCIType *)0,
+
(dvoid *)0, OCI_DURATION_DEFAULT, TRUE,
+
(dvoid **) &type_ref);
+ if (status != OCI_SUCCESS) {
+ oci_error(sth,
fbh->imp_sth->errhp, status, "OCIObjectNew");
+ return 0;
+ }
-
status=OCIObjectGetTypeRef(fbh->imp_sth->envhp,fbh->imp_sth->errhp,
(dvoid*)fbh->obj->obj_value, type_ref);
- if (status != OCI_SUCCESS) {
- oci_error(sth, fbh->imp_sth->errhp,
status, "OCIObjectGetTypeRef");
- return 0;
- }
+
status=OCIObjectGetTypeRef(fbh->imp_sth->envhp,fbh->imp_sth->errhp,
(dvoid*)value, type_ref);
+ if (status != OCI_SUCCESS) {
+ oci_error(sth,
fbh->imp_sth->errhp, status, "OCIObjectGetTypeRef");
+ return 0;
+ }
-
OCITypeByRef_log_stat(fbh->imp_sth->envhp,fbh->imp_sth->errhp,type_ref,&tdo,status);
+
OCITypeByRef_log_stat(fbh->imp_sth->envhp,fbh->imp_sth->errhp,type_ref,&tdo,status);
- if (status != OCI_SUCCESS) {
- oci_error(sth, fbh->imp_sth->errhp,
status, "OCITypeByRef");
- return 0;
+ if (status != OCI_SUCCESS) {
+ oci_error(sth,
fbh->imp_sth->errhp, status, "OCITypeByRef");
+ return 0;
+ }
}
+
if (tdo != obj->tdo) {
/* this is subtype -> search for
subtype obj */
while (obj->next_subtype && tdo !=
obj->tdo) {
@@ -1837,7 +1839,7 @@
if (tdo != obj->tdo) {
/* new subtyped -> get obj
description */
if (DBIS->debug >= 5 ||
dbd_verbose >= 5 ) {
- PerlIO_printf(DBILOGFP,
" describe subtype of object type %s\n",base_obj->type_name);
+ PerlIO_printf(DBILOGFP,
" describe subtype (tdo=%x) of object type %s
(tdo=%x)\n",(int)tdo,base_obj->type_name,(int)base_obj->tdo);
}
Newz(1, obj->next_subtype, 1,
fbh_obj_t);
@@ -1907,7 +1909,7 @@
}
status = OCIObjectGetAttr(fbh->imp_sth->envhp,
fbh->imp_sth->errhp, value,
-
obj_ind, obj->tdo,
+
obj_ind, tdo,
(CONST oratext**)&fld->type_name, &fld->type_namel, 1,
(ub4 *)0, 0, &attr_null_status, &attr_null_struct,
&attr_value, &attr_tdo);
@@ -1926,7 +1928,7 @@
if (fld->typecode !=
OCI_TYPECODE_OBJECT)
attr_value = *(dvoid
**)attr_value;
- get_object
(sth,fld->fields[0].value, fbh, &fld->fields[0],attr_value);
+ get_object
(sth,fld->fields[0].value, fbh, &fld->fields[0],attr_value, attr_tdo);
av_push(list,
new_ora_object(fld->fields[0].value, fld->typecode));
} else{ /* else, display the scaler
type attribute */
@@ -1967,7 +1969,7 @@
} else {
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){
fld->value =
newAV();
- get_object
(sth,fld->value, fbh, fld,element);
+ get_object
(sth,fld->value, fbh, fld,element,0);
av_push(list,
new_ora_object(fld->value, obj->element_typecode));
} else{ /* else,
display the scaler type attribute */
get_attr_val(sth,list, fbh, obj->type_name, obj->element_typecode, element);
@@ -2018,7 +2020,7 @@
fbh->obj->value=newAV();
/*will return referance to an array of scalars*/
- if (!get_object(sth,fbh->obj->value,fbh,fbh->obj,fbh->obj->obj_value)){
+ if
(!get_object(sth,fbh->obj->value,fbh,fbh->obj,fbh->obj->obj_value,0)){
return 0;
} else {
sv_setsv(dest_sv, sv_2mortal(new_ora_object(fbh->obj->value,
fbh->obj->typecode)));
@@ -2739,7 +2741,7 @@
/* the simple types */
case ORA_VARCHAR2: /*
VARCHAR2 */
- if (fbh->dbsize == 0){
+ if (fbh->dbsize == 0){
fbh->dbsize=4000;
}
avg_width = fbh->dbsize / 2;
@@ -3678,12 +3680,12 @@
}
}
}
-
+
matched = 1;
sprintf(sql_field, "%s%s \"%s\"",
(SvCUR(sql_select)>7)?", ":"", p, &phs->name[1]);
sv_catpv(sql_select, sql_field);
-
+
if (DBIS->debug >= 3 || dbd_verbose >= 3 )
PerlIO_printf(DBILOGFP,
" lob refetch %s param: otype %d,
matched field '%s' %s(%s)\n",
@@ -3697,9 +3699,9 @@
fbh->disize = 99;
fbh->desc_t = OCI_DTYPE_LOB;
OCIDescriptorAlloc_ok(imp_sth->envhp,
&fbh->desc_h, fbh->desc_t);
-
+
break; /* we're done with this placeholder now */
-
+
}
if (!matched) {
++unmatched_params;