* Written by Peter Eisentraut <peter_e@gmx.net>.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.485 2009/01/02 01:16:02 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.486 2009/01/02 02:02:10 tgl Exp $
*
*--------------------------------------------------------------------
*/
#ifdef EXEC_BACKEND
/*
- * This routine dumps out all non-default GUC options into a binary
+ * These routines dump out all non-default GUC options into a binary
* file that is read by all exec'ed backends. The format is:
*
* variable name, string, null terminated
* variable value, string, null terminated
* variable source, integer
*/
+static void
+write_one_nondefault_variable(FILE *fp, struct config_generic *gconf)
+{
+ if (gconf->source == PGC_S_DEFAULT)
+ return;
+
+ fprintf(fp, "%s", gconf->name);
+ fputc(0, fp);
+
+ switch (gconf->vartype)
+ {
+ case PGC_BOOL:
+ {
+ struct config_bool *conf = (struct config_bool *) gconf;
+
+ if (*conf->variable)
+ fprintf(fp, "true");
+ else
+ fprintf(fp, "false");
+ }
+ break;
+
+ case PGC_INT:
+ {
+ struct config_int *conf = (struct config_int *) gconf;
+
+ fprintf(fp, "%d", *conf->variable);
+ }
+ break;
+
+ case PGC_REAL:
+ {
+ struct config_real *conf = (struct config_real *) gconf;
+
+ /* Could lose precision here? */
+ fprintf(fp, "%f", *conf->variable);
+ }
+ break;
+
+ case PGC_STRING:
+ {
+ struct config_string *conf = (struct config_string *) gconf;
+
+ fprintf(fp, "%s", *conf->variable);
+ }
+ break;
+
+ case PGC_ENUM:
+ {
+ struct config_enum *conf = (struct config_enum *) gconf;
+
+ fprintf(fp, "%s",
+ config_enum_lookup_by_value(conf, *conf->variable));
+ }
+ break;
+ }
+
+ fputc(0, fp);
+
+ fwrite(&gconf->source, sizeof(gconf->source), 1, fp);
+}
+
void
write_nondefault_variables(GucContext context)
{
- int i;
int elevel;
FILE *fp;
+ struct config_generic *cvc_conf;
+ int i;
Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);
return;
}
+ /*
+ * custom_variable_classes must be written out first; otherwise we might
+ * reject custom variable values while reading the file.
+ */
+ cvc_conf = find_option("custom_variable_classes", false, ERROR);
+ if (cvc_conf)
+ write_one_nondefault_variable(fp, cvc_conf);
+
for (i = 0; i < num_guc_variables; i++)
{
struct config_generic *gconf = guc_variables[i];
- if (gconf->source != PGC_S_DEFAULT)
- {
- fprintf(fp, "%s", gconf->name);
- fputc(0, fp);
-
- switch (gconf->vartype)
- {
- case PGC_BOOL:
- {
- struct config_bool *conf = (struct config_bool *) gconf;
-
- if (*conf->variable == 0)
- fprintf(fp, "false");
- else
- fprintf(fp, "true");
- }
- break;
-
- case PGC_INT:
- {
- struct config_int *conf = (struct config_int *) gconf;
-
- fprintf(fp, "%d", *conf->variable);
- }
- break;
-
- case PGC_REAL:
- {
- struct config_real *conf = (struct config_real *) gconf;
-
- /* Could lose precision here? */
- fprintf(fp, "%f", *conf->variable);
- }
- break;
-
- case PGC_STRING:
- {
- struct config_string *conf = (struct config_string *) gconf;
-
- fprintf(fp, "%s", *conf->variable);
- }
- break;
-
- case PGC_ENUM:
- {
- struct config_enum *conf = (struct config_enum *) gconf;
-
- fprintf(fp, "%s", config_enum_lookup_by_value(conf, *conf->variable));
- }
- break;
- }
-
- fputc(0, fp);
-
- fwrite(&gconf->source, sizeof(gconf->source), 1, fp);
- }
+ if (gconf != cvc_conf)
+ write_one_nondefault_variable(fp, gconf);
}
if (FreeFile(fp))