Author: byterock
Date: Fri Jul 10 11:42:39 2009
New Revision: 13036

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

Log:
working version before long debug

Modified: dbd-oracle/branches/rs_array/Oracle.pm
==============================================================================
--- dbd-oracle/branches/rs_array/Oracle.pm      (original)
+++ dbd-oracle/branches/rs_array/Oracle.pm      Fri Jul 10 11:42:39 2009
@@ -832,9 +832,10 @@
        my $refresh = shift;
 
        if ($refresh || !$dbh->{ora_nls_parameters}) {
-            my $nls_parameters = $dbh->selectall_arrayref(q{
+           my $nls_parameters = $dbh->selectall_arrayref(q{
                SELECT parameter, value FROM v$nls_parameters
            }) or return;
+          
            $dbh->{ora_nls_parameters} = { map { $_->[0] => $_->[1] } 
@$nls_parameters };
        }
 

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 10 11:42:39 2009
@@ -379,8 +379,8 @@
                DBD_ATTRIB_GET_IV(  attr, "dbd_verbose",  11, svp, dbd_verbose);
        if (DBD_ATTRIB_TRUE(attr,"ora_verbose",11,svp))
                DBD_ATTRIB_GET_IV(  attr, "ora_verbose",  11, svp, dbd_verbose);
-               
-               
+
+
        if (DBD_ATTRIB_TRUE(attr,"ora_oci_success_warn",20,svp))
                DBD_ATTRIB_GET_IV(  attr, "ora_oci_success_warn",  20, svp, 
oci_warn);
        if (DBD_ATTRIB_TRUE(attr,"ora_objects",11,svp))
@@ -3044,9 +3044,8 @@
                if (debug >= 2 || dbd_verbose >= 3 )
                        PerlIO_printf(DBILOGFP,"Statement Execute Mode is %d 
(%s)\n",imp_sth->exe_mode,oci_exe_mode(imp_sth->exe_mode));
 
-
                OCIStmtExecute_log_stat(imp_sth->svchp, imp_sth->stmhp, 
imp_sth->errhp,
-                                       (ub4)(is_select ? 0 : 1),
+                                       (ub4)(is_select ? 0: 1),
                                        0, 0, 0,(ub4)imp_sth->exe_mode,status);
 
 

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 10 11:42:39 2009
@@ -356,17 +356,17 @@
        SV *sv;
        switch (attr) {
        /*=============================Attribute 
Types===============================*/
-       /* 
+       /*
           Note: All attributes are global.  New attibutes should be added to 
the end
-          of the list. Before you add an attribute see if an existing one can 
be 
-          used for your handle. 
-       
-          If you see any holes please use the holes first. 
-        
+          of the list. Before you add an attribute see if an existing one can 
be
+          used for your handle.
+
+          If you see any holes please use the holes first.
+
        */
        
/*===========================================================================*/
-       
-       
+
+
        case OCI_ATTR_FNCODE:                           return 
"OCI_ATTR_FNCODE";                       /* the OCI function code */
        case OCI_ATTR_OBJECT:                           return 
"OCI_ATTR_OBJECT"; /* is the environment initialized in object mode */
        case OCI_ATTR_NONBLOCKING_MODE:         return 
"OCI_ATTR_NONBLOCKING_MODE";                   /* non blocking mode */
@@ -381,12 +381,12 @@
        case OCI_ATTR_NESTED_PREFETCH_ROWS:     return 
"OCI_ATTR_NESTED_PREFETCH_ROWS"; /* the prefetch rows of nested table*/
        case OCI_ATTR_PREFETCH_MEMORY:          return 
"OCI_ATTR_PREFETCH_MEMORY";         /* memory limit for rows fetched */
        case OCI_ATTR_NESTED_PREFETCH_MEMORY:return 
"OCI_ATTR_NESTED_PREFETCH_MEMORY";   /* memory limit for nested rows */
-       case OCI_ATTR_CHAR_COUNT:                       return 
"OCI_ATTR_CHAR_COUNT"; 
+       case OCI_ATTR_CHAR_COUNT:                       return 
"OCI_ATTR_CHAR_COUNT";
                            /* this specifies the bind and define size in 
characters */
-       case OCI_ATTR_PDSCL:                            return 
"OCI_ATTR_PDSCL";                          /* packed decimal scale 
+       case OCI_ATTR_PDSCL:                            return 
"OCI_ATTR_PDSCL";                          /* packed decimal scale
        case OCI_ATTR_FSPRECISION OCI_ATTR_PDSCL:return "";*/
                                                  /* fs prec for datetime data 
types */
-       case OCI_ATTR_PDPRC:                            return 
"OCI_ATTR_PDPRC";                         /* packed decimal format 
+       case OCI_ATTR_PDPRC:                            return 
"OCI_ATTR_PDPRC";                         /* packed decimal format
        case OCI_ATTR_LFPRECISION OCI_ATTR_PDPRC: return "";
                                                  /* fs prec for datetime data 
types */
        case OCI_ATTR_PARAM_COUNT:                      return 
"OCI_ATTR_PARAM_COUNT";       /* number of column in the select list */
@@ -422,237 +422,237 @@
        case OCI_ATTR_IN_V8_MODE:                       return 
"OCI_ATTR_IN_V8_MODE"; /* is the server/service context in V8 mode */
        case OCI_ATTR_LOBEMPTY:                         return 
"OCI_ATTR_LOBEMPTY";                              /* empty lob ? */
        case OCI_ATTR_SESSLANG:                         return 
"OCI_ATTR_SESSLANG";                  /* session language handle */
-       
+
        case OCI_ATTR_VISIBILITY:                       return 
"OCI_ATTR_VISIBILITY";                     /* visibility */
        case OCI_ATTR_RELATIVE_MSGID:           return 
"OCI_ATTR_RELATIVE_MSGID";            /* relative message id */
        case OCI_ATTR_SEQUENCE_DEVIATION:       return 
"OCI_ATTR_SEQUENCE_DEVIATION";             /* sequence deviation */
-       
+
        case OCI_ATTR_CONSUMER_NAME:            return 
"OCI_ATTR_CONSUMER_NAME";                  /* consumer name */
        case OCI_ATTR_DEQ_MODE:                         return 
"OCI_ATTR_DEQ_MODE";                   /* dequeue mode */
        case OCI_ATTR_NAVIGATION:                       return 
"OCI_ATTR_NAVIGATION";                     /* navigation */
        case OCI_ATTR_WAIT:                                     return 
"OCI_ATTR_WAIT";                           /* wait */
        case OCI_ATTR_DEQ_MSGID:                        return 
"OCI_ATTR_DEQ_MSGID";             /* dequeue message id */
-       
+
        case OCI_ATTR_PRIORITY:                         return 
"OCI_ATTR_PRIORITY";                       /* priority */
        case OCI_ATTR_DELAY:                            return 
"OCI_ATTR_DELAY";                          /* delay */
        case OCI_ATTR_EXPIRATION:                       return 
"OCI_ATTR_EXPIRATION";                     /* expiration */
        case OCI_ATTR_CORRELATION:                      return 
"OCI_ATTR_CORRELATION";                 /* correlation id */
        case OCI_ATTR_ATTEMPTS:                         return 
"OCI_ATTR_ATTEMPTS";                 /* # of attempts */
-       case OCI_ATTR_RECIPIENT_LIST:                           return 
"OCI_ATTR_RECIPIENT_LIST";                 /* recipient list */
-       case OCI_ATTR_EXCEPTION_QUEUE:                          return 
"OCI_ATTR_EXCEPTION_QUEUE";           /* exception queue name */
+       case OCI_ATTR_RECIPIENT_LIST:           return 
"OCI_ATTR_RECIPIENT_LIST";                 /* recipient list */
+       case OCI_ATTR_EXCEPTION_QUEUE:          return 
"OCI_ATTR_EXCEPTION_QUEUE";           /* exception queue name */
        case OCI_ATTR_ENQ_TIME:                         return 
"OCI_ATTR_ENQ_TIME";/* enqueue time (only OCIAttrGet) */
-       case OCI_ATTR_MSG_STATE:                                return 
"OCI_ATTR_MSG_STATE";/* message state (only OCIAttrGet) */
+       case OCI_ATTR_MSG_STATE:                        return 
"OCI_ATTR_MSG_STATE";/* message state (only OCIAttrGet) */
                                                           /* NOTE: 64-66 used 
below */
-       case OCI_ATTR_AGENT_NAME:                               return 
"OCI_ATTR_AGENT_NAME";                 /* agent name */
-       case OCI_ATTR_AGENT_ADDRESS:                            return 
"OCI_ATTR_AGENT_ADDRESS";                  /* agent address */
-       case OCI_ATTR_AGENT_PROTOCOL:                           return 
"OCI_ATTR_AGENT_PROTOCOL";                /* agent protocol */
-       
-       case OCI_ATTR_SENDER_ID:                                return 
"OCI_ATTR_SENDER_ID";                      /* sender id */
-       case OCI_ATTR_ORIGINAL_MSGID:                           return 
"OCI_ATTR_ORIGINAL_MSGID";           /* original message id */
-       
-       case OCI_ATTR_QUEUE_NAME:                               return 
"OCI_ATTR_QUEUE_NAME";                     /* queue name */
-       case OCI_ATTR_NFY_MSGID:                                return 
"OCI_ATTR_NFY_MSGID";                     /* message id */
+       case OCI_ATTR_AGENT_NAME:                       return 
"OCI_ATTR_AGENT_NAME";                 /* agent name */
+       case OCI_ATTR_AGENT_ADDRESS:            return 
"OCI_ATTR_AGENT_ADDRESS";                  /* agent address */
+       case OCI_ATTR_AGENT_PROTOCOL:           return 
"OCI_ATTR_AGENT_PROTOCOL";                /* agent protocol */
+
+       case OCI_ATTR_SENDER_ID:                        return 
"OCI_ATTR_SENDER_ID";                      /* sender id */
+       case OCI_ATTR_ORIGINAL_MSGID:           return 
"OCI_ATTR_ORIGINAL_MSGID";           /* original message id */
+
+       case OCI_ATTR_QUEUE_NAME:                       return 
"OCI_ATTR_QUEUE_NAME";                     /* queue name */
+       case OCI_ATTR_NFY_MSGID:                        return 
"OCI_ATTR_NFY_MSGID";                     /* message id */
        case OCI_ATTR_MSG_PROP:                         return 
"OCI_ATTR_MSG_PROP";            /* message properties */
-       
-       case OCI_ATTR_NUM_DML_ERRORS:                           return 
"OCI_ATTR_NUM_DML_ERRORS";       /* num of errs in array DML */
-       case OCI_ATTR_DML_ROW_OFFSET:                           return 
"OCI_ATTR_DML_ROW_OFFSET";       /* row offset in the array */
-       
-       case OCI_ATTR_DATEFORMAT:                               return 
"OCI_ATTR_DATEFORMAT";     /* default date format string */
+
+       case OCI_ATTR_NUM_DML_ERRORS:           return 
"OCI_ATTR_NUM_DML_ERRORS";       /* num of errs in array DML */
+       case OCI_ATTR_DML_ROW_OFFSET:           return 
"OCI_ATTR_DML_ROW_OFFSET";       /* row offset in the array */
+
+       case OCI_ATTR_DATEFORMAT:                       return 
"OCI_ATTR_DATEFORMAT";     /* default date format string */
        case OCI_ATTR_BUF_ADDR:                         return 
"OCI_ATTR_BUF_ADDR";                 /* buffer address */
        case OCI_ATTR_BUF_SIZE:                         return 
"OCI_ATTR_BUF_SIZE";                   /* buffer size */
-       case OCI_ATTR_DIRPATH_MODE:                             return 
"OCI_ATTR_DIRPATH_MODE";  /* mode of direct path operation */
-       case OCI_ATTR_DIRPATH_NOLOG:                            return 
"OCI_ATTR_DIRPATH_NOLOG";               /* nologging option */
-       case OCI_ATTR_DIRPATH_PARALLEL:                         return 
"OCI_ATTR_DIRPATH_PARALLEL";    /* parallel (temp seg) option */
+       case OCI_ATTR_DIRPATH_MODE:                     return 
"OCI_ATTR_DIRPATH_MODE";  /* mode of direct path operation */
+       case OCI_ATTR_DIRPATH_NOLOG:            return 
"OCI_ATTR_DIRPATH_NOLOG";               /* nologging option */
+       case OCI_ATTR_DIRPATH_PARALLEL:         return 
"OCI_ATTR_DIRPATH_PARALLEL";    /* parallel (temp seg) option */
        case OCI_ATTR_NUM_ROWS:                         return 
"OCI_ATTR_NUM_ROWS"; /* number of rows in column array */
                                          /* NOTE that OCI_ATTR_NUM_COLS is a 
column
                                           * array attribute too.
                                           */
-       case OCI_ATTR_COL_COUNT:                                return 
"OCI_ATTR_COL_COUNT";        /* columns of column array
+       case OCI_ATTR_COL_COUNT:                        return 
"OCI_ATTR_COL_COUNT";        /* columns of column array
                                                             processed so far.  
     */
-       case OCI_ATTR_STREAM_OFFSET:                            return 
"OCI_ATTR_STREAM_OFFSET";  /* str off of last row processed 
+       case OCI_ATTR_STREAM_OFFSET:            return 
"OCI_ATTR_STREAM_OFFSET";  /* str off of last row processed
        case OCI_ATTR_SHARED_HEAPALLO:                          return "";    
/* Shared Heap Allocation Size */
-       
-       case OCI_ATTR_SERVER_GROUP:                             return 
"OCI_ATTR_SERVER_GROUP";    /* server group name */
-       
-       case OCI_ATTR_MIGSESSION:                               return 
"OCI_ATTR_MIGSESSION";  /* migratable session attribute */
-       
+
+       case OCI_ATTR_SERVER_GROUP:                     return 
"OCI_ATTR_SERVER_GROUP";    /* server group name */
+
+       case OCI_ATTR_MIGSESSION:                       return 
"OCI_ATTR_MIGSESSION";  /* migratable session attribute */
+
        case OCI_ATTR_NOCACHE:                          return 
"OCI_ATTR_NOCACHE";                /* Temporary LOBs */
-       
-       case OCI_ATTR_MEMPOOL_SIZE:                             return 
"OCI_ATTR_MEMPOOL_SIZE";                      /* Pool Size */
-       case OCI_ATTR_MEMPOOL_INSTNAME:                         return 
"OCI_ATTR_MEMPOOL_INSTNAME";                /* Instance name */
-       case OCI_ATTR_MEMPOOL_APPNAME:                          return 
"OCI_ATTR_MEMPOOL_APPNAME";               /* Application name */
-       case OCI_ATTR_MEMPOOL_HOMENAME:                         return 
"OCI_ATTR_MEMPOOL_HOMENAME";            /* Home Directory name */
-       case OCI_ATTR_MEMPOOL_MODEL:                            return 
"OCI_ATTR_MEMPOOL_MODEL";     /* Pool Model (proc,thrd,both)*/
+
+       case OCI_ATTR_MEMPOOL_SIZE:                     return 
"OCI_ATTR_MEMPOOL_SIZE";                      /* Pool Size */
+       case OCI_ATTR_MEMPOOL_INSTNAME:         return 
"OCI_ATTR_MEMPOOL_INSTNAME";                /* Instance name */
+       case OCI_ATTR_MEMPOOL_APPNAME:          return 
"OCI_ATTR_MEMPOOL_APPNAME";               /* Application name */
+       case OCI_ATTR_MEMPOOL_HOMENAME:         return 
"OCI_ATTR_MEMPOOL_HOMENAME";            /* Home Directory name */
+       case OCI_ATTR_MEMPOOL_MODEL:            return 
"OCI_ATTR_MEMPOOL_MODEL";     /* Pool Model (proc,thrd,both)*/
        case OCI_ATTR_MODES:                            return 
"OCI_ATTR_MODES";                          /* Modes */
-       
-       case OCI_ATTR_SUBSCR_NAME:                              return 
"OCI_ATTR_SUBSCR_NAME";           /* name of subscription */
-       case OCI_ATTR_SUBSCR_CALLBACK:                          return 
"OCI_ATTR_SUBSCR_CALLBACK";            /* associated callback */
-       case OCI_ATTR_SUBSCR_CTX:                               return 
"OCI_ATTR_SUBSCR_CTX";   /* associated callback context */
-       case OCI_ATTR_SUBSCR_PAYLOAD:                           return 
"OCI_ATTR_SUBSCR_PAYLOAD";             /* associated payload */
-       case OCI_ATTR_SUBSCR_NAMESPACE:                         return 
"OCI_ATTR_SUBSCR_NAMESPACE";          /* associated namespace */
-       
-       case OCI_ATTR_PROXY_CREDENTIALS:                                return 
"OCI_ATTR_PROXY_CREDENTIALS";         /* Proxy user credentials */
-       case OCI_ATTR_INITIAL_CLIENT_ROLES:                             return 
"OCI_ATTR_INITIAL_CLIENT_ROLES";      /* Initial client role list */
-       
-       case OCI_ATTR_UNK:                              return "OCI_ATTR_UNK";  
                /* unknown attribute */
+
+       case OCI_ATTR_SUBSCR_NAME:                      return 
"OCI_ATTR_SUBSCR_NAME";           /* name of subscription */
+       case OCI_ATTR_SUBSCR_CALLBACK:          return 
"OCI_ATTR_SUBSCR_CALLBACK";            /* associated callback */
+       case OCI_ATTR_SUBSCR_CTX:                       return 
"OCI_ATTR_SUBSCR_CTX";   /* associated callback context */
+       case OCI_ATTR_SUBSCR_PAYLOAD:           return 
"OCI_ATTR_SUBSCR_PAYLOAD";             /* associated payload */
+       case OCI_ATTR_SUBSCR_NAMESPACE:         return 
"OCI_ATTR_SUBSCR_NAMESPACE";          /* associated namespace */
+
+       case OCI_ATTR_PROXY_CREDENTIALS:        return 
"OCI_ATTR_PROXY_CREDENTIALS";         /* Proxy user credentials */
+       case OCI_ATTR_INITIAL_CLIENT_ROLES:     return 
"OCI_ATTR_INITIAL_CLIENT_ROLES";      /* Initial client role list */
+
+       case OCI_ATTR_UNK:                                      return 
"OCI_ATTR_UNK";                  /* unknown attribute */
        case OCI_ATTR_NUM_COLS:                         return 
"OCI_ATTR_NUM_COLS";                  /* number of columns */
-       case OCI_ATTR_LIST_COLUMNS:                             return 
"OCI_ATTR_LIST_COLUMNS";       /* parameter of the column list */
-       case OCI_ATTR_RDBA:                             return "OCI_ATTR_RDBA"; 
          /* DBA of the segment header */
-       case OCI_ATTR_CLUSTERED:                                return 
"OCI_ATTR_CLUSTERED";      /* whether the table is clustered */
-       case OCI_ATTR_PARTITIONED:                              return 
"OCI_ATTR_PARTITIONED";    /* whether the table is partitioned */
-       case OCI_ATTR_INDEX_ONLY:                               return 
"OCI_ATTR_INDEX_ONLY";     /* whether the table is index only */
-       case OCI_ATTR_LIST_ARGUMENTS:                           return 
"OCI_ATTR_LIST_ARGUMENTS";      /* parameter of the argument list */
-       case OCI_ATTR_LIST_SUBPROGRAMS:                         return 
"OCI_ATTR_LIST_SUBPROGRAMS";    /* parameter of the subprogram list */
+       case OCI_ATTR_LIST_COLUMNS:                     return 
"OCI_ATTR_LIST_COLUMNS";       /* parameter of the column list */
+       case OCI_ATTR_RDBA:                                     return 
"OCI_ATTR_RDBA";           /* DBA of the segment header */
+       case OCI_ATTR_CLUSTERED:                        return 
"OCI_ATTR_CLUSTERED";      /* whether the table is clustered */
+       case OCI_ATTR_PARTITIONED:                      return 
"OCI_ATTR_PARTITIONED";    /* whether the table is partitioned */
+       case OCI_ATTR_INDEX_ONLY:                       return 
"OCI_ATTR_INDEX_ONLY";     /* whether the table is index only */
+       case OCI_ATTR_LIST_ARGUMENTS:           return 
"OCI_ATTR_LIST_ARGUMENTS";      /* parameter of the argument list */
+       case OCI_ATTR_LIST_SUBPROGRAMS:         return 
"OCI_ATTR_LIST_SUBPROGRAMS";    /* parameter of the subprogram list */
        case OCI_ATTR_REF_TDO:                          return 
"OCI_ATTR_REF_TDO";          /* REF to the type descriptor */
-       case OCI_ATTR_LINK:                             return "OCI_ATTR_LINK"; 
             /* the database link name */
-       case OCI_ATTR_MIN:                              return "OCI_ATTR_MIN";  
                     /* minimum value */
-       case OCI_ATTR_MAX:                              return "OCI_ATTR_MAX";  
                     /* maximum value */
-       case OCI_ATTR_INCR:                             return "OCI_ATTR_INCR"; 
                    /* increment value */
+       case OCI_ATTR_LINK:                                     return 
"OCI_ATTR_LINK";              /* the database link name */
+       case OCI_ATTR_MIN:                                      return 
"OCI_ATTR_MIN";                       /* minimum value */
+       case OCI_ATTR_MAX:                                      return 
"OCI_ATTR_MAX";                       /* maximum value */
+       case OCI_ATTR_INCR:                                     return 
"OCI_ATTR_INCR";                     /* increment value */
        case OCI_ATTR_CACHE:                            return 
"OCI_ATTR_CACHE";   /* number of sequence numbers cached */
        case OCI_ATTR_ORDER:                            return 
"OCI_ATTR_ORDER";     /* whether the sequence is ordered */
        case OCI_ATTR_HW_MARK:                          return 
"OCI_ATTR_HW_MARK";                     /* high-water mark */
-       case OCI_ATTR_TYPE_SCHEMA:                              return 
"OCI_ATTR_TYPE_SCHEMA";                  /* type's schema name */
-       case OCI_ATTR_TIMESTAMP:                                return 
"OCI_ATTR_TIMESTAMP";             /* timestamp of the object */
-       case OCI_ATTR_NUM_ATTRS:                                return 
"OCI_ATTR_NUM_ATTRS";                /* number of sttributes */
-       case OCI_ATTR_NUM_PARAMS:                               return 
"OCI_ATTR_NUM_PARAMS";                /* number of parameters */
+       case OCI_ATTR_TYPE_SCHEMA:                      return 
"OCI_ATTR_TYPE_SCHEMA";                  /* type's schema name */
+       case OCI_ATTR_TIMESTAMP:                        return 
"OCI_ATTR_TIMESTAMP";             /* timestamp of the object */
+       case OCI_ATTR_NUM_ATTRS:                        return 
"OCI_ATTR_NUM_ATTRS";                /* number of sttributes */
+       case OCI_ATTR_NUM_PARAMS:                       return 
"OCI_ATTR_NUM_PARAMS";                /* number of parameters */
        case OCI_ATTR_OBJID:                            return 
"OCI_ATTR_OBJID";       /* object id for a table or view */
        case OCI_ATTR_PTYPE:                            return 
"OCI_ATTR_PTYPE";           /* type of info described by */
        case OCI_ATTR_PARAM:                            return 
"OCI_ATTR_PARAM";                /* parameter descriptor */
-       case OCI_ATTR_OVERLOAD_ID:                              return 
"OCI_ATTR_OVERLOAD_ID";     /* overload ID for funcs and procs */
-       case OCI_ATTR_TABLESPACE:                               return 
"OCI_ATTR_TABLESPACE";                    /* table name space */
-       case OCI_ATTR_TDO:                              return "OCI_ATTR_TDO";  
                     /* TDO of a type */
+       case OCI_ATTR_OVERLOAD_ID:                      return 
"OCI_ATTR_OVERLOAD_ID";     /* overload ID for funcs and procs */
+       case OCI_ATTR_TABLESPACE:                       return 
"OCI_ATTR_TABLESPACE";                    /* table name space */
+       case OCI_ATTR_TDO:                                      return 
"OCI_ATTR_TDO";                       /* TDO of a type */
        case OCI_ATTR_LTYPE:                            return 
"OCI_ATTR_LTYPE";                           /* list type */
-       case OCI_ATTR_PARSE_ERROR_OFFSET:                               return 
"OCI_ATTR_PARSE_ERROR_OFFSET";               /* Parse Error offset */
-       case OCI_ATTR_IS_TEMPORARY:                             return 
"OCI_ATTR_IS_TEMPORARY";          /* whether table is temporary */
+       case OCI_ATTR_PARSE_ERROR_OFFSET:       return 
"OCI_ATTR_PARSE_ERROR_OFFSET";               /* Parse Error offset */
+       case OCI_ATTR_IS_TEMPORARY:                     return 
"OCI_ATTR_IS_TEMPORARY";          /* whether table is temporary */
        case OCI_ATTR_IS_TYPED:                         return 
"OCI_ATTR_IS_TYPED";              /* whether table is typed */
        case OCI_ATTR_DURATION:                         return 
"OCI_ATTR_DURATION";         /* duration of temporary table */
-       case OCI_ATTR_IS_INVOKER_RIGHTS:                                return 
"OCI_ATTR_IS_INVOKER_RIGHTS";                 /* is invoker rights */
+       case OCI_ATTR_IS_INVOKER_RIGHTS:        return 
"OCI_ATTR_IS_INVOKER_RIGHTS";                 /* is invoker rights */
        case OCI_ATTR_OBJ_NAME:                         return 
"OCI_ATTR_OBJ_NAME";           /* top level schema obj name */
-       case OCI_ATTR_OBJ_SCHEMA:                               return 
"OCI_ATTR_OBJ_SCHEMA";                         /* schema name */
+       case OCI_ATTR_OBJ_SCHEMA:                       return 
"OCI_ATTR_OBJ_SCHEMA";                         /* schema name */
        case OCI_ATTR_OBJ_ID:                           return 
"OCI_ATTR_OBJ_ID";          /* top level schema object id */
-       
-       case OCI_ATTR_DIRPATH_SORTED_INDEX:                             return 
"OCI_ATTR_DIRPATH_SORTED_INDEX";/* index that data is sorted on */
-       
+
+       case OCI_ATTR_DIRPATH_SORTED_INDEX:     return 
"OCI_ATTR_DIRPATH_SORTED_INDEX";/* index that data is sorted on */
+
                    /* direct path index maint method (see oci8dp.h) */
-       case OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD:                               
return "OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD";
-       
+       case OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD:       return 
"OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD";
+
            /* parallel load: db file, initial and next extent sizes */
-       
-       case OCI_ATTR_DIRPATH_FILE:                             return "";     
/* DB file to load into */
-       case OCI_ATTR_DIRPATH_STORAGE_INITIAL:                          return 
"";       /* initial extent size */
-       case OCI_ATTR_DIRPATH_STORAGE_NEXT:                             return 
"";          /* next extent size */
-       
-       
-       case OCI_ATTR_TRANS_TIMEOUT:                            return "";      
/* transaction timeout */
-       case OCI_ATTR_SERVER_STATUS:                            return "";/* 
state of the server handle */
-       case OCI_ATTR_STATEMENT:                                return ""; /* 
statement txt in stmt hdl */
-                                       /* statement should not be executed in 
cache 
+
+       case OCI_ATTR_DIRPATH_FILE:                     return 
"OCI_ATTR_DIRPATH_FILE";     /* DB file to load into */
+       case OCI_ATTR_DIRPATH_STORAGE_INITIAL:          return 
"OCI_ATTR_DIRPATH_STORAGE_INITIAL";       /* initial extent size */
+       case OCI_ATTR_DIRPATH_STORAGE_NEXT:     return 
"OCI_ATTR_DIRPATH_STORAGE_NEXT";          /* next extent size */
+
+
+       case OCI_ATTR_TRANS_TIMEOUT:            return 
"OCI_ATTR_TRANS_TIMEOUT";      /* transaction timeout */
+       case OCI_ATTR_SERVER_STATUS:            return 
"OCI_ATTR_SERVER_STATUS";/* state of the server handle */
+       case OCI_ATTR_STATEMENT:                        return 
"OCI_ATTR_STATEMENT"; /* statement txt in stmt hdl */
+                                       /* statement should not be executed in 
cache
        case OCI_ATTR_NO_CACHE:                         return "";*/
-       case OCI_ATTR_DEQCOND:                          return "";         /* 
dequeue condition */
-       case OCI_ATTR_RESERVED_2:                               return "";      
            /* reserved */
-       
-         
-       case OCI_ATTR_SUBSCR_RECPT:                             return "";/* 
recepient of subscription */
-       case OCI_ATTR_SUBSCR_RECPTPROTO:                                return 
"";    /* protocol for recepient */
-       
+       case OCI_ATTR_DEQCOND:                          return 
"OCI_ATTR_DEQCOND";         /* dequeue condition */
+       case OCI_ATTR_RESERVED_2:                       return 
"OCI_ATTR_RESERVED_2";                  /* reserved */
+
+
+       case OCI_ATTR_SUBSCR_RECPT:                     return 
"OCI_ATTR_SUBSCR_RECPT";/* recepient of subscription */
+       case OCI_ATTR_SUBSCR_RECPTPROTO:        return 
"OCI_ATTR_SUBSCR_RECPTPROTO";    /* protocol for recepient */
+
            /* 8.2 dpapi support of ADTs */
-       case OCI_ATTR_DIRPATH_EXPR_TYPE:                                return 
"";       /* expr type of OCI_ATTR_NAME */
-       
-       case OCI_ATTR_DIRPATH_INPUT:                            return "";    
/* input in text or stream format 
+       case OCI_ATTR_DIRPATH_EXPR_TYPE:        return 
"OCI_ATTR_DIRPATH_EXPR_TYPE";       /* expr type of OCI_ATTR_NAME */
+
+       case OCI_ATTR_DIRPATH_INPUT:            return 
"OCI_ATTR_DIRPATH_INPUT";    /* input in text or stream format
        case OCI_DIRPATH_INPUT_TEXT:                            return "";
        case OCI_DIRPATH_INPUT_STREAM:                          return "";
        case OCI_DIRPATH_INPUT_UNKNOWN:                         return "";      
*/
-       case OCI_ATTR_LDAP_HOST:                                return "";      
       /* LDAP host to connect to */
-       case OCI_ATTR_LDAP_PORT:                                return "";      
        /* LDAP port to connect to */
-       case OCI_ATTR_BIND_DN:                          return "";              
                /* bind DN */
-       case OCI_ATTR_LDAP_CRED:                                return "";      
 /* credentials to connect to LDAP */
-       case OCI_ATTR_WALL_LOC:                         return "";              
 /* client wallet location */
-       case OCI_ATTR_LDAP_AUTH:                                return "";      
     /* LDAP authentication method */
-       case OCI_ATTR_LDAP_CTX:                         return "";        /* 
LDAP adminstration context DN */
-       case OCI_ATTR_SERVER_DNS:                               return "";      
/* list of registration server DNs */
-       
-       case OCI_ATTR_DN_COUNT:                         return "";             
/* the number of server DNs */
-       case OCI_ATTR_SERVER_DN:                                return "";      
           /* server DN attribute */
-       
-       case OCI_ATTR_MAXCHAR_SIZE:                             return "";    
/* max char size of data */
-       
-       case OCI_ATTR_CURRENT_POSITION:                         return ""; /* 
for scrollable result sets*/
-       
+       case OCI_ATTR_LDAP_HOST:                        return 
"OCI_ATTR_LDAP_HOST";             /* LDAP host to connect to */
+       case OCI_ATTR_LDAP_PORT:                        return 
"OCI_ATTR_LDAP_PORT";              /* LDAP port to connect to */
+       case OCI_ATTR_BIND_DN:                          return 
"OCI_ATTR_BIND_DN";                              /* bind DN */
+       case OCI_ATTR_LDAP_CRED:                        return 
"OCI_ATTR_LDAP_CRED";       /* credentials to connect to LDAP */
+       case OCI_ATTR_WALL_LOC:                         return 
"OCI_ATTR_WALL_LOC";               /* client wallet location */
+       case OCI_ATTR_LDAP_AUTH:                        return 
"OCI_ATTR_LDAP_AUTH";           /* LDAP authentication method */
+       case OCI_ATTR_LDAP_CTX:                         return 
"OCI_ATTR_LDAP_CTX";        /* LDAP adminstration context DN */
+       case OCI_ATTR_SERVER_DNS:                       return 
"OCI_ATTR_SERVER_DNS";      /* list of registration server DNs */
+
+       case OCI_ATTR_DN_COUNT:                         return 
"OCI_ATTR_DN_COUNT";             /* the number of server DNs */
+       case OCI_ATTR_SERVER_DN:                        return 
"OCI_ATTR_SERVER_DN";                 /* server DN attribute */
+
+       case OCI_ATTR_MAXCHAR_SIZE:                     return 
"OCI_ATTR_MAXCHAR_SIZE";    /* max char size of data */
+
+       case OCI_ATTR_CURRENT_POSITION:         return 
"OCI_ATTR_CURRENT_POSITION"; /* for scrollable result sets*/
+
        /* Added to get attributes for ref cursor to statement handle */
-       case OCI_ATTR_RESERVED_3:                               return "";      
            /* reserved */
-       case OCI_ATTR_RESERVED_4:                               return "";      
            /* reserved */
-       case OCI_ATTR_DIRPATH_FN_CTX:                           return "";  /* 
fn ctx ADT attrs or args */
-       case OCI_ATTR_DIGEST_ALGO:                              return "";      
   /* digest algorithm */
-       case OCI_ATTR_CERTIFICATE:                              return "";      
         /* certificate */
-       case OCI_ATTR_SIGNATURE_ALGO:                           return "";      
 /* signature algorithm */
-       case OCI_ATTR_CANONICAL_ALGO:                           return "";    
/* canonicalization algo. */
-       case OCI_ATTR_PRIVATE_KEY:                              return "";      
         /* private key */
-       case OCI_ATTR_DIGEST_VALUE:                             return "";      
       /* digest value */
-       case OCI_ATTR_SIGNATURE_VAL:                            return "";      
     /* signature value */
-       case OCI_ATTR_SIGNATURE:                                return "";      
           /* signature */
-       
+       case OCI_ATTR_RESERVED_3:                       return 
"OCI_ATTR_RESERVED_3";                  /* reserved */
+       case OCI_ATTR_RESERVED_4:                       return 
"OCI_ATTR_RESERVED_4";                  /* reserved */
+       case OCI_ATTR_DIRPATH_FN_CTX:           return "";  /* fn ctx ADT attrs 
or args */
+       case OCI_ATTR_DIGEST_ALGO:                      return 
"OCI_ATTR_DIRPATH_FN_CTX";         /* digest algorithm */
+       case OCI_ATTR_CERTIFICATE:                      return 
"OCI_ATTR_CERTIFICATE";               /* certificate */
+       case OCI_ATTR_SIGNATURE_ALGO:           return 
"OCI_ATTR_SIGNATURE_ALGO";       /* signature algorithm */
+       case OCI_ATTR_CANONICAL_ALGO:           return 
"OCI_ATTR_CANONICAL_ALGO";    /* canonicalization algo. */
+       case OCI_ATTR_PRIVATE_KEY:                      return 
"OCI_ATTR_PRIVATE_KEY";               /* private key */
+       case OCI_ATTR_DIGEST_VALUE:                     return 
"OCI_ATTR_DIGEST_VALUE";             /* digest value */
+       case OCI_ATTR_SIGNATURE_VAL:            return 
"OCI_ATTR_SIGNATURE_VAL";           /* signature value */
+       case OCI_ATTR_SIGNATURE:                        return 
"OCI_ATTR_SIGNATURE";                 /* signature */
+
        /* attributes for setting OCI stmt caching specifics in svchp */
-       case OCI_ATTR_STMTCACHESIZE :                           return "";     
/* size of the stm cache */
-       
+       case OCI_ATTR_STMTCACHESIZE :           return 
"OCI_ATTR_STMTCACHESIZE";     /* size of the stm cache */
+
        /* --------------------------- Connection Pool Attributes 
------------------ */
-       case OCI_ATTR_CONN_NOWAIT:                              return "";
-       case OCI_ATTR_CONN_BUSY_COUNT:                          return "";
-       case OCI_ATTR_CONN_OPEN_COUNT:                          return "";
-       case OCI_ATTR_CONN_TIMEOUT:                             return "";
-       case OCI_ATTR_STMT_STATE:                               return "";
-       case OCI_ATTR_CONN_MIN:                         return "";
-       case OCI_ATTR_CONN_MAX:                         return "";
-       case OCI_ATTR_CONN_INCR:                                return "";
-       
-       case OCI_ATTR_DIRPATH_OID:                              return "";   /* 
loading into an OID col */
-       
-       case OCI_ATTR_NUM_OPEN_STMTS:                           return "";    
/* open stmts in session */
-       case OCI_ATTR_DESCRIBE_NATIVE:                          return ""; /* 
get native info via desc */
-       
-       case OCI_ATTR_BIND_COUNT:                               return "";   /* 
number of bind postions */
-       case OCI_ATTR_HANDLE_POSITION:                          return "";/* 
pos of bind/define handle */
-       case OCI_ATTR_RESERVED_5:                               return "";      
           /* reserverd */
-       case OCI_ATTR_SERVER_BUSY:                              return ""; /* 
call in progress on server*/
-       
-       case OCI_ATTR_DIRPATH_SID:                              return "";   /* 
loading into an SID col */
+       case OCI_ATTR_CONN_NOWAIT:                      return 
"OCI_ATTR_CONN_NOWAIT";
+       case OCI_ATTR_CONN_BUSY_COUNT:          return 
"OCI_ATTR_CONN_BUSY_COUNT";
+       case OCI_ATTR_CONN_OPEN_COUNT:          return 
"OCI_ATTR_CONN_OPEN_COUNT";
+       case OCI_ATTR_CONN_TIMEOUT:                     return 
"OCI_ATTR_CONN_TIMEOUT";
+       case OCI_ATTR_STMT_STATE:                       return 
"OCI_ATTR_STMT_STATE";
+       case OCI_ATTR_CONN_MIN:                         return 
"OCI_ATTR_CONN_MIN";
+       case OCI_ATTR_CONN_MAX:                         return 
"OCI_ATTR_CONN_MAX";
+       case OCI_ATTR_CONN_INCR:                        return 
"OCI_ATTR_CONN_INCR";
+
+       case OCI_ATTR_DIRPATH_OID:                      return 
"OCI_ATTR_DIRPATH_OID";   /* loading into an OID col */
+
+       case OCI_ATTR_NUM_OPEN_STMTS:           return 
"OCI_ATTR_NUM_OPEN_STMTS";    /* open stmts in session */
+       case OCI_ATTR_DESCRIBE_NATIVE:          return 
"OCI_ATTR_DESCRIBE_NATIVE"; /* get native info via desc */
+
+       case OCI_ATTR_BIND_COUNT:                       return 
"OCI_ATTR_BIND_COUNT";   /* number of bind postions */
+       case OCI_ATTR_HANDLE_POSITION:          return 
"OCI_ATTR_HANDLE_POSITION";/* pos of bind/define handle */
+       case OCI_ATTR_RESERVED_5:                       return 
"OCI_ATTR_RESERVED_5";                 /* reserverd */
+       case OCI_ATTR_SERVER_BUSY:                      return 
"OCI_ATTR_SERVER_BUSY"; /* call in progress on server*/
+
+       case OCI_ATTR_DIRPATH_SID:                      return 
"OCI_ATTR_DIRPATH_SID";   /* loading into an SID col */
        /* notification presentation for recipient */
-       case OCI_ATTR_SUBSCR_RECPTPRES:                         return "";
-       case OCI_ATTR_TRANSFORMATION:                           return ""; /* 
AQ message transformation */
-       
-       case OCI_ATTR_ROWS_FETCHED:                             return ""; /* 
rows fetched in last call */
-       
+       case OCI_ATTR_SUBSCR_RECPTPRES:         return 
"OCI_ATTR_SUBSCR_RECPTPRES";
+       case OCI_ATTR_TRANSFORMATION:           return 
"OCI_ATTR_TRANSFORMATION"; /* AQ message transformation */
+
+       case OCI_ATTR_ROWS_FETCHED:                     return 
"OCI_ATTR_ROWS_FETCHED"; /* rows fetched in last call */
+
        /* --------------------------- Snapshot attributes 
------------------------- */
        case OCI_ATTR_SCN_BASE:                         return 
"OCI_ATTR_SCN_BASE";          /* snapshot base */
        case OCI_ATTR_SCN_WRAP:                         return 
"OCI_ATTR_SCN_WRAP";            /* snapshot wrap */
-       
+
        /* --------------------------- Miscellanous attributes 
--------------------- */
-       case OCI_ATTR_RESERVED_6:                               return 
"OCI_ATTR_RESERVED_6";                 /* reserved */
-       case OCI_ATTR_READONLY_TXN:                             return 
"OCI_ATTR_READONLY_TXN";          /* txn is readonly */
-       case OCI_ATTR_RESERVED_7:                               return 
"OCI_ATTR_RESERVED_7";                  /* reserved */
-       case OCI_ATTR_ERRONEOUS_COLUMN:                         return 
"OCI_ATTR_ERRONEOUS_COLUMN"; /* position of erroneous col */
-       case OCI_ATTR_RESERVED_8:                               return 
"OCI_ATTR_RESERVED_8";                  /* reserved */
-       
+       case OCI_ATTR_RESERVED_6:                       return 
"OCI_ATTR_RESERVED_6";                 /* reserved */
+       case OCI_ATTR_READONLY_TXN:                     return 
"OCI_ATTR_READONLY_TXN";          /* txn is readonly */
+       case OCI_ATTR_RESERVED_7:                       return 
"OCI_ATTR_RESERVED_7";                  /* reserved */
+       case OCI_ATTR_ERRONEOUS_COLUMN:         return 
"OCI_ATTR_ERRONEOUS_COLUMN"; /* position of erroneous col */
+       case OCI_ATTR_RESERVED_8:                       return 
"OCI_ATTR_RESERVED_8";                  /* reserved */
+
        /* -------------------- 8.2 dpapi support of ADTs continued 
---------------- */
-       case OCI_ATTR_DIRPATH_OBJ_CONSTR:                               return 
"OCI_ATTR_DIRPATH_OBJ_CONSTR"; /* obj type of subst obj tbl */
-       
+       case OCI_ATTR_DIRPATH_OBJ_CONSTR:       return 
"OCI_ATTR_DIRPATH_OBJ_CONSTR"; /* obj type of subst obj tbl */
+
        /************************FREE attribute     207      
*************************/
        /************************FREE attribute     208      
*************************/
-       case OCI_ATTR_ENV_UTF16:                                return 
"OCI_ATTR_ENV_UTF16";     /* is env in utf16 mode? */
-       case OCI_ATTR_RESERVED_9:                               return 
"OCI_ATTR_RESERVED_9";          /* reserved for TMZ */
-       case OCI_ATTR_RESERVED_10:                              return 
"OCI_ATTR_RESERVED_10";                 /* reserved */
-       
+       case OCI_ATTR_ENV_UTF16:                        return 
"OCI_ATTR_ENV_UTF16";     /* is env in utf16 mode? */
+       case OCI_ATTR_RESERVED_9:                       return 
"OCI_ATTR_RESERVED_9";          /* reserved for TMZ */
+       case OCI_ATTR_RESERVED_10:                      return 
"OCI_ATTR_RESERVED_10";                 /* reserved */
+
        /* Attr to allow setting of the stream version PRIOR to calling Prepare 
*/
-       case OCI_ATTR_DIRPATH_STREAM_VERSION:                           return 
"OCI_ATTR_DIRPATH_STREAM_VERSION";      /* version of the stream
+       case OCI_ATTR_DIRPATH_STREAM_VERSION:   return 
"OCI_ATTR_DIRPATH_STREAM_VERSION";      /* version of the stream
        case OCI_ATTR_RESERVED_11:                              return 
"OCI_ATTR_RESERVED_11";                 /* reserved */
-       
-       case OCI_ATTR_RESERVED_12:                              return 
"OCI_ATTR_RESERVED_12";                 /* reserved */
-       case OCI_ATTR_RESERVED_13:                              return 
"OCI_ATTR_RESERVED_13";                 /* reserved */
-       
+
+       case OCI_ATTR_RESERVED_12:                      return 
"OCI_ATTR_RESERVED_12";                 /* reserved */
+       case OCI_ATTR_RESERVED_13:                      return 
"OCI_ATTR_RESERVED_13";                 /* reserved */
+
        /* OCI_ATTR_RESERVED_14 */
-       
-       case OCI_ATTR_RESERVED_15:                              return 
"OCI_ATTR_RESERVED_15";                /* reserved */
-       case OCI_ATTR_RESERVED_16:                              return 
"OCI_ATTR_RESERVED_16";                /* reserved */
-       
+
+       case OCI_ATTR_RESERVED_15:                      return 
"OCI_ATTR_RESERVED_15";                /* reserved */
+       case OCI_ATTR_RESERVED_16:                      return 
"OCI_ATTR_RESERVED_16";                /* reserved */
+
        }
        sv = sv_2mortal(newSViv((IV)attr));
        return SvPV(sv,na);
@@ -848,8 +848,8 @@
        /* row cache. Change later to set up row cache using just a     */
        /* a memory size, perhaps also default $RowCacheSize to a       */
        /* negative value. OCI_ATTR_PREFETCH_MEMORY */
-       
-       
+
+
 
        if (!DBIc_ACTIVE(imp_dbh)) {
                oci_error(sth, NULL, OCI_ERROR, "Database disconnected");
@@ -874,7 +874,7 @@
        imp_sth->auto_lob = 1;
        imp_sth->exe_mode  = OCI_DEFAULT;
 
-               if (attribs) {
+       if (attribs) {
                SV **svp;
                IV ora_auto_lob = 1;
                DBD_ATTRIB_GET_IV(  attribs, "ora_parse_lang", 14, svp, 
oparse_lng);
@@ -885,11 +885,13 @@
                DBD_ATTRIB_GET_IV(  attribs, "ora_piece_lob", 13, svp, 
ora_piece_lob);
                DBD_ATTRIB_GET_IV(  attribs, "ora_piece_size", 14, svp, 
ora_piece_size);
 
-               imp_sth->auto_lob = (ora_auto_lob) ? 1 : 0;
-               imp_sth->pers_lob = (ora_pers_lob) ? 1 : 0;
-               imp_sth->clbk_lob = (ora_clbk_lob) ? 1 : 0;
-               imp_sth->piece_lob = (ora_piece_lob) ? 1 : 0;
-               imp_sth->piece_size = (ora_piece_size) ? ora_piece_size : 0;
+               imp_sth->auto_lob       = (ora_auto_lob) ? 1 : 0;
+               imp_sth->pers_lob       = (ora_pers_lob) ? 1 : 0;
+               imp_sth->clbk_lob       = (ora_clbk_lob) ? 1 : 0;
+               imp_sth->piece_lob      = (ora_piece_lob) ? 1 : 0;
+               imp_sth->piece_size     = (ora_piece_size) ? ora_piece_size : 0;
+               imp_sth->prefetch_rows  = 0;
+               imp_sth->prefetch_memory= 0;
                /* ora_check_sql only works for selects owing to Oracle 
behaviour */
                DBD_ATTRIB_GET_IV(  attribs, "ora_check_sql", 13, svp, 
ora_check_sql);
                DBD_ATTRIB_GET_IV(  attribs, "ora_exe_mode", 12, svp, 
imp_sth->exe_mode);
@@ -902,7 +904,7 @@
 
                if (!dbd_verbose)
                        DBD_ATTRIB_GET_IV(  attribs, "dbd_verbose",  11, svp, 
dbd_verbose);
-               }
+       }
 
 
        /* scan statement for '?', ':1' and/or ':foo' style placeholders        
*/
@@ -1906,12 +1908,24 @@
 
 
 static int
-calc_cache_rows(int cache_rows, int num_fields, int est_width, int has_longs)
+calc_cache_rows(int cache_rows, int num_fields, int est_width, int 
has_longs,ub4 prefetch_memory)
 {
        dTHX;
-       if (has_longs)                  /* override/disable caching     */
+       /* Use guessed average on-the-wire row width calculated above & */
+       /* add in overhead of 5 bytes per field plus 8 bytes per row.   */
+       /* The n*5+8 was determined by studying SQL*Net v2 packets.     */
+       /* It could probably benefit from a more detailed analysis.     */
+
+       est_width += num_fields*5 + 8;
+
+       if (has_longs) {                        /* override/disable caching     
*/
                cache_rows = 1;         /* else read_blob can't work    */
-       else
+       }
+       else if (prefetch_memory) { /*set rows by memory*/
+
+               cache_rows=prefetch_memory/est_width;
+       }
+       else{
                if (cache_rows == 0) {          /* automatically size the cache 
*/
                /* automatically size the cache */
 
@@ -1920,20 +1934,14 @@
                /* Using 10 means any 'runt' packets will have less impact.     
*/
                int txfr_size  = 10 * 1460;     /* desired transfer/cache size  
*/
 
-               /* Use guessed average on-the-wire row width calculated above & 
*/
-               /* add in overhead of 5 bytes per field plus 8 bytes per row.   
*/
-               /* The n*5+8 was determined by studying SQL*Net v2 packets.     
*/
-               /* It could probably benefit from a more detailed analysis.     
*/
-               est_width += num_fields*5 + 8;
-
                cache_rows = txfr_size / est_width;               /* (maybe 1 
or 0)     */
 
                /* To ensure good performance with large rows (near or larger   
*/
                /* than our target transfer size) we set a minimum cache size.  
*/
                if (cache_rows < 6)     /* is cache a 'useful' size?    */
                        cache_rows = (cache_rows > 0) ? 6 : 4;
+               }
        }
-
        if (cache_rows > 10000000)      /* keep within Oracle's limits  */
                cache_rows = 10000000;  /* seems it was ub2 at one time now ub4 
this number is arbitary on my part*/
 
@@ -2591,15 +2599,28 @@
        imp_sth->rs_array_num_rows      =0;
        imp_sth->rs_array_idx           =0;
        imp_sth->rs_fetch_count         =0;
-       imp_sth->prefetch_rows          =0;
-       imp_sth->prefetch_memory        =0;
+       /*imp_sth->prefetch_rows                =0;
+       imp_sth->prefetch_memory        =0;*/
        imp_sth->rs_array_status        =OCI_SUCCESS;
-       
+
        if (DBIS->debug >= 3 || dbd_verbose >= 3 )
                PerlIO_printf(DBILOGFP, "       
rs_array_init:imp_sth->rs_array_size=%d, rs_array_idx=%d, prefetch_rows=%d, 
rs_array_status=%s\n",imp_sth->rs_array_size,imp_sth->rs_array_idx,imp_sth->prefetch_rows,oci_status_name(imp_sth->rs_array_status));
 }
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
 /*static int                   /* --- Setup the row cache for this sth --- */
 sth_set_row_cache(SV *h, imp_sth_t *imp_sth, int max_cache_rows, int 
num_fields, int has_longs)
 {
@@ -2611,33 +2632,33 @@
        ub4 prefetch_rows       = 0; /*Oracle prefetch Row Buffer*/
        sb4 cache_rows          = 0;/* set high so memory is the limit */
        sword status;
-       
+
        if (imp_dbh->RowCacheSize){
          cache_rows=imp_dbh->RowCacheSize;
        }
-       
+
        /* seems that RowCacheSize was incorrectly used in the past
           in the DBI Spect  RowCacheSize is to be used for a local row cache
-          
+
           From DBI POD
-             A hint to the driver indicating the size of the local 
-             row cache that the application would like the driver to 
-             use for future SELECT statements. 
+             A hint to the driver indicating the size of the local
+             row cache that the application would like the driver to
+             use for future SELECT statements.
 
           so RowCacheSize is for a local cache to cut down on round trips
-          
+
           The OCI doc state that both OCI_ATTR_PREFETCH_ROWS 
OCI_ATTR_PREFETCH_MEMORY
-          sets up a cleint side cache but as we use to select one 1 record at 
a time from 
-          the fetch this means the records are never really cached locally.as 
each fecth did 
-          a round trim
-          
+          sets up a cleint side cache but in earluer version that 1.24 we only 
selected
+          one record at a time from the fetch this means a round trip (at 
least to the local cache)
+          at each fetch.
+
           With the new array fetch we truly have a local cache so I will use it
           RowCacheSize to set the value of that cache or the array fetch*/
-                  
-       
+
+
 
        /* number of rows to cache       if using oraperl  will leave this in 
for now*/
-       
+
 
        if (SvOK(imp_drh->ora_cache_o)){
                imp_sth->cache_rows = SvIV(imp_drh->ora_cache_o);
@@ -2646,43 +2667,47 @@
                imp_sth->cache_rows = SvIV(imp_drh->ora_cache);
        }
 
-       if (imp_dbh->RowCacheSize){
+       if (imp_dbh->RowCacheSize){ /* defalut value*/
          cache_rows=imp_dbh->RowCacheSize;
-       } 
+       }
 
        prefetch_rows   =imp_sth->prefetch_rows;
        prefetch_mem    =imp_sth->prefetch_memory;
-       
-       
-       if (!cache_rows) { /*start with this value if not set then set default*/
-               
-               cache_rows=calc_cache_rows(imp_sth->cache_rows,(int)num_fields, 
imp_sth->est_width, has_longs);
-                       
-               if(!prefetch_rows && !prefetch_mem){
+
+
+       if (!cache_rows) { /*start with this value if not set then set default 
cache */
+
+               cache_rows=calc_cache_rows(imp_sth->cache_rows,(int)num_fields, 
imp_sth->est_width, has_longs,0);
+
+               if(!prefetch_rows && !prefetch_mem){ /*if there are not 
prefetch rows make sure I set it here to the default*/
                          prefetch_rows=cache_rows;
                }
        }
        else if (imp_dbh->RowCacheSize < 0) {/* for compaibility with DBI doc 
negitive value here means use the value as memory*/
                prefetch_mem    =-imp_dbh->RowCacheSize; /* cache_mem always 
+ve here */
                prefetch_rows   =0;
-               cache_rows=calc_cache_rows(imp_sth->cache_rows,(int)num_fields, 
imp_sth->est_width, has_longs);
-               /*Sill use local cache but it is calulated nothing in the doc 
for this so I will use it like this*/
-       } 
+               cache_rows=calc_cache_rows(imp_sth->cache_rows,(int)num_fields, 
imp_sth->est_width, has_longs,prefetch_mem);
+               /*The above fucntion will set the cache_rows using memory as 
the limit*/
+       }
        else {
+
           if (!prefetch_mem){
-                       prefetch_rows = cache_rows;
+                       prefetch_rows = cache_rows; /*use the RowCacheSize*/
           }
        }
-               
-       
-    
+
+       if (cache_rows <= prefetch_rows){
+               cache_rows=prefetch_rows;
+               /* is prefetch_rows are greater than the RowCahceSize then use 
prefetch_rows*/
+       }
+
        OCIAttrSet_log_stat(imp_sth->stmhp, OCI_HTYPE_STMT,
                                                &prefetch_mem,  
sizeof(prefetch_mem), OCI_ATTR_PREFETCH_MEMORY,
                                                imp_sth->errhp, status);
 
        if (status != OCI_SUCCESS) {
                oci_error(h, imp_sth->errhp, status,
-                               "OCIAttrSet 
OCI_ATTR_PREFETCH_ROWS/OCI_ATTR_PREFETCH_MEMORY");
+                               "OCIAttrSet OCI_ATTR_PREFETCH_MEMORY");
                ++num_errors;
        }
 
@@ -2696,26 +2721,27 @@
        }
 
     imp_sth->rs_array_size=cache_rows;
-    
-    if (max_cache_rows){
+    /*set the size of the array buffer*/
+
+    if (max_cache_rows){/* limited by a cursor or something else*/
                imp_sth->rs_array_size=max_cache_rows;
-       } 
-       
-       
-       if (imp_sth->row_cache_off){
+       }
+
+
+       if (imp_sth->row_cache_off){/*set the size of the Rows in Cache value*/
                imp_dbh->RowsInCache =1;
-       } 
+       }
        else {
                imp_dbh->RowsInCache=imp_sth->rs_array_size;
        }
-       
-       if (DBIS->debug >= 3 || dbd_verbose >= 3 || oci_warn)
+
+       if (DBIS->debug >= 3 || dbd_verbose >= 3 || oci_warn) /*will also 
display if oci_want is on*/
                PerlIO_printf(DBILOGFP,
-                       "       cache settings RowCacheSize=%d, 
OCI_ATTR_PREFETCH_ROWS %lu, OCI_ATTR_PREFETCH_MEMORY %lu Rows per Fetch=%d, 
Multiple Row Fetch off=%d\n",
-                       imp_dbh->RowCacheSize,(unsigned long) (prefetch_rows), 
(unsigned long) (prefetch_mem),cache_rows,imp_sth->row_cache_off);
+                       "       cache settings RowCacheSize=%d, 
OCI_ATTR_PREFETCH_ROWS=%lu, OCI_ATTR_PREFETCH_MEMORY=%lu, Rows per Fetch=%d, 
Multiple Row Fetch=%s\n",
+                       imp_dbh->RowCacheSize,(unsigned long) (prefetch_rows), 
(unsigned long) (prefetch_mem),cache_rows,(imp_sth->row_cache_off)?"Off":"On");
+
 
 
-   
        return num_errors;
 }
 
@@ -3358,6 +3384,7 @@
        }/* end define of filed struct[i] fbh*/
 
        imp_sth->est_width = est_width;
+
        sth_set_row_cache(h, imp_sth,
                        (imp_dbh->max_nested_cursors) ? 0 :nested_cursors ,
                        (int)num_fields, has_longs );
@@ -3366,6 +3393,8 @@
        imp_sth->eod_errno = 0;
        rs_array_init(imp_sth);
 
+
+
        /* now set up the oci call with define by pos*/
        for(i=1; i <= num_fields; ++i) {
                imp_fbh_t *fbh = &imp_sth->fbh[i-1];
@@ -3373,7 +3402,6 @@
                /* add space for STRING null term, or VAR len prefix */
                sb4 define_len = (ftype==94||ftype==95) ? 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);
 
@@ -3506,11 +3534,11 @@
                if (imp_sth->fetch_orient != OCI_DEFAULT) {
                        if (imp_sth->exe_mode!=OCI_STMT_SCROLLABLE_READONLY)
                                croak ("attempt to use a scrollable cursor 
without first setting ora_exe_mode to OCI_STMT_SCROLLABLE_READONLY\n") ;
-                               
+
                        if (DBIS->debug >= 4 || dbd_verbose >= 4 )
                                PerlIO_printf(DBILOGFP,"        Scrolling 
Fetch, postion before fetch=%d, Orientation = %s , Fetchoffset =%d\n",
                                        
imp_sth->fetch_position,oci_fetch_options(imp_sth->fetch_orient),imp_sth->fetch_offset);
-                                       
+
                        OCIStmtFetch_log_stat(imp_sth->stmhp, imp_sth->errhp,1, 
imp_sth->fetch_orient,imp_sth->fetch_offset, status);
                                /*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*/
@@ -3519,20 +3547,21 @@
                        if (DBIS->debug >= 4 || dbd_verbose >= 4 )
                                PerlIO_printf(DBILOGFP,"        Scrolling 
Fetch, postion after fetch=%d\n",imp_sth->fetch_position);
 
-               } 
+               }
                else {
-               
+
                        if (imp_sth->row_cache_off){ /*Do not use array fetch 
or local cache */
                                OCIStmtFetch_log_stat(imp_sth->stmhp, 
imp_sth->errhp,1,(ub2)OCI_FETCH_NEXT, OCI_DEFAULT, status);
                                imp_sth->rs_fetch_count++;
                                imp_sth->rs_array_idx=0;
-                               
+
                        }
                        else {  /*Array Fetch the New Noraml Super speedy and 
very nice*/
-                                       
+
                                imp_dbh->RowsInCache--;
                                imp_sth->rs_array_idx++;
-                               
+/*                                     PerlIO_printf(DBILOGFP," /n/n 
rs_array_num_rows=%d,imp_sth->rs_array_idx=%d\n",imp_sth->rs_array_idx,imp_sth->rs_array_num_rows);*/
+
                                if 
(imp_sth->rs_array_num_rows<=imp_sth->rs_array_idx && 
(imp_sth->rs_array_status==OCI_SUCCESS || 
imp_sth->rs_array_status==OCI_SUCCESS_WITH_INFO)) {
                                        
OCIStmtFetch_log_stat(imp_sth->stmhp,imp_sth->errhp,imp_sth->rs_array_size,(ub2)OCI_FETCH_NEXT,OCI_DEFAULT,status);
                                        imp_sth->rs_array_status=status;
@@ -3542,12 +3571,12 @@
                                        }
                                        OCIAttrGet_stmhp_stat(imp_sth, 
&imp_sth->rs_array_num_rows,0,OCI_ATTR_ROWS_FETCHED, status);
                                        imp_sth->rs_array_idx=0;
-                                       imp_dbh->RowsInCache 
=imp_sth->rs_array_size; 
-                               /*      if (DBIS->debug >= 4 || dbd_verbose >= 
4 || oci_warn)
-                                                       
PerlIO_printf(DBILOGFP," fetch count=%d\n",imp_sth->rs_fetch_count);*/
-                               
-                               }               
-                                               
+                                       imp_dbh->RowsInCache 
=imp_sth->rs_array_size;
+                                       if (DBIS->debug >= 4 || dbd_verbose >= 
4 || oci_warn)
+                                               
PerlIO_printf(DBILOGFP,"...Fetched %d rows\n",imp_sth->rs_array_num_rows);
+
+                               }
+
                                if 
(imp_sth->rs_array_num_rows>imp_sth->rs_array_idx)   /* set status to success 
if rows in cache */
                                        status=OCI_SUCCESS;
                                else
@@ -3597,6 +3626,7 @@
                ub1* row_data           = 
&fb_ary->abuf[0]+(fb_ary->bufl*imp_sth->rs_array_idx);
                SV *sv                          = AvARRAY(av)[i]; /* Note: we 
(re)use the SV in the AV  */;
 
+
                if (DBIS->debug >= 4 || dbd_verbose >= 4 ) {
                        PerlIO_printf(DBILOGFP, "       field #%d with 
rc=%d(%s)\n",i+1,rc,oci_col_return_codes(rc));
                }

Reply via email to