[svn:dbd-oracle] r11957 - in dbd-oracle/branches/utf8_ea_2: . t

[email protected]
Newsgroups perl.dbd.oracle.changes
Message-ID <[email protected]>
Author: byterock
Date: Fri Oct 10 13:45:17 2008
New Revision: 11957

Modified:
   dbd-oracle/branches/utf8_ea_2/dbdimp.c
   dbd-oracle/branches/utf8_ea_2/oci8.c
   dbd-oracle/branches/utf8_ea_2/t/26exe_array.t

Log:
working version still have to clean up a little before it goes in trunk

Modified: dbd-oracle/branches/utf8_ea_2/dbdimp.c
==============================================================================
--- dbd-oracle/branches/utf8_ea_2/dbdimp.c	(original)
+++ dbd-oracle/branches/utf8_ea_2/dbdimp.c	Fri Oct 10 13:45:17 2008
@@ -3093,18 +3093,20 @@
 }
 
 static int
-do_bind_array_exec(sth, imp_sth, phs,utf8)
+do_bind_array_exec(sth, imp_sth, phs,utf8,parma_index,tuples_utf8_av,tuples_status_av)
     SV *sth;
     imp_sth_t *imp_sth;
     phs_t *phs;
     int utf8;
-{
+    AV *tuples_utf8_av,*tuples_status_av;
+    int parma_index;
+    {
 	dTHX;
     sword status;
     ub1 csform;
 	ub2 csid;
 	int trace_level = DBIS->debug;
-
+    int i;
     OCIBindByName_log_stat(imp_sth->stmhp, &phs->bndhp, imp_sth->errhp,
             (text*)phs->name, (sb4)strlen(phs->name),
             0,
@@ -3170,7 +3172,27 @@
 	    * mixed utf8 and native (non-utf8) data, then it's a fatal problem
 	    * utf8 _compatible_ means, can be upgraded to utf8, ie. utf8 or ascii */
 	    if ((utf8 & ARRAY_BIND_NATIVE) && CS_IS_NOT_UTF8(csid)) {
-			croak("Can't mix utf8 and non-utf8 in array bind");
+			warn("what is my one=%d",av_len(tuples_utf8_av));
+			if (av_len(tuples_utf8_av+1)){
+				oratext  charsetname[OCI_NLS_MAXBUFSZ];
+				OCINlsCharSetIdToName(imp_sth->envhp,charsetname, sizeof(charsetname),csid );
+
+				for(i=0;i<av_len(tuples_utf8_av)+1;i++){
+					SV *err_svs[2];
+					SV *item;
+					item=*(av_fetch(tuples_utf8_av,i,0));
+					warn("what is my one=%d =%d\n",av_len(tuples_utf8_av),SvIV(item));
+					err_svs[0] = newSViv((IV)0);
+        			err_svs[1] = newSVpvf("DBD Oracle Warning: You have mixed utf8 and non-utf8 in an array bind in parameter#%d. This may result in corrupt data. The Query charset id=%d, name=%s",parma_index+1,csid,charsetname);
+        		    av_store(tuples_status_av,SvIV(item),
+                     newRV_noinc((SV *)(av_make(2, err_svs))));
+        		warn("what is my one=%d\n",av_len(tuples_utf8_av));
+				}
+        		/*av_store(tuples_status_av,tuple_index,
+                     newRV_noinc((SV *)(av_make(2, err_svs))));
+*/
+			}
+
 		}
 	    csid = utf8_csid; /* not al32utf8_csid here on purpose */
 	}
@@ -3231,7 +3253,7 @@
     D_imp_dbh_from_sth;
     sword status, exe_status;
     int is_select = (imp_sth->stmt_type == OCI_STMT_SELECT);
-    AV *tuples_av, *tuples_status_av, *columns_av;
+    AV *tuples_av, *tuples_status_av, *columns_av,*tuples_utf8_av;
     ub4 oci_mode;
     ub4 num_errs;
     int i,j;
@@ -3245,6 +3267,7 @@
     STRLEN len;
     int outparams = (imp_sth->out_params_av) ? AvFILL(imp_sth->out_params_av)+1 : 0;
 	int *utf8_flgs;
+    tuples_utf8_av=newAV();
 
     if (debug >= 2  || dbd_verbose >=2)
  		PerlIO_printf(DBILOGFP, "  ora_st_execute_array %s count=%d (%s %s %s)...\n",
@@ -3285,11 +3308,7 @@
         }
         tuples_status_av = (AV*)SvRV(tuples_status);
         av_fill(tuples_status_av, exe_count - 1);
-        /* Fill in 'unknown' exe count in every element (know not how to get
-           individual execute row counts from OCI). */
-        for(i = 0; (unsigned int) i < exe_count; i++) {
-            av_store(tuples_status_av, i, newSViv((IV)-1));
-        }
+
     } else {
         tuples_status_av = NULL;
     }
@@ -3313,7 +3332,14 @@
 	memset(utf8_flgs, 0, param_count*sizeof(int));
 
    	for(j = 0; (unsigned int) j < exe_count; j++) {
+		/* Fill in 'unknown' exe count in every element (know not how to get
+           individual execute row counts from OCI).
+           Moved it here as there is no need to iterate twice over it
+           this should speed it up somewhat for large binds*/
 
+		if (SvTRUE(tuples_status)){
+		    av_store(tuples_status_av, j, newSViv((IV)-1));
+		}
     	sv_p = av_fetch(tuples_av, j, 0);
         if(sv_p == NULL) {
             Safefree(phs);
@@ -3376,16 +3402,24 @@
 			/* update the utf8_flgs for this value */
 			if (SvUTF8(sv)) {
 				utf8_flgs[i] |= ARRAY_BIND_UTF8;
+				if (SvTRUE(tuples_status)){
+					av_push(tuples_utf8_av,newSViv(j));
+
+				}
+
+
 			}
 			else {
 				utf8_flgs[i] |= ARRAY_BIND_NATIVE;
+				warn("I may be i=%d,j=%d",i,j);
 			}
         	/* Do OCI bind calls on last iteration. */
         	if( ((unsigned int) j ) == exe_count - 1 ) {
-				if(!do_bind_array_exec(sth, imp_sth, phs[i], utf8_flgs[i])) {
-    				Safefree(phs);
-    				 Safefree(utf8_flgs);
-        		}
+
+				if(!do_bind_array_exec(sth, imp_sth, phs[i], utf8_flgs[i],i,tuples_utf8_av,tuples_status_av)) {
+   					Safefree(phs);
+   			 		Safefree(utf8_flgs);
+				}
 			}
     	}
   	}

Modified: dbd-oracle/branches/utf8_ea_2/oci8.c
==============================================================================
--- dbd-oracle/branches/utf8_ea_2/oci8.c	(original)
+++ dbd-oracle/branches/utf8_ea_2/oci8.c	Fri Oct 10 13:45:17 2008
@@ -658,50 +658,51 @@
 	if( bindp ) { /* For GCC not to warn on unused parameter*/ }
 
  		/* Check for bind values supplied by tuple array. */
-		tuples_av = phs->imp_sth->bind_tuples;
-		if(tuples_av) {
-		   	/* NOTE: we already checked the validity in ora_st_bind_for_array_exec(). */
-		   	sv_p = av_fetch(tuples_av, phs->imp_sth->rowwise ? (int)iter : phs->idx, 0);
-		   	av = (AV*)SvRV(*sv_p);
-		   	sv_p = av_fetch(av, phs->imp_sth->rowwise ? phs->idx : (int)iter, 0);
-			sv = *sv_p;
-	   		if(SvOK(sv)) {
-	     		*bufpp = SvPV(sv, phs_len);
-	     		phs->alen = (phs->alen_incnull) ? phs_len+1 : phs_len;
-	     		phs->indp = 0;
-	   		} else {
-	     		*bufpp = SvPVX(sv);
-	     		phs->alen = 0;
-	     		phs->indp = -1;
-	   		}
-    	}
-    	else
-    		if (phs->desc_h) {
-				*bufpp  = phs->desc_h;
-				phs->alen = 0;
-				phs->indp = 0;
-    	}
-    	else
-    		if (SvOK(phs->sv)) {
-				*bufpp  = SvPV(phs->sv, phs_len);
+	tuples_av = phs->imp_sth->bind_tuples;
+	if(tuples_av) {
+	   	/* NOTE: we already checked the validity in ora_st_bind_for_array_exec(). */
+	   	sv_p = av_fetch(tuples_av, phs->imp_sth->rowwise ? (int)iter : phs->idx, 0);
+	   	av = (AV*)SvRV(*sv_p);
+	   	sv_p = av_fetch(av, phs->imp_sth->rowwise ? phs->idx : (int)iter, 0);
+		sv = *sv_p;
+		if(SvOK(sv)) {
+	   		*bufpp = SvPV(sv, phs_len);
+	   		phs->alen = (phs->alen_incnull) ? phs_len+1 : phs_len;
+	   		phs->indp = 0;
+		} else {
+	   		*bufpp = SvPVX(sv);
+	   		phs->alen = 0;
+	   		phs->indp = -1;
+		}
+    }
+    else
+	if (phs->desc_h) {
+		*bufpp  = phs->desc_h;
+		phs->alen = 0;
+		phs->indp = 0;
+    }
+    else
+   	if (SvOK(phs->sv)) {
+		*bufpp  = SvPV(phs->sv, phs_len);
 		phs->alen = (phs->alen_incnull) ? phs_len+1 : phs_len;;
 		phs->indp = 0;
-   	}
-    else {
+	}
+   	else {
 		*bufpp  = SvPVX(phs->sv);	/* not actually used? */
 		phs->alen = 0;
 		phs->indp = -1;
-    }
-    *alenp  = phs->alen;
-    *indpp  = &phs->indp;
-    *piecep = OCI_ONE_PIECE;
-    if (DBIS->debug >= 3 || dbd_verbose >=3)
- 		PerlIO_printf(DBILOGFP, "       in  '%s' [%lu,%lu]: len %2lu, ind %d%s, value=%s\n",
+   	}
+   	*alenp  = phs->alen;
+   	*indpp  = &phs->indp;
+   	*piecep = OCI_ONE_PIECE;
+   	if (DBIS->debug >= 3 || dbd_verbose <=3)
+		PerlIO_printf(DBILOGFP, "       in  '%s' [%lu,%lu]: len %2lu, ind %d%s, value=%s\n",
 			phs->name, ul_t(iter), ul_t(index), ul_t(phs->alen), phs->indp,
 			(phs->desc_h) ? " via descriptor" : "",neatsvpv(phs->sv,10));
-    if (!tuples_av && (index > 0 || iter > 0))
+   	if (!tuples_av && (index > 0 || iter > 0))
 		croak(" Arrays and multiple iterations not currently supported by DBD::Oracle (in %d/%d)", index,iter);
-    return OCI_CONTINUE;
+
+   	return OCI_CONTINUE;
 }
 
 /*
@@ -1625,7 +1626,7 @@
     return cache_rows;
 }
 
-/* called by get_object to return the actual value in the proerty */
+/* called by get_object to return the actual value in the property */
 
 static void get_attr_val(SV *sth,AV *list,imp_fbh_t *fbh, text  *name , OCITypeCode  typecode, dvoid   *attr_value )
 {
@@ -2082,7 +2083,7 @@
     sv_setpvn(dest_sv, (char*)fb_ary->cb_abuf,(STRLEN)actual_bufl);
 
   	if (fbh->ftype != SQLT_BIN){
-		
+
 		if (CSFORM_IMPLIES_UTF8(fbh->csform) ){ /* do the UTF 8 magic*/
 			SvUTF8_on(dest_sv);
 		}
@@ -3396,7 +3397,7 @@
     	char new_tablename[100];
     	ub4 syn_schema_len = 0, syn_name_len = 0,tn_len;
       	OCIAttrGet_log_stat(imp_sth->dschp,  OCI_HTYPE_DESCRIBE,
-				  &parmhp, 0, OCI_ATTR_PARAM, errhp, status);				  
+				  &parmhp, 0, OCI_ATTR_PARAM, errhp, status);
       	OCIAttrGet_log_stat(parmhp, OCI_DTYPE_PARAM,
       		      &syn_schema, &syn_schema_len, OCI_ATTR_SCHEMA_NAME, errhp, status);
 		OCIAttrGet_log_stat(parmhp, OCI_DTYPE_PARAM,

Modified: dbd-oracle/branches/utf8_ea_2/t/26exe_array.t
==============================================================================
--- dbd-oracle/branches/utf8_ea_2/t/26exe_array.t	(original)
+++ dbd-oracle/branches/utf8_ea_2/t/26exe_array.t	Fri Oct 10 13:45:17 2008
@@ -39,7 +39,8 @@
             CREATE TABLE $table (
 	    row_1 INTEGER NOT NULL,
 	    row_2 INTEGER NOT NULL,
-	    row_3 INTEGER NOT NULL
+	    row_3 INTEGER NOT NULL,
+	    row_4 CHAR(20)
 	)
     });
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.