Received: from localhost (unknown [200.46.204.183]) by mail.postgresql.org (Postfix) with ESMTP id 2E0D863F631 for ; Mon, 20 Apr 2009 07:07:19 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 86854-01 for ; Mon, 20 Apr 2009 07:07:29 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from svr2.hagander.net (svr2.hagander.net [88.198.128.226]) by mail.postgresql.org (Postfix) with ESMTP id F1C3C63F5EE for ; Mon, 20 Apr 2009 06:37:54 -0300 (ADT) Received: from dynamic.hagander.net ([127.0.0.1]) (encrypted and authenticated) by svr2.hagander.net (Postfix) with ESMTP id 92383DCD2DF; Mon, 20 Apr 2009 11:37:52 +0200 (CEST) Received: from [127.0.0.1] (localhost [127.0.0.1]) by mha-laptop.hagander.net (Postfix) with ESMTP id 03437124112; Mon, 20 Apr 2009 11:37:51 +0200 (CEST) Message-ID: <49EC426F.5020602@hagander.net> Date: Mon, 20 Apr 2009 11:37:51 +0200 From: Magnus Hagander User-Agent: Thunderbird 2.0.0.21 (X11/20090318) MIME-Version: 1.0 To: Heikki Linnakangas CC: Tom Lane , pgsql-hackers@postgreSQL.org Subject: Re: Re: [COMMITTERS] pgsql: Explicitly bind gettext to the correct encoding on Windows. References: <20090122100948.89F977559ED@cvs.postgresql.org> <20643.1232666867@sss.pgh.pa.us> <499821F3.7050004@hagander.net> <22474.1234718514@sss.pgh.pa.us> <49D47C40.5040300@hagander.net> <49DC7E11.2050501@enterprisedb.com> In-Reply-To: <49DC7E11.2050501@enterprisedb.com> X-Enigmail-Version: 0.95.0 Content-Type: multipart/mixed; boundary="------------050005090506000602040207" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=0 tagged_above=0 required=5 tests=none X-Spam-Level: X-Archive-Number: 200904/1022 X-Sequence-Number: 137125 This is a multi-part message in MIME format. --------------050005090506000602040207 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Heikki Linnakangas wrote: > Magnus Hagander wrote: >> Tom Lane wrote: >>> Magnus Hagander writes: >>>> Tom Lane wrote: >>>>> What makes more sense to me is to add a table to encnames.c that >>>>> provides the gettext name of every encoding that we support. >>>> Do you mean a separate table there, or should we add a new column to >>>> one >>>> of the existing tables? >>> Whichever seems to make more sense is fine with me. I just don't want >>> add-an-encoding maintenance requirements spread across N different >>> source files. >> >> I was about to start looking at this when that other thread >> (http://archives.postgresql.org//pgsql-hackers/2009-03/msg01270.php) >> started about related issues on other platforms. Seems we should have a >> "coordinated fix" for this, so I'm going to want and see what come sout >> of that one. Unless I'm misunderstanding thigns and they're not related? > > I've committed a fairly trivial patch per Peter's suggestion to fix the > other thread's issue. I left the table as is, so whatever refactorings > were planned can now be applied. Here's a patch that moves the table over to encnames.c, and renames it to look like the others. I don't know what it should be doing if it can't find a match, so I haven't changed that behavior. Comments? //Magnus --------------050005090506000602040207 Content-Type: text/x-diff; name="enctable.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="enctable.patch" *** a/src/backend/utils/mb/encnames.c --- b/src/backend/utils/mb/encnames.c *************** *** 431,436 **** pg_enc2name pg_enc2name_tbl[] = --- 431,478 ---- }; /* ---------- + * These are encoding names for gettext. + * ---------- + */ + pg_enc2gettext pg_enc2gettext_tbl[] = + { + {PG_UTF8, "UTF-8"}, + {PG_LATIN1, "LATIN1"}, + {PG_LATIN2, "LATIN2"}, + {PG_LATIN3, "LATIN3"}, + {PG_LATIN4, "LATIN4"}, + {PG_ISO_8859_5, "ISO-8859-5"}, + {PG_ISO_8859_6, "ISO_8859-6"}, + {PG_ISO_8859_7, "ISO-8859-7"}, + {PG_ISO_8859_8, "ISO-8859-8"}, + {PG_LATIN5, "LATIN5"}, + {PG_LATIN6, "LATIN6"}, + {PG_LATIN7, "LATIN7"}, + {PG_LATIN8, "LATIN8"}, + {PG_LATIN9, "LATIN-9"}, + {PG_LATIN10, "LATIN10"}, + {PG_KOI8R, "KOI8-R"}, + {PG_KOI8U, "KOI8-U"}, + {PG_WIN1250, "CP1250"}, + {PG_WIN1251, "CP1251"}, + {PG_WIN1252, "CP1252"}, + {PG_WIN1253, "CP1253"}, + {PG_WIN1254, "CP1254"}, + {PG_WIN1255, "CP1255"}, + {PG_WIN1256, "CP1256"}, + {PG_WIN1257, "CP1257"}, + {PG_WIN1258, "CP1258"}, + {PG_WIN866, "CP866"}, + {PG_WIN874, "CP874"}, + {PG_EUC_CN, "EUC-CN"}, + {PG_EUC_JP, "EUC-JP"}, + {PG_EUC_KR, "EUC-KR"}, + {PG_EUC_TW, "EUC-TW"}, + {PG_EUC_JIS_2004, "EUC-JP"} + }; + + + /* ---------- * Encoding checks, for error returns -1 else encoding id * ---------- */ *** a/src/backend/utils/mb/mbutils.c --- b/src/backend/utils/mb/mbutils.c *************** *** 890,936 **** cliplen(const char *str, int len, int limit) return l; } - #if defined(ENABLE_NLS) - static const struct codeset_map { - int encoding; - const char *codeset; - } codeset_map_array[] = { - {PG_UTF8, "UTF-8"}, - {PG_LATIN1, "LATIN1"}, - {PG_LATIN2, "LATIN2"}, - {PG_LATIN3, "LATIN3"}, - {PG_LATIN4, "LATIN4"}, - {PG_ISO_8859_5, "ISO-8859-5"}, - {PG_ISO_8859_6, "ISO_8859-6"}, - {PG_ISO_8859_7, "ISO-8859-7"}, - {PG_ISO_8859_8, "ISO-8859-8"}, - {PG_LATIN5, "LATIN5"}, - {PG_LATIN6, "LATIN6"}, - {PG_LATIN7, "LATIN7"}, - {PG_LATIN8, "LATIN8"}, - {PG_LATIN9, "LATIN-9"}, - {PG_LATIN10, "LATIN10"}, - {PG_KOI8R, "KOI8-R"}, - {PG_KOI8U, "KOI8-U"}, - {PG_WIN1250, "CP1250"}, - {PG_WIN1251, "CP1251"}, - {PG_WIN1252, "CP1252"}, - {PG_WIN1253, "CP1253"}, - {PG_WIN1254, "CP1254"}, - {PG_WIN1255, "CP1255"}, - {PG_WIN1256, "CP1256"}, - {PG_WIN1257, "CP1257"}, - {PG_WIN1258, "CP1258"}, - {PG_WIN866, "CP866"}, - {PG_WIN874, "CP874"}, - {PG_EUC_CN, "EUC-CN"}, - {PG_EUC_JP, "EUC-JP"}, - {PG_EUC_KR, "EUC-KR"}, - {PG_EUC_TW, "EUC-TW"}, - {PG_EUC_JIS_2004, "EUC-JP"} - }; - #endif /* ENABLE_NLS */ - void SetDatabaseEncoding(int encoding) { --- 890,895 ---- *************** *** 969,980 **** pg_bind_textdomain_codeset(const char *domainname) return; #endif ! for (i = 0; i < lengthof(codeset_map_array); i++) { ! if (codeset_map_array[i].encoding == encoding) { if (bind_textdomain_codeset(domainname, ! codeset_map_array[i].codeset) == NULL) elog(LOG, "bind_textdomain_codeset failed"); break; } --- 928,939 ---- return; #endif ! for (i = 0; pg_enc2gettext_tbl[i].name != NULL; i++) { ! if (pg_enc2gettext_tbl[i].encoding == encoding) { if (bind_textdomain_codeset(domainname, ! pg_enc2gettext_tbl[i].name) == NULL) elog(LOG, "bind_textdomain_codeset failed"); break; } *** a/src/include/mb/pg_wchar.h --- b/src/include/mb/pg_wchar.h *************** *** 262,267 **** typedef struct pg_enc2name --- 262,278 ---- extern pg_enc2name pg_enc2name_tbl[]; /* + * Encoding names for gettext + */ + typedef struct pg_enc2gettext + { + pg_enc encoding; + const char *name; + } pg_enc2gettext; + + extern pg_enc2gettext pg_enc2gettext_tbl[]; + + /* * pg_wchar stuff */ typedef int (*mb2wchar_with_len_converter) (const unsigned char *from, --------------050005090506000602040207--