diff options
author | Bruce Momjian <bruce@momjian.us> | 2000-12-22 03:08:52 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2000-12-22 03:08:52 +0000 |
commit | 4ce226eeb7c1f07923069a5dfe358d9e1dc16c82 (patch) | |
tree | c00647b4d26e1ca0cdcefd0d546c6feee9a12fd5 | |
parent | 6cc842abd340b6f4c3f9e5f49d59805174959f7e (diff) | |
download | postgresql-4ce226eeb7c1f07923069a5dfe358d9e1dc16c82.tar.gz postgresql-4ce226eeb7c1f07923069a5dfe358d9e1dc16c82.zip |
In looking at the 7.1beta1 code for JDBC, I noticed that support was
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
-rw-r--r-- | src/interfaces/jdbc/org/postgresql/Connection.java | 80 |
1 files changed, 76 insertions, 4 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/Connection.java b/src/interfaces/jdbc/org/postgresql/Connection.java index 7a2346f80e8..b828a90b6dc 100644 --- a/src/interfaces/jdbc/org/postgresql/Connection.java +++ b/src/interfaces/jdbc/org/postgresql/Connection.java @@ -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(); |