Author: byterock
Date: Fri Jul 17 05:30:27 2009
New Revision: 13071

Modified:
   dbd-oracle/branches/rs_array/Oracle.h
   dbd-oracle/branches/rs_array/dbdimp.c
   dbd-oracle/branches/rs_array/oci8.c

Log:
final version me thinks

Modified: dbd-oracle/branches/rs_array/Oracle.h
==============================================================================
--- dbd-oracle/branches/rs_array/Oracle.h       (original)
+++ dbd-oracle/branches/rs_array/Oracle.h       Fri Jul 17 05:30:27 2009
@@ -1,5 +1,6 @@
 /*
-   Copyright (c) 1994-2006  Tim Bunce
+   Copyright (c) 1994-2006     Tim Bunce
+   Copyright (c) 2006~         John Scoles
 
    See the COPYRIGHT section in the Oracle.pm file for terms.
 
@@ -97,26 +98,43 @@
 
 /* Oracle types */
 #define ORA_VARCHAR2           1
-#define ORA_STRING                     5
 #define ORA_NUMBER                     2
+#define ORA_INT                                3       /* (ORANET TYPE) 
integer */
+#define ORA_FLT                                4       /* (ORANET TYPE) 
Floating point number */
+#define ORA_STRING                     5
+#define ORA_VNU                                6       /* NUM with preceding 
length byte */
+#define ORA_PDN                                7       /* (ORANET TYPE) Packed 
Decimal Numeric */
 #define ORA_LONG                       8
 #define ORA_ROWID                      11
 #define ORA_DATE                       12
 #define ORA_RAW                                23
 #define ORA_LONGRAW                    24
+#define ORA_LVB                                95      /* Longer long binary */
 #define ORA_CHAR                       96
 #define ORA_CHARZ                      97
+#define ORA_CUR                                102     /* cursor  type */
+#define ORA_RDD                                104     /* rowid descriptor */
 #define ORA_MLSLABEL           105
+#define ORA_XMLTYPE                    108
+#define ORA_REF                                110     /* ref type */
 #define ORA_CLOB                       112
 #define ORA_BLOB                       113
+#define ORA_BFILEE                     114     /* binary file lob */
+#define ORA_CFILEE                     115     /* character file lob */
 #define ORA_RSET                       116
 #define ORA_VARCHAR2_TABLE     201
 #define ORA_NUMBER_TABLE       202
-#define ORA_XMLTYPE                    108
-
+#define ORA_ANSI_DATE          184                      /* ANSI Date */
+#define ORA_TIME                       185                           /* TIME */
+#define ORA_TIME_TZ                    186            /* TIME WITH TIME ZONE */
+#define ORA_TIMESTAMP          187                      /* TIMESTAMP */
+#define ORA_TIMESTAMP_TZ       188       /* TIMESTAMP WITH TIME ZONE */
+#define ORA_INTERVAL_YM                189         /* INTERVAL YEAR TO MONTH */
+#define ORA_INTERVAL_DS                190         /* INTERVAL DAY TO SECOND */
+#define ORA_TIMESTAMP_LTZ      232        /* TIMESTAMP WITH LOCAL TZ */
 
