[svn:DBD-Pg] r14544 - in DBD-Pg/trunk: . t

[email protected]
Newsgroups gmane.comp.db.postgresql.dbdpg.cvs
Message-ID <[email protected]>
Author: turnstep
Date: Sat Nov 20 21:42:15 2010
New Revision: 14544

Modified:
   DBD-Pg/trunk/Pg.pm
   DBD-Pg/trunk/dbdimp.c
   DBD-Pg/trunk/dbdimp.h
   DBD-Pg/trunk/t/09arrays.t

Log:
Quick swipe at the utf8 problem. Doesn't work yet :)


Modified: DBD-Pg/trunk/Pg.pm
==============================================================================
--- DBD-Pg/trunk/Pg.pm	(original)
+++ DBD-Pg/trunk/Pg.pm	Sat Nov 20 21:42:15 2010
@@ -3124,9 +3124,10 @@
 
 =head3 B<pg_enable_utf8> (boolean)
 
-DBD::Pg specific attribute. If true, then the C<utf8> flag will be turned on
-for returned character data (if the data is valid UTF-8). For details about
-the C<utf8> flag, see the C<Encode> module. This attribute is only relevant under
+DBD::Pg specific attribute. Partially deprecated, as we now mark all strings 
+coming from a database with a client_encoding of 'UTF8' as utf8. However, 
+setting pg_enable_utf8 to false will override this automatic check, for 
+backwards compatibility with applications. This attribute is only relevant under
 perl 5.8 and later.
 
 =head3 B<pg_errorlevel> (integer)

Modified: DBD-Pg/trunk/dbdimp.c
==============================================================================
--- DBD-Pg/trunk/dbdimp.c	(original)
+++ DBD-Pg/trunk/dbdimp.c	Sat Nov 20 21:42:15 2010
@@ -229,6 +229,9 @@
 		}
 	}
 
+	/* Figure out the client_encoding for UTF work */
+	imp_dbh->is_utf8 = strncmp("UTF8", PQparameterStatus(imp_dbh->conn, "client_encoding"), 4)
+		? DBDPG_FALSE : DBDPG_TRUE;
 	imp_dbh->pg_bool_tf      = DBDPG_FALSE;
 	imp_dbh->pg_enable_utf8  = DBDPG_FALSE;
  	imp_dbh->prepare_now     = DBDPG_FALSE;
@@ -281,7 +284,7 @@
 	sv_setpv(DBIc_STATE(imp_xxh), (char*)imp_dbh->sqlstate);
 
 	/* Set as utf-8 */
-	if (imp_dbh->pg_enable_utf8)
+	if (imp_dbh->is_utf8)
 		SvUTF8_on(DBIc_ERRSTR(imp_xxh));
 
 	if (TEND) TRC(DBILOGFP, "%sEnd pg_error\n", THEADER);
@@ -736,7 +739,7 @@
 		else if (strEQ("pg_prepare_now", key))
 			retsv = newSViv((IV)imp_dbh->prepare_now);
 #ifdef is_utf8_string
-		else if (strEQ("pg_enable_utf8", key))
+		else if (strEQ("pg_enable_utf8", key)) 
 			retsv = newSViv((IV)imp_dbh->pg_enable_utf8);
 #endif
 		break;
@@ -857,6 +860,10 @@
 #ifdef is_utf8_string
 		else if (strEQ("pg_enable_utf8", key)) {
 			imp_dbh->pg_enable_utf8 = newval!=0 ? DBDPG_TRUE : DBDPG_FALSE;
+			/* Turning on does nothing now, but explicit off will force is_utf8 off! */
+			if (imp_dbh->pg_enable_utf8 == DBDPG_FALSE) {
+				imp_dbh->is_utf8 = DBDPG_FALSE;
+			}
 			retval = 1;
 		}
 #endif
@@ -2623,11 +2630,8 @@
 				else {
 					SV *sv = newSVpvn(string, section_size);
 #ifdef is_utf8_string
-					if (imp_dbh->pg_enable_utf8) {
-						SvUTF8_off(sv);
-						if (is_high_bit_set(aTHX_ (unsigned char *)string, section_size) && is_utf8_string((unsigned char*)string, section_size)) {
-							SvUTF8_on(sv);
-						}
+					if (imp_dbh->is_utf8) {
+						SvUTF8_on(sv);
 					}
 #endif
 					av_push(currentav, sv);
@@ -3426,20 +3430,8 @@
 				}
 			}
 #ifdef is_utf8_string
-			if (imp_dbh->pg_enable_utf8 && type_info) {
-				SvUTF8_off(sv);
-				switch (type_info->type_id) {
-				case PG_CHAR:
-				case PG_TEXT:
-				case PG_BPCHAR:
-				case PG_VARCHAR:
-					if (is_high_bit_set(aTHX_ value, value_len) && is_utf8_string((unsigned char*)value, value_len)) {
-						SvUTF8_on(sv);
-					}
-					break;
-				default:
-					break;
-				}
+			if (imp_dbh->is_utf8) {
+				SvUTF8_on(sv);
 			}
 #endif
 		}

Modified: DBD-Pg/trunk/dbdimp.h
==============================================================================
--- DBD-Pg/trunk/dbdimp.h	(original)
+++ DBD-Pg/trunk/dbdimp.h	Sat Nov 20 21:42:15 2010
@@ -32,6 +32,7 @@
 	PGconn  *conn;             /* connection structure */
 	char    *sqlstate;         /* from the last result */
 
+	bool    is_utf8;           /* does the client_encoding return UTF8? */
 	bool    pg_bool_tf;        /* do bools return 't'/'f'? Set by user, default is 0 */
 	bool    pg_enable_utf8;    /* should we attempt to make utf8 strings? Set by user, default is 0 */
 	bool    prepare_now;       /* force immediate prepares, even with placeholders. Set by user, default is 0 */

Modified: DBD-Pg/trunk/t/09arrays.t
==============================================================================
--- DBD-Pg/trunk/t/09arrays.t	(original)
+++ DBD-Pg/trunk/t/09arrays.t	Sat Nov 20 21:42:15 2010
@@ -569,7 +569,6 @@
 		if $server_encoding ne 'UTF8';
 
 	$t='String should be UTF-8';
-	local $dbh->{pg_enable_utf8} = 1;
 	my $utf8_str = chr(0x100).'dam'; # LATIN CAPITAL LETTER A WITH MACRON
     ok (Encode::is_utf8( $utf8_str ), $t);
 
@@ -624,6 +623,8 @@
 	};
 	is ($@, q{}, $t);
 
+	local $dbh->{pg_enable_utf8} = 1;
+
 	$t='Retreiving an array containing utf-8 works';
 	$SQL = q{SELECT id, testarray, val FROM dbd_pg_test WHERE id = 1};
 	$sth = $dbh->prepare($SQL);
@@ -632,8 +633,8 @@
 	$expected = [1,['Bob',$utf8_str],'one'];
 	is_deeply ($result, $expected, $t);
 
-	$t='Selected ASCII string should not be UTF-8';
-    ok (!Encode::is_utf8( $result->[1][0] ), $t);
+	$t='Selected ASCII string should be UTF-8';
+    ok (Encode::is_utf8( $result->[1][0] ), $t);
 
 	$t='Selected string should be UTF-8';
     ok (Encode::is_utf8( $result->[1][1] ), $t);
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.