Received: from ns.sharemation.com (d83b57e4.dsl.flashcom.net [216.59.87.228]) by mail.postgresql.org (8.11.1/8.11.1) with ESMTP id eBM2Wd657779; Thu, 21 Dec 2000 21:32:39 -0500 (EST) (envelope-from barry@xythos.com) Received: from xythos.com (IDENT:blind@frog.xythos.com [192.168.254.110]) by ns.sharemation.com (8.9.3/8.8.7) with ESMTP id SAA21824; Thu, 21 Dec 2000 18:21:39 -0800 Message-ID: <3A42C05C.8BC5858D@xythos.com> Date: Thu, 21 Dec 2000 18:45:48 -0800 From: Barry Lind X-Mailer: Mozilla 4.76 [en] (X11; U; Linux 2.2.16-22smp i686) X-Accept-Language: en MIME-Version: 1.0 To: pgsql-interfaces@postgresql.org CC: pgsql-patches@postgresql.org Subject: patch for character set encoding detection for JDBC Content-Type: multipart/mixed; boundary="------------F58CD7E14C5DB056B6438612" X-Archive-Number: 200012/205 X-Sequence-Number: 551 This is a multi-part message in MIME format. --------------F58CD7E14C5DB056B6438612 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit 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). thanks, --Barry --------------F58CD7E14C5DB056B6438612 Content-Type: text/plain; charset=UTF-8; name="patch.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch.diff" *** ./Connection.java.orig Thu Dec 21 18:20:36 2000 --- ./Connection.java Thu Dec 21 18:21:49 2000 *************** *** 125,132 **** PG_HOST = host; PG_STATUS = CONNECTION_BAD; - encoding = info.getProperty("charSet"); // could be null - // Now make the initial connection try { --- 125,130 ---- *************** *** 265,274 **** // This may cause some clients to break when they assume anything other than ISO, // but then - they should be using the proper methods ;-) // // firstWarning = null; ! ExecSQL("set datestyle to 'ISO'"); // Initialise object handling initObjectTypes(); --- 263,346 ---- // 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; ! 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(); --------------F58CD7E14C5DB056B6438612--