pg.ddx.io  pgsql-patches@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Magnus Hagander <magnus@hagander.net>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Hiroshi Saito <z-saito@guitar.ocn.ne.jp>
Cc: ITAGAKI Takahiro <itagaki.takahiro@oss.ntt.co.jp>
Cc: Jaime Casanova <jcasanov@systemguards.com.ec>
Cc: Alvaro Herrera <alvherre@commandprompt.com>
Cc: pgsql-hackers <pgsql-hackers@postgresql.org>
Subject: Re: [PATCHES] Solve a problem of LC_TIME of windows.
Date: Mon, 24 Nov 2008 16:00:42 +0100
Message-ID: <492AC19A.6090401@hagander.net> (raw)
In-Reply-To: <492AC031.7010901@hagander.net>
References: <20081104094301.7EE8.52131E4D@oss.ntt.co.jp>
	<3073cc9b0811102212n278644a8o7169f7c5ea562081@mail.gmail.com>
	<20081111152112.B605.52131E4D@oss.ntt.co.jp>
	<A32F4AB7D95646B3A358002E1FB73F9C@HIRO57887DE653>
	<446F4763B989489C9B626D21AB9F6C7F@HIRO57887DE653>
	<492AA5CD.8050001@hagander.net>
	<18269.1227538234@sss.pgh.pa.us>
	<492AC031.7010901@hagander.net>

Magnus Hagander wrote:
> Tom Lane wrote:
>> Magnus Hagander <magnus@hagander.net> writes:
>>> *** a/src/backend/utils/adt/pg_locale.c
>>> --- b/src/backend/utils/adt/pg_locale.c
>>> ***************
>>> *** 54,59 ****
>>> --- 54,60 ----
>>>   #include "utils/memutils.h"
>>>   #include "utils/pg_locale.h"
>>   
>>> + #include "mb/pg_wchar.h"
>>   
>>>   #define		MAX_L10N_DATA		80
>> Please stick to the convention of including include files in
>> alphabetical order.
> 
> Check.
> 
> 
>>> + strftime_win32(char *dst, size_t dstlen, const char *format, const struct tm *tm)
>>> + {
>>> + 	size_t	len;
>>> + 	wchar_t	wbuf[MAX_L10N_DATA];
>>> + 	int		encoding;
>>> + 
>>> + 	encoding = GetDatabaseEncoding();
>>> + 	if (encoding == PG_SQL_ASCII)
>>> + 		return len;
>> Surely this is returning an uninitialized variable, not to mention
>> failing to accomplish any of the goals of the function.  I don't think
>> breaking things completely for SQL_ASCII was part of the plan.
> 
> Gah, true, that's me breaking it. That was correct in Hiroshi-san's
> patch. My bad, sorry.
> 
> 
>>> + 		ereport(ERROR,
>>> + 			(errmsg("could not convert string to UTF-8:error %lu", GetLastError())));
>> This is not exactly per message style guidelines.  Maybe it's just a
>> can't-happen case, but if so make it elog not ereport.
> 
> Check.

Forgot the attachment.

//Magnus

Attachments:

pg_locale.diff (text/x-diff, 1.8K) download *** a/src/backend/utils/adt/pg_locale.c --- b/src/backend/utils/adt/pg_locale.c *************** *** 51,56 **** --- 51,57 ---- #include <time.h> #include "catalog/pg_control.h" + #include "mb/pg_wchar.h" #include "utils/memutils.h" #include "utils/pg_locale.h" *************** *** 452,457 **** PGLC_localeconv(void) --- 453,507 ---- return &CurrentLocaleConv; } + #ifdef WIN32 + /* + * On win32, strftime() returns the encoding in CP_ACP, which is likely + * different from SERVER_ENCODING. This is especially important in Japanese + * versions of Windows which will use SJIS encoding, which we don't support + * as a server encoding. + * + * Replace strftime() with a version that gets the string in UTF16 and then + * converts it to the appropriate encoding as necessary. + */ + static size_t + strftime_win32(char *dst, size_t dstlen, const char *format, const struct tm *tm) + { + size_t len; + wchar_t wbuf[MAX_L10N_DATA]; + int encoding; + + encoding = GetDatabaseEncoding(); + if (encoding == PG_SQL_ASCII) + return strftime(dst, dstlen, format, tm); + + len = wcsftime(wbuf, sizeof(wbuf), format, tm); + if (len == 0) + /* strftime call failed - return 0 with the contents of dst unspecified */ + return 0; + + len = WideCharToMultiByte(CP_UTF8, 0, wbuf, len, dst, dstlen, NULL, NULL); + if (len == 0) + elog(ERROR, + "could not convert string to UTF-8:error %lu", GetLastError()); + + dst[len] = '\0'; + if (encoding != PG_UTF8) + { + char *convstr = pg_do_encoding_conversion(dst, len, PG_UTF8, encoding); + if (dst != convstr) + { + StrNCpy(dst, convstr, dstlen); + len = strlen(dst); + } + } + + return len; + } + + #define strftime(a,b,c,d) strftime_win32(a,b,c,d) + + #endif /* WIN32 */ + /* * Update the lc_time localization cache variables if needed.

view thread (45+ messages)  latest in thread

Message-ID: <492AC19A.6090401@hagander.net>
Permalink:  ../492AC19A.6090401@hagander.net/
Also on:    postgresql.org/message-id/492AC19A.6090401@hagander.net

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-patches@postgresql.org
  Cc: magnus@hagander.net, tgl@sss.pgh.pa.us, z-saito@guitar.ocn.ne.jp, itagaki.takahiro@oss.ntt.co.jp, jcasanov@systemguards.com.ec, alvherre@commandprompt.com, pgsql-hackers@postgresql.org
  Subject: Re: [PATCHES] Solve a problem of LC_TIME of windows.
  In-Reply-To: <492AC19A.6090401@hagander.net>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox