diff --git a/src/backend/utils/misc/README b/src/backend/utils/misc/README index c0f90c9f6c..3113218853 100644 --- a/src/backend/utils/misc/README +++ b/src/backend/utils/misc/README @@ -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. diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 9f7e87037f..2f855b13aa 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut . * * 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) { diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 43c37eb4ff..4c80da7d08 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -7,7 +7,7 @@ * Copyright (c) 2000-2008, PostgreSQL Global Development Group * Written by Peter Eisentraut . * - * $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); diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index 2b8d8e6e3e..f81826fe4c 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -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 */