PostgreSQL Source Code git master
Loading...
Searching...
No Matches
variables.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  _variable
 

Typedefs

typedef bool(* VariableAssignHook) (const char *newval)
 
typedef char *(* VariableSubstituteHook) (char *newval)
 
typedef struct _variableVariableSpace
 

Functions

VariableSpace CreateVariableSpace (void)
 
const charGetVariable (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)
 
bool ParseVariableDouble (const char *value, const char *name, double *result, double min, double max)
 
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)
 

Typedef Documentation

◆ VariableAssignHook

typedef bool(* VariableAssignHook) (const char *newval)

Definition at line 31 of file variables.h.

◆ VariableSpace

Definition at line 72 of file variables.h.

◆ VariableSubstituteHook

typedef char *(* VariableSubstituteHook) (char *newval)

Definition at line 54 of file variables.h.

Function Documentation

◆ CreateVariableSpace()

VariableSpace CreateVariableSpace ( void  )

Definition at line 53 of file variables.c.

54{
55 struct _variable *ptr;
56
57 ptr = pg_malloc_object(struct _variable);
58 ptr->name = NULL;
59 ptr->value = NULL;
60 ptr->substitute_hook = NULL;
61 ptr->assign_hook = NULL;
62 ptr->next = NULL;
63
64 return ptr;
65}
#define pg_malloc_object(type)
Definition fe_memutils.h:60
static int fb(int x)
VariableSubstituteHook substitute_hook
Definition variables.h:66
VariableAssignHook assign_hook
Definition variables.h:67
struct _variable * next
Definition variables.h:68
char * name
Definition variables.h:64
char * value
Definition variables.h:65

References _variable::assign_hook, fb(), _variable::name, _variable::next, pg_malloc_object, _variable::substitute_hook, and _variable::value.

Referenced by EstablishVariableSpace().

◆ DeleteVariable()

bool DeleteVariable ( VariableSpace  space,
const char name 
)

Definition at line 475 of file variables.c.

476{
477 return SetVariable(space, name, NULL);
478}
bool SetVariable(VariableSpace space, const char *name, const char *value)
Definition variables.c:282
const char * name

References fb(), name, and SetVariable().

Referenced by parse_psql_options().

◆ GetVariable()

const char * GetVariable ( VariableSpace  space,
const char name 
)

Definition at line 73 of file variables.c.

74{
75 struct _variable *current;
76
77 if (!space)
78 return NULL;
79
80 for (current = space->next; current; current = current->next)
81 {
82 int cmp = strcmp(current->name, name);
83
84 if (cmp == 0)
85 {
86 /* this is correct answer when value is NULL, too */
87 return current->value;
88 }
89 if (cmp > 0)
90 break; /* it's not there */
91 }
92
93 return NULL;
94}
static int cmp(const chr *x, const chr *y, size_t len)

References cmp(), fb(), name, _variable::name, _variable::next, and _variable::value.

Referenced by get_prompt(), initializeInput(), and psql_get_variable().

◆ ParseVariableBool()

bool ParseVariableBool ( const char value,
const char name,
bool result 
)

Definition at line 109 of file variables.c.

110{
111 size_t len;
112 bool valid = true;
113
114 /* Treat "unset" as an empty string, which will lead to error below */
115 if (value == NULL)
116 value = "";
117
118 len = strlen(value);
119
120 if (len > 0 && pg_strncasecmp(value, "true", len) == 0)
121 *result = true;
122 else if (len > 0 && pg_strncasecmp(value, "false", len) == 0)
123 *result = false;
124 else if (len > 0 && pg_strncasecmp(value, "yes", len) == 0)
125 *result = true;
126 else if (len > 0 && pg_strncasecmp(value, "no", len) == 0)
127 *result = false;
128 /* 'o' is not unique enough */
129 else if (pg_strncasecmp(value, "on", (len > 2 ? len : 2)) == 0)
130 *result = true;
131 else if (pg_strncasecmp(value, "off", (len > 2 ? len : 2)) == 0)
132 *result = false;
133 else if (pg_strcasecmp(value, "1") == 0)
134 *result = true;
135 else if (pg_strcasecmp(value, "0") == 0)
136 *result = false;
137 else
138 {
139 /* string is not recognized; don't clobber *result */
140 if (name)
141 pg_log_error("unrecognized value \"%s\" for \"%s\": Boolean expected",
142 value, name);
143 valid = false;
144 }
145 return valid;
146}
uint32 result
#define false
static struct @177 value
return true
Definition isn.c:130
#define pg_log_error(...)
Definition logging.h:108
const void size_t len
int pg_strcasecmp(const char *s1, const char *s2)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)

References fb(), len, name, pg_log_error, pg_strcasecmp(), pg_strncasecmp(), result, and value.

Referenced by autocommit_hook(), do_pset(), echo_hidden_hook(), exec_command_connect(), exec_command_timing(), hide_compression_hook(), hide_tableam_hook(), is_true_boolean_expression(), on_error_rollback_hook(), on_error_stop_hook(), quiet_hook(), show_all_results_hook(), singleline_hook(), and singlestep_hook().

