Author: byterock
Date: Fri Oct 24 11:44:53 2008
New Revision: 11998

Modified:
   dbd-oracle/trunk/dbdimp.c
   dbd-oracle/trunk/oci8.c

Log:
check partial fix for  RT 38749

Modified: dbd-oracle/trunk/dbdimp.c
==============================================================================
--- dbd-oracle/trunk/dbdimp.c   (original)
+++ dbd-oracle/trunk/dbdimp.c   Fri Oct 24 11:44:53 2008
@@ -2325,103 +2325,114 @@
 int
 pp_exec_rset(SV *sth, imp_sth_t *imp_sth, phs_t *phs, int pre_exec)
 {
-       dTHX;
-    if (pre_exec) {    /* pre-execute - allocate a statement handle */
-       dSP;
-       D_imp_dbh_from_sth;
-       HV *init_attr = newHV();
-       int count;
-       sword status;
+   dTHX;
+   if (pre_exec) {     /* pre-execute - allocate a statement handle */
+        dSP;
+        D_imp_dbh_from_sth;
+        HV *init_attr = newHV();
+        int count;
+        sword status;
 
        if (DBIS->debug >= 3 || dbd_verbose >=3)
            PerlIO_printf(DBILOGFP, " pp_exec_rset bind %s - allocating new 
sth...\n", phs->name);
 
-
-       /* extproc deallocates everything for us */
-       if (is_extproc)
+        /* extproc deallocates everything for us */
+        if (is_extproc)
            return 1;
 
-       if (!phs->desc_h || 1) { /* XXX phs->desc_t != OCI_HTYPE_STMT) */
+        if (!phs->desc_h || 1) { /* XXX phs->desc_t != OCI_HTYPE_STMT) */
            if (phs->desc_h) {
                        OCIHandleFree_log_stat(phs->desc_h, phs->desc_t, 
status);
                        phs->desc_h = NULL;
            }
            phs->desc_t = OCI_HTYPE_STMT;
            OCIHandleAlloc_ok(imp_sth->envhp, &phs->desc_h, phs->desc_t, 
status);
-       }
+        }
 
 
-       phs->progv = (char*)&phs->desc_h;
-       phs->maxlen = 0;
+        phs->progv = (char*)&phs->desc_h;
+        phs->maxlen = 0;
 
-       OCIBindByName_log_stat(imp_sth->stmhp, &phs->bndhp, imp_sth->errhp,
-               (text*)phs->name, (sb4)strlen(phs->name),
-               phs->progv, 0,
-               (ub2)phs->ftype, 0, /* using &phs->indp triggers ORA-01001 
errors! */
-               NULL, 0, 0, NULL, OCI_DEFAULT, status);
-       if (status != OCI_SUCCESS) {
+        OCIBindByName_log_stat(imp_sth->stmhp, &phs->bndhp, imp_sth->errhp,
+               (text*)phs->name,
+               (sb4)strlen(phs->name),
+               phs->progv,
+               0,
+               (ub2)phs->ftype,
+               NULL, /* using &phs->indp triggers ORA-01001 errors! */
+               NULL,
+               0,
+               0,
+               NULL,
+               OCI_DEFAULT,
+               status);
+
+        if (status != OCI_SUCCESS) {
            oci_error(sth, imp_sth->errhp, status, "OCIBindByName SQLT_RSET");
            return 0;
-       }
-       ENTER;
-       SAVETMPS;
-       PUSHMARK(SP);
-       XPUSHs(sv_2mortal(newRV((SV*)DBIc_MY_H(imp_dbh))));
-       XPUSHs(sv_2mortal(newRV((SV*)init_attr)));
-       PUTBACK;
-       count = perl_call_pv("DBI::_new_sth", G_ARRAY);
-       SPAGAIN;
-       if (count != 2)
-           croak("panic: DBI::_new_sth returned %d values instead of 2", 
count);
-       (void)POPs;                     /* discard inner handle */
-       sv_setsv(phs->sv, POPs);        /* save outer handle */
-       SvREFCNT_dec(init_attr);
-       PUTBACK;
-       FREETMPS;
-       LEAVE;
-       if (DBIS->debug >= 3 || dbd_verbose >=3)
+        }
+
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+        XPUSHs(sv_2mortal(newRV((SV*)DBIc_MY_H(imp_dbh))));
+        XPUSHs(sv_2mortal(newRV((SV*)init_attr)));
+        PUTBACK;
+        count = perl_call_pv("DBI::_new_sth", G_ARRAY);
+        SPAGAIN;
+
+        if (count != 2)
+            croak("panic: DBI::_new_sth returned %d values instead of 2", 
count);
+
+        (void)POPs;                    /* discard inner handle */
+        sv_setsv(phs->sv, POPs);       /* save outer handle */
+        SvREFCNT_dec(init_attr);
+        PUTBACK;
+        FREETMPS;
+        LEAVE;
+        if (DBIS->debug >= 3 || dbd_verbose >=3)
            PerlIO_printf(DBILOGFP, "   pp_exec_rset   bind %s - allocated 
%s...\n",
                phs->name, neatsvpv(phs->sv, 0));
 
-    }
+   }
     else {             /* post-execute - setup the statement handle */
-       dTHR;
-       SV * sth_csr = phs->sv;
-       D_impdata(imp_sth_csr, imp_sth_t, sth_csr);
+        dTHR;
+        SV * sth_csr = phs->sv;
+        D_impdata(imp_sth_csr, imp_sth_t, sth_csr);
 
-       if (DBIS->debug >= 3 || dbd_verbose >=3 )
+        if (DBIS->debug >= 3 || dbd_verbose >=3 )
            PerlIO_printf(DBILOGFP, "       bind %s - initialising new %s for 
cursor 0x%lx...\n",
                phs->name, neatsvpv(sth_csr,0), (unsigned long)phs->progv);
 
-       /* copy appropriate handles and atributes from parent statement */
-       imp_sth_csr->envhp      = imp_sth->envhp;
-       imp_sth_csr->errhp      = imp_sth->errhp;
-       imp_sth_csr->srvhp      = imp_sth->srvhp;
-       imp_sth_csr->svchp      = imp_sth->svchp;
-       imp_sth_csr->auto_lob   = imp_sth->auto_lob;
-       imp_sth_csr->pers_lob   = imp_sth->pers_lob;
-       imp_sth_csr->clbk_lob   = imp_sth->clbk_lob;
-       imp_sth_csr->piece_size = imp_sth->piece_size;
-       imp_sth_csr->piece_lob  = imp_sth->piece_lob;
-       imp_sth_csr->is_child   = 1; /*no prefetching on a cursor or sp*/
-
-
-       /* assign statement handle from placeholder descriptor  */
-       imp_sth_csr->stmhp = (OCIStmt*)phs->desc_h;
-       phs->desc_h = NULL;               /* tell phs that we own it now        
*/
-
-       /* force stmt_type since OCIAttrGet(OCI_ATTR_STMT_TYPE) doesn't work! */
-       imp_sth_csr->stmt_type = OCI_STMT_SELECT;
-       imp_sth_csr->rs_array_on=1;     /* turn on array fetch for ref cursors 
*/
-       DBIc_IMPSET_on(imp_sth_csr);
-
-       /* set ACTIVE so dbd_describe doesn't do explicit OCI describe */
-       DBIc_ACTIVE_on(imp_sth_csr);
-       if (!dbd_describe(sth_csr, imp_sth_csr)) {
-           return 0;
-       }
-    }
-    return 1;
+        /* copy appropriate handles and atributes from parent statement        
*/
+        imp_sth_csr->envhp      = imp_sth->envhp;
+        imp_sth_csr->errhp      = imp_sth->errhp;
+        imp_sth_csr->srvhp      = imp_sth->srvhp;
+        imp_sth_csr->svchp      = imp_sth->svchp;
+        imp_sth_csr->auto_lob   = imp_sth->auto_lob;
+        imp_sth_csr->pers_lob   = imp_sth->pers_lob;
+        imp_sth_csr->clbk_lob   = imp_sth->clbk_lob;
+        imp_sth_csr->piece_size = imp_sth->piece_size;
+        imp_sth_csr->piece_lob  = imp_sth->piece_lob;
+        imp_sth_csr->is_child   = 1; /*no prefetching on a cursor or sp*/
+
+
+        /* assign statement handle from placeholder descriptor */
+        imp_sth_csr->stmhp = (OCIStmt*)phs->desc_h;
+        phs->desc_h = NULL;              /* tell phs that we own it now        
*/
+
+        /* force stmt_type since OCIAttrGet(OCI_ATTR_STMT_TYPE) doesn't work! 
*/
+        imp_sth_csr->stmt_type = OCI_STMT_SELECT;
+        imp_sth_csr->rs_array_on=1;    /* turn on array fetch for ref cursors 
*/
+        DBIc_IMPSET_on(imp_sth_csr);
+
+        /* set ACTIVE so dbd_describe doesn't do explicit OCI describe */
+        DBIc_ACTIVE_on(imp_sth_csr);
+        if (!dbd_describe(sth_csr, imp_sth_csr)) {
+            return 0;
+        }
+   }
+   return 1;
 }
 
 static int
