]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Sorry, that I send this letter/patch again, but previous sending is
authorBruce Momjian <bruce@momjian.us>
Fri, 7 Jan 2000 17:22:47 +0000 (17:22 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 7 Jan 2000 17:22:47 +0000 (17:22 +0000)
still
without answer. I want continue with to_char(), but I need any answer
for this patch. Please.

Thank! (and sorry of my impatient :-)
                                                        Karel

src/backend/utils/adt/Makefile
src/backend/utils/adt/pg_locale.c [new file with mode: 0644]
src/include/utils/pg_locale.h [new file with mode: 0644]

index 9aba12726481b96aca163c9cbfb0116547de9df7..dbf5d40ce91d79dd24c1d8c5584b7682dc05ec4f 100644 (file)
@@ -4,7 +4,7 @@
 #    Makefile for utils/adt
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/utils/adt/Makefile,v 1.30 1999/12/28 13:40:48 wieck Exp $
+#    $Header: /cvsroot/pgsql/src/backend/utils/adt/Makefile,v 1.31 2000/01/07 17:22:47 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -35,7 +35,7 @@ OBJS = acl.o arrayfuncs.o arrayutils.o bool.o cash.o char.o chunk.o \
        regexp.o regproc.o ruleutils.o selfuncs.o sets.o \
        tid.o timestamp.o varchar.o varlena.o version.o \
        network.o mac.o inet_net_ntop.o inet_net_pton.o \
-       ri_triggers.o pg_lzcompress.o
+       ri_triggers.o pg_lzcompress.o pg_locale.o
 
 all: SUBSYS.o
 
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
new file mode 100644 (file)
index 0000000..7688a75
--- /dev/null
@@ -0,0 +1,128 @@
+
+/*------
+ * pg_locale.c
+ *
+ *     The PostgreSQL locale utils.
+ *
+ *     2000 Karel Zak - Zakkr
+ *
+ *------
+ */
+#include <stdio.h>
+#include "postgres.h"
+#ifdef USE_LOCALE
+
+#include <locale.h>
+#include "utils/pg_locale.h"
+
+/* #define DEBUG_LOCALE_UTILS  */
+
+
+/*------
+ * Return in PG_LocaleCategories current locale setting 
+ *------
+ */  
+PG_LocaleCategories *
+PGLC_current( PG_LocaleCategories *lc )
+{
+       lc->lang        = getenv("LANG");               
+               
+lc->lc_ctype   = setlocale(LC_CTYPE,     NULL);
+lc->lc_numeric = setlocale(LC_NUMERIC,   NULL);
+lc->lc_time    = setlocale(LC_TIME,      NULL);
+lc->lc_collate = setlocale(LC_COLLATE,   NULL);
+lc->lc_monetary        = setlocale(LC_MONETARY,  NULL);
+lc->lc_messages        = setlocale(LC_MESSAGES,  NULL);
+
+       return lc;
+}      
+
+
+#ifdef DEBUG_LOCALE_UTILS 
+
+/*------
+ * Print a PG_LocaleCategories struct as DEBUG
+ *------
+ */
+PG_LocaleCategories *
+PGLC_debug_lc( PG_LocaleCategories *lc )
+{
+       elog(DEBUG, "CURRENT LOCALE ENVIRONMENT:\n\nLANG:   \t%s\nLC_CTYPE:\t%s\nLC_NUMERIC:\t%s\nLC_TIME:\t%s\nLC_COLLATE:\t%s\nLC_MONETARY:\t%s\nLC_MESSAGES:\t%s\n",
+               lc->lang,       
+               lc->lc_ctype,   
+               lc->lc_numeric, 
+               lc->lc_time,    
+               lc->lc_collate, 
+               lc->lc_monetary,        
+               lc->lc_messages 
+       );
+
+       return lc;      
+}
+
+#endif
+
+/*------
+ * Set locales via a PG_LocaleCategories struct 
+ *------
+ */
+PG_LocaleCategories *
+PGLC_setlocale( PG_LocaleCategories *lc )
+{
+       if (!setlocale(LC_CTYPE,         lc->lc_ctype   ))
+               elog(NOTICE, "pg_setlocale(): 'LC_CTYPE=%s' cannot be honored.", lc->lc_ctype); 
+                       
+       if (!setlocale(LC_NUMERIC,      lc->lc_numeric  ))
+               elog(NOTICE, "pg_setlocale(): 'LC_NUMERIC=%s' cannot be honored.", lc->lc_numeric);
+                       
+        if (!setlocale(LC_TIME,                lc->lc_time     ))
+               elog(NOTICE, "pg_setlocale(): 'LC_TIME=%s' cannot be honored.", lc->lc_time);
+        
+        if (!setlocale(LC_COLLATE,     lc->lc_collate  ))
+               elog(NOTICE, "pg_setlocale(): 'LC_COLLATE=%s' cannot be honored.", lc->lc_collate);
+
+        if (!setlocale(LC_MONETARY,    lc->lc_monetary ))
+               elog(NOTICE, "pg_setlocale(): 'LC_MONETARY=%s' cannot be honored.", lc->lc_monetary);
+  
+        if (!setlocale(LC_MESSAGES,    lc->lc_messages ))
+               elog(NOTICE, "pg_setlocale(): 'LC_MESSAGE=%s' cannot be honored.", lc->lc_messages);
+
+       return lc;
+}
+
+/*------
+ * Return the POSIX lconv struct (contains number/money formatting information)
+ * with locale information for *all* categories.
+ * => Returned lconv is *independent* on current locale catogories setting - in 
+ * contrast to standard localeconv().
+ *
+ * ! libc prepare memory space for lconv itself and all returned strings in 
+ *   lconv are *static strings*.                         
+ *------
+ */
+struct lconv *
+PGLC_localeconv()
+{
+       PG_LocaleCategories     lc;
+       struct lconv            *lconv;
+
+       /* Save current locale setting to lc */
+       PGLC_current(&lc);      
+       
+       /* Set all locale category for current lang */
+       setlocale(LC_ALL, "");
+       
+       /* Get numeric formatting information */ 
+       lconv = localeconv();           
+       
+       /* Set previous original locale */
+       PGLC_setlocale(&lc);
+
+       return lconv;
+}
+
+
+#endif /* USE_LOCALE */
diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h
new file mode 100644 (file)
index 0000000..e5aee46
--- /dev/null
@@ -0,0 +1,46 @@
+
+/*------
+ * pg_locale.h
+ *
+ *     The PostgreSQL locale utils
+ *
+ *     2000 Karel Zak - Zakkr
+ *
+ *------
+ */ 
+ #ifndef _PG_LOCALE_
+ #define _PG_LOCALE_
+ #ifdef USE_LOCALE
+/*------
+ * POSIX locale categories and environment variable LANG
+ *------
+ */
+typedef struct PG_LocaleCategories {
+       char    *lang,
+               *lc_ctype,
+               *lc_numeric,
+               *lc_time,
+               *lc_collate,
+               *lc_monetary,
+               *lc_messages;
+} PG_LocaleCategories;
+
+
+extern PG_LocaleCategories *PGLC_current( PG_LocaleCategories *lc );
+extern PG_LocaleCategories *PGLC_setlocale( PG_LocaleCategories *lc );
+
+/*------
+ * Return the POSIX lconv struct (contains number/money formatting information)
+ * with locale information for *all* categories. Returned lconv is *independent* 
+ * on current locale catogories setting - in contrast to standard localeconv().
+ *------
+ */
+extern struct lconv *PGLC_localeconv();
+
+#endif /* USE_LOCALE */
+#endif /* _PG_LOCALE_ */