-/* other Oracle not in noraml API defines
 
+/*
 most of these are largly undocumented XML functions that are in the API but 
not defined
 not noramlly found in the  defines the prototypes of OCI functions in most 
clients
 Normally can be found in ociap.h (Oracle Call Interface - Ansi Prototypes

Modified: dbd-oracle/branches/rs_array/dbdimp.c
==============================================================================
--- dbd-oracle/branches/rs_array/dbdimp.c       (original)
+++ dbd-oracle/branches/rs_array/dbdimp.c       Fri Jul 17 05:30:27 2009
@@ -3074,7 +3074,7 @@
                                PerlIO_printf(DBILOGFP,"Statement Executed 
Succesfully!!\n");
                        break;
                        
-               case OCI_NO_DATA: /* selected all the rows at exe*/
+               case OCI_NO_DATA: /* selected all the rows at exe maybe*/
                
                        if (imp_sth->row_cache_off && is_select){ /*row cache 
was off and was is_select so is this an error? */
                                 oci_error(sth, imp_sth->errhp, status, 
ora_sql_error(imp_sth,"OCIStmtExecute"));

Modified: dbd-oracle/branches/rs_array/oci8.c
==============================================================================
--- dbd-oracle/branches/rs_array/oci8.c (original)
+++ dbd-oracle/branches/rs_array/oci8.c Fri Jul 17 05:30:27 2009
@@ -75,28 +75,48 @@
        dTHX;
        SV *sv;
        switch(dbtype) {
-               case  0:        return "DEFAULT (varchar)";
-               case  1:        return "VARCHAR";
-               case  2:        return "NVARCHAR2";
-               case  5:        return "STRING";
-               case  8:        return "LONG";
-               case 21:        return "BINARY FLOAT os-endian";
-               case 22:        return "BINARY DOUBLE os-endian";
-               case 23:        return "RAW";
-               case 24:        return "LONG RAW";
-               case 96:        return "CHAR";
-               case 97:        return "CHARZ";
-               case 100:       return "BINARY FLOAT oracle-endian";
-               case 101:       return "BINARY DOUBLE oracle-endian";
-               case 106:       return "MLSLABEL";
-               case 102:       return "SQLT_CUR        OCI 7 cursor variable";
-               case 112:       return "SQLT_CLOB / long";
-               case 113:       return "SQLT_BLOB / long";
-               case 116:       return "SQLT_RSET       OCI 8 cursor variable";
-               case ORA_VARCHAR2_TABLE:return "ORA_VARCHAR2_TABLE";
-               case ORA_NUMBER_TABLE:  return "ORA_NUMBER_TABLE";
-               case ORA_XMLTYPE:               return "ORA_XMLTYPE or 
SQLT_NTY";/* SQLT_NTY    must be carefull here as its value (108) is the same 
for an embedded object Well realy only XML clobs not embedded objects  */
-
+               case  0:                                        return "DEFAULT 
(varchar)";
+               case ORA_VARCHAR2:                      return "VARCHAR";
+               case ORA_NUMBER:                        return "NVARCHAR2";
+               case ORA_INT:                           return "(ORANET TYPE) 
integer3";
+               case ORA_FLT:                           return "ORANET TYPE) 
Floating point number";
+               case ORA_STRING:                        return "STRING";
+               case ORA_VNU:                           return "NUM with 
preceding length byte";
+               case ORA_PDN:                           return "(ORANET TYPE) 
Packed Decimal Numeric";
+               case ORA_LONG:                          return "LONG";
+               case ORA_ROWID:                         return "ROWID";
+               case ORA_DATE:                          return "DATE";
+               case 21:                                        return "BINARY 
FLOAT os-endian";
+               case 22:                                        return "BINARY 
DOUBLE os-endian";
+               case ORA_RAW:                           return "RAW";
+               case ORA_LONGRAW:                       return "LONG RAW";
+               case ORA_LVB:                           return "Longer LONG 
binary";
+               case ORA_CHAR:                          return "CHAR";
+               case ORA_CHARZ:                         return "CHARZ";
+               case 100:                                       return "BINARY 
FLOAT oracle-endian";
+               case 101:                                       return "BINARY 
DOUBLE oracle-endian";
+               case ORA_RDD:                           return "ROWID 
descriptor";
+               case ORA_MLSLABEL:                      return "MLSLABEL";
+               case 106:                                       return 
"MLSLABEL";
+               case ORA_CUR:                           return "SQLT_CUR        
OCI 7 cursor variable";
+               case ORA_REF:                           return "REF";
+               case ORA_CLOB:                          return "SQLT_CLOB / 
long";
+               case ORA_BLOB:                          return "SQLT_BLOB / 
long";
+               case ORA_BFILEE:                        return "BINARY FILE 
lob"; 
+               case ORA_CFILEE:                        return "CHARACTER FILE 
lob";
+               case ORA_RSET:                          return "SQLT_RSET       
OCI 8 cursor variable";
+               case ORA_XMLTYPE:                       return "ORA_XMLTYPE or 
SQLT_NTY or ORA_OBJECT";/* SQLT_NTY      must be carefull here as its value 
(108) is the same for an embedded object Well realy only XML clobs not embedded 
objects  */
+               case ORA_ANSI_DATE:                     return "ANSI Date";
+               case ORA_TIME:                          return "TIME";
+               case ORA_TIME_TZ:                       return "TIME WITH TIME 
ZONE";
+               case ORA_TIMESTAMP:                     return "TIMESTAMP";
+               case ORA_TIMESTAMP_TZ:          return "TIMESTAMP WITH TIME 
ZONE";
+               case ORA_INTERVAL_YM:           return "INTERVAL YEAR TO MONTH";
+               case ORA_INTERVAL_DS:           return "INTERVAL DAY TO SECOND";
+               case ORA_TIMESTAMP_LTZ:         return "TIMESTAMP WITH LOCAL 
TZ";
+               case ORA_VARCHAR2_TABLE:        return "VARCHAR2_TABLE";
+               case ORA_NUMBER_TABLE:          return "NUMBER_TABLE";
+               
        }
         sv = sv_2mortal(newSVpv("",0));
         sv_grow(sv, 50);
@@ -106,6 +126,7 @@
 
 
 
+
 char *
 oci_typecode_name(int typecode){
 
@@ -3139,7 +3160,7 @@
                fbh->ftype      = 5;    /* default: return as null terminated 
string */
 
                if (DBIS->debug >= 4 || dbd_verbose >= 4 )
-                       PerlIO_printf(DBILOGFP, "Describe col #%d 
type=%d(%s),%d\n",i,fbh->dbtype,sql_typecode_name(fbh->dbtype),ORA_DATE);
+                       PerlIO_printf(DBILOGFP, "Describe col #%d 
type=%d(%s)\n",i,fbh->dbtype,sql_typecode_name(fbh->dbtype));
 
                switch (fbh->dbtype) {
                /*      the simple types        */
@@ -3267,11 +3288,12 @@
                                break;
 
                        case    ORA_ROWID:                              /* 
ROWID        */
-                       case    104:                            /* ROWID Desc   
*/
+                       case    ORA_RDD:                                /* 
ROWID Desc   */
                                fbh->disize = 20;
                                fbh->prec       = fbh->disize;
                                break;
-                       case    108:                             /* some sort 
of embedded object */
+                       case    ORA_XMLTYPE:    /*SQLT_NTY really just this for 
the XML interface*/
+                                                                       /* some 
sort of embedded object */
                                fbh->ftype  = fbh->dbtype;  /*varray or alike */
                                fbh->fetch_func = fetch_func_oci_object; /* 
need a new fetch function for it */
                                fbh->fetch_cleanup = fetch_cleanup_oci_object; 
/* clean up any AV  from the fetch*/
@@ -3286,7 +3308,7 @@
                                break;
                        case    ORA_CLOB:                       /* CLOB & NCLOB 
*/
                        case    ORA_BLOB:                       /* BLOB         
*/
-                       case    114:                            /* BFILE        
*/
+                       case    ORA_BFILEE:                     /* BFILE        
*/
                                fbh->ftype        = fbh->dbtype;
                                imp_sth->ret_lobs = 1;
                                /* do we need some addition size logic here? 
(lab) */
@@ -3356,7 +3378,7 @@
                                break;
 
 #ifdef OCI_DTYPE_REF
-                       case    111:                            /* REF          
*/
+                       case    ORA_REF_PTR:                            /* REF  
        */
                                fbh_setup_getrefpv(fbh, OCI_DTYPE_REF, 
"OCIRefPtr");
                                break;
 #endif
@@ -3371,9 +3393,9 @@
 
                        case    182:                              /* INTERVAL 
YEAR TO MONTH */
                        case    183:                              /* INTERVAL 
DAY TO SECOND */
-                       case    190:                              /* INTERVAL 
DAY TO SECOND */
-                       case    187:                              /* TIMESTAMP 
*/
-                       case    188:                            /* TIMESTAMP 
WITH TIME ZONE     */
+                       case    ORA_INTERVAL_DS:                                
  /* INTERVAL DAY TO SECOND */
+                       case    ORA_TIMESTAMP:                            /* 
TIMESTAMP */
+                       case    ORA_TIMESTAMP_TZ:                               
/* TIMESTAMP WITH TIME ZONE     */
                        case    232:                              /* TIMESTAMP 
WITH LOCAL TIME ZONE */
                                /* actually dependent on NLS default date 
format*/
                                        fbh->disize = 75;               /* XXX 
*/
@@ -3398,7 +3420,7 @@
                                        i, fbh->dbtype, 
sql_typecode_name(fbh->dbtype),fbh->scale, fbh->prec, fbh->nullok, fbh->name,
                                        fbh->dbsize, fbh->len_char_used, 
fbh->len_char_size, fbh->csid,fbh->csform,oci_csform_name(fbh->csform), 
fbh->disize);
 
-               if (fbh->ftype == 5)    /* XXX need to handle wide chars 
somehow */
+               if (fbh->ftype == ORA_STRING)   /* XXX need to handle wide 
chars somehow */
                        fbh->disize += 1;       /* allow for null terminator */
 
        /* dbsize can be zero for 'select NULL ...'                     */
@@ -3433,7 +3455,7 @@
                int ftype = fbh->ftype;
                /* add space for STRING null term, or VAR len prefix */
 
-               sb4 define_len = (ftype==94||ftype==95) ? fbh->disize+4 : 
fbh->disize;
+               sb4 define_len = (ftype==94||ftype==ORA_LVB) ? fbh->disize+4 : 
fbh->disize;
                fb_ary_t  *fb_ary;
                if (fbh->clbk_lob || fbh->piece_lob  ){/*init the cb_abuf with 
this call*/
                        fbh->fb_ary = 
fb_ary_cb_alloc(imp_sth->piece_size,define_len, imp_sth->rs_array_size);
@@ -3462,7 +3484,7 @@
                        (fbh->desc_h) ?                                 0 :     
        define_len,
                        (ub2)fbh->ftype,
                        fb_ary->aindp,
-                       (ftype==94||ftype==95) ? NULL : fb_ary->arlen,
+                       (ftype==94||ftype==ORA_LVB) ? NULL : fb_ary->arlen,
                        fb_ary->arcode,
                        fbh->define_mode,
                                status);
@@ -3472,7 +3494,7 @@
                        
OCIDefineDynamic_log_stat(fbh->defnp,imp_sth->errhp,(dvoid *) fbh,status);
                }
 
-               if (fbh->ftype == 108)  { /* Embedded object bind it 
differently*/
+               if (fbh->ftype == ORA_XMLTYPE)  { /* Embedded object bind it 
differently*/
                        if (DBIS->debug >= 5 || dbd_verbose >= 5 ){
                                PerlIO_printf(DBILOGFP,"Field #%d is a  object 
or colection of some sort. Using OCIDefineObject and or OCIObjectPin \n",i);
                        }
@@ -3572,15 +3594,17 @@
 
                        
                        OCIStmtFetch_log_stat(imp_sth->stmhp, imp_sth->errhp,1, 
imp_sth->fetch_orient,imp_sth->fetch_offset, status);
-                       if (status == OCI_NO_DATA)
-                               status = OCI_SUCCESS;
+                       
+       /*              if (status == OCI_NO_DATA)
+                               status = OCI_SUCCESS;*/
                                
                        
                        /*this will work without a round trip so might as well 
open it up for all statments handles*/
                        /* defualt and OCI_FETCH_NEXT are the same so this 
avoids miscaluation on the next value*/
                        OCIAttrGet_stmhp_stat(imp_sth, 
&imp_sth->fetch_position, 0, OCI_ATTR_CURRENT_POSITION, status);
-                       if (status == OCI_NO_DATA)
-                               status = OCI_SUCCESS;
+                       
+                       /*if (status == OCI_NO_DATA)
+                               status = OCI_SUCCESS;*/
                                
                        if (DBIS->debug >= 4 || dbd_verbose >= 4 )
                                PerlIO_printf(DBILOGFP,"        Scrolling 
Fetch, postion after fetch=%d\n",imp_sth->fetch_position);

Reply via email to