Some cleanups of enum-guc code, per comments from Tom.

This commit is contained in:
Magnus Hagander 2008-03-16 16:42:44 +00:00
parent c9a1cc694a
commit a3f66eac01
4 changed files with 68 additions and 23 deletions

View File

@ -1,10 +1,10 @@
$PostgreSQL: pgsql/src/backend/utils/misc/README,v 1.8 2007/12/28 00:23:23 tgl Exp $
$PostgreSQL: pgsql/src/backend/utils/misc/README,v 1.9 2008/03/16 16:42:44 mha Exp $
GUC IMPLEMENTATION NOTES
The GUC (Grand Unified Configuration) module implements configuration
variables of multiple types (currently boolean, int, float, and string).
variables of multiple types (currently boolean, enum, int, float, and string).
Variable settings can come from various places, with a priority ordering
determining which setting is used.

View File

@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.437 2008/03/10 12:55:13 mha Exp $
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.438 2008/03/16 16:42:44 mha Exp $
*
*--------------------------------------------------------------------
*/
@ -168,6 +168,14 @@ static const char *show_tcp_keepalives_count(void);
static bool assign_autovacuum_max_workers(int newval, bool doit, GucSource source);
static bool assign_maxconnections(int newval, bool doit, GucSource source);
static const char *config_enum_lookup_value(struct config_enum *record, int val);
static bool config_enum_lookup_name(struct config_enum *record,
const char *value, int *retval);
static char *config_enum_get_options(struct config_enum *record,
const char *prefix, const char *suffix);
/*
* Options for enum values defined in this module.
*/
@ -3134,8 +3142,9 @@ InitializeGUCOptions(void)
if (conf->assign_hook)
if (!(*conf->assign_hook) (conf->boot_val, true,
PGC_S_DEFAULT))
elog(FATAL, "failed to initialize %s to %d",
conf->gen.name, conf->boot_val);
elog(FATAL, "failed to initialize %s to %s",
conf->gen.name,
config_enum_lookup_value(conf, conf->boot_val));
*conf->variable = conf->reset_val = conf->boot_val;
break;
}
@ -4230,7 +4239,7 @@ config_enum_lookup_value(struct config_enum *record, int val)
* Lookup the value for an enum option with the selected name
* (case-insensitive).
* If the enum option is found, sets the retval value and returns
* true. If it's not found, return FALSE and don't touch retval.
* true. If it's not found, return FALSE and retval is set to 0.
*
*/
static bool
@ -4243,7 +4252,7 @@ config_enum_lookup_name(struct config_enum *record, const char *value, int *retv
while (entry && entry->name)
{
if (!pg_strcasecmp(value, entry->name))
if (pg_strcasecmp(value, entry->name) == 0)
{
*retval = entry->val;
return TRUE;
@ -4255,10 +4264,10 @@ config_enum_lookup_name(struct config_enum *record, const char *value, int *retv
/*
* Returna list of all available options for an enum, separated
* Return a list of all available options for an enum, separated
* by ", " (comma-space).
* If prefix is gievn, it is added before the first enum value.
* If suffix is given, it is added to the end of the string.
* If prefix is non-NULL, it is added before the first enum value.
* If suffix is non-NULL, it is added to the end of the string.
*/
static char *
config_enum_get_options(struct config_enum *record, const char *prefix, const char *suffix)
@ -4895,8 +4904,9 @@ set_config_option(const char *name, const char *value,
{
ereport(elevel,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid value for parameter \"%s\": \"%d\"",
name, newval)));
errmsg("invalid value for parameter \"%s\": \"%s\"",
name,
config_enum_lookup_value(conf, newval))));
return false;
}
@ -5592,6 +5602,30 @@ DefineCustomStringVariable(const char *name,
define_custom_variable(&var->gen);
}
void
DefineCustomEnumVariable(const char *name,
const char *short_desc,
const char *long_desc,
int *valueAddr,
const struct config_enum_entry *options,
GucContext context,
GucEnumAssignHook assign_hook,
GucShowHook show_hook)
{
struct config_enum *var;
var = (struct config_enum *)
init_custom_variable(name, short_desc, long_desc, context,
PGC_ENUM, sizeof(struct config_enum));
var->variable = valueAddr;
var->boot_val = *valueAddr;
var->reset_val = *valueAddr;
var->options = options;
var->assign_hook = assign_hook;
var->show_hook = show_hook;
define_custom_variable(&var->gen);
}
void
EmitWarningsOnPlaceholders(const char *className)
{

View File

@ -7,7 +7,7 @@
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.91 2008/03/10 12:55:13 mha Exp $
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.92 2008/03/16 16:42:44 mha Exp $
*--------------------------------------------------------------------
*/
#ifndef GUC_H
@ -93,6 +93,16 @@ typedef enum
PGC_S_SESSION /* SET command */
} GucSource;
/*
* Enum values are made up of an array of name-value pairs
*/
struct config_enum_entry
{
const char *name;
int val;
};
typedef const char *(*GucStringAssignHook) (const char *newval, bool doit, GucSource source);
typedef bool (*GucBoolAssignHook) (bool newval, bool doit, GucSource source);
typedef bool (*GucIntAssignHook) (int newval, bool doit, GucSource source);
@ -189,6 +199,16 @@ extern void DefineCustomStringVariable(
GucStringAssignHook assign_hook,
GucShowHook show_hook);
extern void DefineCustomEnumVariable(
const char *name,
const char *short_desc,
const char *long_desc,
int *valueAddr,
const struct config_enum_entry *options,
GucContext context,
GucEnumAssignHook assign_hook,
GucShowHook show_hook);
extern void EmitWarningsOnPlaceholders(const char *className);
extern const char *GetConfigOption(const char *name);

View File

@ -7,7 +7,7 @@
*
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.39 2008/03/10 12:55:13 mha Exp $
* $PostgreSQL: pgsql/src/include/utils/guc_tables.h,v 1.40 2008/03/16 16:42:44 mha Exp $
*
*-------------------------------------------------------------------------
*/
@ -37,15 +37,6 @@ union config_var_value
int enumval;
};
/*
* Enum values are made up of an array of name-value pairs
*/
struct config_enum_entry
{
const char *name;
int val;
};
/*
* Groupings to help organize all the run-time options for display
*/