Author: byterock
Date: Fri Dec 28 08:07:13 2007
New Revision: 10461
Modified:
dbd-oracle/trunk/oci8.c
dbd-oracle/trunk/ocitrace.h
Log:
added more support for more obscure oracle datatypes
Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c (original)
+++ dbd-oracle/trunk/oci8.c Fri Dec 28 08:07:13 2007
@@ -1309,6 +1309,8 @@
ub4 i = 0;
sword status;
SV *raw_sv;
+
+
/* get the data based on the type code*/
if (DBIS->debug >= 5) {
PerlIO_printf(DBILOGFP, " getting value of object attribute named %s
with typecode=%d\n",name,typecode);
@@ -1316,6 +1318,61 @@
switch (typecode)
{
+
+ case OCI_TYPECODE_INTERVAL_YM :
+ case OCI_TYPECODE_INTERVAL_DS :
+
+ OCIIntervalToText_log_stat(fbh->imp_sth->envhp,
+
fbh->imp_sth->errhp,
+ attr_value,
+ str_buf,
+ 200,
+ &str_len,
+ status);
+ str_buf[str_len+1] = '\0';
+ av_push(list, newSVpv( (char *) str_buf,0));
+ break;
+
+ case OCI_TYPECODE_TIMESTAMP_TZ :
+ case OCI_TYPECODE_TIMESTAMP_LTZ :
+ case OCI_TYPECODE_TIMESTAMP :
+
+
+ str_len = 200;
+ OCIDateTimeToText_log_stat(fbh->imp_sth->envhp,
+
fbh->imp_sth->errhp,attr_value,&str_len,str_buf,status);
+
+
+
+ if (typecode == OCI_TYPECODE_TIMESTAMP_TZ || typecode ==
OCI_TYPECODE_TIMESTAMP_LTZ){
+ char s_tz_hour[3]="000";
+ char s_tz_min[3]="000";
+ sb1 tz_hour;
+ sb1 tz_minute;
+ status = OCIDateTimeGetTimeZoneOffset
(fbh->imp_sth->envhp,
+
fbh->imp_sth->errhp,
+
*(OCIDateTime**)attr_value,
+ &tz_hour,
+ &tz_minute );
+
+ if ( (tz_hour<0) && (tz_hour>-10) ){
+ sprintf(s_tz_hour," %03ld",tz_hour);
+ } else {
+ sprintf(s_tz_hour," %02ld",tz_hour);
+ }
+
+ sprintf(s_tz_min,":%02ld",tz_minute);
+ strcat(str_buf,s_tz_hour);
+ strcat(str_buf, s_tz_min);
+ str_buf[str_len+7] = '\0';
+
+ } else {
+ str_buf[str_len+1] = '\0';
+ }
+
+ av_push(list, newSVpv( (char *) str_buf,0));
+ break;
+
case OCI_TYPECODE_DATE : /* fixed length string*/
str_len = 200;
OCIDateToText_log_stat(fbh->imp_sth->errhp, (CONST OCIDate *)
attr_value,&str_len,str_buf,status);
@@ -2347,6 +2404,7 @@
/* else fall through and let rc trigger failure below */
}
+
if (rc == 0) { /* the normal case
*/
if (fbh->fetch_func) {
Modified: dbd-oracle/trunk/ocitrace.h
==============================================================================
--- dbd-oracle/trunk/ocitrace.h (original)
+++ dbd-oracle/trunk/ocitrace.h Fri Dec 28 08:07:13 2007
@@ -71,8 +71,26 @@
: stat
+
+#define OCIIntervalToText_log_stat(envhp,errhp,di,sb,ln,sl,stat)\
+ stat = OCIIntervalToText(envhp,errhp, *(OCIInterval**)di,3,3,sb,ln,sl);\
+ (DBD_OCI_TRACEON) \
+ ? PerlIO_printf(DBD_OCI_TRACEFP,\
+ "% OCIIntervalToText(%p,%p,%p,%s)=%s\n",\
+ OciTp, (void*)errhp,
di,sl,sb,oci_status_name(stat)),stat \
+ : stat
+
+#define OCIDateTimeToText_log_stat(envhp,errhp,d,sl,sb,stat)\
+ stat = OCIDateTimeToText(envhp,errhp, *(OCIDateTime**)d,(CONST text*)
0,(ub1) 0,0, (CONST text*) 0, (ub4) 0,(ub4 *)sl,sb );\
+ (DBD_OCI_TRACEON) \
+ ? PerlIO_printf(DBD_OCI_TRACEFP,\
+ "% OCIDateTimeToText(%p,%p,%p,%s)=%s\n",\
+ OciTp, (void*)errhp,
d,sl,sb,oci_status_name(stat)),stat \
+ : stat
+
+
#define OCIDateToText_log_stat(errhp,d,sl,sb,stat)\
- 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 );\
+ stat = OCIDateToText(errhp, (CONST OCIDate *) d,(CONST text*) 0,(ub1) 0,
(CONST text*) 0, (ub4) 0,(ub4 *)sl,sb );\
(DBD_OCI_TRACEON) \
? PerlIO_printf(DBD_OCI_TRACEFP,\
"%sDateToText_log_stat(%p,%p,%p,%s)=%s\n",\