[svn:dbd-oracle] r11998 - dbd-oracle/trunk

[email protected]
Newsgroups perl.dbd.oracle.changes
Message-ID <[email protected]>
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);
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.