summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas2009-04-08 09:50:48 +0000
committerHeikki Linnakangas2009-04-08 09:50:48 +0000
commit463d863c3ae7fd62f2cc659e587c31bd2abed2c6 (patch)
tree53570dddd2e3ea137d8cc212aa7a07f762e1fbb5
parentb493f708e0859774e290059115bb7fa3b403db5d (diff)
Tell gettext which codeset to use by calling bind_textdomain_codeset(). We
already did that on Windows, but it's needed on other platforms too when LC_CTYPE=C. With other locales, we enforce (or trust) that the codeset of the locale matches the server encoding so we don't need to bind it explicitly. It should do no harm in that case either, but I don't have full faith in the PG encoding -> OS codeset mapping table yet. Per recent discussion on pgsql-hackers.
-rw-r--r--src/backend/utils/init/miscinit.c2
-rw-r--r--src/backend/utils/init/postinit.c3
-rw-r--r--src/backend/utils/mb/mbutils.c34
-rw-r--r--src/include/mb/pg_wchar.h2
4 files changed, 29 insertions, 12 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index 03d86ca5f9..669186ef9a 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -1242,7 +1242,7 @@ pg_bindtextdomain(const char *domain)
get_locale_path(my_exec_path, locale_path);
bindtextdomain(domain, locale_path);
- pg_bind_textdomain_codeset(domain, GetDatabaseEncoding());
+ pg_bind_textdomain_codeset(domain);
}
#endif
}
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index b35939556f..a73833a1e6 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -265,6 +265,9 @@ CheckMyDatabase(const char *name, bool am_superuser)
SetConfigOption("lc_collate", collate, PGC_INTERNAL, PGC_S_OVERRIDE);
SetConfigOption("lc_ctype", ctype, PGC_INTERNAL, PGC_S_OVERRIDE);
+ /* Use the right encoding in translated messages */
+ pg_bind_textdomain_codeset(textdomain(NULL));
+
/*
* Lastly, set up any database-specific configuration variables.
*/
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index cb05b3f934..e06500ee91 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -890,7 +890,7 @@ cliplen(const char *str, int len, int limit)
return l;
}
-#if defined(ENABLE_NLS) && defined(WIN32)
+#if defined(ENABLE_NLS)
static const struct codeset_map {
int encoding;
const char *codeset;
@@ -929,7 +929,7 @@ static const struct codeset_map {
{PG_EUC_TW, "EUC-TW"},
{PG_EUC_JIS_2004, "EUC-JP"}
};
-#endif /* WIN32 */
+#endif /* ENABLE_NLS */
void
SetDatabaseEncoding(int encoding)
@@ -939,22 +939,36 @@ SetDatabaseEncoding(int encoding)
DatabaseEncoding = &pg_enc2name_tbl[encoding];
Assert(DatabaseEncoding->encoding == encoding);
-
-#ifdef ENABLE_NLS
- pg_bind_textdomain_codeset(textdomain(NULL), encoding);
-#endif
}
/*
- * On Windows, we need to explicitly bind gettext to the correct
- * encoding, because gettext() tends to get confused.
+ * Bind gettext to the codeset equivalent with the database encoding.
*/
void
-pg_bind_textdomain_codeset(const char *domainname, int encoding)
+pg_bind_textdomain_codeset(const char *domainname)
{
-#if defined(ENABLE_NLS) && defined(WIN32)
+#if defined(ENABLE_NLS)
+ int encoding = GetDatabaseEncoding();
int i;
+ /*
+ * gettext() uses the codeset specified by LC_CTYPE by default,
+ * so if that matches the database encoding we don't need to do
+ * anything. In CREATE DATABASE, we enforce or trust that the
+ * locale's codeset matches database encoding, except for the C
+ * locale. In C locale, we bind gettext() explicitly to the right
+ * codeset.
+ *
+ * On Windows, though, gettext() tends to get confused so we always
+ * bind it.
+ */
+#ifndef WIN32
+ const char *ctype = setlocale(LC_CTYPE, NULL);
+
+ if (pg_strcasecmp(ctype, "C") != 0 && pg_strcasecmp(ctype, "POSIX") != 0)
+ return;
+#endif
+
for (i = 0; i < lengthof(codeset_map_array); i++)
{
if (codeset_map_array[i].encoding == encoding)
diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h
index 3525299b2a..fd8557c5d9 100644
--- a/src/include/mb/pg_wchar.h
+++ b/src/include/mb/pg_wchar.h
@@ -391,7 +391,7 @@ extern const char *pg_get_client_encoding_name(void);
extern void SetDatabaseEncoding(int encoding);
extern int GetDatabaseEncoding(void);
extern const char *GetDatabaseEncodingName(void);
-extern void pg_bind_textdomain_codeset(const char *domainname, int encoding);
+extern void pg_bind_textdomain_codeset(const char *domainname);
extern int pg_valid_client_encoding(const char *name);
extern int pg_valid_server_encoding(const char *name);