]> granicus.if.org Git - postgresql/commitdiff
Some cleanups of enum-guc code, per comments from Tom.
authorMagnus Hagander <magnus@hagander.net>
Sun, 16 Mar 2008 16:42:44 +0000 (16:42 +0000)
committerMagnus Hagander <magnus@hagander.net>
Sun, 16 Mar 2008 16:42:44 +0000 (16:42 +0000)
src/backend/utils/misc/README
src/backend/utils/misc/guc.c
src/include/utils/guc.h
src/include/utils/guc_tables.h

index c0f90c9f6c78a4a71217cebc2e3bcabb9d6ad7c2..3113218853f6a622d6ba456e94416f3f8b788289 100644 (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.
 
index 9f7e87037ff440ffc2a6c5b42d961816f07d0f3f..2f855b13aaec648974010fdaaedc85032a173879 100644 (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)
 {
index 43c37eb4ff06853dc2df7ec015ed4a52f61c0a81..4c80da7d08793524e453dfa84478a9a605e8bf4a 100644 (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);
index 2b8d8e6e3e339928deb526003bf0ed18607b343d..f81826fe4cfa298280437c1c4e40621db3f2e495 100644 (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
  */