mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Minor code embellishments.
This commit is contained in:
parent
a1feb90ef3
commit
c98c9114cb
@ -10,7 +10,7 @@
|
||||
* Written by Peter Eisentraut <peter_e@gmx.net>.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.481 2008/11/21 20:14:27 mha Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.482 2008/12/02 02:00:32 alvherre Exp $
|
||||
*
|
||||
*--------------------------------------------------------------------
|
||||
*/
|
||||
@ -4382,16 +4382,17 @@ parse_real(const char *value, double *result)
|
||||
const char *
|
||||
config_enum_lookup_by_value(struct config_enum *record, int val)
|
||||
{
|
||||
const struct config_enum_entry *entry = record->options;
|
||||
while (entry && entry->name)
|
||||
const struct config_enum_entry *entry;
|
||||
|
||||
for (entry = record->options; entry && entry->name; entry++)
|
||||
{
|
||||
if (entry->val == val)
|
||||
return entry->name;
|
||||
entry++;
|
||||
}
|
||||
|
||||
elog(ERROR, "could not find enum option %d for %s",
|
||||
val, record->gen.name);
|
||||
return NULL; /* silence compiler */
|
||||
return NULL; /* silence compiler */
|
||||
}
|
||||
|
||||
|
||||
@ -4400,32 +4401,30 @@ config_enum_lookup_by_value(struct config_enum *record, int val)
|
||||
* (case-insensitive).
|
||||
* If the enum option is found, sets the retval value and returns
|
||||
* true. If it's not found, return FALSE and retval is set to 0.
|
||||
*
|
||||
*/
|
||||
bool
|
||||
config_enum_lookup_by_name(struct config_enum *record, const char *value, int *retval)
|
||||
config_enum_lookup_by_name(struct config_enum *record, const char *value,
|
||||
int *retval)
|
||||
{
|
||||
const struct config_enum_entry *entry = record->options;
|
||||
|
||||
if (retval)
|
||||
*retval = 0; /* suppress compiler warning */
|
||||
|
||||
while (entry && entry->name)
|
||||
const struct config_enum_entry *entry;
|
||||
|
||||
for (entry = record->options; entry && entry->name; entry++)
|
||||
{
|
||||
if (pg_strcasecmp(value, entry->name) == 0)
|
||||
{
|
||||
*retval = entry->val;
|
||||
return TRUE;
|
||||
}
|
||||
entry++;
|
||||
}
|
||||
|
||||
*retval = 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return a list of all available options for an enum, excluding
|
||||
* hidden ones, separated by ", " (comma-space).
|
||||
* hidden ones, separated by the given separator.
|
||||
* 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.
|
||||
*/
|
||||
@ -4433,39 +4432,23 @@ static char *
|
||||
config_enum_get_options(struct config_enum *record, const char *prefix,
|
||||
const char *suffix, const char *separator)
|
||||
{
|
||||
const struct config_enum_entry *entry = record->options;
|
||||
int len = 0;
|
||||
char *hintmsg;
|
||||
const struct config_enum_entry *entry;
|
||||
StringInfoData retstr;
|
||||
int seplen;
|
||||
|
||||
if (!entry || !entry->name)
|
||||
return NULL; /* Should not happen */
|
||||
|
||||
while (entry && entry->name)
|
||||
{
|
||||
if (!entry->hidden)
|
||||
len += strlen(entry->name) + strlen(separator);
|
||||
|
||||
entry++;
|
||||
}
|
||||
|
||||
hintmsg = palloc(len + strlen(prefix) + strlen(suffix) + 2);
|
||||
|
||||
strcpy(hintmsg, prefix);
|
||||
initStringInfo(&retstr);
|
||||
appendStringInfoString(&retstr, prefix);
|
||||
|
||||
entry = record->options;
|
||||
while (entry && entry->name)
|
||||
seplen = strlen(separator);
|
||||
for (entry = record->options; entry && entry->name; entry++)
|
||||
{
|
||||
if (!entry->hidden)
|
||||
{
|
||||
strcat(hintmsg, entry->name);
|
||||
strcat(hintmsg, separator);
|
||||
appendStringInfoString(&retstr, entry->name);
|
||||
appendBinaryStringInfo(&retstr, separator, seplen);
|
||||
}
|
||||
|
||||
entry++;
|
||||
}
|
||||
|
||||
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
|
||||
@ -4473,13 +4456,16 @@ config_enum_get_options(struct config_enum *record, const char *prefix,
|
||||
* to make sure we don't write to invalid memory instead of actually
|
||||
* trying to do something smart with it.
|
||||
*/
|
||||
if (len >= strlen(separator))
|
||||
if (retstr.len >= seplen)
|
||||
{
|
||||
/* Replace final separator */
|
||||
hintmsg[len-strlen(separator)] = '\0';
|
||||
retstr.data[retstr.len - seplen] = '\0';
|
||||
retstr.len -= seplen;
|
||||
}
|
||||
|
||||
strcat(hintmsg, suffix);
|
||||
appendStringInfoString(&retstr, suffix);
|
||||
|
||||
return hintmsg;
|
||||
return retstr.data;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -5047,7 +5033,11 @@ set_config_option(const char *name, const char *value,
|
||||
{
|
||||
if (!config_enum_lookup_by_name(conf, value, &newval))
|
||||
{
|
||||
char *hintmsg = config_enum_get_options(conf, "Available values: ", ".", ", ");
|
||||
char *hintmsg;
|
||||
|
||||
hintmsg = config_enum_get_options(conf,
|
||||
"Available values: ",
|
||||
".", ", ");
|
||||
|
||||
ereport(elevel,
|
||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
||||
@ -6253,13 +6243,16 @@ GetConfigOptionByNum(int varnum, const char **values, bool *noshow)
|
||||
|
||||
/* enumvals */
|
||||
/* NOTE! enumvals with double quotes in them are not supported! */
|
||||
values[11] = config_enum_get_options((struct config_enum *) conf, "{\"", "\"}", "\",\"");
|
||||
values[11] = config_enum_get_options((struct config_enum *) conf,
|
||||
"{\"", "\"}", "\",\"");
|
||||
|
||||
/* boot_val */
|
||||
values[12] = pstrdup(config_enum_lookup_by_value(lconf, lconf->boot_val));
|
||||
values[12] = pstrdup(config_enum_lookup_by_value(lconf,
|
||||
lconf->boot_val));
|
||||
|
||||
/* reset_val */
|
||||
values[13] = pstrdup(config_enum_lookup_by_value(lconf, lconf->reset_val));
|
||||
values[13] = pstrdup(config_enum_lookup_by_value(lconf,
|
||||
lconf->reset_val));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -6672,8 +6665,8 @@ is_newvalue_equal(struct config_generic * record, const char *newvalue)
|
||||
struct config_enum *conf = (struct config_enum *) record;
|
||||
int newval;
|
||||
|
||||
return config_enum_lookup_by_name(conf, newvalue, &newval)
|
||||
&& *conf->variable == newval;
|
||||
return config_enum_lookup_by_name(conf, newvalue, &newval) &&
|
||||
*conf->variable == newval;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user