diff -cpr head/src/backend/utils/error/elog.c eventlog/src/backend/utils/error/elog.c *** head/src/backend/utils/error/elog.c Tue Jul 7 16:06:35 2009 --- eventlog/src/backend/utils/error/elog.c Mon Aug 17 10:49:42 2009 *************** static int syslog_facility = LOG_LOCAL0; *** 111,116 **** --- 111,118 ---- static void write_syslog(int level, const char *line); #endif + static void write_console(const char *line, int len); + #ifdef WIN32 static void write_eventlog(int level, const char *line); #endif *************** write_eventlog(int level, const char *li *** 1606,1613 **** break; } ! ! ReportEvent(evtHandle, eventlevel, 0, 0, /* All events are Id 0 */ --- 1608,1616 ---- break; } ! if (GetDatabaseEncoding() == GetPlatformEncoding()) ! { ! ReportEventA(evtHandle, eventlevel, 0, 0, /* All events are Id 0 */ *************** write_eventlog(int level, const char *li *** 1616,1624 **** --- 1619,1696 ---- 0, &line, NULL); + } + else + { + char *utf8; + WCHAR *utf16; + int len; + + len = strlen(line); + utf8 = (char *) pg_do_encoding_conversion((unsigned char *) line, + len, GetDatabaseEncoding(), PG_UTF8); + if (utf8 != line) + len = strlen(utf8); + + utf16 = (WCHAR *) palloc(sizeof(WCHAR) * (len + 1)); + len = MultiByteToWideChar(CP_UTF8, 0, utf8, len, utf16, len); + utf16[len] = L'\0'; + + ReportEventW(evtHandle, + eventlevel, + 0, + 0, /* All events are Id 0 */ + NULL, + 1, + 0, + (LPCWSTR *) &utf16, + NULL); + + if (utf8 != line) + pfree(utf8); + pfree(utf16); + } } #endif /* WIN32 */ + static void + write_console(const char *line, int len) + { + if (GetDatabaseEncoding() == GetPlatformEncoding()) + write(fileno(stderr), line, len); + else + { + #ifdef WIN32 + char *utf8; + WCHAR *utf16; + HANDLE stderrHandle; + DWORD written; + + utf8 = (char *) pg_do_encoding_conversion((unsigned char *) line, + len, GetDatabaseEncoding(), PG_UTF8); + + if (utf8 != line) + len = strlen(utf8); + utf16 = (WCHAR *) palloc(sizeof(WCHAR) * len); + len = MultiByteToWideChar(CP_UTF8, 0, utf8, len, utf16, len); + + stderrHandle = GetStdHandle(STD_ERROR_HANDLE); + WriteConsoleW(stderrHandle, utf16, len, &written, NULL); + + if (utf8 != line) + pfree(utf8); + pfree(utf16); + #else + /* + * Conversion on non-win32 platform is not implemented yet. + * It requires non-throw version of pg_do_encoding_conversion(), + * that converts unconvertable characters to '?' without errors. + */ + write(fileno(stderr), line, len); + #endif + } + } + /* * setup formatted_log_time, for consistent times between CSV and regular logs */ *************** send_message_to_server_log(ErrorData *ed *** 2233,2239 **** write_eventlog(edata->elevel, buf.data); #endif else ! write(fileno(stderr), buf.data, buf.len); } /* If in the syslogger process, try to write messages direct to file */ --- 2305,2311 ---- write_eventlog(edata->elevel, buf.data); #endif else ! write_console(buf.data, buf.len); } /* If in the syslogger process, try to write messages direct to file */ *************** send_message_to_server_log(ErrorData *ed *** 2256,2267 **** { const char *msg = _("Not safe to send CSV data\n"); ! write(fileno(stderr), msg, strlen(msg)); if (!(Log_destination & LOG_DESTINATION_STDERR) && whereToSendOutput != DestDebug) { /* write message to stderr unless we just sent it above */ ! write(fileno(stderr), buf.data, buf.len); } pfree(buf.data); } --- 2328,2339 ---- { const char *msg = _("Not safe to send CSV data\n"); ! write_console(msg, strlen(msg)); if (!(Log_destination & LOG_DESTINATION_STDERR) && whereToSendOutput != DestDebug) { /* write message to stderr unless we just sent it above */ ! write_console(buf.data, buf.len); } pfree(buf.data); } *************** void *** 2642,2647 **** --- 2714,2722 ---- write_stderr(const char *fmt,...) { va_list ap; + #ifdef WIN32 + char errbuf[2048]; /* Arbitrary size? */ + #endif fmt = _(fmt); *************** write_stderr(const char *fmt,...) *** 2651,2656 **** --- 2726,2732 ---- vfprintf(stderr, fmt, ap); fflush(stderr); #else + vsnprintf(errbuf, sizeof(errbuf), fmt, ap); /* * On Win32, we print to stderr if running on a console, or write to *************** write_stderr(const char *fmt,...) *** 2658,2673 **** */ if (pgwin32_is_service()) /* Running as a service */ { - char errbuf[2048]; /* Arbitrary size? */ - - vsnprintf(errbuf, sizeof(errbuf), fmt, ap); - write_eventlog(ERROR, errbuf); } else { /* Not running as service, write to stderr */ ! vfprintf(stderr, fmt, ap); fflush(stderr); } #endif --- 2734,2745 ---- */ if (pgwin32_is_service()) /* Running as a service */ { write_eventlog(ERROR, errbuf); } else { /* Not running as service, write to stderr */ ! write_console(errbuf, strlen(errbuf)); fflush(stderr); } #endif diff -cpr head/src/backend/utils/mb/mbutils.c eventlog/src/backend/utils/mb/mbutils.c *** head/src/backend/utils/mb/mbutils.c Thu Jul 9 11:16:13 2009 --- eventlog/src/backend/utils/mb/mbutils.c Mon Aug 17 10:49:42 2009 *************** static FmgrInfo *ToClientConvProc = NULL *** 58,63 **** --- 58,64 ---- */ static pg_enc2name *ClientEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; static pg_enc2name *DatabaseEncoding = &pg_enc2name_tbl[PG_SQL_ASCII]; + static pg_enc2name *PlatformEncoding = NULL; /* * During backend startup we can't set client encoding because we (a) *************** pg_client_encoding(PG_FUNCTION_ARGS) *** 977,980 **** --- 978,989 ---- { Assert(ClientEncoding); return DirectFunctionCall1(namein, CStringGetDatum(ClientEncoding->name)); + } + + int + GetPlatformEncoding(void) + { + if (PlatformEncoding == NULL) + PlatformEncoding = &pg_enc2name_tbl[pg_get_encoding_from_locale("")]; + return PlatformEncoding->encoding; } diff -cpr head/src/include/mb/pg_wchar.h eventlog/src/include/mb/pg_wchar.h *** head/src/include/mb/pg_wchar.h Fri Jun 12 09:52:43 2009 --- eventlog/src/include/mb/pg_wchar.h Mon Aug 17 10:49:42 2009 *************** extern const char *pg_get_client_encodin *** 402,407 **** --- 402,408 ---- extern void SetDatabaseEncoding(int encoding); extern int GetDatabaseEncoding(void); extern const char *GetDatabaseEncodingName(void); + extern int GetPlatformEncoding(void); extern void pg_bind_textdomain_codeset(const char *domainname); extern int pg_valid_client_encoding(const char *name);