Peter Eisentraut wrote:
> Magnus Hagander wrote:
>> However, one question: The comment currently says it's harmless to do
>> this on non-windows platforms. Does this still hold true?
> 
> Yes, the non-WIN32 code path appears to be the same, still.  But the
> ifdef WIN32 part we don't want, because that presumes something about
> the spelling of encoding names in the local iconv library.
> 
>> If we do keep the thing win32 only, I think we should just wrap the
>> whole thing in #ifdef WIN32 and no longer do the codeset stuff at all on
>> Unix - that'll make for cleaner code.
> 
> Yes, that would be much better.

Something like this then?

//Magnus

*** a/src/backend/utils/mb/mbutils.c
--- b/src/backend/utils/mb/mbutils.c
***************
*** 849,854 **** cliplen(const char *str, int len, int limit)
--- 849,894 ----
  	return l;
  }
  
+ #if defined(ENABLE_NLS) && defined(WIN32)
+ 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_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 /* WIN32 */
+ 
  void
  SetDatabaseEncoding(int encoding)
  {
***************
*** 859,880 **** SetDatabaseEncoding(int encoding)
  	Assert(DatabaseEncoding->encoding == encoding);
  
  	/*
! 	 * On Windows, we allow UTF-8 database encoding to be used with any
! 	 * locale setting, because UTF-8 requires special handling anyway.
! 	 * But this means that gettext() might be misled about what output
! 	 * encoding it should use, so we have to tell it explicitly.
! 	 *
! 	 * In future we might want to call bind_textdomain_codeset
! 	 * unconditionally, but that requires knowing how to spell the codeset
! 	 * name properly for all encodings on all platforms, which might be
! 	 * problematic.
! 	 *
! 	 * This is presently unnecessary, but harmless, on non-Windows platforms.
  	 */
! #ifdef ENABLE_NLS
! 	if (encoding == PG_UTF8)
! 		if (bind_textdomain_codeset(textdomain(NULL), "UTF-8") == NULL)
! 			elog(LOG, "bind_textdomain_codeset failed");
  #endif
  }
  
--- 899,921 ----
  	Assert(DatabaseEncoding->encoding == encoding);
  
  	/*
! 	 * On Windows, we need to explicitly bind gettext to the correct
! 	 * encoding, because gettext() tends to get confused.
  	 */
! #if defined(ENABLE_NLS) && defined(WIN32)
! 	{
! 		int	i;
! 
! 		for (i = 0; i < sizeof(codeset_map_array) / sizeof(codeset_map_array[0]); i++)
! 		{
! 			if (codeset_map_array[i].encoding == encoding)
! 			{
! 				if (bind_textdomain_codeset(textdomain(NULL), codeset_map_array[i].codeset) == NULL)
! 					elog(LOG, "bind_textdomain_codeset failed");
! 				break;
! 			}
! 		}
! 	}
  #endif
  }
  
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to