[svn:DBD-Pg] r14556 - DBD-Pg/trunk

[email protected]
Newsgroups gmane.comp.db.postgresql.dbdpg.cvs
Message-ID <[email protected]>
Author: turnstep
Date: Tue Nov 30 10:47:24 2010
New Revision: 14556

Modified:
   DBD-Pg/trunk/dbdimp.c

Log:
Quick attempt at refinining the utf8 logic.
May make no sense: I have a head cold and am lacking sleep. :)


Modified: DBD-Pg/trunk/dbdimp.c
==============================================================================
--- DBD-Pg/trunk/dbdimp.c	(original)
+++ DBD-Pg/trunk/dbdimp.c	Tue Nov 30 10:47:24 2010
@@ -3370,15 +3370,20 @@
 	
 	for (i = 0; i < num_fields; ++i) {
 		SV *sv;
+		int can_be_utf8;
 
 		if (TRACE5)
 			TRC(DBILOGFP, "%sFetching field #%d\n", THEADER, i);
 
 		sv = AvARRAY(av)[i];
 
+		/* Only mark as utf8 if the type supports it (or is unknown) */
+		can_be_utf8 = DBDPG_TRUE;
+
 		TRACE_PQGETISNULL;
 		if (PQgetisnull(imp_sth->result, imp_sth->cur_tuple, i)!=0) {
 			SvROK(sv) ? (void)sv_unref(sv) : (void)SvOK_off(sv);
+			can_be_utf8 = DBDPG_FALSE;
 		}
 		else {
 			TRACE_PQGETVALUE;
@@ -3397,6 +3402,7 @@
 					/* For certain types, we can cast to non-string Perlish values */
 					switch (type_info->type_id) {
 					case PG_BOOL:
+						can_be_utf8 = DBDPG_FALSE;
 						if (imp_dbh->pg_bool_tf) {
 							*value = ('1' == *value) ? 't' : 'f';
 							sv_setpvn(sv, (char *)value, value_len);
@@ -3407,10 +3413,15 @@
 					case PG_OID:
 					case PG_INT4:
 					case PG_INT2:
+						can_be_utf8 = DBDPG_FALSE;
 						sv_setiv(sv, atol((char *)value));
 						break;
+					case PG_BYTEA:
+						/* Here solely to ensure it does not get set to utf8 */
+						can_be_utf8 = DBDPG_FALSE;
 					default:
 						sv_setpvn(sv, (char *)value, value_len);
+						/* None of the above need to be utf8 */
 					}
 				}
 				else {
@@ -3430,7 +3441,7 @@
 				}
 			}
 #ifdef is_utf8_string
-			if (imp_dbh->is_utf8) {
+			if (imp_dbh->is_utf8 && can_be_utf8) {
 				SvUTF8_on(sv);
 			}
 #endif
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.