Author: byterock
Date: Thu Jul 16 12:00:52 2009
New Revision: 13069
Modified:
dbd-oracle/branches/rs_array/dbdimp.c
dbd-oracle/branches/rs_array/dbdimp.h
dbd-oracle/branches/rs_array/oci8.c
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 Thu Jul 16 12:00:52 2009
@@ -2956,6 +2956,7 @@
dTHR;
dTHX;
int row_count = 0;
+ int ext_fetch = 1;
int debug = DBIS->debug;
int outparams = (imp_sth->out_params_av) ? AvFILL(imp_sth->out_params_av)+1 : 0;
D_imp_dbh_from_sth;
@@ -2993,86 +2994,121 @@
if (!phs->out_prepost_exec(sth, imp_sth, phs, 1))
return -2; /* out_prepost_exec already called ora_error() */
}
- else
- if (SvTYPE(sv) == SVt_RV && SvTYPE(SvRV(sv)) == SVt_PVAV) {
- if (debug >= 2 || dbd_verbose >= 3 )
- PerlIO_printf(DBILOGFP,
- " with %s = [] (len %ld/%ld, indp %d, otype %d, ptype %d)\n",
- phs->name,
- (long)phs->alen, (long)phs->maxlen, phs->indp,
- phs->ftype, (int)SvTYPE(sv));
- av_clear((AV*)SvRV(sv));
- }
- else
- /* Some checks for mutated storage since we pointed oracle at it. */
- if (SvTYPE(sv) != phs->sv_type
- || (SvOK(sv) && !SvPOK(sv))
- /* SvROK==!SvPOK so cursor (SQLT_CUR) handle will call dbd_rebind_ph */
- /* that suits us for now */
- || SvPVX(sv) != phs->progv
- || (SvPOK(sv) && SvCUR(sv) > UB2MAXVAL)
- ) {
- if (!dbd_rebind_ph(sth, imp_sth, phs))
- croak("Can't rebind placeholder %s", phs->name);
- }
- else {
- /* String may have grown or shrunk since it was bound */
- /* so tell Oracle about it's current length */
- ub2 prev_alen = phs->alen;
- phs->alen = (SvOK(sv)) ? SvCUR(sv) + phs->alen_incnull : 0+phs->alen_incnull;
+ else {
+ if (SvTYPE(sv) == SVt_RV && SvTYPE(SvRV(sv)) == SVt_PVAV) {
if (debug >= 2 || dbd_verbose >= 3 )
PerlIO_printf(DBILOGFP,
- " with %s = '%.*s' (len %ld(%ld)/%ld, indp %d, otype %d, ptype %d)\n",
- phs->name, (int)phs->alen,
- (phs->indp == -1) ? "" : SvPVX(sv),
- (long)phs->alen, (long)prev_alen, (long)phs->maxlen, phs->indp,
- phs->ftype, (int)SvTYPE(sv));
+ " with %s = [] (len %ld/%ld, indp %d, otype %d, ptype %d)\n",
+ phs->name,
+ (long)phs->alen, (long)phs->maxlen, phs->indp,
+ phs->ftype, (int)SvTYPE(sv));
+
+ av_clear((AV*)SvRV(sv));
+ }
+ else {
+ /* Some checks for mutated storage since we pointed oracle at it. */
+ if (SvTYPE(sv) != phs->sv_type
+ || (SvOK(sv) && !SvPOK(sv))
+ /* SvROK==!SvPOK so cursor (SQLT_CUR) handle will call dbd_rebind_ph */
+ /* that suits us for now */
+ || SvPVX(sv) != phs->progv
+ || (SvPOK(sv) && SvCUR(sv) > UB2MAXVAL)
+ ) {
+ if (!dbd_rebind_ph(sth, imp_sth, phs))
+ croak("Can't rebind placeholder %s", phs->name);
+ }
+ else {
+ /* String may have grown or shrunk since it was bound */
+ /* so tell Oracle about it's current length */
+ ub2 prev_alen = phs->alen;
+ phs->alen = (SvOK(sv)) ? SvCUR(sv) + phs->alen_incnull : 0+phs->alen_incnull;
+ if (debug >= 2 || dbd_verbose >= 3 )
+ PerlIO_printf(DBILOGFP,
+ " with %s = '%.*s' (len %ld(%ld)/%ld, indp %d, otype %d, ptype %d)\n",
+ phs->name, (int)phs->alen,
+ (phs->indp == -1) ? "" : SvPVX(sv),
+ (long)phs->alen, (long)prev_alen, (long)phs->maxlen, phs->indp,
+ phs->ftype, (int)SvTYPE(sv));
+ }
}
}
}
+ }
- if (DBIc_has(imp_dbh,DBIcf_AutoCommit) && !is_select) {
- imp_sth->exe_mode=OCI_COMMIT_ON_SUCCESS;
- /* we don't AutoCommit on select so LOB locators work */
- } else if(imp_sth->exe_mode!=OCI_STMT_SCROLLABLE_READONLY){
+ if (DBIc_has(imp_dbh,DBIcf_AutoCommit) && !is_select) {
+ imp_sth->exe_mode=OCI_COMMIT_ON_SUCCESS;
+ /* we don't AutoCommit on select so LOB locators work */
+ }
+ else if(imp_sth->exe_mode!=OCI_STMT_SCROLLABLE_READONLY){
+ imp_sth->exe_mode=OCI_DEFAULT;
+ }
- imp_sth->exe_mode=OCI_DEFAULT;
- }
+ 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));
- 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 ? ( imp_sth->row_cache_off ? 0 : imp_sth->rs_array_size) : 1),
- 0, 0, 0,(ub4)imp_sth->exe_mode,status);
+ if (is_select) {
+
+ if ((imp_sth->exe_mode!=OCI_STMT_SCROLLABLE_READONLY) && (!imp_sth->row_cache_off)){
+ ext_fetch=imp_sth->rs_array_size;
+ }
+ else{
+ ext_fetch=0;
+ }
+ }
+ OCIStmtExecute_log_stat(imp_sth->svchp, imp_sth->stmhp, imp_sth->errhp,
+ (ub4)ext_fetch,
+ 0, 0, 0,(ub4)imp_sth->exe_mode,status);
- if (status != OCI_SUCCESS){
+ /* 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 */
+
+
+ switch (status) {
+
+ case OCI_SUCCESS: /*normal case */
+ if (debug >= 2 || dbd_verbose >= 3 )
+ PerlIO_printf(DBILOGFP,"Statement Executed Succesfully!!\n");
+ break;
+
+ case OCI_NO_DATA: /* selected all the rows at exe*/
+
+ 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"));
+ }
+ break;
+
+ case OCI_SUCCESS_WITH_INFO:/* something wrong but I still worked */
- 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 */
+ if (imp_sth->ret_long || imp_sth->ret_lobs) {
+ if (!DBIcf_LongTruncOk) {
+ oci_error(sth, imp_sth->errhp, status, ora_sql_error(imp_sth,"OCIStmtExecute"));
+ }
+ }
+ else {
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;
}
- }
-
-
- /* Can do this here as it does not do a server round trip */
+ break;
+ default: /* really something wrong */
- OCIAttrGet_stmhp_stat(imp_sth, &row_count,0,OCI_ATTR_ROW_COUNT, status);
+ oci_error(sth, imp_sth->errhp, status, ora_sql_error(imp_sth,"OCIStmtExecute"));
+ return -2;
+ break;
+ }
+ /* 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) = row_count;
- if (!imp_sth->row_cache_off){
+ if (!imp_sth->row_cache_off && (imp_sth->exe_mode!=OCI_STMT_SCROLLABLE_READONLY)){
/*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;
Modified: dbd-oracle/branches/rs_array/dbdimp.h
==============================================================================
--- dbd-oracle/branches/rs_array/dbdimp.h (original)
+++ dbd-oracle/branches/rs_array/dbdimp.h Thu Jul 16 12:00:52 2009
@@ -79,6 +79,7 @@
ub4 piece_size; /*used in callback to set the size of the piece to get*/
int has_lobs; /*Statement has bound LOBS */
int ret_lobs; /*Statement returns LOBS */
+ bool ret_long; /* Statement returns a Long */
lob_refetch_t *lob_refetch;
int nested_cursor; /* cursors fetched from SELECTs */
AV *bind_tuples; /* Bind tuples in array execute, or NULL */
Modified: dbd-oracle/branches/rs_array/oci8.c
==============================================================================
--- dbd-oracle/branches/rs_array/oci8.c (original)
+++ dbd-oracle/branches/rs_array/oci8.c Thu Jul 16 12:00:52 2009
@@ -981,7 +981,7 @@
OCIAttrGet_stmhp_stat(imp_sth, &imp_sth->stmt_type, 0, OCI_ATTR_STMT_TYPE, status);
if (DBIS->debug >= 3 || dbd_verbose >= 3 )
- PerlIO_printf(DBILOGFP, " dbd_st_prepare'd sql %s (pl%d, auto_lob%d, check_sql%d)\n",
+ PerlIO_printf(DBILOGFP, " dbd_st_prepare'd sql %s (pl%d, auto_lob%d, check_sql%d)\n",
oci_stmt_type_name(imp_sth->stmt_type),
oparse_lng, imp_sth->auto_lob, ora_check_sql);
@@ -3222,17 +3222,17 @@
fbh->ftype = 94; /* VAR form */
fbh->fetch_func = fetch_func_varfield;
++has_longs;
-
+ imp_sth->ret_long=1;
}
break;
case ORA_LONGRAW: /* LONG RAW */
if (imp_sth->clbk_lob){ /*get by peice with callback a slow*/
- fbh->clbk_lob = 1;
+ fbh->clbk_lob = 1;
fbh->define_mode = OCI_DYNAMIC_FETCH; /* piecwise fetch*/
fbh->disize = imp_sth->long_readlen; /*user set max value for the fetch*/
fbh->piece_size = imp_sth->piece_size; /*the size for each piece*/
- fbh->fetch_cleanup = fetch_cleanup_pres_lobs; /* clean up buffer before each fetch*/
+ fbh->fetch_cleanup = fetch_cleanup_pres_lobs; /* clean up buffer before each fetch*/
if (!imp_sth->piece_size){ /*if not set use max value*/
imp_sth->piece_size=imp_sth->long_readlen;
@@ -3244,7 +3244,7 @@
}
else if (imp_sth->piece_lob){ /*get by peice with polling slowest*/
- fbh->piece_lob = 1;
+ fbh->piece_lob = 1;
fbh->define_mode = OCI_DYNAMIC_FETCH; /* piecwise fetch*/
fbh->disize = imp_sth->long_readlen; /*user set max value for the fetch*/
fbh->piece_size = imp_sth->piece_size; /*the size for each piece*/
@@ -3262,6 +3262,7 @@
fbh->ftype = 95; /* VAR form */
fbh->fetch_func = fetch_func_varfield;
++has_longs;
+ imp_sth->ret_long=1;
}
break;
@@ -3567,13 +3568,20 @@
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);
+ 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*/
+ 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 (DBIS->debug >= 4 || dbd_verbose >= 4 )
PerlIO_printf(DBILOGFP," Scrolling Fetch, postion after fetch=%d\n",imp_sth->fetch_position);
@@ -3684,7 +3692,8 @@
/* else fall through and let rc trigger failure below */
}
- if (rc == 0 || /* the normal case*/
+ if (rc == 0 || /* the normal case*/
+ rc == 35 || /* in case it is a scroll fetch?? */
(rc == 1406 && DBIc_has(imp_sth,DBIcf_LongTruncOk))/*Field Truncaded*/) {
if (fbh->fetch_func) {
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.