Add a field to guc enums to allow hiding of values from display while

still accepting them as input, used to allow alternate syntax for the
same setting.

Alex Hunsaker
REL8_5_ALPHA1_BRANCH
Magnus Hagander 18 years ago
parent a8f98c068e
commit d88cd7db63
  1. 161
      src/backend/utils/misc/guc.c
  2. 3
      src/include/utils/guc.h

@ -10,7 +10,7 @@
* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.455 2008/05/26 18:54:29 tgl Exp $
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.456 2008/05/28 09:04:06 mha Exp $
*
*--------------------------------------------------------------------
*/
@ -173,90 +173,90 @@ static char *config_enum_get_options(struct config_enum *record,
* Options for enum values defined in this module.
*/
static const struct config_enum_entry message_level_options[] = {
{"debug", DEBUG2},
{"debug5", DEBUG5},
{"debug4", DEBUG4},
{"debug3", DEBUG3},
{"debug2", DEBUG2},
{"debug1", DEBUG1},
{"log", LOG},
{"info", INFO},
{"notice", NOTICE},
{"warning", WARNING},
{"error", ERROR},
{"fatal", FATAL},
{"panic", PANIC},
{NULL, 0}
{"debug", DEBUG2, false},
{"debug5", DEBUG5, false},
{"debug4", DEBUG4, false},
{"debug3", DEBUG3, false},
{"debug2", DEBUG2, false},
{"debug1", DEBUG1, false},
{"log", LOG, false},
{"info", INFO, false},
{"notice", NOTICE, false},
{"warning", WARNING, false},
{"error", ERROR, false},
{"fatal", FATAL, false},
{"panic", PANIC, false},
{NULL, 0, false}
};
static const struct config_enum_entry log_error_verbosity_options[] = {
{"default", PGERROR_DEFAULT},
{"terse", PGERROR_TERSE},
{"verbose", PGERROR_VERBOSE},
{NULL, 0}
{"default", PGERROR_DEFAULT, false},
{"terse", PGERROR_TERSE, false},
{"verbose", PGERROR_VERBOSE, false},
{NULL, 0, false}
};
static const struct config_enum_entry log_statement_options[] = {
{"none", LOGSTMT_NONE},
{"ddl", LOGSTMT_DDL},
{"mod", LOGSTMT_MOD},
{"all", LOGSTMT_ALL},
{NULL, 0}
{"none", LOGSTMT_NONE, false},
{"ddl", LOGSTMT_DDL, false},
{"mod", LOGSTMT_MOD, false},
{"all", LOGSTMT_ALL, false},
{NULL, 0, false}
};
static const struct config_enum_entry regex_flavor_options[] = {
{"advanced", REG_ADVANCED},
{"extended", REG_EXTENDED},
{"basic", REG_BASIC},
{NULL, 0}
{"advanced", REG_ADVANCED, false},
{"extended", REG_EXTENDED, false},
{"basic", REG_BASIC, false},
{NULL, 0, false}
};
static const struct config_enum_entry isolation_level_options[] = {
{"serializable", XACT_SERIALIZABLE},
{"repeatable read", XACT_REPEATABLE_READ},
{"read committed", XACT_READ_COMMITTED},
{"read uncommitted", XACT_READ_UNCOMMITTED},
{"serializable", XACT_SERIALIZABLE, false},
{"repeatable read", XACT_REPEATABLE_READ, false},
{"read committed", XACT_READ_COMMITTED, false},
{"read uncommitted", XACT_READ_UNCOMMITTED, false},
{NULL, 0}
};
static const struct config_enum_entry session_replication_role_options[] = {
{"origin", SESSION_REPLICATION_ROLE_ORIGIN},
{"replica", SESSION_REPLICATION_ROLE_REPLICA},
{"local", SESSION_REPLICATION_ROLE_LOCAL},
{NULL, 0}
{"origin", SESSION_REPLICATION_ROLE_ORIGIN, false},
{"replica", SESSION_REPLICATION_ROLE_REPLICA, false},
{"local", SESSION_REPLICATION_ROLE_LOCAL, false},
{NULL, 0, false}
};
#ifdef HAVE_SYSLOG
static const struct config_enum_entry syslog_facility_options[] = {
{"local0", LOG_LOCAL0},
{"local1", LOG_LOCAL1},
{"local2", LOG_LOCAL2},
{"local3", LOG_LOCAL3},
{"local4", LOG_LOCAL4},
{"local5", LOG_LOCAL5},
{"local6", LOG_LOCAL6},
{"local7", LOG_LOCAL7},
{"local0", LOG_LOCAL0, false},
{"local1", LOG_LOCAL1, false},
{"local2", LOG_LOCAL2, false},
{"local3", LOG_LOCAL3, false},
{"local4", LOG_LOCAL4, false},
{"local5", LOG_LOCAL5, false},
{"local6", LOG_LOCAL6, false},
{"local7", LOG_LOCAL7, false},
{NULL, 0}
};
#endif
static const struct config_enum_entry track_function_options[] = {
{"none", TRACK_FUNC_OFF},
{"pl", TRACK_FUNC_PL},
{"all", TRACK_FUNC_ALL},
{NULL, 0}
{"none", TRACK_FUNC_OFF, false},
{"pl", TRACK_FUNC_PL, false},
{"all", TRACK_FUNC_ALL, false},
{NULL, 0, false}
};
static const struct config_enum_entry xmlbinary_options[] = {
{"base64", XMLBINARY_BASE64},
{"hex", XMLBINARY_HEX},
{NULL, 0}
{"base64", XMLBINARY_BASE64, false},
{"hex", XMLBINARY_HEX, false},
{NULL, 0, false}
};
static const struct config_enum_entry xmloption_options[] = {
{"content", XMLOPTION_CONTENT},
{"document", XMLOPTION_DOCUMENT},
{NULL, 0}
{"content", XMLOPTION_CONTENT, false},
{"document", XMLOPTION_DOCUMENT, false},
{NULL, 0, false}
};
/*
@ -264,16 +264,16 @@ static const struct config_enum_entry xmloption_options[] = {
* accept all the likely variants of "on" and "off".
*/
static const struct config_enum_entry backslash_quote_options[] = {
{"safe_encoding", BACKSLASH_QUOTE_SAFE_ENCODING},
{"on", BACKSLASH_QUOTE_ON},
{"off", BACKSLASH_QUOTE_OFF},
{"true", BACKSLASH_QUOTE_ON},
{"false", BACKSLASH_QUOTE_OFF},
{"yes", BACKSLASH_QUOTE_ON},
{"no", BACKSLASH_QUOTE_OFF},
{"1", BACKSLASH_QUOTE_ON},
{"0", BACKSLASH_QUOTE_OFF},
{NULL, 0}
{"safe_encoding", BACKSLASH_QUOTE_SAFE_ENCODING, false},
{"on", BACKSLASH_QUOTE_ON, false},
{"off", BACKSLASH_QUOTE_OFF, false},
{"true", BACKSLASH_QUOTE_ON, true},
{"false", BACKSLASH_QUOTE_OFF, true},
{"yes", BACKSLASH_QUOTE_ON, true},
{"no", BACKSLASH_QUOTE_OFF, true},
{"1", BACKSLASH_QUOTE_ON, true},
{"0", BACKSLASH_QUOTE_OFF, true},
{NULL, 0, false}
};
/*
@ -4339,8 +4339,8 @@ config_enum_lookup_by_name(struct config_enum *record, const char *value, int *r
/*
* Return a list of all available options for an enum, separated
* by ", " (comma-space).
* Return a list of all available options for an enum, excluding
* hidden ones, separated by ", " (comma-space).
* 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.
*/
@ -4353,10 +4353,12 @@ config_enum_get_options(struct config_enum *record, const char *prefix, const ch
if (!entry || !entry->name)
return NULL; /* Should not happen */
while (entry && entry->name)
{
len += strlen(entry->name) + 2; /* string and ", " */
if (!entry->hidden)
len += strlen(entry->name) + 2; /* string and ", " */
entry++;
}
@ -4367,13 +4369,28 @@ config_enum_get_options(struct config_enum *record, const char *prefix, const ch
entry = record->options;
while (entry && entry->name)
{
strcat(hintmsg, entry->name);
strcat(hintmsg, ", ");
if (!entry->hidden)
{
strcat(hintmsg, entry->name);
strcat(hintmsg, ", ");
}
entry++;
}
/* Replace final comma/space */
hintmsg[strlen(hintmsg)-2] = '\0';
len = strlen(hintmsg);
/*
* All the entries may have been hidden, leaving the string empty
* if no prefix was given. This indicates a broken GUC setup, since
* there is no use for an enum without any values, so we just check
* to make sure we don't write to invalid memory instead of actually
* trying to do something smart with it.
*/
if (len > 1)
/* Replace final comma/space */
hintmsg[len-2] = '\0';
strcat(hintmsg, suffix);
return hintmsg;

@ -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.95 2008/05/12 08:35:05 mha Exp $
* $PostgreSQL: pgsql/src/include/utils/guc.h,v 1.96 2008/05/28 09:04:06 mha Exp $
*--------------------------------------------------------------------
*/
#ifndef GUC_H
@ -100,6 +100,7 @@ struct config_enum_entry
{
const char *name;
int val;
bool hidden;
};

Loading…
Cancel
Save