@@ -2511,26 +2522,25 @@
                phs->name, (SvPOK(phs->sv) ? neatsvpv(phs->sv,10) : 
"NULL"),(SvUTF8(phs->sv) ? "is-utf8" : "not-utf8"),
                phs->ftype,sql_typecode_name(phs->ftype),phs->csid, 
phs->csform, phs->is_inout);
 
-
     switch (phs->ftype) {
-    case ORA_VARCHAR2_TABLE:
-               done = dbd_rebind_ph_varchar2_table(sth, imp_sth, phs);
-               break;
-       case ORA_NUMBER_TABLE:
-               done = dbd_rebind_ph_number_table(sth, imp_sth, phs);
-               break;
-    case SQLT_CLOB:
-    case SQLT_BLOB:
-           done = dbd_rebind_ph_lob(sth, imp_sth, phs);
-           break;
-    case SQLT_RSET:
-           done = dbd_rebind_ph_rset(sth, imp_sth, phs);
-           break;
-        case ORA_XMLTYPE:
-           done = dbd_rebind_ph_xml(sth, imp_sth, phs);
-           break;
-    default:
-           done = dbd_rebind_ph_char(imp_sth, phs);
+           case ORA_VARCHAR2_TABLE:
+                       done = dbd_rebind_ph_varchar2_table(sth, imp_sth, phs);
+                       break;
+               case ORA_NUMBER_TABLE:
+                       done = dbd_rebind_ph_number_table(sth, imp_sth, phs);
+                       break;
+           case SQLT_CLOB:
+           case SQLT_BLOB:
+                   done = dbd_rebind_ph_lob(sth, imp_sth, phs);
+                   break;
+           case SQLT_RSET:
+                   done = dbd_rebind_ph_rset(sth, imp_sth, phs);
+                   break;
+                case ORA_XMLTYPE:
+                   done = dbd_rebind_ph_xml(sth, imp_sth, phs);
+                   break;
+           default:
+                   done = dbd_rebind_ph_char(imp_sth, phs);
     }
 
     if (done == 2) { /* the dbd_rebind_* did the OCI bind call itself 
successfully */

Modified: dbd-oracle/trunk/oci8.c
==============================================================================
--- dbd-oracle/trunk/oci8.c     (original)
+++ dbd-oracle/trunk/oci8.c     Fri Oct 24 11:44:53 2008
@@ -155,21 +155,20 @@
        dTHX;
     SV *sv;
     switch (status) {
-    case OCI_SUCCESS:                  return "SUCCESS";
-    case OCI_SUCCESS_WITH_INFO:        return "SUCCESS_WITH_INFO";
-    case OCI_NEED_DATA:                        return "NEED_DATA";
-    case OCI_NO_DATA:                  return "NO_DATA";
-    case OCI_ERROR:                            return "ERROR";
-    case OCI_INVALID_HANDLE:   return "INVALID_HANDLE";
-    case OCI_STILL_EXECUTING:  return "STILL_EXECUTING";
-    case OCI_CONTINUE:                 return "CONTINUE";
+       case OCI_SUCCESS:                       return "SUCCESS";
+       case OCI_SUCCESS_WITH_INFO:     return "SUCCESS_WITH_INFO";
+       case OCI_NEED_DATA:                     return "NEED_DATA";
+       case OCI_NO_DATA:                       return "NO_DATA";
+       case OCI_ERROR:                         return "ERROR";
+       case OCI_INVALID_HANDLE:        return "INVALID_HANDLE";
+               case OCI_STILL_EXECUTING:       return "STILL_EXECUTING";
+       case OCI_CONTINUE:                      return "CONTINUE";
     }
     sv = sv_2mortal(newSVpv("",0));
     sv_grow(sv, 50);
     sprintf(SvPVX(sv),"(UNKNOWN OCI STATUS %d)", status);
     return SvPVX(sv);
 }
-
 /* the various modes used in OCI */
 char *
 oci_define_options(ub4 options)
@@ -3060,7 +3059,7 @@
 
                        if (imp_sth->rs_array_on) {     /* if array fetch on, 
fetch only if not in cache */
                                imp_sth->rs_array_idx++;
-                               if 
(imp_sth->rs_array_num_rows<=imp_sth->rs_array_idx && 
imp_sth->rs_array_status==OCI_SUCCESS) {
+                               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;
                                        OCIAttrGet_stmhp_stat(imp_sth, 
&imp_sth->rs_array_num_rows,0,OCI_ATTR_ROWS_FETCHED, status);

Reply via email to