mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-01 12:41:20 +02:00
97c39498e5
Backpatch-through: certain files through 9.4
97 lines
3.7 KiB
C
97 lines
3.7 KiB
C
/*
|
|
* psql - the PostgreSQL interactive terminal
|
|
*
|
|
* Copyright (c) 2000-2019, PostgreSQL Global Development Group
|
|
*
|
|
* This implements a sort of variable repository. One could also think of it
|
|
* as a cheap version of an associative array. Each variable has a string
|
|
* name and a string value. The value can't be NULL, or more precisely
|
|
* that's not distinguishable from the variable being unset.
|
|
*
|
|
* src/bin/psql/variables.h
|
|
*/
|
|
#ifndef VARIABLES_H
|
|
#define VARIABLES_H
|
|
|
|
/*
|
|
* Variables can be given "assign hook" functions. The assign hook can
|
|
* prevent invalid values from being assigned, and can update internal C
|
|
* variables to keep them in sync with the variable's current value.
|
|
*
|
|
* An assign hook function is called before any attempted assignment, with the
|
|
* proposed new value of the variable (or with NULL, if an \unset is being
|
|
* attempted). If it returns false, the assignment doesn't occur --- it
|
|
* should print an error message with psql_error() to tell the user why.
|
|
*
|
|
* When an assign hook function is installed with SetVariableHooks(), it is
|
|
* called with the variable's current value (or with NULL, if it wasn't set
|
|
* yet). But its return value is ignored in this case. The hook should be
|
|
* set before any possibly-invalid value can be assigned.
|
|
*/
|
|
typedef bool (*VariableAssignHook) (const char *newval);
|
|
|
|
/*
|
|
* Variables can also be given "substitute hook" functions. The substitute
|
|
* hook can replace values (including NULL) with other values, allowing
|
|
* normalization of variable contents. For example, for a boolean variable,
|
|
* we wish to interpret "\unset FOO" as "\set FOO off", and we can do that
|
|
* by installing a substitute hook. (We can use the same substitute hook
|
|
* for all bool or nearly-bool variables, which is why this responsibility
|
|
* isn't part of the assign hook.)
|
|
*
|
|
* The substitute hook is called before any attempted assignment, and before
|
|
* the assign hook if any, passing the proposed new value of the variable as a
|
|
* malloc'd string (or NULL, if an \unset is being attempted). It can return
|
|
* the same value, or a different malloc'd string, or modify the string
|
|
* in-place. It should free the passed-in value if it's not returning it.
|
|
* The substitute hook generally should not complain about erroneous values;
|
|
* that's a job for the assign hook.
|
|
*
|
|
* When a substitute hook is installed with SetVariableHooks(), it is applied
|
|
* to the variable's current value (typically NULL, if it wasn't set yet).
|
|
* That also happens before applying the assign hook.
|
|
*/
|
|
typedef char *(*VariableSubstituteHook) (char *newval);
|
|
|
|
/*
|
|
* Data structure representing one variable.
|
|
*
|
|
* Note: if value == NULL then the variable is logically unset, but we are
|
|
* keeping the struct around so as not to forget about its hook function(s).
|
|
*/
|
|
struct _variable
|
|
{
|
|
char *name;
|
|
char *value;
|
|
VariableSubstituteHook substitute_hook;
|
|
VariableAssignHook assign_hook;
|
|
struct _variable *next;
|
|
};
|
|
|
|
/* Data structure representing a set of variables */
|
|
typedef struct _variable *VariableSpace;
|
|
|
|
|
|
VariableSpace CreateVariableSpace(void);
|
|
const char *GetVariable(VariableSpace space, const char *name);
|
|
|
|
bool ParseVariableBool(const char *value, const char *name,
|
|
bool *result);
|
|
|
|
bool ParseVariableNum(const char *value, const char *name,
|
|
int *result);
|
|
|
|
void PrintVariables(VariableSpace space);
|
|
|
|
bool SetVariable(VariableSpace space, const char *name, const char *value);
|
|
bool SetVariableBool(VariableSpace space, const char *name);
|
|
bool DeleteVariable(VariableSpace space, const char *name);
|
|
|
|
void SetVariableHooks(VariableSpace space, const char *name,
|
|
VariableSubstituteHook shook,
|
|
VariableAssignHook ahook);
|
|
|
|
void PsqlVarEnumError(const char *name, const char *value, const char *suggestions);
|
|
|
|
#endif /* VARIABLES_H */
|