OSDN Git Service

In looking at the 7.1beta1 code for JDBC, I noticed that support was
authorBruce Momjian <bruce@momjian.us>
Fri, 22 Dec 2000 03:08:52 +0000 (03:08 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 22 Dec 2000 03:08:52 +0000 (03:08 +0000)
added to support character set encodings.  However I noticed that the
encoding that is used isn't obtained from the DB.  Since Java uses
unicode UCS2 internally the character set encoding is used to translate
strings from/to the DB encoding.  So it seems logical that the code
would get the encoding from the DB instead of the current method of
requiring the user pass it as a parameter.

Attached is a patch that gets the DB encoding from the DB in the same
manner as is done in libpq/fe-connect.c.  The patch is created off of
the latest CVS sources (Connection.java version 1.10).

Barry Lind

src/interfaces/jdbc/org/postgresql/Connection.java

index 7a2346f..b828a90 100644 (file)
@@ -10,7 +10,7 @@ import org.postgresql.largeobject.*;
 import org.postgresql.util.*;
 
 /**
- * $Id: Connection.java,v 1.10 2000/11/20 08:15:30 peter Exp $
+ * $Id: Connection.java,v 1.11 2000/12/22 03:08:52 momjian Exp $
  *
  * This abstract class is used by org.postgresql.Driver to open either the JDBC1 or
  * JDBC2 versions of the Connection class.
@@ -125,8 +125,6 @@ public abstract class Connection
     PG_HOST = host;
     PG_STATUS = CONNECTION_BAD;
 
-    encoding = info.getProperty("charSet");  // could be null
-    
     // Now make the initial connection
     try
       {
@@ -265,10 +263,84 @@ public abstract class Connection
       // This may cause some clients to break when they assume anything other than ISO,
       // but then - they should be using the proper methods ;-)
       //
+      // We also ask the DB for certain properties (i.e. DatabaseEncoding at this time)
       //
       firstWarning = null;
       
-      ExecSQL("set datestyle to 'ISO'");
+      java.sql.ResultSet initrset = ExecSQL("set datestyle to 'ISO'; select getdatabaseencoding()");
+
+      String dbEncoding = null;
+      //retrieve DB properties
+      if(initrset.next()) {
+
+        //handle DatabaseEncoding
+        dbEncoding = initrset.getString(1);
+        //convert from the PostgreSQL name to the Java name
+        if (dbEncoding.equals("SQL_ASCII")) {
+          dbEncoding = "ASCII";
+        } else if (dbEncoding.equals("UNICODE")) {
+          dbEncoding = "UTF8";
+        } else if (dbEncoding.equals("LATIN1")) {
+          dbEncoding = "ISO8859_1";
+        } else if (dbEncoding.equals("LATIN2")) {
+          dbEncoding = "ISO8859_2";
+        } else if (dbEncoding.equals("LATIN3")) {
+          dbEncoding = "ISO8859_3";
+        } else if (dbEncoding.equals("LATIN4")) {
+          dbEncoding = "ISO8859_4";
+        } else if (dbEncoding.equals("LATIN5")) {
+          dbEncoding = "ISO8859_5";
+        } else if (dbEncoding.equals("LATIN6")) {
+          dbEncoding = "ISO8859_6";
+        } else if (dbEncoding.equals("LATIN7")) {
+          dbEncoding = "ISO8859_7";
+        } else if (dbEncoding.equals("LATIN8")) {
+          dbEncoding = "ISO8859_8";
+        } else if (dbEncoding.equals("LATIN9")) {
+          dbEncoding = "ISO8859_9";
+        } else if (dbEncoding.equals("EUC_JP")) {
+          dbEncoding = "EUC_JP";
+        } else if (dbEncoding.equals("EUC_CN")) {
+          dbEncoding = "EUC_CN";
+        } else if (dbEncoding.equals("EUC_KR")) {
+          dbEncoding = "EUC_KR";
+        } else if (dbEncoding.equals("EUC_TW")) {
+          dbEncoding = "EUC_TW";
+        } else if (dbEncoding.equals("KOI8")) {
+          dbEncoding = "KOI8_R";
+        } else if (dbEncoding.equals("WIN")) {
+          dbEncoding = "Cp1252";
+        } else {
+          dbEncoding = null;
+        }
+      }
+
+
+      //Set the encoding for this connection
+      //Since the encoding could be specified or obtained from the DB we use the
+      //following order:
+      //  1.  passed as a property
+      //  2.  value from DB if supported by current JVM
+      //  3.  default for JVM (leave encoding null)
+      String passedEncoding = info.getProperty("charSet");  // could be null
+
+      if (passedEncoding != null) {
+        encoding = passedEncoding;
+      } else {
+        if (dbEncoding != null) {
+          //test DB encoding
+          try {
+            "TEST".getBytes(dbEncoding);
+            //no error the encoding is supported by the current JVM
+            encoding = dbEncoding;
+          } catch (UnsupportedEncodingException uee) {
+            //dbEncoding is not supported by the current JVM
+            encoding = null;
+          }
+        } else {
+          encoding = null;
+        }
+      }
       
       // Initialise object handling
       initObjectTypes();