aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/misc/guc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/misc/guc.c')
-rw-r--r--src/backend/utils/misc/guc.c156
1 files changed, 154 insertions, 2 deletions
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 6e112caa43c..f140d871f0c 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.59 2002/02/23 01:31:36 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/guc.c,v 1.60 2002/03/01 22:45:16 petere Exp $
*
* Copyright 2000 by PostgreSQL Global Development Group
* Written by Peter Eisentraut <peter_e@gmx.net>.
@@ -36,6 +36,8 @@
#include "storage/lock.h"
#include "storage/proc.h"
#include "tcop/tcopprot.h"
+#include "utils/array.h"
+#include "utils/builtins.h"
#include "utils/datetime.h"
#include "pgstat.h"
@@ -89,6 +91,7 @@ bool Password_encryption = false;
#define PG_KRB_SRVTAB ""
#endif
+static bool guc_session_init = false; /* XXX mildly bogus */
/*
* Declarations for GUC tables
@@ -882,7 +885,12 @@ set_config_option(const char *name, const char *value,
int elevel;
bool makeDefault;
- elevel = (context == PGC_SIGHUP) ? DEBUG : ERROR;
+ if (context == PGC_SIGHUP)
+ elevel = DEBUG;
+ else if (guc_session_init)
+ elevel = NOTICE;
+ else
+ elevel = ERROR;
type = find_option(name, &record);
if (type == PGC_NONE)
@@ -1362,3 +1370,147 @@ assign_defaultxactisolevel(const char *value)
else
elog(ERROR, "bogus transaction isolation level");
}
+
+
+
+void
+ProcessGUCArray(ArrayType *array, GucSource source)
+{
+ int i;
+
+ Assert(array);
+
+ for (i = 1; i <= ARR_DIMS(array)[0]; i++)
+ {
+ Datum d;
+ bool isnull;
+ char *s;
+ char *name;
+ char *value;
+
+ d = array_ref(array, 1, &i,
+ false /*notbyvalue*/,
+ -1 /*varlenelem*/,
+ -1 /*varlenarray*/,
+ &isnull);
+
+ if (isnull)
+ continue;
+
+ s = DatumGetCString(DirectFunctionCall1(textout, d));
+ ParseLongOption(s, &name, &value);
+ if (!value)
+ {
+ elog(NOTICE, "cannot to parse setting \"%s\"", name);
+ continue;
+ }
+
+ /* prevent errors from incorrect options */
+ guc_session_init = true;
+
+ SetConfigOption(name, value, PGC_SUSET, source);
+
+ guc_session_init = false;
+ }
+}
+
+
+
+ArrayType *
+GUCArrayAdd(ArrayType *array, const char *name, const char *value)
+{
+ Datum datum;
+ char *newval;
+ ArrayType *a;
+
+ Assert(name);
+ Assert(value);
+
+ /* test if the option is valid */
+ set_config_option(name, value,
+ superuser() ? PGC_SUSET : PGC_USERSET,
+ false, PGC_S_INFINITY);
+
+ newval = palloc(strlen(name) + 1 + strlen(value) + 1);
+ sprintf(newval, "%s=%s", name, value);
+ datum = DirectFunctionCall1(textin, CStringGetDatum(newval));
+
+ if (array)
+ {
+ int index;
+ bool isnull;
+ int i;
+
+ index = ARR_DIMS(array)[0] + 1; /* add after end */
+
+ for (i = 1; i <= ARR_DIMS(array)[0]; i++)
+ {
+ Datum d;
+ char *current;
+
+ d = array_ref(array, 1, &i,
+ false /*notbyvalue*/,
+ -1 /*varlenelem*/,
+ -1 /*varlenarray*/,
+ &isnull);
+ current = DatumGetCString(DirectFunctionCall1(textout, d));
+ if (strncmp(current, newval, strlen(name) + 1)==0)
+ {
+ index = i;
+ break;
+ }
+ }
+
+ isnull = false;
+ a = array_set(array, 1, &index, datum, false/*notbyval*/, -1, -1, &isnull);
+ }
+ else
+ a = construct_array(&datum, 1, false, -1, 'i');
+
+ return a;
+}
+
+
+
+ArrayType *
+GUCArrayDelete(ArrayType *array, const char *name)
+{
+ ArrayType *newarray;
+ int i;
+ int index;
+
+ Assert(name);
+ Assert(array);
+
+ /* test if the option is valid */
+ set_config_option(name, NULL,
+ superuser() ? PGC_SUSET : PGC_USERSET,
+ false, PGC_S_INFINITY);
+
+ newarray = construct_array(NULL, 0, false, -1, 'i');
+ index = 1;
+
+ for (i = 1; i <= ARR_DIMS(array)[0]; i++)
+ {
+ Datum d;
+ char *val;
+ bool isnull;
+
+ d = array_ref(array, 1, &i,
+ false /*notbyvalue*/,
+ -1 /*varlenelem*/,
+ -1 /*varlenarray*/,
+ &isnull);
+ val = DatumGetCString(DirectFunctionCall1(textout, d));
+
+ if (strncmp(val, name, strlen(name))==0
+ && val[strlen(name)] == '=')
+ continue;
+
+ isnull = false;
+ newarray = array_set(newarray, 1, &index, d, false/*notbyval*/, -1, -1, &isnull);
+ index++;
+ }
+
+ return newarray;
+}