aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/bootstrap/bootstrap.c4
-rw-r--r--src/backend/commands/variable.c8
-rw-r--r--src/backend/postmaster/postmaster.c10
-rw-r--r--src/backend/tcop/postgres.c6
-rw-r--r--src/backend/utils/misc/guc.c313
-rw-r--r--src/include/utils/guc.h18
6 files changed, 223 insertions, 136 deletions
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 706d350659f..460bc80ff56 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.108 2001/06/03 14:53:56 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.109 2001/06/12 22:54:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -243,7 +243,7 @@ BootstrapMain(int argc, char *argv[])
dbName = NULL;
if (!IsUnderPostmaster)
{
- ResetAllOptions();
+ ResetAllOptions(true);
potential_DataDir = getenv("PGDATA"); /* Null if no PGDATA
* variable */
}
diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c
index 6f22bcc33d2..dd94509a7f2 100644
--- a/src/backend/commands/variable.c
+++ b/src/backend/commands/variable.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.49 2001/06/07 04:50:56 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.50 2001/06/12 22:54:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -792,7 +792,9 @@ ResetPGVariable(const char *name)
reset_datestyle();
reset_timezone();
- ResetAllOptions();
+ ResetAllOptions(false);
} else
- SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET, false);
+ SetConfigOption(name, NULL,
+ superuser() ? PGC_SUSET : PGC_USERSET,
+ false);
}
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 6334cdd7e37..2eca6babb07 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -28,7 +28,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.218 2001/06/11 04:12:29 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.219 2001/06/12 22:54:05 tgl Exp $
*
* NOTES
*
@@ -362,9 +362,13 @@ PostmasterMain(int argc, char *argv[])
/*
* Options setup
*/
- potential_DataDir = getenv("PGDATA"); /* default value */
+ ResetAllOptions(true);
+
+ /* PGPORT environment variable, if set, overrides GUC setting */
+ if (getenv("PGPORT"))
+ PostPortNumber = atoi(getenv("PGPORT"));
- ResetAllOptions();
+ potential_DataDir = getenv("PGDATA"); /* default value */
/*
* First we must scan for a -D argument to get the data dir. Then read
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 8e5115f755a..cd3e5850369 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.219 2001/06/07 04:50:57 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.220 2001/06/12 22:54:06 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -1156,7 +1156,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
if (!IsUnderPostmaster)
{
- ResetAllOptions();
+ ResetAllOptions(true);
potential_DataDir = getenv("PGDATA");
}
StatFp = stderr;
@@ -1709,7 +1709,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const cha
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
- puts("$Revision: 1.219 $ $Date: 2001/06/07 04:50:57 $\n");
+ puts("$Revision: 1.220 $ $Date: 2001/06/12 22:54:06 $\n");
}
/*
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 78c569f80b8..28b1eb0bd67 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.37 2001/06/07 04:50:57 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.38 2001/06/12 22:54:06 tgl Exp $
*
* Copyright 2000 by PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
@@ -46,7 +46,6 @@ extern bool FixBTree;
extern char *Syslog_facility;
extern char *Syslog_ident;
static bool check_facility(const char *facility);
-
#endif
/*
@@ -54,7 +53,6 @@ static bool check_facility(const char *facility);
*/
#ifdef USE_ASSERT_CHECKING
bool assert_enabled = true;
-
#endif
bool Debug_print_query = false;
bool Debug_print_plan = false;
@@ -76,7 +74,9 @@ bool SQL_inheritance = true;
#endif
-
+/*
+ * Declarations for GUC tables
+ */
enum config_type
{
PGC_NONE = 0,
@@ -101,6 +101,8 @@ struct config_bool
GucContext context;
bool *variable;
bool default_val;
+ /* No need for parse_hook ... presumably both values are legal */
+ void (*assign_hook) (bool newval);
};
@@ -112,6 +114,8 @@ struct config_int
int default_val;
int min;
int max;
+ bool (*parse_hook) (int proposed);
+ void (*assign_hook) (int newval);
};
@@ -123,6 +127,8 @@ struct config_real
double default_val;
double min;
double max;
+ bool (*parse_hook) (double proposed);
+ void (*assign_hook) (double newval);
};
/*
@@ -171,61 +177,61 @@ struct config_string
static struct config_bool
ConfigureNamesBool[] =
{
- {"enable_seqscan", PGC_USERSET, &enable_seqscan, true},
- {"enable_indexscan", PGC_USERSET, &enable_indexscan, true},
- {"enable_tidscan", PGC_USERSET, &enable_tidscan, true},
- {"enable_sort", PGC_USERSET, &enable_sort, true},
- {"enable_nestloop", PGC_USERSET, &enable_nestloop, true},
- {"enable_mergejoin", PGC_USERSET, &enable_mergejoin, true},
- {"enable_hashjoin", PGC_USERSET, &enable_hashjoin, true},
-
- {"ksqo", PGC_USERSET, &_use_keyset_query_optimizer, false},
- {"geqo", PGC_USERSET, &enable_geqo, true},
-
- {"tcpip_socket", PGC_POSTMASTER, &NetServer, false},
- {"ssl", PGC_POSTMASTER, &EnableSSL, false},
- {"fsync", PGC_SIGHUP, &enableFsync, true},
- {"silent_mode", PGC_POSTMASTER, &SilentMode, false},
-
- {"log_connections", PGC_SIGHUP, &Log_connections, false},
- {"log_timestamp", PGC_SIGHUP, &Log_timestamp, false},
- {"log_pid", PGC_SIGHUP, &Log_pid, false},
+ {"enable_seqscan", PGC_USERSET, &enable_seqscan, true, NULL},
+ {"enable_indexscan", PGC_USERSET, &enable_indexscan, true, NULL},
+ {"enable_tidscan", PGC_USERSET, &enable_tidscan, true, NULL},
+ {"enable_sort", PGC_USERSET, &enable_sort, true, NULL},
+ {"enable_nestloop", PGC_USERSET, &enable_nestloop, true, NULL},
+ {"enable_mergejoin", PGC_USERSET, &enable_mergejoin, true, NULL},
+ {"enable_hashjoin", PGC_USERSET, &enable_hashjoin, true, NULL},
+
+ {"ksqo", PGC_USERSET, &_use_keyset_query_optimizer, false, NULL},
+ {"geqo", PGC_USERSET, &enable_geqo, true, NULL},
+
+ {"tcpip_socket", PGC_POSTMASTER, &NetServer, false, NULL},
+ {"ssl", PGC_POSTMASTER, &EnableSSL, false, NULL},
+ {"fsync", PGC_SIGHUP, &enableFsync, true, NULL},
+ {"silent_mode", PGC_POSTMASTER, &SilentMode, false, NULL},
+
+ {"log_connections", PGC_SIGHUP, &Log_connections, false, NULL},
+ {"log_timestamp", PGC_SIGHUP, &Log_timestamp, false, NULL},
+ {"log_pid", PGC_SIGHUP, &Log_pid, false, NULL},
#ifdef USE_ASSERT_CHECKING
- {"debug_assertions", PGC_USERSET, &assert_enabled, true},
+ {"debug_assertions", PGC_USERSET, &assert_enabled, true, NULL},
#endif
- {"debug_print_query", PGC_USERSET, &Debug_print_query, false},
- {"debug_print_parse", PGC_USERSET, &Debug_print_parse, false},
- {"debug_print_rewritten", PGC_USERSET, &Debug_print_rewritten, false},
- {"debug_print_plan", PGC_USERSET, &Debug_print_plan, false},
- {"debug_pretty_print", PGC_USERSET, &Debug_pretty_print, false},
+ {"debug_print_query", PGC_USERSET, &Debug_print_query, false, NULL},
+ {"debug_print_parse", PGC_USERSET, &Debug_print_parse, false, NULL},
+ {"debug_print_rewritten", PGC_USERSET, &Debug_print_rewritten, false, NULL},
+ {"debug_print_plan", PGC_USERSET, &Debug_print_plan, false, NULL},
+ {"debug_pretty_print", PGC_USERSET, &Debug_pretty_print, false, NULL},
- {"show_parser_stats", PGC_USERSET, &Show_parser_stats, false},
- {"show_planner_stats", PGC_USERSET, &Show_planner_stats, false},
- {"show_executor_stats", PGC_USERSET, &Show_executor_stats, false},
- {"show_query_stats", PGC_USERSET, &Show_query_stats, false},
+ {"show_parser_stats", PGC_USERSET, &Show_parser_stats, false, NULL},
+ {"show_planner_stats", PGC_USERSET, &Show_planner_stats, false, NULL},
+ {"show_executor_stats", PGC_USERSET, &Show_executor_stats, false, NULL},
+ {"show_query_stats", PGC_USERSET, &Show_query_stats, false, NULL},
#ifdef BTREE_BUILD_STATS
- {"show_btree_build_stats", PGC_SUSET, &Show_btree_build_stats, false},
+ {"show_btree_build_stats", PGC_SUSET, &Show_btree_build_stats, false, NULL},
#endif
- {"trace_notify", PGC_USERSET, &Trace_notify, false},
+ {"trace_notify", PGC_USERSET, &Trace_notify, false, NULL},
#ifdef LOCK_DEBUG
- {"trace_locks", PGC_SUSET, &Trace_locks, false},
- {"trace_userlocks", PGC_SUSET, &Trace_userlocks, false},
- {"trace_spinlocks", PGC_SUSET, &Trace_spinlocks, false},
- {"debug_deadlocks", PGC_SUSET, &Debug_deadlocks, false},
+ {"trace_locks", PGC_SUSET, &Trace_locks, false, NULL},
+ {"trace_userlocks", PGC_SUSET, &Trace_userlocks, false, NULL},
+ {"trace_spinlocks", PGC_SUSET, &Trace_spinlocks, false, NULL},
+ {"debug_deadlocks", PGC_SUSET, &Debug_deadlocks, false, NULL},
#endif
- {"hostname_lookup", PGC_SIGHUP, &HostnameLookup, false},
- {"show_source_port", PGC_SIGHUP, &ShowPortNumber, false},
+ {"hostname_lookup", PGC_SIGHUP, &HostnameLookup, false, NULL},
+ {"show_source_port", PGC_SIGHUP, &ShowPortNumber, false, NULL},
- {"sql_inheritance", PGC_USERSET, &SQL_inheritance, true},
+ {"sql_inheritance", PGC_USERSET, &SQL_inheritance, true, NULL},
- {"fixbtree", PGC_POSTMASTER, &FixBTree, true},
+ {"fixbtree", PGC_POSTMASTER, &FixBTree, true, NULL},
- {NULL, 0, NULL, false}
+ {NULL, 0, NULL, false, NULL}
};
@@ -233,22 +239,22 @@ static struct config_int
ConfigureNamesInt[] =
{
{"geqo_threshold", PGC_USERSET, &geqo_rels,
- DEFAULT_GEQO_RELS, 2, INT_MAX},
+ DEFAULT_GEQO_RELS, 2, INT_MAX, NULL, NULL},
{"geqo_pool_size", PGC_USERSET, &Geqo_pool_size,
- DEFAULT_GEQO_POOL_SIZE, 0, MAX_GEQO_POOL_SIZE},
+ DEFAULT_GEQO_POOL_SIZE, 0, MAX_GEQO_POOL_SIZE, NULL, NULL},
{"geqo_effort", PGC_USERSET, &Geqo_effort,
- 1, 1, INT_MAX},
+ 1, 1, INT_MAX, NULL, NULL},
{"geqo_generations", PGC_USERSET, &Geqo_generations,
- 0, 0, INT_MAX},
+ 0, 0, INT_MAX, NULL, NULL},
{"geqo_random_seed", PGC_USERSET, &Geqo_random_seed,
- -1, INT_MIN, INT_MAX},
+ -1, INT_MIN, INT_MAX, NULL, NULL},
{"deadlock_timeout", PGC_POSTMASTER, &DeadlockTimeout,
- 1000, 0, INT_MAX},
+ 1000, 0, INT_MAX, NULL, NULL},
#ifdef ENABLE_SYSLOG
{"syslog", PGC_SIGHUP, &Use_syslog,
- 0, 0, 2},
+ 0, 0, 2, NULL, NULL},
#endif
/*
@@ -257,52 +263,52 @@ static struct config_int
* constraints here are partially unused.
*/
{"max_connections", PGC_POSTMASTER, &MaxBackends,
- DEF_MAXBACKENDS, 1, MAXBACKENDS},
+ DEF_MAXBACKENDS, 1, MAXBACKENDS, NULL, NULL},
{"shared_buffers", PGC_POSTMASTER, &NBuffers,
- DEF_NBUFFERS, 16, INT_MAX},
+ DEF_NBUFFERS, 16, INT_MAX, NULL, NULL},
{"port", PGC_POSTMASTER, &PostPortNumber,
- DEF_PGPORT, 1, 65535},
+ DEF_PGPORT, 1, 65535, NULL, NULL},
{"sort_mem", PGC_USERSET, &SortMem,
- 512, 1, INT_MAX},
+ 512, 1, INT_MAX, NULL, NULL},
{"debug_level", PGC_USERSET, &DebugLvl,
- 0, 0, 16},
+ 0, 0, 16, NULL, NULL},
#ifdef LOCK_DEBUG
{"trace_lock_oidmin", PGC_SUSET, &Trace_lock_oidmin,
- BootstrapObjectIdData, 1, INT_MAX},
+ BootstrapObjectIdData, 1, INT_MAX, NULL, NULL},
{"trace_lock_table", PGC_SUSET, &Trace_lock_table,
- 0, 0, INT_MAX},
+ 0, 0, INT_MAX, NULL, NULL},
#endif
{"max_expr_depth", PGC_USERSET, &max_expr_depth,
- DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX},
+ DEFAULT_MAX_EXPR_DEPTH, 10, INT_MAX, NULL, NULL},
{"unix_socket_permissions", PGC_POSTMASTER, &Unix_socket_permissions,
- 0777, 0000, 0777},
+ 0777, 0000, 0777, NULL, NULL},
{"checkpoint_segments", PGC_SIGHUP, &CheckPointSegments,
- 3, 1, INT_MAX},
+ 3, 1, INT_MAX, NULL, NULL},
{"checkpoint_timeout", PGC_SIGHUP, &CheckPointTimeout,
- 300, 30, 3600},
+ 300, 30, 3600, NULL, NULL},
{"wal_buffers", PGC_POSTMASTER, &XLOGbuffers,
- 8, 4, INT_MAX},
+ 8, 4, INT_MAX, NULL, NULL},
{"wal_files", PGC_SIGHUP, &XLOGfiles,
- 0, 0, 64},
+ 0, 0, 64, NULL, NULL},
{"wal_debug", PGC_SUSET, &XLOG_DEBUG,
- 0, 0, 16},
+ 0, 0, 16, NULL, NULL},
{"commit_delay", PGC_USERSET, &CommitDelay,
- 0, 0, 100000},
+ 0, 0, 100000, NULL, NULL},
{"commit_siblings", PGC_USERSET, &CommitSiblings,
- 5, 1, 1000},
+ 5, 1, 1000, NULL, NULL},
- {NULL, 0, NULL, 0, 0, 0}
+ {NULL, 0, NULL, 0, 0, 0, NULL, NULL}
};
@@ -310,20 +316,21 @@ static struct config_real
ConfigureNamesReal[] =
{
{"effective_cache_size", PGC_USERSET, &effective_cache_size,
- DEFAULT_EFFECTIVE_CACHE_SIZE, 0, DBL_MAX},
+ DEFAULT_EFFECTIVE_CACHE_SIZE, 0, DBL_MAX, NULL, NULL},
{"random_page_cost", PGC_USERSET, &random_page_cost,
- DEFAULT_RANDOM_PAGE_COST, 0, DBL_MAX},
+ DEFAULT_RANDOM_PAGE_COST, 0, DBL_MAX, NULL, NULL},
{"cpu_tuple_cost", PGC_USERSET, &cpu_tuple_cost,
- DEFAULT_CPU_TUPLE_COST, 0, DBL_MAX},
+ DEFAULT_CPU_TUPLE_COST, 0, DBL_MAX, NULL, NULL},
{"cpu_index_tuple_cost", PGC_USERSET, &cpu_index_tuple_cost,
- DEFAULT_CPU_INDEX_TUPLE_COST, 0, DBL_MAX},
+ DEFAULT_CPU_INDEX_TUPLE_COST, 0, DBL_MAX, NULL, NULL},
{"cpu_operator_cost", PGC_USERSET, &cpu_operator_cost,
- DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX},
+ DEFAULT_CPU_OPERATOR_COST, 0, DBL_MAX, NULL, NULL},
{"geqo_selection_bias", PGC_USERSET, &Geqo_selection_bias,
- DEFAULT_GEQO_SELECTION_BIAS, MIN_GEQO_SELECTION_BIAS, MAX_GEQO_SELECTION_BIAS},
+ DEFAULT_GEQO_SELECTION_BIAS, MIN_GEQO_SELECTION_BIAS,
+ MAX_GEQO_SELECTION_BIAS, NULL, NULL},
- {NULL, 0, NULL, 0.0, 0.0, 0.0}
+ {NULL, 0, NULL, 0.0, 0.0, 0.0, NULL, NULL}
};
@@ -413,47 +420,84 @@ find_option(const char *name, struct config_generic ** record)
/*
- * Reset all options to their specified default values. Should only be
- * called at program startup.
+ * Reset all options to their specified default values. Must be called
+ * with isStartup = true at program startup. May be called later with
+ * isStartup = false to reset all resettable options.
*/
void
-ResetAllOptions(void)
+ResetAllOptions(bool isStartup)
{
int i;
for (i = 0; ConfigureNamesBool[i].name; i++)
- *(ConfigureNamesBool[i].variable) = ConfigureNamesBool[i].default_val;
+ {
+ struct config_bool *conf = &ConfigureNamesBool[i];
+
+ if (isStartup ||
+ conf->context == PGC_SUSET || conf->context == PGC_USERSET)
+ {
+ if (conf->assign_hook)
+ (conf->assign_hook) (conf->default_val);
+ *conf->variable = conf->default_val;
+ }
+ }
for (i = 0; ConfigureNamesInt[i].name; i++)
- *(ConfigureNamesInt[i].variable) = ConfigureNamesInt[i].default_val;
+ {
+ struct config_int *conf = &ConfigureNamesInt[i];
+
+ if (isStartup ||
+ conf->context == PGC_SUSET || conf->context == PGC_USERSET)
+ {
+ if (conf->assign_hook)
+ (conf->assign_hook) (conf->default_val);
+ *conf->variable = conf->default_val;
+ }
+ }
for (i = 0; ConfigureNamesReal[i].name; i++)
- *(ConfigureNamesReal[i].variable) = ConfigureNamesReal[i].default_val;
+ {
+ struct config_real *conf = &ConfigureNamesReal[i];
+
+ if (isStartup ||
+ conf->context == PGC_SUSET || conf->context == PGC_USERSET)
+ {
+ if (conf->assign_hook)
+ (conf->assign_hook) (conf->default_val);
+ *conf->variable = conf->default_val;
+ }
+ }
for (i = 0; ConfigureNamesString[i].name; i++)
{
- char *str = NULL;
+ struct config_string *conf = &ConfigureNamesString[i];
- if (!ConfigureNamesString[i].default_val
- && ConfigureNamesString[i].boot_default_val)
+ if (isStartup ||
+ conf->context == PGC_SUSET || conf->context == PGC_USERSET)
{
- str = strdup(ConfigureNamesString[i].boot_default_val);
- if (str == NULL)
- elog(ERROR, "out of memory");
+ char *str = NULL;
- ConfigureNamesString[i].default_val = str;
- }
- if (ConfigureNamesString[i].default_val)
- {
- str = strdup(ConfigureNamesString[i].default_val);
- if (str == NULL)
- elog(ERROR, "out of memory");
+ if (conf->default_val == NULL &&
+ conf->boot_default_val)
+ {
+ str = strdup(conf->boot_default_val);
+ if (str == NULL)
+ elog(ERROR, "out of memory");
+ conf->default_val = str;
+ }
+ if (conf->default_val)
+ {
+ str = strdup(conf->default_val);
+ if (str == NULL)
+ elog(ERROR, "out of memory");
+ }
+ if (conf->assign_hook)
+ (conf->assign_hook) (str);
+ if (*conf->variable)
+ free(*conf->variable);
+ *conf->variable = str;
}
- *(ConfigureNamesString[i].variable) = str;
}
-
- if (getenv("PGPORT"))
- PostPortNumber = atoi(getenv("PGPORT"));
}
@@ -591,8 +635,8 @@ parse_real(const char *value, double *result)
* See also SetConfigOption for an external interface.
*/
bool
-set_config_option(const char *name, const char *value, GucContext
- context, bool DoIt, bool makeDefault)
+set_config_option(const char *name, const char *value,
+ GucContext context, bool DoIt, bool makeDefault)
{
struct config_generic *record;
enum config_type type;
@@ -639,8 +683,8 @@ set_config_option(const char *name, const char *value, GucContext
else
return true;
}
- else if (record->context == PGC_SUSET && (context == PGC_USERSET
- || context == PGC_BACKEND))
+ else if (record->context == PGC_SUSET &&
+ (context == PGC_USERSET || context == PGC_BACKEND))
elog(ERROR, "permission denied");
@@ -662,15 +706,22 @@ set_config_option(const char *name, const char *value, GucContext
elog(elevel, "option '%s' requires a boolean value", name);
return false;
}
+ /* no parse_hook needed for booleans */
if (DoIt)
{
+ if (conf->assign_hook)
+ (conf->assign_hook) (boolval);
*conf->variable = boolval;
if (makeDefault)
conf->default_val = boolval;
}
}
else if (DoIt)
+ {
+ if (conf->assign_hook)
+ (conf->assign_hook) (conf->default_val);
*conf->variable = conf->default_val;
+ }
break;
}
@@ -694,15 +745,27 @@ set_config_option(const char *name, const char *value, GucContext
name, intval, conf->min, conf->max);
return false;
}
+ if (conf->parse_hook && !(conf->parse_hook) (intval))
+ {
+ elog(elevel, "invalid value for option '%s': %d",
+ name, intval);
+ return false;
+ }
if (DoIt)
{
+ if (conf->assign_hook)
+ (conf->assign_hook) (intval);
*conf->variable = intval;
if (makeDefault)
conf->default_val = intval;
}
}
else if (DoIt)
+ {
+ if (conf->assign_hook)
+ (conf->assign_hook) (conf->default_val);
*conf->variable = conf->default_val;
+ }
break;
}
@@ -726,15 +789,27 @@ set_config_option(const char *name, const char *value, GucContext
name, dval, conf->min, conf->max);
return false;
}
+ if (conf->parse_hook && !(conf->parse_hook) (dval))
+ {
+ elog(elevel, "invalid value for option '%s': %g",
+ name, dval);
+ return false;
+ }
if (DoIt)
{
+ if (conf->assign_hook)
+ (conf->assign_hook) (dval);
*conf->variable = dval;
if (makeDefault)
conf->default_val = dval;
}
}
else if (DoIt)
+ {
+ if (conf->assign_hook)
+ (conf->assign_hook) (conf->default_val);
*conf->variable = conf->default_val;
+ }
break;
}
@@ -746,7 +821,8 @@ set_config_option(const char *name, const char *value, GucContext
{
if (conf->parse_hook && !(conf->parse_hook) (value))
{
- elog(elevel, "invalid value for option '%s': '%s'", name, value);
+ elog(elevel, "invalid value for option '%s': '%s'",
+ name, value);
return false;
}
if (DoIt)
@@ -766,13 +842,13 @@ set_config_option(const char *name, const char *value, GucContext
*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;
}
+ if (conf->default_val)
+ free(conf->default_val);
conf->default_val = str;
}
}
@@ -789,7 +865,7 @@ set_config_option(const char *name, const char *value, GucContext
elog(elevel, "out of memory");
return false;
}
- conf->boot_default_val = str;
+ conf->default_val = str;
}
str = strdup(conf->default_val);
if (str == NULL)
@@ -818,8 +894,8 @@ set_config_option(const char *name, const char *value, GucContext
* this is just the wrapper to be called from the outside.
*/
void
-SetConfigOption(const char *name, const char *value, GucContext
- context, bool makeDefault)
+SetConfigOption(const char *name, const char *value,
+ GucContext context, bool makeDefault)
{
(void) set_config_option(name, value, context, true, makeDefault);
}
@@ -829,9 +905,7 @@ SetConfigOption(const char *name, const char *value, GucContext
/*
* This is more or less the SHOW command. It returns a string with the
* value of the option `name'. If the option doesn't exist, throw an
- * elog and don't return. issuper should be true if and only if the
- * current user is a superuser. Normal users don't have read
- * permission on all options.
+ * elog and don't return.
*
* The string is *not* allocated for modification and is really only
* valid until the next call to configuration related functions.
@@ -853,11 +927,13 @@ GetConfigOption(const char *name)
return *((struct config_bool *) record)->variable ? "on" : "off";
case PGC_INT:
- snprintf(buffer, 256, "%d", *((struct config_int *) record)->variable);
+ snprintf(buffer, sizeof(buffer), "%d",
+ *((struct config_int *) record)->variable);
return buffer;
case PGC_REAL:
- snprintf(buffer, 256, "%g", *((struct config_real *) record)->variable);
+ snprintf(buffer, sizeof(buffer), "%g",
+ *((struct config_real *) record)->variable);
return buffer;
case PGC_STRING:
@@ -872,7 +948,7 @@ GetConfigOption(const char *name)
static void
_ShowOption(enum config_type opttype, struct config_generic *record)
{
- static char buffer[256];
+ char buffer[256];
char *val;
switch (opttype)
@@ -881,12 +957,14 @@ _ShowOption(enum config_type opttype, struct config_generic *record)
val = *((struct config_bool *) record)->variable ? "on" : "off";
break;
case PGC_INT:
- snprintf(buffer, 256, "%d", *((struct config_int *) record)->variable);
+ snprintf(buffer, sizeof(buffer), "%d",
+ *((struct config_int *) record)->variable);
val = buffer;
break;
case PGC_REAL:
- snprintf(buffer, 256, "%g", *((struct config_real *) record)->variable);
+ snprintf(buffer, sizeof(buffer), "%g",
+ *((struct config_real *) record)->variable);
val = buffer;
break;
@@ -955,8 +1033,8 @@ ParseLongOption(const char *string, char **name, char **value)
elog(FATAL, "out of memory");
}
else
-/* no equal sign in string */
{
+ /* no equal sign in string */
*name = strdup(string);
if (!*name)
elog(FATAL, "out of memory");
@@ -971,6 +1049,7 @@ ParseLongOption(const char *string, char **name, char **value)
#ifdef ENABLE_SYSLOG
+
static bool
check_facility(const char *facility)
{
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 1d925f0c3ea..08774128c14 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -4,7 +4,7 @@
* External declarations pertaining to backend/utils/misc/guc.c and
* backend/utils/misc/guc-file.l
*
- * $Header: /cvsroot/pgsql/src/include/utils/guc.h,v 1.7 2001/06/07 04:50:57 momjian Exp $
+ * $Id: guc.h,v 1.8 2001/06/12 22:54:06 tgl Exp $
*/
#ifndef GUC_H
#define GUC_H
@@ -46,13 +46,15 @@ typedef enum
} GucContext;
-void SetConfigOption(const char *name, const char *value, GucContext context, bool makeDefault);
-const char *GetConfigOption(const char *name);
-void ProcessConfigFile(GucContext context);
-void ResetAllOptions(void);
-void ParseLongOption(const char *string, char **name, char **value);
-bool set_config_option(const char *name, const char *value, GucContext context, bool DoIt, bool makeDefault);
-void ShowAllGUCConfig(void);
+extern void SetConfigOption(const char *name, const char *value,
+ GucContext context, bool makeDefault);
+extern const char *GetConfigOption(const char *name);
+extern void ProcessConfigFile(GucContext context);
+extern void ResetAllOptions(bool isStartup);
+extern void ParseLongOption(const char *string, char **name, char **value);
+extern bool set_config_option(const char *name, const char *value,
+ GucContext context, bool DoIt, bool makeDefault);
+extern void ShowAllGUCConfig(void);
extern bool Debug_print_query;