diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2000-05-31 00:28:42 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2000-05-31 00:28:42 +0000 |
commit | 6a68f42648f54690ad5b5ae6fb9104e86e15f0f1 (patch) | |
tree | 4b6742f51fb2160dbe2ce090273fd430dc2b2499 /src/backend/commands | |
parent | 5e4d554bae6a7177903cdb99bf5d41b695519a45 (diff) | |
download | postgresql-6a68f42648f54690ad5b5ae6fb9104e86e15f0f1.tar.gz postgresql-6a68f42648f54690ad5b5ae6fb9104e86e15f0f1.zip |
The heralded `Grand Unified Configuration scheme' (GUC)
That means you can now set your options in either or all of $PGDATA/configuration,
some postmaster option (--enable-fsync=off), or set a SET command. The list of
options is in backend/utils/misc/guc.c, documentation will be written post haste.
pg_options is gone, so is that pq_geqo config file. Also removed were backend -K,
-Q, and -T options (no longer applicable, although -d0 does the same as -Q).
Added to configure an --enable-syslog option.
changed all callers from TPRINTF to elog(DEBUG)
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/async.c | 64 | ||||
-rw-r--r-- | src/backend/commands/variable.c | 792 |
2 files changed, 108 insertions, 748 deletions
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index 8225f3a7ca4..a1eb3598bdd 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.61 2000/05/28 17:55:54 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.62 2000/05/31 00:28:15 petere Exp $ * *------------------------------------------------------------------------- */ @@ -90,7 +90,7 @@ #include "utils/fmgroids.h" #include "utils/ps_status.h" #include "utils/syscache.h" -#include "utils/trace.h" + /* stuff that we really ought not be touching directly :-( */ extern TransactionState CurrentTransactionState; @@ -128,6 +128,8 @@ static void NotifyMyFrontEnd(char *relname, int32 listenerPID); static int AsyncExistsPendingNotify(char *relname); static void ClearPendingNotifies(void); +bool Trace_notify = false; + /* *-------------------------------------------------------------- @@ -149,7 +151,8 @@ Async_Notify(char *relname) { char *notifyName; - TPRINTF(TRACE_NOTIFY, "Async_Notify: %s", relname); + if (Trace_notify) + elog(DEBUG, "Async_Notify: %s", relname); if (!pendingNotifies) pendingNotifies = DLNewList(); @@ -202,7 +205,8 @@ Async_Listen(char *relname, int pid) int alreadyListener = 0; TupleDesc tupDesc; - TPRINTF(TRACE_NOTIFY, "Async_Listen: %s", relname); + if (Trace_notify) + elog(DEBUG, "Async_Listen: %s", relname); lRel = heap_openr(ListenerRelationName, AccessExclusiveLock); tdesc = RelationGetDescr(lRel); @@ -304,7 +308,8 @@ Async_Unlisten(char *relname, int pid) return; } - TPRINTF(TRACE_NOTIFY, "Async_Unlisten %s", relname); + if (Trace_notify) + elog(DEBUG, "Async_Unlisten %s", relname); lRel = heap_openr(ListenerRelationName, AccessExclusiveLock); /* Note we assume there can be only one matching tuple. */ @@ -346,7 +351,8 @@ Async_UnlistenAll() HeapTuple lTuple; ScanKeyData key[1]; - TPRINTF(TRACE_NOTIFY, "Async_UnlistenAll"); + if (Trace_notify) + elog(DEBUG, "Async_UnlistenAll"); lRel = heap_openr(ListenerRelationName, AccessExclusiveLock); tdesc = RelationGetDescr(lRel); @@ -452,7 +458,8 @@ AtCommit_Notify() return; } - TPRINTF(TRACE_NOTIFY, "AtCommit_Notify"); + if (Trace_notify) + elog(DEBUG, "AtCommit_Notify"); lRel = heap_openr(ListenerRelationName, AccessExclusiveLock); tdesc = RelationGetDescr(lRel); @@ -485,13 +492,16 @@ AtCommit_Notify() * be bad for applications that ignore self-notify * messages. */ - TPRINTF(TRACE_NOTIFY, "AtCommit_Notify: notifying self"); + + if (Trace_notify) + elog(DEBUG, "AtCommit_Notify: notifying self"); + NotifyMyFrontEnd(relname, listenerPID); } else { - TPRINTF(TRACE_NOTIFY, "AtCommit_Notify: notifying pid %d", - listenerPID); + if (Trace_notify) + elog(DEBUG, "AtCommit_Notify: notifying pid %d", listenerPID); /* * If someone has already notified this listener, we don't @@ -551,7 +561,8 @@ AtCommit_Notify() ClearPendingNotifies(); - TPRINTF(TRACE_NOTIFY, "AtCommit_Notify: done"); + if (Trace_notify) + elog(DEBUG, "AtCommit_Notify: done"); } /* @@ -624,10 +635,13 @@ Async_NotifyHandler(SIGNAL_ARGS) if (notifyInterruptOccurred) { /* Here, it is finally safe to do stuff. */ - TPRINTF(TRACE_NOTIFY, - "Async_NotifyHandler: perform async notify"); + if (Trace_notify) + elog(DEBUG, "Async_NotifyHandler: perform async notify"); + ProcessIncomingNotify(); - TPRINTF(TRACE_NOTIFY, "Async_NotifyHandler: done"); + + if (Trace_notify) + elog(DEBUG, "Async_NotifyHandler: done"); } } } @@ -693,10 +707,13 @@ EnableNotifyInterrupt(void) notifyInterruptEnabled = 0; if (notifyInterruptOccurred) { - TPRINTF(TRACE_NOTIFY, - "EnableNotifyInterrupt: perform async notify"); + if (Trace_notify) + elog(DEBUG, "EnableNotifyInterrupt: perform async notify"); + ProcessIncomingNotify(); - TPRINTF(TRACE_NOTIFY, "EnableNotifyInterrupt: done"); + + if (Trace_notify) + elog(DEBUG, "EnableNotifyInterrupt: done"); } } } @@ -751,7 +768,9 @@ ProcessIncomingNotify(void) char *relname; int32 sourcePID; - TPRINTF(TRACE_NOTIFY, "ProcessIncomingNotify"); + if (Trace_notify) + elog(DEBUG, "ProcessIncomingNotify"); + PS_SET_STATUS("async_notify"); notifyInterruptOccurred = 0; @@ -784,8 +803,11 @@ ProcessIncomingNotify(void) d = heap_getattr(lTuple, Anum_pg_listener_relname, tdesc, &isnull); relname = (char *) DatumGetPointer(d); /* Notify the frontend */ - TPRINTF(TRACE_NOTIFY, "ProcessIncomingNotify: received %s from %d", + + if (Trace_notify) + elog(DEBUG, "ProcessIncomingNotify: received %s from %d", relname, (int) sourcePID); + NotifyMyFrontEnd(relname, sourcePID); /* Rewrite the tuple with 0 in notification column */ rTuple = heap_modifytuple(lTuple, lRel, value, nulls, repl); @@ -820,7 +842,9 @@ ProcessIncomingNotify(void) pq_flush(); PS_SET_STATUS("idle"); - TPRINTF(TRACE_NOTIFY, "ProcessIncomingNotify: done"); + + if (Trace_notify) + elog(DEBUG, "ProcessIncomingNotify: done"); } /* Send NOTIFY message to my front end. */ diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index 367b17aa64c..18b39d66aac 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.34 2000/04/12 17:15:00 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/variable.c,v 1.35 2000/05/31 00:28:15 petere Exp $ * *------------------------------------------------------------------------- */ @@ -27,17 +27,14 @@ #include "optimizer/paths.h" #include "parser/parse_expr.h" #include "utils/builtins.h" +#include "utils/guc.h" #include "utils/tqual.h" -#include "utils/trace.h" #ifdef MULTIBYTE #include "mb/pg_wchar.h" #endif -/* XXX should be in a header file */ -extern bool _use_keyset_query_optimizer; - static bool show_date(void); static bool reset_date(void); @@ -45,51 +42,7 @@ static bool parse_date(char *); static bool show_timezone(void); static bool reset_timezone(void); static bool parse_timezone(char *); -static bool show_effective_cache_size(void); -static bool reset_effective_cache_size(void); -static bool parse_effective_cache_size(char *); -static bool show_random_page_cost(void); -static bool reset_random_page_cost(void); -static bool parse_random_page_cost(char *); -static bool show_cpu_tuple_cost(void); -static bool reset_cpu_tuple_cost(void); -static bool parse_cpu_tuple_cost(char *); -static bool show_cpu_index_tuple_cost(void); -static bool reset_cpu_index_tuple_cost(void); -static bool parse_cpu_index_tuple_cost(char *); -static bool show_cpu_operator_cost(void); -static bool reset_cpu_operator_cost(void); -static bool parse_cpu_operator_cost(char *); -static bool reset_enable_seqscan(void); -static bool show_enable_seqscan(void); -static bool parse_enable_seqscan(char *); -static bool reset_enable_indexscan(void); -static bool show_enable_indexscan(void); -static bool parse_enable_indexscan(char *); -static bool reset_enable_tidscan(void); -static bool show_enable_tidscan(void); -static bool parse_enable_tidscan(char *); -static bool reset_enable_sort(void); -static bool show_enable_sort(void); -static bool parse_enable_sort(char *); -static bool reset_enable_nestloop(void); -static bool show_enable_nestloop(void); -static bool parse_enable_nestloop(char *); -static bool reset_enable_mergejoin(void); -static bool show_enable_mergejoin(void); -static bool parse_enable_mergejoin(char *); -static bool reset_enable_hashjoin(void); -static bool show_enable_hashjoin(void); -static bool parse_enable_hashjoin(char *); -static bool reset_geqo(void); -static bool show_geqo(void); -static bool parse_geqo(char *); -static bool show_ksqo(void); -static bool reset_ksqo(void); -static bool parse_ksqo(char *); -static bool reset_max_expr_depth(void); -static bool show_max_expr_depth(void); -static bool parse_max_expr_depth(char *); + static bool show_XactIsoLevel(void); static bool reset_XactIsoLevel(void); static bool parse_XactIsoLevel(char *); @@ -97,6 +50,7 @@ static bool parse_random_seed(char *); static bool show_random_seed(void); static bool reset_random_seed(void); + /* * get_token * Obtain the next item in a comma-separated list of items, @@ -210,447 +164,6 @@ get_token(char **tok, char **val, char *str) return str; } -/* - * Generic parse routine for boolean ON/OFF variables - */ -static bool -parse_boolean_var(char *value, - bool *variable, const char *varname, bool defaultval) -{ - if (value == NULL) - { - *variable = defaultval; - return TRUE; - } - - if (strcasecmp(value, "on") == 0) - *variable = true; - else if (strcasecmp(value, "off") == 0) - *variable = false; - else - elog(ERROR, "Bad value for %s (%s)", varname, value); - - return TRUE; -} - -/* - * ENABLE_SEQSCAN - */ -static bool -parse_enable_seqscan(char *value) -{ - return parse_boolean_var(value, &enable_seqscan, - "ENABLE_SEQSCAN", true); -} - -static bool -show_enable_seqscan() -{ - elog(NOTICE, "ENABLE_SEQSCAN is %s", - enable_seqscan ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_seqscan() -{ - enable_seqscan = true; - return TRUE; -} - -/* - * ENABLE_INDEXSCAN - */ -static bool -parse_enable_indexscan(char *value) -{ - return parse_boolean_var(value, &enable_indexscan, - "ENABLE_INDEXSCAN", true); -} - -static bool -show_enable_indexscan() -{ - elog(NOTICE, "ENABLE_INDEXSCAN is %s", - enable_indexscan ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_indexscan() -{ - enable_indexscan = true; - return TRUE; -} - -/* - * ENABLE_TIDSCAN - */ -static bool -parse_enable_tidscan(char *value) -{ - return parse_boolean_var(value, &enable_tidscan, - "ENABLE_TIDSCAN", true); -} - -static bool -show_enable_tidscan() -{ - elog(NOTICE, "ENABLE_TIDSCAN is %s", - enable_tidscan ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_tidscan() -{ - enable_tidscan = true; - return TRUE; -} - -/* - * ENABLE_SORT - */ -static bool -parse_enable_sort(char *value) -{ - return parse_boolean_var(value, &enable_sort, - "ENABLE_SORT", true); -} - -static bool -show_enable_sort() -{ - elog(NOTICE, "ENABLE_SORT is %s", - enable_sort ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_sort() -{ - enable_sort = true; - return TRUE; -} - -/* - * ENABLE_NESTLOOP - */ -static bool -parse_enable_nestloop(char *value) -{ - return parse_boolean_var(value, &enable_nestloop, - "ENABLE_NESTLOOP", true); -} - -static bool -show_enable_nestloop() -{ - elog(NOTICE, "ENABLE_NESTLOOP is %s", - enable_nestloop ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_nestloop() -{ - enable_nestloop = true; - return TRUE; -} - -/* - * ENABLE_MERGEJOIN - */ -static bool -parse_enable_mergejoin(char *value) -{ - return parse_boolean_var(value, &enable_mergejoin, - "ENABLE_MERGEJOIN", true); -} - -static bool -show_enable_mergejoin() -{ - elog(NOTICE, "ENABLE_MERGEJOIN is %s", - enable_mergejoin ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_mergejoin() -{ - enable_mergejoin = true; - return TRUE; -} - -/* - * ENABLE_HASHJOIN - */ -static bool -parse_enable_hashjoin(char *value) -{ - return parse_boolean_var(value, &enable_hashjoin, - "ENABLE_HASHJOIN", true); -} - -static bool -show_enable_hashjoin() -{ - elog(NOTICE, "ENABLE_HASHJOIN is %s", - enable_hashjoin ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_enable_hashjoin() -{ - enable_hashjoin = true; - return TRUE; -} - -/* - * - * GEQO - * - */ -static bool -parse_geqo(char *value) -{ - char *tok, - *val, - *rest; - - if (value == NULL) - { - reset_geqo(); - return TRUE; - } - - rest = get_token(&tok, &val, value); - - /* expect one and only one item */ - if (tok == NULL) - elog(ERROR, "Value undefined"); - if (rest && *rest != '\0') - elog(ERROR, "Unable to parse '%s'", rest); - - if (strcasecmp(tok, "on") == 0) - { - int new_geqo_rels = GEQO_RELS; - - if (val != NULL) - { - new_geqo_rels = pg_atoi(val, sizeof(int), '\0'); - if (new_geqo_rels <= 1) - elog(ERROR, "Bad value for # of relations (%s)", val); - } - enable_geqo = true; - geqo_rels = new_geqo_rels; - } - else if (strcasecmp(tok, "off") == 0) - { - if (val != NULL) - elog(ERROR, "%s does not allow a parameter", tok); - enable_geqo = false; - } - else - elog(ERROR, "Bad value for GEQO (%s)", value); - - return TRUE; -} - -static bool -show_geqo() -{ - if (enable_geqo) - elog(NOTICE, "GEQO is ON beginning with %d relations", geqo_rels); - else - elog(NOTICE, "GEQO is OFF"); - return TRUE; -} - -static bool -reset_geqo(void) -{ -#ifdef GEQO - enable_geqo = true; -#else - enable_geqo = false; -#endif - geqo_rels = GEQO_RELS; - return TRUE; -} - -/* - * EFFECTIVE_CACHE_SIZE - */ -static bool -parse_effective_cache_size(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_effective_cache_size(); - return TRUE; - } - - res = float8in((char *) value); - effective_cache_size = *res; - - return TRUE; -} - -static bool -show_effective_cache_size() -{ - elog(NOTICE, "EFFECTIVE_CACHE_SIZE is %g (%dK pages)", - effective_cache_size, BLCKSZ / 1024); - return TRUE; -} - -static bool -reset_effective_cache_size() -{ - effective_cache_size = DEFAULT_EFFECTIVE_CACHE_SIZE; - return TRUE; -} - -/* - * RANDOM_PAGE_COST - */ -static bool -parse_random_page_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_random_page_cost(); - return TRUE; - } - - res = float8in((char *) value); - random_page_cost = *res; - - return TRUE; -} - -static bool -show_random_page_cost() -{ - elog(NOTICE, "RANDOM_PAGE_COST is %g", random_page_cost); - return TRUE; -} - -static bool -reset_random_page_cost() -{ - random_page_cost = DEFAULT_RANDOM_PAGE_COST; - return TRUE; -} - -/* - * CPU_TUPLE_COST - */ -static bool -parse_cpu_tuple_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_cpu_tuple_cost(); - return TRUE; - } - - res = float8in((char *) value); - cpu_tuple_cost = *res; - - return TRUE; -} - -static bool -show_cpu_tuple_cost() -{ - elog(NOTICE, "CPU_TUPLE_COST is %g", cpu_tuple_cost); - return TRUE; -} - -static bool -reset_cpu_tuple_cost() -{ - cpu_tuple_cost = DEFAULT_CPU_TUPLE_COST; - return TRUE; -} - -/* - * CPU_INDEX_TUPLE_COST - */ -static bool -parse_cpu_index_tuple_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_cpu_index_tuple_cost(); - return TRUE; - } - - res = float8in((char *) value); - cpu_index_tuple_cost = *res; - - return TRUE; -} - -static bool -show_cpu_index_tuple_cost() -{ - elog(NOTICE, "CPU_INDEX_TUPLE_COST is %g", cpu_index_tuple_cost); - return TRUE; -} - -static bool -reset_cpu_index_tuple_cost() -{ - cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST; - return TRUE; -} - -/* - * CPU_OPERATOR_COST - */ -static bool -parse_cpu_operator_cost(char *value) -{ - float64 res; - - if (value == NULL) - { - reset_cpu_operator_cost(); - return TRUE; - } - - res = float8in((char *) value); - cpu_operator_cost = *res; - - return TRUE; -} - -static bool -show_cpu_operator_cost() -{ - elog(NOTICE, "CPU_OPERATOR_COST is %g", cpu_operator_cost); - return TRUE; -} - -static bool -reset_cpu_operator_cost() -{ - cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST; - return TRUE; -} /* * DATE_STYLE @@ -917,71 +430,7 @@ reset_timezone() return TRUE; } /* reset_timezone() */ -/*----------------------------------------------------------------------- -KSQO code will one day be unnecessary when the optimizer makes use of -indexes when multiple ORs are specified in the where clause. -See optimizer/prep/prepkeyset.c for more on this. - daveh@insightdist.com 6/16/98 ------------------------------------------------------------------------*/ -static bool -parse_ksqo(char *value) -{ - return parse_boolean_var(value, &_use_keyset_query_optimizer, - "KSQO", false); -} -static bool -show_ksqo() -{ - elog(NOTICE, "KSQO is %s", - _use_keyset_query_optimizer ? "ON" : "OFF"); - return TRUE; -} - -static bool -reset_ksqo() -{ - _use_keyset_query_optimizer = false; - return TRUE; -} - -/* - * MAX_EXPR_DEPTH - */ -static bool -parse_max_expr_depth(char *value) -{ - int newval; - - if (value == NULL) - { - reset_max_expr_depth(); - return TRUE; - } - - newval = pg_atoi(value, sizeof(int), '\0'); - - if (newval < 10) /* somewhat arbitrary limit */ - elog(ERROR, "Bad value for MAX_EXPR_DEPTH (%s)", value); - - max_expr_depth = newval; - - return TRUE; -} - -static bool -show_max_expr_depth() -{ - elog(NOTICE, "MAX_EXPR_DEPTH is %d", max_expr_depth); - return TRUE; -} - -static bool -reset_max_expr_depth(void) -{ - max_expr_depth = DEFAULT_MAX_EXPR_DEPTH; - return TRUE; -} /* SET TRANSACTION */ @@ -1038,37 +487,6 @@ reset_XactIsoLevel() return TRUE; } -/* - * Pg_options - */ -static bool -parse_pg_options(char *value) -{ - if (!superuser()) - elog(ERROR, "Only users with superuser privilege can set pg_options"); - if (value == NULL) - read_pg_options(0); - else - parse_options((char *) value, TRUE); - return (TRUE); -} - -static bool -show_pg_options(void) -{ - show_options(); - return (TRUE); -} - -static bool -reset_pg_options(void) -{ - if (!superuser()) - elog(ERROR, "Only users with superuser privilege can set pg_options"); - read_pg_options(0); - return (TRUE); -} - /* * Random number seed @@ -1105,157 +523,75 @@ reset_random_seed(void) } -/*-----------------------------------------------------------------------*/ - -static struct VariableParsers -{ - const char *name; - bool (*parser) (char *); - bool (*show) (); - bool (*reset) (); -} VariableParsers[] = +void +SetPGVariable(const char *name, const char *value) { - { - "datestyle", parse_date, show_date, reset_date - }, - { - "timezone", parse_timezone, show_timezone, reset_timezone - }, - { - "effective_cache_size", parse_effective_cache_size, - show_effective_cache_size, reset_effective_cache_size - }, - { - "random_page_cost", parse_random_page_cost, - show_random_page_cost, reset_random_page_cost - }, - { - "cpu_tuple_cost", parse_cpu_tuple_cost, - show_cpu_tuple_cost, reset_cpu_tuple_cost - }, - { - "cpu_index_tuple_cost", parse_cpu_index_tuple_cost, - show_cpu_index_tuple_cost, reset_cpu_index_tuple_cost - }, - { - "cpu_operator_cost", parse_cpu_operator_cost, - show_cpu_operator_cost, reset_cpu_operator_cost - }, - { - "enable_seqscan", parse_enable_seqscan, - show_enable_seqscan, reset_enable_seqscan - }, - { - "enable_indexscan", parse_enable_indexscan, - show_enable_indexscan, reset_enable_indexscan - }, - { - "enable_tidscan", parse_enable_tidscan, - show_enable_tidscan, reset_enable_tidscan - }, - { - "enable_sort", parse_enable_sort, - show_enable_sort, reset_enable_sort - }, - { - "enable_nestloop", parse_enable_nestloop, - show_enable_nestloop, reset_enable_nestloop - }, - { - "enable_mergejoin", parse_enable_mergejoin, - show_enable_mergejoin, reset_enable_mergejoin - }, - { - "enable_hashjoin", parse_enable_hashjoin, - show_enable_hashjoin, reset_enable_hashjoin - }, - { - "geqo", parse_geqo, show_geqo, reset_geqo - }, + /* + * Special cases ought to be removed are handled separately + * by TCOP + */ + if (strcasecmp(name, "datestyle")==0) + parse_date(pstrdup(value)); + else if (strcasecmp(name, "timezone")==0) + parse_timezone(pstrdup(value)); + else if (strcasecmp(name, "XactIsoLevel")==0) + parse_XactIsoLevel(pstrdup(value)); #ifdef MULTIBYTE - { - "client_encoding", parse_client_encoding, show_client_encoding, reset_client_encoding - }, - { - "server_encoding", parse_server_encoding, show_server_encoding, reset_server_encoding - }, + else if (strcasecmp(name, "client_encoding")==0) + parse_client_encoding(pstrdup(value)); + else if (strcasecmp(name, "server_encoding")==0) + parse_server_encoding(pstrdup(value)); #endif - { - "ksqo", parse_ksqo, show_ksqo, reset_ksqo - }, - { - "max_expr_depth", parse_max_expr_depth, - show_max_expr_depth, reset_max_expr_depth - }, - { - "XactIsoLevel", parse_XactIsoLevel, show_XactIsoLevel, reset_XactIsoLevel - }, - { - "pg_options", parse_pg_options, show_pg_options, reset_pg_options - }, - { - "seed", parse_random_seed, show_random_seed, reset_random_seed - }, - { - NULL, NULL, NULL, NULL - } -}; - -/*-----------------------------------------------------------------------*/ -/* - * Set the named variable, or reset to default value if value is NULL - */ -bool -SetPGVariable(const char *name, const char *value) -{ - struct VariableParsers *vp; - char *val; - - /* Make a modifiable copy for convenience of get_token */ - val = value ? pstrdup(value) : ((char *) NULL); - - for (vp = VariableParsers; vp->name; vp++) - { - if (!strcasecmp(vp->name, name)) - return (vp->parser) (val); - } - - elog(NOTICE, "Unrecognized variable %s", name); - - return TRUE; + else if (strcasecmp(name, "random_seed")==0) + parse_random_seed(pstrdup(value)); + else + SetConfigOption(name, value, superuser() ? PGC_SUSET : PGC_USERSET); } -/*-----------------------------------------------------------------------*/ -bool + +void GetPGVariable(const char *name) { - struct VariableParsers *vp; - - for (vp = VariableParsers; vp->name; vp++) - { - if (!strcasecmp(vp->name, name)) - return (vp->show) (); - } + if (strcasecmp(name, "datestyle")==0) + show_date(); + else if (strcasecmp(name, "timezone")==0) + show_timezone(); + else if (strcasecmp(name, "XactIsoLevel")==0) + show_XactIsoLevel(); +#ifdef MULTIBYTE + else if (strcasecmp(name, "client_encoding")==0) + show_client_encoding(); + else if (strcasecmp(name, "server_encoding")==0) + show_server_encoding(); +#endif + else if (strcasecmp(name, "random_seed")==0) + show_random_seed(); + else + { + const char * val = GetConfigOption(name, superuser()); + elog(NOTICE, "%s = %s", name, val); + } +} - elog(NOTICE, "Unrecognized variable %s", name); - return TRUE; -} - -/*-----------------------------------------------------------------------*/ -bool +void ResetPGVariable(const char *name) { - struct VariableParsers *vp; - - for (vp = VariableParsers; vp->name; vp++) - { - if (!strcasecmp(vp->name, name)) - return (vp->reset) (); - } - - elog(NOTICE, "Unrecognized variable %s", name); - - return TRUE; -} + if (strcasecmp(name, "datestyle")==0) + reset_date(); + else if (strcasecmp(name, "timezone")==0) + reset_timezone(); + else if (strcasecmp(name, "XactIsoLevel")==0) + reset_XactIsoLevel(); +#ifdef MULTIBYTE + else if (strcasecmp(name, "client_encoding")==0) + reset_client_encoding(); + else if (strcasecmp(name, "server_encoding")==0) + reset_server_encoding(); +#endif + else if (strcasecmp(name, "random_seed")==0) + reset_random_seed(); + else + SetConfigOption(name, NULL, superuser() ? PGC_SUSET : PGC_USERSET); +} |