diff options
Diffstat (limited to 'src/bin/psql/variables.h')
-rw-r--r-- | src/bin/psql/variables.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h new file mode 100644 index 0000000..12ae3c0 --- /dev/null +++ b/src/bin/psql/variables.h @@ -0,0 +1,97 @@ +/* + * psql - the PostgreSQL interactive terminal + * + * Copyright (c) 2000-2021, 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 pg_log_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); +bool VariableHasHook(VariableSpace space, const char *name); + +void PsqlVarEnumError(const char *name, const char *value, const char *suggestions); + +#endif /* VARIABLES_H */ |