mirror of
https://github.com/postgres/postgres.git
synced 2025-11-12 00:04:44 -05:00
guc.c has grown to be one of our largest .c files, making it a bottleneck for compilation. It's also acquired a bunch of knowledge that'd be better kept elsewhere, because of our not very good habit of putting variable-specific check hooks here. Hence, split it up along these lines: * guc.c itself retains just the core GUC housekeeping mechanisms. * New file guc_funcs.c contains the SET/SHOW interfaces and some SQL-accessible functions for GUC manipulation. * New file guc_tables.c contains the data arrays that define the built-in GUC variables, along with some already-exported constant tables. * GUC check/assign/show hook functions are moved to the variable's home module, whenever that's clearly identifiable. A few hard- to-classify hooks ended up in commands/variable.c, which was already a home for miscellaneous GUC hook functions. To avoid cluttering a lot more header files with #include "guc.h", I also invented a new header file utils/guc_hooks.h and put all the GUC hook functions' declarations there, regardless of their originating module. That allowed removal of #include "guc.h" from some existing headers. The fallout from that (hopefully all caught here) demonstrates clearly why such inclusions are best minimized: there are a lot of files that, for example, were getting array.h at two or more levels of remove, despite not having any connection at all to GUCs in themselves. There is some very minor code beautification here, such as renaming a couple of inconsistently-named hook functions and improving some comments. But mostly this just moves code from point A to point B and deals with the ensuing needs for #include adjustments and exporting a few functions that previously weren't exported. Patch by me, per a suggestion from Andres Freund; thanks also to Michael Paquier for the idea to invent guc_funcs.c. Discussion: https://postgr.es/m/587607.1662836699@sss.pgh.pa.us
117 lines
3.2 KiB
C
117 lines
3.2 KiB
C
/*-----------------------------------------------------------------------
|
|
*
|
|
* PostgreSQL locale utilities
|
|
*
|
|
* src/include/utils/pg_locale.h
|
|
*
|
|
* Copyright (c) 2002-2022, PostgreSQL Global Development Group
|
|
*
|
|
*-----------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef _PG_LOCALE_
|
|
#define _PG_LOCALE_
|
|
|
|
#if defined(LOCALE_T_IN_XLOCALE) || defined(WCSTOMBS_L_IN_XLOCALE)
|
|
#include <xlocale.h>
|
|
#endif
|
|
#ifdef USE_ICU
|
|
#include <unicode/ucol.h>
|
|
#endif
|
|
|
|
#ifdef USE_ICU
|
|
/*
|
|
* ucol_strcollUTF8() was introduced in ICU 50, but it is buggy before ICU 53.
|
|
* (see
|
|
* <https://www.postgresql.org/message-id/flat/f1438ec6-22aa-4029-9a3b-26f79d330e72%40manitou-mail.org>)
|
|
*/
|
|
#if U_ICU_VERSION_MAJOR_NUM >= 53
|
|
#define HAVE_UCOL_STRCOLLUTF8 1
|
|
#else
|
|
#undef HAVE_UCOL_STRCOLLUTF8
|
|
#endif
|
|
#endif
|
|
|
|
/* use for libc locale names */
|
|
#define LOCALE_NAME_BUFLEN 128
|
|
|
|
/* GUC settings */
|
|
extern PGDLLIMPORT char *locale_messages;
|
|
extern PGDLLIMPORT char *locale_monetary;
|
|
extern PGDLLIMPORT char *locale_numeric;
|
|
extern PGDLLIMPORT char *locale_time;
|
|
|
|
/* lc_time localization cache */
|
|
extern PGDLLIMPORT char *localized_abbrev_days[];
|
|
extern PGDLLIMPORT char *localized_full_days[];
|
|
extern PGDLLIMPORT char *localized_abbrev_months[];
|
|
extern PGDLLIMPORT char *localized_full_months[];
|
|
|
|
|
|
extern bool check_locale(int category, const char *locale, char **canonname);
|
|
extern char *pg_perm_setlocale(int category, const char *locale);
|
|
extern void check_strxfrm_bug(void);
|
|
|
|
extern bool lc_collate_is_c(Oid collation);
|
|
extern bool lc_ctype_is_c(Oid collation);
|
|
|
|
/*
|
|
* Return the POSIX lconv struct (contains number/money formatting
|
|
* information) with locale information for all categories.
|
|
*/
|
|
extern struct lconv *PGLC_localeconv(void);
|
|
|
|
extern void cache_locale_time(void);
|
|
|
|
|
|
/*
|
|
* We define our own wrapper around locale_t so we can keep the same
|
|
* function signatures for all builds, while not having to create a
|
|
* fake version of the standard type locale_t in the global namespace.
|
|
* pg_locale_t is occasionally checked for truth, so make it a pointer.
|
|
*/
|
|
struct pg_locale_struct
|
|
{
|
|
char provider;
|
|
bool deterministic;
|
|
union
|
|
{
|
|
#ifdef HAVE_LOCALE_T
|
|
locale_t lt;
|
|
#endif
|
|
#ifdef USE_ICU
|
|
struct
|
|
{
|
|
const char *locale;
|
|
UCollator *ucol;
|
|
} icu;
|
|
#endif
|
|
int dummy; /* in case we have neither LOCALE_T nor ICU */
|
|
} info;
|
|
};
|
|
|
|
typedef struct pg_locale_struct *pg_locale_t;
|
|
|
|
extern PGDLLIMPORT struct pg_locale_struct default_locale;
|
|
|
|
extern void make_icu_collator(const char *iculocstr,
|
|
struct pg_locale_struct *resultp);
|
|
|
|
extern pg_locale_t pg_newlocale_from_collation(Oid collid);
|
|
|
|
extern char *get_collation_actual_version(char collprovider, const char *collcollate);
|
|
|
|
#ifdef USE_ICU
|
|
extern int32_t icu_to_uchar(UChar **buff_uchar, const char *buff, size_t nbytes);
|
|
extern int32_t icu_from_uchar(char **result, const UChar *buff_uchar, int32_t len_uchar);
|
|
#endif
|
|
extern void check_icu_locale(const char *icu_locale);
|
|
|
|
/* These functions convert from/to libc's wchar_t, *not* pg_wchar_t */
|
|
extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,
|
|
pg_locale_t locale);
|
|
extern size_t char2wchar(wchar_t *to, size_t tolen,
|
|
const char *from, size_t fromlen, pg_locale_t locale);
|
|
|
|
#endif /* _PG_LOCALE_ */
|