PostgreSQL 6.3.2 JDBC ドライバ MB サポートパッチ 1998 9/30 このパッチは、PostgreSQL 6.3.2 に付属の JDBC ドライバを、 バックエンドとやりとりする文字列のエンコーディングを指定できるよう 拡張します。 src/interfaces/jdbc/ の下で、 % patch -p1 < このファイル でパッチをあてて下さい。使い方は、src/interfaces/jdbc/ に README.mb.eucjp というファイルができるので、それを読んで下さい。 diff -urN jdbc-6.3.2.ORIG/README.mb.eucjp jdbc-6.3.2-mb/README.mb.eucjp --- jdbc-6.3.2.ORIG/README.mb.eucjp Thu Jan 1 09:00:00 1970 +++ jdbc-6.3.2-mb/README.mb.eucjp Wed Sep 30 20:56:46 1998 @@ -0,0 +1,77 @@ + + $Id: README.mb.eucjp,v 1.3 1998/09/30 11:56:29 mochid Exp mochid $ + +PostgreSQL 6.3.2 JDBC ドライバ MB サポート + + PostgreSQL 6.3.2 に付属の JDBC ドライバを、バックエンドとやりとりする + 文字列のエンコーディングを指定できるよう拡張します。エンコーディングは、 + 石井達夫さんの mb_b3.patch で使用できるもののうちの + + EUC_JP + UNICODE + + と(*1)、mb_b3.patch でのエンコーディング名と Java での + エンコーディング名が同じものが使用できます(*2)。 + +使い方: + postgresql.databaseencoding という Java のプロパティにバックエンドの + エンコーディングを指定します。例えば、 + + -Dpostgresql.databaseencoding=EUC_JP + + とします。 + + + *1 MULE_INTERNAL はサポートしていません。JDK の配布に含まれる + エンコーディング変換機能を利用しているため、MULE_INTERNAL は + 変換できません。コンバータ書いたからマージしてよ、という方は + 連絡下さい。 + *2 JDK 1.1.6 以降では、EUC_KR, EUC_CN, EUC_TW が使用できます。 + 1.1.5 以前ではこれらは使えません。 + *3 いちいち -Dpostgresql.databaseencoding= を指定するのは面倒だ、 + という方は、Connection.java を編集して、databaseEncoding の初期値を + 直接指定して下さい。プロパティに無指定の場合はその値が使用される様に + なります。 + + String databaseEncoding = null; // set default encoding + ↓ + String databaseEncoding = "EUC_JP"; // set default encoding + + +注意: + このパッチは、無保証です。このパッチによってなんらかの損害が発生する + 可能性がありますので、自らの責任において使用して下さい。 + 再配布は自由に行ってもらって結構です。ただし、修正されたものを + 配布される場合は、その旨を明記して下さい。修正されたものについての + 問い合わせ等には応じかねます。 + +履歴: + このパッチは、たかばとしはる さんが「jdbc UTF8 patch」として + pgsql-jp メーリングリスト [pgsql-jp 3617] で公開されたものを、 + 持田 修司 mochid@yo.rim.or.jp が他のエンコーディングでも + 利用できるように修正したものです。 + +その他: + + 1) Java とシステム間のエンコーディングについて: + + バックエンドと JDBC ドライバ間のエンコーディングと、 + Java とシステム間のエンコーディングは区別する必要があります。 + Java とシステム間のエンコーディングは、Java が正式にサポートしている + プラットホームではあまり意識する必要はありません。ですが、 + Java が正式にサポートしていないプラットホームでは、 + これを明示的に指定してやる必要があります。 + 例えば NetBSD/i386 1.3.2 + JDK 1.1.5 (http://www.quick.com.au/java/) + では、 + + -Dfile.encoding=EUCJIS -Duser.language=ja + + とすることで日本語 EUC を使用するよう指示することができています。 + +関連情報: + このパッチ用のページ('98 9/30 現在、まだ準備中です) + http://www.yo.rim.or.jp/~mochid/postgresql-jdbc/ + PostgreSQL ML + http://www.sra.co.jp/people/t-ishii/postgres95/ML/info.html + +# End of file diff -urN jdbc-6.3.2.ORIG/postgresql/Connection.java jdbc-6.3.2-mb/postgresql/Connection.java --- jdbc-6.3.2.ORIG/postgresql/Connection.java Sun Apr 19 16:00:31 1998 +++ jdbc-6.3.2-mb/postgresql/Connection.java Sun Sep 27 12:21:57 1998 @@ -53,7 +53,7 @@ //private static final int STARTUP_HBA = 12; // Host Based //private static final int STARTUP_NONE = 13; // Unauthenticated (unused) //private static final int STARTUP_PASS = 14; // Password auth - + private boolean autoCommit = true; private boolean readOnly = false; @@ -122,6 +122,40 @@ // Now handle notices as warnings, so things like "show" now work protected SQLWarning firstWarning = null; + // Encoding string PostgreSQL -> Java mapping + class EncodingTable extends Hashtable + { + final String[] encodingStrs = { + "EUC_JP", "EUCJIS", /* use EUCJIS for JDK 1.1.5 */ + "UNICODE", "UTF8" + /* "MULE_INTERNAL" is not supported */ + }; + + EncodingTable() + { + super(); + for (int i = 0, len = encodingStrs.length; i < len;) + this.put(encodingStrs[i++], encodingStrs[i++]); + } + + // convert encoding name to Java complient + private String mapString(String instr) + { + if (instr == null) + return null; + String ecMapped = (String)this.get(instr); + if (ecMapped != null) + return ecMapped; + else + return instr; + } + }; + + static String dbEncodingPropName = "postgresql.databaseencoding"; + + boolean needConvertEncodingFlag = false; // need encoding conversion + String databaseEncoding = null; // set default encoding + /** * Connect to a PostgreSQL database back end. * @@ -181,7 +215,7 @@ //// Anything else defaults to trust authentication //STARTUP_CODE=STARTUP_USER; //} - + // Now make the initial connection try { @@ -298,7 +332,42 @@ // Initialise object handling initObjectTypes(); - + + // Get Database encoding + EncodingTable ecTbl = new EncodingTable(); + databaseEncoding = ecTbl.mapString(databaseEncoding); + + // get from Java Property + String encoding = System.getProperty(dbEncodingPropName); + encoding = ecTbl.mapString(encoding); + // get from database + ResultSet r = null; + try{ + r = ExecSQL("select getdatabaseencoding()"); + } catch(SQLException e) { + // do nothing. + } + if (r != null) { + r.next(); + String ecFromDb = r.getString(1); + ecFromDb = ecTbl.mapString(ecFromDb); + if ((!ecFromDb.equals("SQL_ASCII")) + && encoding != null && (!ecFromDb.equals(encoding))) + throw new SQLException("Encoding " + encoding + + " does not match with database's " + ecFromDb + "."); + if (encoding == null) + encoding = ecFromDb; + } + if (encoding != null) + databaseEncoding = encoding; + + if (databaseEncoding == null || databaseEncoding.equals("SQL_ASCII")) + needConvertEncodingFlag = false; + else + needConvertEncodingFlag = true; + + pg_stream.cacheEncoding(this); + // Mark the connection as ok, and cleanup clearWarnings(); PG_STATUS = CONNECTION_OK; @@ -681,7 +750,15 @@ try { pg_stream.SendChar('Q'); - buf = sql.getBytes(); + if (!needConvertEncodingFlag) + buf = sql.getBytes(); + else { + try { + buf = sql.getBytes(databaseEncoding); + } catch (UnsupportedEncodingException e) { + throw new SQLException("Encode Error: " + e.toString()); + } + } pg_stream.Send(buf); pg_stream.SendChar(0); } catch (IOException e) { @@ -982,6 +1059,14 @@ { for(int i=0;i