























在数据库中运行需要的各种参数 --> GUC: Grand Unified Configuration. 当我们需要写 postgres 中相关的插件时,离不开 GUC 的处理,这篇文章对 GUC 做一些简单的记录。
而这些参数的可以有各种各样的来源,postgres 对每种来源的处理也不完全相同, 这些来源中有 pg 默认的,系统环境的,来自 user 的,来自 session 的等等等。。。一些基于 pg 的分布式数据库还会额外的增加 GUC 来源。
postgres 9.4 guc file src/backend/utils/misc/guc.c
const char *const GucSource_Names[] = { /* PGC_S_DEFAULT */ "default", /* PGC_S_DYNAMIC_DEFAULT */ "default", /* PGC_S_ENV_VAR */ "environment variable", /* PGC_S_FILE */ "configuration file", /* PGC_S_ARGV */ "command line", /* PGC_S_GLOBAL */ "global", /* PGC_S_DATABASE */ "database", /* PGC_S_USER */ "user", /* PGC_S_DATABASE_USER */ "database user", /* PGC_S_CLIENT */ "client", /* PGC_S_OVERRIDE */ "override", /* PGC_S_INTERACTIVE */ "interactive", /* PGC_S_TEST */ "test", /* PGC_S_SESSION */ "session" };
我们可以用命令查这些相关的 GUC 和来源
select name, setting, source from pg_settings;
不同的 GUC 也会有不同的权限。
/* * Displayable names for context types (enum GucContext) * * Note: these strings are deliberately not localized. */ const char *const GucContext_Names[] = { /* PGC_INTERNAL */ "internal", /* PGC_POSTMASTER */ "postmaster", /* PGC_SIGHUP */ "sighup", /* PGC_BACKEND */ "backend", /* PGC_SUSET */ "superuser", /* PGC_USERSET */ "user" };
const char *const config_type_names[] = { /* PGC_BOOL */ "bool", /* PGC_INT */ "integer", /* PGC_REAL */ "real", /* PGC_STRING */ "string", /* PGC_ENUM */ "enum" };
不同类型的 GUC 有对应相对的 GUC 函数,都用 DefineCustomXXXVariable 命名 srting 类型为例:
void DefineCustomStringVariable(const char *name, const char *short_desc, const char *long_desc, char **valueAddr, const char *bootValue, GucContext context, int flags, GucStringCheckHook check_hook, GucStringAssignHook assign_hook, GucShowHook show_hook) { struct config_string *var; var = (struct config_string *) init_custom_variable(name, short_desc, long_desc, context, flags, PGC_STRING, sizeof(struct config_string)); var->variable = valueAddr; var->boot_val = bootValue; var->check_hook = check_hook; var->assign_hook = assign_hook; var->show_hook = show_hook; define_custom_variable(&var->gen); }
如上 DefineCustomStringVariable 可以容易看出,每种类型的 GUC 可以添加 3 个不同的 hook, 这 3 个 hook 在 set 时候触发,分别是
_PG_init 中此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。