Refactor: make default_locale internal to pg_locale.c.
Discussion: https://postgr.es/m/2228884bb1f1a02614b39f71a90c94d2cc8a3a2f.camel@j-davis.com Reviewed-by: Peter Eisentraut, Andreas Karlsson
This commit is contained in:
parent
005c6b833f
commit
1c461a8d8d
@ -56,6 +56,7 @@
|
|||||||
|
|
||||||
#include "access/htup_details.h"
|
#include "access/htup_details.h"
|
||||||
#include "catalog/pg_collation.h"
|
#include "catalog/pg_collation.h"
|
||||||
|
#include "catalog/pg_database.h"
|
||||||
#include "common/hashfn.h"
|
#include "common/hashfn.h"
|
||||||
#include "mb/pg_wchar.h"
|
#include "mb/pg_wchar.h"
|
||||||
#include "miscadmin.h"
|
#include "miscadmin.h"
|
||||||
@ -116,6 +117,8 @@ char *localized_full_months[12 + 1];
|
|||||||
/* is the databases's LC_CTYPE the C locale? */
|
/* is the databases's LC_CTYPE the C locale? */
|
||||||
bool database_ctype_is_c = false;
|
bool database_ctype_is_c = false;
|
||||||
|
|
||||||
|
static struct pg_locale_struct default_locale;
|
||||||
|
|
||||||
/* indicates whether locale information cache is valid */
|
/* indicates whether locale information cache is valid */
|
||||||
static bool CurrentLocaleConvValid = false;
|
static bool CurrentLocaleConvValid = false;
|
||||||
static bool CurrentLCTimeValid = false;
|
static bool CurrentLCTimeValid = false;
|
||||||
@ -1458,8 +1461,6 @@ lc_ctype_is_c(Oid collation)
|
|||||||
return (lookup_collation_cache(collation, true))->ctype_is_c;
|
return (lookup_collation_cache(collation, true))->ctype_is_c;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pg_locale_struct default_locale;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
make_icu_collator(const char *iculocstr,
|
make_icu_collator(const char *iculocstr,
|
||||||
const char *icurules,
|
const char *icurules,
|
||||||
@ -1554,7 +1555,69 @@ pg_locale_deterministic(pg_locale_t locale)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a locale_t from a collation OID. Results are cached for the
|
* Initialize default_locale with database locale settings.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
init_database_collation(void)
|
||||||
|
{
|
||||||
|
HeapTuple tup;
|
||||||
|
Form_pg_database dbform;
|
||||||
|
Datum datum;
|
||||||
|
bool isnull;
|
||||||
|
|
||||||
|
/* Fetch our pg_database row normally, via syscache */
|
||||||
|
tup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId));
|
||||||
|
if (!HeapTupleIsValid(tup))
|
||||||
|
elog(ERROR, "cache lookup failed for database %u", MyDatabaseId);
|
||||||
|
dbform = (Form_pg_database) GETSTRUCT(tup);
|
||||||
|
|
||||||
|
if (dbform->datlocprovider == COLLPROVIDER_BUILTIN)
|
||||||
|
{
|
||||||
|
char *datlocale;
|
||||||
|
|
||||||
|
datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datlocale);
|
||||||
|
datlocale = TextDatumGetCString(datum);
|
||||||
|
|
||||||
|
builtin_validate_locale(dbform->encoding, datlocale);
|
||||||
|
|
||||||
|
default_locale.info.builtin.locale = MemoryContextStrdup(
|
||||||
|
TopMemoryContext, datlocale);
|
||||||
|
}
|
||||||
|
else if (dbform->datlocprovider == COLLPROVIDER_ICU)
|
||||||
|
{
|
||||||
|
char *datlocale;
|
||||||
|
char *icurules;
|
||||||
|
|
||||||
|
datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datlocale);
|
||||||
|
datlocale = TextDatumGetCString(datum);
|
||||||
|
|
||||||
|
datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_daticurules, &isnull);
|
||||||
|
if (!isnull)
|
||||||
|
icurules = TextDatumGetCString(datum);
|
||||||
|
else
|
||||||
|
icurules = NULL;
|
||||||
|
|
||||||
|
make_icu_collator(datlocale, icurules, &default_locale);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Assert(dbform->datlocprovider == COLLPROVIDER_LIBC);
|
||||||
|
}
|
||||||
|
|
||||||
|
default_locale.provider = dbform->datlocprovider;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default locale is currently always deterministic. Nondeterministic
|
||||||
|
* locales currently don't support pattern matching, which would break a
|
||||||
|
* lot of things if applied globally.
|
||||||
|
*/
|
||||||
|
default_locale.deterministic = true;
|
||||||
|
|
||||||
|
ReleaseSysCache(tup);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a pg_locale_t from a collation OID. Results are cached for the
|
||||||
* lifetime of the backend. Thus, do not free the result with freelocale().
|
* lifetime of the backend. Thus, do not free the result with freelocale().
|
||||||
*
|
*
|
||||||
* As a special optimization, the default/database collation returns 0.
|
* As a special optimization, the default/database collation returns 0.
|
||||||
|
@ -318,7 +318,6 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect
|
|||||||
bool isnull;
|
bool isnull;
|
||||||
char *collate;
|
char *collate;
|
||||||
char *ctype;
|
char *ctype;
|
||||||
char *datlocale;
|
|
||||||
|
|
||||||
/* Fetch our pg_database row normally, via syscache */
|
/* Fetch our pg_database row normally, via syscache */
|
||||||
tup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId));
|
tup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId));
|
||||||
@ -423,42 +422,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect
|
|||||||
strcmp(ctype, "POSIX") == 0)
|
strcmp(ctype, "POSIX") == 0)
|
||||||
database_ctype_is_c = true;
|
database_ctype_is_c = true;
|
||||||
|
|
||||||
if (dbform->datlocprovider == COLLPROVIDER_BUILTIN)
|
init_database_collation();
|
||||||
{
|
|
||||||
datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datlocale);
|
|
||||||
datlocale = TextDatumGetCString(datum);
|
|
||||||
|
|
||||||
builtin_validate_locale(dbform->encoding, datlocale);
|
|
||||||
|
|
||||||
default_locale.info.builtin.locale = MemoryContextStrdup(
|
|
||||||
TopMemoryContext, datlocale);
|
|
||||||
}
|
|
||||||
else if (dbform->datlocprovider == COLLPROVIDER_ICU)
|
|
||||||
{
|
|
||||||
char *icurules;
|
|
||||||
|
|
||||||
datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datlocale);
|
|
||||||
datlocale = TextDatumGetCString(datum);
|
|
||||||
|
|
||||||
datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_daticurules, &isnull);
|
|
||||||
if (!isnull)
|
|
||||||
icurules = TextDatumGetCString(datum);
|
|
||||||
else
|
|
||||||
icurules = NULL;
|
|
||||||
|
|
||||||
make_icu_collator(datlocale, icurules, &default_locale);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
datlocale = NULL;
|
|
||||||
|
|
||||||
default_locale.provider = dbform->datlocprovider;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Default locale is currently always deterministic. Nondeterministic
|
|
||||||
* locales currently don't support pattern matching, which would break a
|
|
||||||
* lot of things if applied globally.
|
|
||||||
*/
|
|
||||||
default_locale.deterministic = true;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check collation version. See similar code in
|
* Check collation version. See similar code in
|
||||||
@ -478,7 +442,10 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect
|
|||||||
if (dbform->datlocprovider == COLLPROVIDER_LIBC)
|
if (dbform->datlocprovider == COLLPROVIDER_LIBC)
|
||||||
locale = collate;
|
locale = collate;
|
||||||
else
|
else
|
||||||
locale = datlocale;
|
{
|
||||||
|
datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datlocale);
|
||||||
|
locale = TextDatumGetCString(datum);
|
||||||
|
}
|
||||||
|
|
||||||
actual_versionstr = get_collation_actual_version(dbform->datlocprovider, locale);
|
actual_versionstr = get_collation_actual_version(dbform->datlocprovider, locale);
|
||||||
if (!actual_versionstr)
|
if (!actual_versionstr)
|
||||||
|
@ -93,13 +93,12 @@ struct pg_locale_struct
|
|||||||
|
|
||||||
typedef struct pg_locale_struct *pg_locale_t;
|
typedef struct pg_locale_struct *pg_locale_t;
|
||||||
|
|
||||||
extern PGDLLIMPORT struct pg_locale_struct default_locale;
|
|
||||||
|
|
||||||
extern void make_icu_collator(const char *iculocstr,
|
extern void make_icu_collator(const char *iculocstr,
|
||||||
const char *icurules,
|
const char *icurules,
|
||||||
struct pg_locale_struct *resultp);
|
struct pg_locale_struct *resultp);
|
||||||
|
|
||||||
extern bool pg_locale_deterministic(pg_locale_t locale);
|
extern bool pg_locale_deterministic(pg_locale_t locale);
|
||||||
|
extern void init_database_collation(void);
|
||||||
extern pg_locale_t pg_newlocale_from_collation(Oid collid);
|
extern pg_locale_t pg_newlocale_from_collation(Oid collid);
|
||||||
|
|
||||||
extern char *get_collation_actual_version(char collprovider, const char *collcollate);
|
extern char *get_collation_actual_version(char collprovider, const char *collcollate);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user