summaryrefslogtreecommitdiff
path: root/contrib/tsearch2/ts_locale.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tsearch2/ts_locale.c')
-rw-r--r--contrib/tsearch2/ts_locale.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/contrib/tsearch2/ts_locale.c b/contrib/tsearch2/ts_locale.c
new file mode 100644
index 00000000000..b84681f1b07
--- /dev/null
+++ b/contrib/tsearch2/ts_locale.c
@@ -0,0 +1,61 @@
+#include "ts_locale.h"
+
+#include "utils/builtins.h"
+#include "utils/pg_locale.h"
+#include "mb/pg_wchar.h"
+
+
+#if defined(TS_USE_WIDE) && defined(WIN32)
+
+size_t
+wchar2char( const char *to, const wchar_t *from, size_t len ) {
+ if (GetDatabaseEncoding() == PG_UTF8) {
+ int r;
+
+ if (len==0)
+ return 0;
+
+ r = WideCharToMultiByte(CP_UTF8, 0, from, len, to, nbytes,
+ NULL, NULL);
+
+
+ if ( r==0 )
+ ereport(ERROR,
+ (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
+ errmsg("UTF-16 to UTF-8 translation failed: %lu",
+ GetLastError())));
+
+ return r;
+ }
+
+ return wcstombs(to, from, len);
+}
+
+size_t
+char2wchar( const wchar_t *to, const char *from, size_t len ) {
+ if (GetDatabaseEncoding() == PG_UTF8) {
+ int r;
+
+ if (len==0)
+ return 0;
+
+ r = MultiByteToWideChar(CP_UTF8, 0, from, len,
+ to, len);
+
+ if (!r) {
+ pg_verifymbstr(from, len, false);
+ ereport(ERROR,
+ (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
+ errmsg("invalid multibyte character for locale"),
+ errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
+ }
+
+ Assert(r <= nbytes);
+
+ return r;
+ }
+
+ return mbstowcs(to, from, len);
+}
+
+#endif