Author: turnstep
Date: Thu Feb 10 19:40:38 2011
New Revision: 14702

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

Log:
Back out recent UTF-8 changes: too big of a job to have it hold up other stuff.
Will probably create a new branch or repo to track this.


Modified: DBD-Pg/trunk/Pg.pm
==============================================================================
--- DBD-Pg/trunk/Pg.pm  (original)
+++ DBD-Pg/trunk/Pg.pm  Thu Feb 10 19:40:38 2011
@@ -3123,10 +3123,9 @@
 
 =head3 B<pg_enable_utf8> (boolean)
 
-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
+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
 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       Thu Feb 10 19:40:38 2011
@@ -230,36 +230,8 @@
                }
        }
 
-       /* Store the old client_encoding in case we need to restore to it later 
*/
-       /* Longest name is currently 'SHIFT_JIS_2004', so allow for that plus a 
lot */
-       Renew(imp_dbh->client_encoding, 42, char); /* freed in dbd_db_destroy */
-       strncpy(imp_dbh->client_encoding, PQparameterStatus(imp_dbh->conn, 
"client_encoding"), 42);
-
-       /* We need to know if the server is SQL_ASCII. We assume not */
-       imp_dbh->pg_byte_soup = DBDPG_FALSE;
-
-       if (0 == strncmp("UTF8", PQparameterStatus(imp_dbh->conn, 
"client_encoding"), 4)) {
-               imp_dbh->is_utf8 = DBDPG_TRUE;
-       }
-       else {
-               imp_dbh->is_utf8 = DBDPG_FALSE;
-               /* Can we set pg_enable_utf8 this early? */
-               /* We need to find the server_encoding to make sure it is 
possible to change 
-                the client_encoding to UTF-8. This is safe for all but 
SQL_ASCII */
-               /* If we are not SQL_ASCII, let's change the encoding to UTF-8 
right now */
-               if (0 == strncmp("SQL_ASCII", PQparameterStatus(imp_dbh->conn, 
"server_encoding"), 9)) {
-                       imp_dbh->pg_byte_soup = DBDPG_TRUE;
-               }
-               else {
-                       PQexec(imp_dbh->conn, "SET client_encoding = 'UTF-8'");
-                       imp_dbh->is_utf8 = DBDPG_TRUE;
-               }
-       }
-
-       /* At this point, the only way that is_utf8 is false is for SQL_ASCII 
databases */
-
        imp_dbh->pg_bool_tf      = DBDPG_FALSE;
-       imp_dbh->pg_enable_utf8  = -1;
+       imp_dbh->pg_enable_utf8  = DBDPG_FALSE;
        imp_dbh->prepare_now     = DBDPG_FALSE;
        imp_dbh->done_begin      = DBDPG_FALSE;
        imp_dbh->dollaronly      = DBDPG_FALSE;
@@ -312,7 +284,7 @@
 
        /* Set as utf-8 */
 #ifdef is_utf8_string
-       if (imp_dbh->is_utf8)
+       if (imp_dbh->pg_enable_utf8)
                SvUTF8_on(DBIc_ERRSTR(imp_xxh));
 #endif
 
@@ -768,7 +740,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;
@@ -888,14 +860,7 @@
 
 #ifdef is_utf8_string
                else if (strEQ("pg_enable_utf8", key)) {
-                       imp_dbh->pg_enable_utf8 = (SvOK(valuesv) && 0 == 
(unsigned)SvIV(valuesv))
-                               ? 0 : 1;
-                       if (0 == imp_dbh->pg_enable_utf8) {
-                               imp_dbh->is_utf8 = DBDPG_FALSE;
-                       }
-                       else {
-                               imp_dbh->is_utf8 = DBDPG_TRUE;
-                       }
+                       imp_dbh->pg_enable_utf8 = newval!=0 ? DBDPG_TRUE : 
DBDPG_FALSE;
                        retval = 1;
                }
 #endif
@@ -1098,7 +1063,8 @@
                                fieldname = PQfname(imp_sth->result, fields);
                                sv_fieldname = newSVpv(fieldname,0);
 #ifdef is_utf8_string
-                               SvUTF8_on(sv_fieldname);
+                               if (is_high_bit_set(aTHX_ (unsigned char 
*)fieldname, strlen(fieldname)) && is_utf8_string((unsigned char *)fieldname, 
strlen(fieldname)))
+                                       SvUTF8_on(sv_fieldname);
 #endif
                                (void)av_store(av, fields, sv_fieldname);
                        }
@@ -2661,8 +2627,11 @@
                                else {
                                        SV *sv = newSVpvn(string, section_size);
 #ifdef is_utf8_string
-                                       if (imp_dbh->is_utf8) {
-                                               SvUTF8_on(sv);
+                                       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);
+                                               }
                                        }
 #endif
                                        av_push(currentav, sv);
@@ -3401,20 +3370,15 @@
        
        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;
@@ -3433,7 +3397,6 @@
                                        /* 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);
@@ -3444,15 +3407,10 @@
                                        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 {
@@ -3472,8 +3430,20 @@
                                }
                        }
 #ifdef is_utf8_string
-                       if (imp_dbh->is_utf8 && can_be_utf8) {
-                               SvUTF8_on(sv);
+                       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;
+                               }
                        }
 #endif
                }

Modified: DBD-Pg/trunk/dbdimp.h
==============================================================================
--- DBD-Pg/trunk/dbdimp.h       (original)
+++ DBD-Pg/trunk/dbdimp.h       Thu Feb 10 19:40:38 2011
@@ -26,17 +26,14 @@
        int     pg_errorlevel;     /* PQsetErrorVerbosity. Set by user, 
defaults to 1 */
        int     server_prepare;    /* do we want to use PQexecPrepared? 0=no 
1=yes 2=smart. Can be changed by user */
        int     async_status;      /* 0=no async 1=async started -1=async has 
been cancelled */
-       int     pg_enable_utf8;    /* -1=not set  0=force off  1=force on */
 
     imp_sth_t *async_sth;      /* current async statement handle */
        AV      *savepoints;       /* list of savepoints */
        PGconn  *conn;             /* connection structure */
        char    *sqlstate;         /* from the last result */
-       char    *client_encoding;  /* the initial (default) client_encoding */
 
-       bool    is_utf8;           /* does the client_encoding return UTF8? */
-       bool    pg_byte_soup;      /* is the server_encoding SQL_ASCII? */
        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 */
        bool    done_begin;        /* have we done a begin? (e.g. are we in a 
transaction?) */
        bool    dollaronly;        /* only consider $1, $2 ... as valid 
placeholders */

Reply via email to