◆ ParseVariableDouble()

bool ParseVariableDouble ( const char value,
const char name,
double result,
double  min,
double  max 
)

Definition at line 195 of file variables.c.

196{
197 char *end;
198 double dblval;
199
200 /*
201 * Empty-string input has historically been treated differently by strtod
202 * on various platforms, so handle that by specifically checking for it.
203 */
204 if ((value == NULL) || (*value == '\0'))
205 {
206 if (name)
207 pg_log_error("invalid input syntax for variable \"%s\"", name);
208 return false;
209 }
210
211 errno = 0;
212 dblval = strtod(value, &end);
213 if (errno == 0 && *end == '\0' && end != value)
214 {
215 if (dblval < min)
216 {
217 if (name)
218 pg_log_error("invalid value \"%s\" for variable \"%s\": must be greater than %.2f",
219 value, name, min);
220 return false;
221 }
222 else if (dblval > max)
223 {
224 if (name)
225 pg_log_error("invalid value \"%s\" for variable \"%s\": must be less than %.2f",
226 value, name, max);
227 return false;
228 }
229 *result = dblval;
230 return true;
231 }
232
233 /*
234 * Cater for platforms which treat values which aren't zero, but that are
235 * too close to zero to have full precision, by checking for zero or real
236 * out-of-range values.
237 */
238 else if ((errno == ERANGE) &&
239 (dblval == 0.0 || dblval >= HUGE_VAL || dblval <= -HUGE_VAL))
240 {
241 if (name)
242 pg_log_error("value \"%s\" is out of range for variable \"%s\"", value, name);
243 return false;
244 }
245 else
246 {
247 if (name)
248 pg_log_error("invalid value \"%s\" for variable \"%s\"", value, name);
249 return false;
250 }
251}

References fb(), name, pg_log_error, result, and value.

Referenced by watch_interval_hook().

◆ ParseVariableNum()

bool ParseVariableNum ( const char value,
const char name,
int result 
)

Definition at line 158 of file variables.c.

159{
160 char *end;
161 long numval;
162
163 /* Treat "unset" as an empty string, which will lead to error below */
164 if (value == NULL)
165 value = "";
166
167 errno = 0;
168 numval = strtol(value, &end, 0);
169 if (errno == 0 && *end == '\0' && end != value && numval == (int) numval)
170 {
171 *result = (int) numval;
172 return true;
173 }
174 else
175 {
176 /* string is not recognized; don't clobber *result */
177 if (name)
178 pg_log_error("invalid value \"%s\" for \"%s\": integer expected",
179 value, name);
180 return false;
181 }
182}

References fb(), name, pg_log_error, result, and value.

Referenced by do_pset(), fetch_count_hook(), histsize_hook(), ignoreeof_hook(), and ignoreeof_substitute_hook().

◆ PrintVariables()

void PrintVariables ( VariableSpace  space)

Definition at line 257 of file variables.c.

258{
259 struct _variable *ptr;
260
261 if (!space)
262 return;
263
264 for (ptr = space->next; ptr; ptr = ptr->next)
265 {
266 if (ptr->value)
267 printf("%s = '%s'\n", ptr->name, ptr->value);
268 if (cancel_pressed)
269 break;
270 }
271}
volatile sig_atomic_t cancel_pressed
Definition print.c:48
#define printf(...)
Definition port.h:267

References cancel_pressed, _variable::name, _variable::next, printf, and _variable::value.

Referenced by exec_command_set().

◆ PsqlVarEnumError()

void PsqlVarEnumError ( const char name,
const char value,
const char suggestions 
)

Definition at line 487 of file variables.c.

