aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2008-03-16 16:42:44 +0000
committerMagnus Hagander <magnus@hagander.net>2008-03-16 16:42:44 +0000
commita3f66eac011f1b69e22a95cd3e091cf15d3ef56b (patch)
treea790234731f4d288b499032bf3c74609e5041ff8
parentc9a1cc694abef737548a2aa096c555fa4b253102 (diff)
downloadpostgresql-a3f66eac011f1b69e22a95cd3e091cf15d3ef56b.tar.gz
postgresql-a3f66eac011f1b69e22a95cd3e091cf15d3ef56b.zip
Some cleanups of enum-guc code, per comments from Tom.
-rw-r--r--src/backend/utils/misc/README4
-rw-r--r--src/backend/utils/misc/guc.c54
-rw-r--r--src/include/utils/guc.h22
-rw-r--r--src/include/utils/guc_tables.h11
4 files changed, 68 insertions, 23 deletions
diff --git a/src/backend/utils/misc/README b/src/backend/utils/misc/README
index c0f90c9f6c7..3113218853f 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 9f7e87037ff..2f855b13aae 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -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;
}
@@ -5593,6 +5603,30 @@ DefineCustomStringVariable(const char *name,
}
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)
{
struct config_generic **vars = guc_variables;
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 43c37eb4ff0..4c80da7d087 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 <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);
diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h
index 2b8d8e6e3e3..f81826fe4cf 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 $
*
*-------------------------------------------------------------------------
*/
@@ -38,15 +38,6 @@ union config_var_value
};
/*
- * 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
*/
enum config_group