Author: byterock
Date: Wed Jul 15 12:16:31 2009
New Revision: 13063
Modified:
dbd-oracle/branches/rs_array/dbdimp.c
dbd-oracle/branches/rs_array/dbdimp.h
dbd-oracle/branches/rs_array/oci8.c
dbd-oracle/branches/rs_array/t/34pres_lobs.t
Log:
working version
Modified: dbd-oracle/branches/rs_array/dbdimp.c
==============================================================================
--- dbd-oracle/branches/rs_array/dbdimp.c (original)
+++ dbd-oracle/branches/rs_array/dbdimp.c Wed Jul 15 12:16:31 2009
@@ -2955,7 +2955,7 @@
{
dTHR;
dTHX;
- ub4 row_count = 0;
+ int row_count = 0;
int debug = DBIS->debug;
int outparams = (imp_sth->out_params_av) ? AvFILL(imp_sth->out_params_av)+1 : 0;
D_imp_dbh_from_sth;
@@ -3045,28 +3045,54 @@
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 ? ( imp_sth->row_cache_off ? 0 : imp_sth->rs_array_size) : 1),
0, 0, 0,(ub4)imp_sth->exe_mode,status);
-
- if (status != OCI_SUCCESS) { /* may be OCI_ERROR or OCI_SUCCESS_WITH_INFO etc */
- /* we record the error even for OCI_SUCCESS_WITH_INFO */
- oci_error(sth, imp_sth->errhp, status, ora_sql_error(imp_sth,"OCIStmtExecute"));
- /* but only bail out here if not OCI_SUCCESS_WITH_INFO */
- if (status != OCI_SUCCESS_WITH_INFO)
- return -2;
+ if (status != OCI_SUCCESS){
+
+ if ((status != OCI_NO_DATA) && (imp_sth->row_cache_off) && (is_select)) {
+ /* may be OCI_ERROR or OCI_SUCCESS_WITH_INFO etc */
+ /* but OCI_NO_DATA with a select means the exe got all the rows in 1 shot (a warning really according to oralce )
+ /* we record the error even for OCI_SUCCESS_WITH_INFO */
+ oci_error(sth, imp_sth->errhp, status, ora_sql_error(imp_sth,"OCIStmtExecute"));
+ /* but only bail out here if not OCI_SUCCESS_WITH_INFO */
+ if (status != OCI_SUCCESS_WITH_INFO)
+ return -2;
+ }
}
- if (is_select) {
+
+ /* Can do this here as it does not do a server round trip */
+
+ OCIAttrGet_stmhp_stat(imp_sth, &row_count,0,OCI_ATTR_ROW_COUNT, status);
+
+
+
+ if (is_select) { /*only need this on a select*/
DBIc_ACTIVE_on(imp_sth);
- DBIc_ROW_COUNT(imp_sth) = 0; /* reset (possibly re-exec'ing) */
- row_count = 0;
- /*reinit the rs_array as well
- as we may have more thatn one exe on a prepare*/
- rs_array_init(imp_sth);
- }
- else {
- OCIAttrGet_stmhp_stat(imp_sth, &row_count, 0, OCI_ATTR_ROW_COUNT, status);
+ DBIc_ROW_COUNT(imp_sth) = row_count;
+
+ if (!imp_sth->row_cache_off){
+ /*reinit the rs_array as well if we have to
+ as we may have more than one exe on a prepare*/
+ imp_sth->rs_fetch_count = 1;
+ if (row_count < imp_sth->rs_array_size){ /*got them all*/
+ imp_sth->rs_all_fetched = 1;
+
+ }
+ imp_sth->rs_array_status =OCI_SUCCESS;
+ imp_sth->rs_array_num_rows = row_count;
+ imp_dbh->RowsInCache = row_count;
+ imp_sth->rs_array_idx =-1;
+
+
+ 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));
+
+ }
+
+
+
}
if (debug >= 2 || dbd_verbose >= 3 ) {
Modified: dbd-oracle/branches/rs_array/dbdimp.h
==============================================================================
--- dbd-oracle/branches/rs_array/dbdimp.h (original)
+++ dbd-oracle/branches/rs_array/dbdimp.h Wed Jul 15 12:16:31 2009
@@ -121,6 +121,7 @@
int rs_array_num_rows; /* num rows in last fetch */
int rs_array_idx; /* index of current row */
sword rs_array_status; /* status of last fetch */
+ int rs_all_fetched;
};
#define IMP_STH_EXECUTING 0x0001
@@ -347,7 +348,6 @@
void * oci_db_handle(imp_dbh_t *imp_dbh, int handle_type, int flags);
void * oci_st_handle(imp_sth_t *imp_sth, int handle_type, int flags);
void fb_ary_free(fb_ary_t *fb_ary);
-void rs_array_init(imp_sth_t *imp_sth);
Modified: dbd-oracle/branches/rs_array/oci8.c
==============================================================================
--- dbd-oracle/branches/rs_array/oci8.c (original)
+++ dbd-oracle/branches/rs_array/oci8.c Wed Jul 15 12:16:31 2009
@@ -2632,40 +2632,6 @@
return;
}
-void rs_array_init(imp_sth_t *imp_sth)
-{
- dTHX;
-/* if (imp_sth->rs_array_on!=1 ||
- imp_sth->rs_array_size<1 ||
- imp_sth->rs_array_size>128){
-
- imp_sth->rs_array_on=0;
- imp_sth->rs_array_size=1;
-
- }*/
- 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->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 --- */
@@ -2788,7 +2754,7 @@
*/
- /*if (DBIS->debug >= 3 || dbd_verbose >= 3 || oci_warn) /*will also display if oci_want is on*/
+ 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=%s\n",
imp_dbh->RowCacheSize,(unsigned long) (prefetch_rows), (unsigned long) (prefetch_mem),cache_rows,(imp_sth->row_cache_off)?"Off":"On");
@@ -3078,7 +3044,6 @@
/* set long_readlen for SELECT or PL/SQL with output placeholders */
imp_sth->long_readlen = long_readlen;
-PerlIO_printf(DBILOGFP, "\n\n SQL=%s\n\n",imp_sth->statement);
if (imp_sth->stmt_type != OCI_STMT_SELECT) { /* XXX DISABLED, see num_fields test below */
if (DBIS->debug >= 3 || dbd_verbose >= 3 )
@@ -3174,7 +3139,7 @@
fbh->name = SvPVX(fbh->name_sv);
fbh->ftype = 5; /* default: return as null terminated string */
- if (DBIS->debug >= 4 || dbd_verbose <= 4 )
+ 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);
switch (fbh->dbtype) {
@@ -3328,11 +3293,11 @@
if (imp_sth->pers_lob){ /*get as one peice fasted but limited to how big you can get.*/
fbh->pers_lob = 1;
- if (long_readlen){
- fbh->disize = fbh->disize*10; /*default size*/
+ if (!long_readlen){
+ fbh->disize = fbh->dbsize*10; /*default size*/
}
else {
- fbh->disize = long_readlen;/*user set max value for the fetch*/
+ fbh->disize = fbh->dbsize+long_readlen;/*user set max value for the fetch*/
}
if (fbh->dbtype == ORA_CLOB){
fbh->ftype = SQLT_CHR;
@@ -3426,7 +3391,7 @@
break;
}
- if (DBIS->debug >= 3 || dbd_verbose <= 3 )
+ if (DBIS->debug >= 3 || dbd_verbose >= 3 )
PerlIO_printf(DBILOGFP,
"Described col %2d: dbtype %d(%s), scale %d, prec %d, nullok %d, name %s\n"
" : dbsize %d, char_used %d, char_size %d, csid %d, csform %d(%s), disize %d\n",
@@ -3467,16 +3432,15 @@
imp_fbh_t *fbh = &imp_sth->fbh[i-1];
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;
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);
} else {
fbh->fb_ary = fb_ary_alloc(define_len, imp_sth->rs_array_size);
}
-
fb_ary = fbh->fb_ary;
if (fbh->ftype == SQLT_BIN) {
@@ -3489,7 +3453,7 @@
(dvoid*)&((OCIStmt **)fb_ary->abuf)[0],
OCI_HTYPE_STMT, status);
}
-
+
OCIDefineByPos_log_stat(imp_sth->stmhp,
&fbh->defnp,
imp_sth->errhp,
@@ -3502,8 +3466,7 @@
fb_ary->arcode,
fbh->define_mode,
status);
-
-
+
if (fbh->clbk_lob){
/* use a dynamic callback for persistent binary and char lobs*/
OCIDefineDynamic_log_stat(fbh->defnp,imp_sth->errhp,(dvoid *) fbh,status);
@@ -3540,7 +3503,7 @@
#ifdef OCI_ATTR_CHARSET_FORM
if ( (fbh->dbtype == 1) && fbh->csform ) {
/* csform may be 0 when talking to Oracle 8.0 database*/
- if (DBIS->debug >= 3 || dbd_verbose <= 3 )
+ if (DBIS->debug >= 3 || dbd_verbose >= 3 )
PerlIO_printf(DBILOGFP, " calling OCIAttrSet OCI_ATTR_CHARSET_FORM with csform=%d (%s)\n", fbh->csform,oci_csform_name(fbh->csform) );
OCIAttrSet_log_stat( fbh->defnp, (ub4) OCI_HTYPE_DEFINE, (dvoid *) &fbh->csform,
(ub4) 0, (ub4) OCI_ATTR_CHARSET_FORM, imp_sth->errhp, status );
@@ -3625,30 +3588,34 @@
}
else { /*Array Fetch the New Noraml Super speedy and very nice*/
+ /*PerlIO_printf(DBILOGFP,"run imp_sth->rs_array_num_rows=%d imp_sth->rs_array_idx=%d,rs_array_size=%d\n",imp_sth->rs_array_num_rows,imp_sth->rs_array_idx,imp_sth->rs_array_size);*/
-/* PerlIO_printf(DBILOGFP, " dbd_st_fetch fields...a\n");*/
imp_dbh->RowsInCache--;
imp_sth->rs_array_idx++;
- /*PerlIO_printf(DBILOGFP," \n imp_sth->rs_array_idx=%d,rs_array_num_rows=%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)) {
-/* PerlIO_printf(DBILOGFP, " dbd_st_fetch fields...b\n");*/
-
- 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;
- imp_sth->rs_fetch_count++;
- if (oci_warn && (imp_sth->rs_array_status == OCI_SUCCESS_WITH_INFO)) {
- oci_error(sth, imp_sth->errhp, status, "OCIStmtFetch");
+ if (imp_sth->rs_all_fetched){
+ imp_sth->rs_array_status = OCI_NO_DATA;
}
- 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,"...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 */
+ else {
+ 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;
+ imp_sth->rs_fetch_count++;
+ if (oci_warn && (imp_sth->rs_array_status == OCI_SUCCESS_WITH_INFO)) {
+ oci_error(sth, imp_sth->errhp, status, "OCIStmtFetch");
+ }
+ 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,"...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 */
+ /* if No data then all the rows are already in cache */
status=OCI_SUCCESS;
else
status=imp_sth->rs_array_status;
Modified: dbd-oracle/branches/rs_array/t/34pres_lobs.t
==============================================================================
--- dbd-oracle/branches/rs_array/t/34pres_lobs.t (original)
+++ dbd-oracle/branches/rs_array/t/34pres_lobs.t Wed Jul 15 12:16:31 2009
@@ -30,7 +30,7 @@
my $dbuser = $ENV{ORACLE_USERID} || 'scott/tiger';
my $dbh = DBI->connect($dsn, $dbuser, '', { RaiseError=>1,
AutoCommit=>1,
- PrintError => 0 ,LongReadLen=>10000000});
+ PrintError => 0 ,LongReadLen=>2000000});
# check that our db handle is good
my $ora_oci = DBD::Oracle::ORA_OCI(); # dualvar
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.