diff options
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r-- | src/backend/utils/misc/guc.c | 105 |
1 files changed, 100 insertions, 5 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 6e080594f8b..78c569f80b8 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -4,7 +4,7 @@ * Support for grand unified configuration scheme, including SET * command, configuration file, and command line options. * - * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.36 2001/05/17 17:44:18 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.37 2001/06/07 04:50:57 momjian Exp $ * * Copyright 2000 by PostgreSQL Global Development Group * Written by Peter Eisentraut <peter_e@gmx.net>. @@ -136,9 +136,10 @@ struct config_string const char *name; GucContext context; char **variable; - const char *default_val; + const char *boot_default_val; bool (*parse_hook) (const char *proposed); void (*assign_hook) (const char *newval); + char *default_val; }; @@ -433,6 +434,15 @@ ResetAllOptions(void) { char *str = NULL; + if (!ConfigureNamesString[i].default_val + && ConfigureNamesString[i].boot_default_val) + { + str = strdup(ConfigureNamesString[i].boot_default_val); + if (str == NULL) + elog(ERROR, "out of memory"); + + ConfigureNamesString[i].default_val = str; + } if (ConfigureNamesString[i].default_val) { str = strdup(ConfigureNamesString[i].default_val); @@ -582,7 +592,7 @@ parse_real(const char *value, double *result) */ bool set_config_option(const char *name, const char *value, GucContext - context, bool DoIt) + context, bool DoIt, bool makeDefault) { struct config_generic *record; enum config_type type; @@ -653,7 +663,11 @@ set_config_option(const char *name, const char *value, GucContext return false; } if (DoIt) + { *conf->variable = boolval; + if (makeDefault) + conf->default_val = boolval; + } } else if (DoIt) *conf->variable = conf->default_val; @@ -681,7 +695,11 @@ set_config_option(const char *name, const char *value, GucContext return false; } if (DoIt) + { *conf->variable = intval; + if (makeDefault) + conf->default_val = intval; + } } else if (DoIt) *conf->variable = conf->default_val; @@ -709,7 +727,11 @@ set_config_option(const char *name, const char *value, GucContext return false; } if (DoIt) + { *conf->variable = dval; + if (makeDefault) + conf->default_val = dval; + } } else if (DoIt) *conf->variable = conf->default_val; @@ -742,12 +764,33 @@ set_config_option(const char *name, const char *value, GucContext if (*conf->variable) free(*conf->variable); *conf->variable = str; + if (makeDefault) + { + if (conf->default_val) + free(conf->default_val); + str = strdup(value); + if (str == NULL) { + elog(elevel, "out of memory"); + return false; + } + conf->default_val = str; + } } } else if (DoIt) { char *str; + if (!conf->default_val && conf->boot_default_val) + { + str = strdup(conf->boot_default_val); + if (str == NULL) + { + elog(elevel, "out of memory"); + return false; + } + conf->boot_default_val = str; + } str = strdup(conf->default_val); if (str == NULL) { @@ -776,9 +819,9 @@ set_config_option(const char *name, const char *value, GucContext */ void SetConfigOption(const char *name, const char *value, GucContext - context) + context, bool makeDefault) { - (void) set_config_option(name, value, context, true); + (void) set_config_option(name, value, context, true, makeDefault); } @@ -826,6 +869,58 @@ GetConfigOption(const char *name) return NULL; } +static void +_ShowOption(enum config_type opttype, struct config_generic *record) +{ + static char buffer[256]; + char *val; + + switch (opttype) + { + case PGC_BOOL: + val = *((struct config_bool *) record)->variable ? "on" : "off"; + break; + case PGC_INT: + snprintf(buffer, 256, "%d", *((struct config_int *) record)->variable); + val = buffer; + break; + + case PGC_REAL: + snprintf(buffer, 256, "%g", *((struct config_real *) record)->variable); + val = buffer; + break; + + case PGC_STRING: + val = strlen(*((struct config_string *) record)->variable) != 0 ? + *((struct config_string *) record)->variable : "unset"; + break; + + default: + val = "???"; + } + elog(NOTICE, "%s is %s", record->name, val); +} + +void +ShowAllGUCConfig(void) +{ + int i; + + for (i = 0; ConfigureNamesBool[i].name; i++) + _ShowOption(PGC_BOOL, (struct config_generic *)&ConfigureNamesBool[i]); + + for (i = 0; ConfigureNamesInt[i].name; i++) + _ShowOption(PGC_INT, (struct config_generic *)&ConfigureNamesInt[i]); + + for (i = 0; ConfigureNamesReal[i].name; i++) + _ShowOption(PGC_REAL, (struct config_generic *)&ConfigureNamesReal[i]); + + for (i = 0; ConfigureNamesString[i].name; i++) + _ShowOption(PGC_STRING, (struct config_generic *)&ConfigureNamesString[i]); +} + + + /* |