488{
489 pg_log_error("unrecognized value \"%s\" for \"%s\"\n"
490 "Available values are: %s.",
492}

References fb(), name, pg_log_error, and value.

Referenced by comp_keyword_case_hook(), do_pset(), echo_hidden_hook(), echo_hook(), histcontrol_hook(), on_error_rollback_hook(), show_context_hook(), and verbosity_hook().

◆ SetVariable()

bool SetVariable ( VariableSpace  space,
const char name,
const char value 
)

Definition at line 282 of file variables.c.

283{
284 struct _variable *current,
285 *previous;
286
287 if (!space || !name)
288 return false;
289
291 {
292 /* Deletion of non-existent variable is not an error */
293 if (!value)
294 return true;
295 pg_log_error("invalid variable name: \"%s\"", name);
296 return false;
297 }
298
299 for (previous = space, current = space->next;
300 current;
301 previous = current, current = current->next)
302 {
303 int cmp = strcmp(current->name, name);
304
305 if (cmp == 0)
306 {
307 /*
308 * Found entry, so update, unless assign hook returns false.
309 *
310 * We must duplicate the passed value to start with. This
311 * simplifies the API for substitute hooks. Moreover, some assign
312 * hooks assume that the passed value has the same lifespan as the
313 * variable. Having to free the string again on failure is a
314 * small price to pay for keeping these APIs simple.
315 */
316 char *new_value = value ? pg_strdup(value) : NULL;
317 bool confirmed;
318
319 if (current->substitute_hook)
320 new_value = current->substitute_hook(new_value);
321
322 if (current->assign_hook)
323 confirmed = current->assign_hook(new_value);
324 else
325 confirmed = true;
326
327 if (confirmed)
328 {
329 pg_free(current->value);
330 current->value = new_value;
331
332 /*
333 * If we deleted the value, and there are no hooks to
334 * remember, we can discard the variable altogether.
335 */
336 if (new_value == NULL &&
337 current->substitute_hook == NULL &&
338 current->assign_hook == NULL)
339 {
340 previous->next = current->next;
341 free(current->name);
342 free(current);
343 }
344 }
345 else
346 pg_free(new_value); /* current->value is left unchanged */
347
348 return confirmed;
349 }
350 if (cmp > 0)
351 break; /* it's not there */
352 }
353
354 /* not present, make new entry ... unless we were asked to delete */
355 if (value)
356 {
357 current = pg_malloc_object(struct _variable);
358 current->name = pg_strdup(name);
359 current->value = pg_strdup(value);
360 current->substitute_hook = NULL;
361 current->assign_hook = NULL;
362 current->next = previous->next;
363 previous->next = current;
364 }
365 return true;
366}
char * pg_strdup(const char *in)
Definition fe_memutils.c:91
void pg_free(void *ptr)
#define free(a)
static bool valid_variable_name(const char *name)
Definition variables.c:24

References _variable::assign_hook, cmp(), fb(), free, name, _variable::name, _variable::next, pg_free(), pg_log_error, pg_malloc_object, pg_strdup(), _variable::substitute_hook, valid_variable_name(), _variable::value, and value.

Referenced by DeleteVariable(), do_lo_import(), exec_command_encoding(), exec_command_getenv(), exec_command_prompt(), exec_command_set(), exec_command_unset(), ExecQueryAndProcessResults(), main(), parse_psql_options(), PrintQueryStatus(), SendQuery(), SetPipelineVariables(), SetResultVariables(), SetShellResultVariables(), SetVariableBool(), StoreQueryTuple(), SyncVariables(), and UnsyncVariables().

◆ SetVariableBool()

bool SetVariableBool ( VariableSpace  space,
const char name 
)

Definition at line 463 of file variables.c.

464{
465 return SetVariable(space, name, "on");
466}

References name, and SetVariable().

Referenced by main(), and parse_psql_options().

◆ SetVariableHooks()

void SetVariableHooks ( VariableSpace  space,
const char name,
VariableSubstituteHook  shook,
VariableAssignHook  ahook 
)

Definition at line 385 of file variables.c.

388{
389 struct _variable *current,
390 *previous;
391
392 if (!space || !name)
393 return;
394
396 return;
397
398 for (previous = space, current = space->next;
399 current;
400 previous = current, current = current->next)
401 {
402 int cmp = strcmp(current->name, name);
403
404 if (cmp == 0)
405 {
406 /* found entry, so update */
407 current->substitute_hook = shook;
408 current->assign_hook = ahook;
409 if (shook)
410 current->value = (*shook) (current->value);
411 if (ahook)
412 (void) (*ahook) (current->value);
413 return;
414 }
415 if (cmp > 0)
416 break; /* it's not there */
417 }
418
419 /* not present, make new entry */
420 current = pg_malloc_object(struct _variable);
421 current->name = pg_strdup(name);
422 current->value = NULL;
423 current->substitute_hook = shook;
424 current->assign_hook = ahook;
425 current->next = previous->next;
426 previous->next = current;
427 if (shook)
428 current->value = (*shook) (current->value);
429 if (ahook)
430 (void) (*ahook) (current->value);
431}

References _variable::assign_hook, cmp(), fb(), name, _variable::name, _variable::next, pg_malloc_object, pg_strdup(), _variable::substitute_hook, valid_variable_name(), and _variable::value.

Referenced by EstablishVariableSpace().

◆ VariableHasHook()

bool VariableHasHook ( VariableSpace  space,
const char name 
)

Definition at line 438 of file variables.c.

439{
440 struct _variable *current;
441
442 Assert(space);
443 Assert(name);
444
445 for (current = space->next; current; current = current->next)
446 {
447 int cmp = strcmp(current->name, name);
448
449 if (cmp == 0)
450 return (current->substitute_hook != NULL ||
451 current->assign_hook != NULL);
452 if (cmp > 0)
453 break; /* it's not there */
454 }
455
456 return false;
457}
#define Assert(condition)
Definition c.h:943

References Assert, _variable::assign_hook, cmp(), fb(), name, _variable::name, _variable::next, and _variable::substitute_hook.

Referenced by StoreQueryTuple().