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
This commit is contained in:
Magnus Hagander 2008-05-28 09:04:06 +00:00
parent a8f98c068e
commit d88cd7db63
2 changed files with 91 additions and 73 deletions

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.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;

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.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;
};