2 * psql - the PostgreSQL interactive terminal
4 * Copyright (c) 2000-2003, PostgreSQL Global Development Group
6 * $PostgreSQL: pgsql/src/bin/psql/variables.c,v 1.17 2004/01/25 03:07:22 neilc Exp $
8 #include "postgres_fe.h"
10 #include "variables.h"
13 CreateVariableSpace(void)
15 struct _variable *ptr;
17 ptr = pg_calloc(1, sizeof *ptr);
18 ptr->name = pg_strdup("@");
19 ptr->value = pg_strdup("");
25 GetVariable(VariableSpace space, const char *name)
27 struct _variable *current;
32 if (strspn(name, VALID_VARIABLE_CHARS) != strlen(name))
35 for (current = space; current; current = current->next)
37 psql_assert(current->name);
38 psql_assert(current->value);
39 if (strcmp(current->name, name) == 0)
40 return current->value;
47 GetVariableBool(VariableSpace space, const char *name)
51 val = GetVariable(space, name);
53 return false; /* not set -> assume "off" */
54 if (strcmp(val, "off") == 0)
58 * for backwards compatibility, anything except "off" is taken as
65 VariableEquals(VariableSpace space, const char name[], const char value[])
69 var = GetVariable(space, name);
70 return var && (strcmp(var, value) == 0);
74 GetVariableNum(VariableSpace space,
83 var = GetVariable(space, name);
92 result = strtol(var, &end, 0);
93 if (!allowtrail && *end)
101 SwitchVariable(VariableSpace space, const char name[], const char *opt,...)
106 var = GetVariable(space, name);
112 for (result = 1; opt && (strcmp(var, opt) != 0); result++)
113 opt = va_arg(args, const char *);
115 result = VAR_NOTFOUND;
125 PrintVariables(VariableSpace space)
127 struct _variable *ptr;
129 for (ptr = space->next; ptr; ptr = ptr->next)
130 printf("%s = '%s'\n", ptr->name, ptr->value);
134 SetVariable(VariableSpace space, const char *name, const char *value)
136 struct _variable *current,
143 return DeleteVariable(space, name);
145 if (strspn(name, VALID_VARIABLE_CHARS) != strlen(name))
148 for (current = space, previous = NULL; current; previous = current, current = current->next)
150 psql_assert(current->name);
151 psql_assert(current->value);
152 if (strcmp(current->name, name) == 0)
154 free(current->value);
155 current->value = pg_strdup(value);
160 previous->next = pg_calloc(1, sizeof *(previous->next));
161 previous->next->name = pg_strdup(name);
162 previous->next->value = pg_strdup(value);
167 SetVariableBool(VariableSpace space, const char *name)
169 return SetVariable(space, name, "on");
173 DeleteVariable(VariableSpace space, const char *name)
175 struct _variable *current,
181 if (strspn(name, VALID_VARIABLE_CHARS) != strlen(name))
184 for (current = space, previous = NULL; current; previous = current, current = current->next)
186 psql_assert(current->name);
187 psql_assert(current->value);
188 if (strcmp(current->name, name) == 0)
191 free(current->value);
193 previous->next = current->next;