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",\

Reply via email to