/* In SIGHUP cases in the postmaster, report changes */
if (context == PGC_SIGHUP && !IsUnderPostmaster)
{
- const char *preval = GetConfigOption(item->name, false);
+ const char *preval = GetConfigOptionNoError(item->name);
- /* string variables could be NULL; treat that as empty */
+ /* If option doesn't exist yet or is NULL, treat as empty string */
if (!preval)
preval = "";
/* must dup, else might have dangling pointer below */
if (pre_value)
{
- const char *post_value = GetConfigOption(item->name, false);
+ const char *post_value = GetConfigOptionNoError(item->name);
if (!post_value)
post_value = "";
return NULL;
}
+/*
+ * As above, but return NULL if no such option.
+ * (This is a stopgap to avoid changing GetConfigOption's API within the
+ * 9.0.x release series.)
+ */
+const char *
+GetConfigOptionNoError(const char *name)
+{
+ struct config_generic *record;
+ static char buffer[256];
+
+ record = find_option(name, false, ERROR);
+ if (record == NULL)
+ return NULL;
+
+ switch (record->vartype)
+ {
+ case PGC_BOOL:
+ return *((struct config_bool *) record)->variable ? "on" : "off";
+
+ case PGC_INT:
+ snprintf(buffer, sizeof(buffer), "%d",
+ *((struct config_int *) record)->variable);
+ return buffer;
+
+ case PGC_REAL:
+ snprintf(buffer, sizeof(buffer), "%g",
+ *((struct config_real *) record)->variable);
+ return buffer;
+
+ case PGC_STRING:
+ return *((struct config_string *) record)->variable;
+
+ case PGC_ENUM:
+ return config_enum_lookup_by_value((struct config_enum *) record,
+ *((struct config_enum *) record)->variable);
+ }
+ return NULL;
+}
+
/*
* Get the RESET value associated with the given option.
*
extern void EmitWarningsOnPlaceholders(const char *className);
extern const char *GetConfigOption(const char *name, bool restrict_superuser);
+extern const char *GetConfigOptionNoError(const char *name);
extern const char *GetConfigOptionResetString(const char *name);
extern void ProcessConfigFile(GucContext context);
extern void InitializeGUCOptions(void);