From: Tom Lane Date: Fri, 8 Apr 2011 19:38:57 +0000 (-0400) Subject: Modify initdb to complain only when no usable system locales are found. X-Git-Tag: REL9_1_BETA1~135 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d4c810d570e71b021c93e3ee3ea4ab18af4a053d;p=postgresql Modify initdb to complain only when no usable system locales are found. Per discussion, the original behavior seems too noisy. But if things are so broken that none of the locales reported by "locale -a" are usable, that's probably worth warning about. --- diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index 4db34e5f2e..9ea2ea39ce 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -1564,7 +1564,7 @@ setup_collation(void) int i; FILE *locale_a_handle; char localebuf[NAMEDATALEN]; - int skipped = 0; + int count = 0; PG_CMD_DECL; #endif @@ -1579,7 +1579,7 @@ setup_collation(void) locale_a_handle = popen_check("locale -a", "r"); if (!locale_a_handle) - return; + return; /* complaint already printed */ PG_CMD_OPEN; @@ -1597,12 +1597,11 @@ setup_collation(void) len = strlen(localebuf); - if (localebuf[len - 1] != '\n') + if (len == 0 || localebuf[len - 1] != '\n') { if (debug) fprintf(stderr, _("%s: locale name too long, skipped: %s\n"), progname, localebuf); - skipped++; continue; } localebuf[len - 1] = '\0'; @@ -1628,22 +1627,23 @@ setup_collation(void) if (debug) fprintf(stderr, _("%s: locale name has non-ASCII characters, skipped: %s\n"), progname, localebuf); - skipped++; continue; } enc = pg_get_encoding_from_locale(localebuf, debug); if (enc < 0) { - skipped++; - continue; /* error message printed by pg_get_encoding_from_locale() */ + /* error message printed by pg_get_encoding_from_locale() */ + continue; } if (!PG_VALID_BE_ENCODING(enc)) continue; /* ignore locales for client-only encodings */ if (enc == PG_SQL_ASCII) continue; /* C/POSIX are already in the catalog */ - PG_CMD_PRINTF2("INSERT INTO tmp_pg_collation (locale, encoding) VALUES ('%s', %d);", + count++; + + PG_CMD_PRINTF2("INSERT INTO tmp_pg_collation (locale, encoding) VALUES ('%s', %d);\n", escape_quotes(localebuf), enc); /* @@ -1653,12 +1653,12 @@ setup_collation(void) * "en_US" for LATIN1, say. */ if (normalize_locale_name(alias, localebuf)) - PG_CMD_PRINTF3("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('%s', '%s', %d);", + PG_CMD_PRINTF3("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('%s', '%s', %d);\n", escape_quotes(alias), escape_quotes(localebuf), enc); } /* Add an SQL-standard name */ - PG_CMD_PRINTF1("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('ucs_basic', 'C', %d);", PG_UTF8); + PG_CMD_PRINTF1("INSERT INTO tmp_pg_collation (collname, locale, encoding) VALUES ('ucs_basic', 'C', %d);\n", PG_UTF8); /* * When copying collations to the final location, eliminate @@ -1674,8 +1674,7 @@ setup_collation(void) " COALESCE(collname, locale) AS final_collname, " " (SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog') AS collnamespace, " " (SELECT relowner FROM pg_class WHERE relname = 'pg_collation') AS collowner, " - " encoding, " - " locale, locale " + " encoding, locale, locale " " FROM tmp_pg_collation" " ORDER BY final_collname, collnamespace, encoding, (collname = locale) DESC, locale;\n"); @@ -1683,12 +1682,9 @@ setup_collation(void) PG_CMD_CLOSE; check_ok(); - if (skipped && !debug) + if (count == 0 && !debug) { - printf(ngettext("%d system locale has been omitted because it cannot supported by PostgreSQL.\n", - "%d system locales have been omitted because they cannot be supported by PostgreSQL.\n", - skipped), - skipped); + printf(_("No usable system locales were found.\n")); printf(_("Use the option \"--debug\" to see details.\n")); } #else /* not HAVE_LOCALE_T */