aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2000-12-22 03:08:52 +0000
committerBruce Momjian <bruce@momjian.us>2000-12-22 03:08:52 +0000
commit4ce226eeb7c1f07923069a5dfe358d9e1dc16c82 (patch)
treec00647b4d26e1ca0cdcefd0d546c6feee9a12fd5
parent6cc842abd340b6f4c3f9e5f49d59805174959f7e (diff)
downloadpostgresql-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.java80
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();