include-exists-v2.patch
text/x-patch
Filename: include-exists-v2.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| doc/src/sgml/config.sgml | 0 | 0 |
| src/backend/utils/misc/guc-file.l | 0 | 0 |
| src/include/utils/guc.h | 0 | 0 |
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index d1e628f..0cc3296 100644
*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
*************** include 'filename'
*** 91,96 ****
--- 91,108 ----
<para>
<indexterm>
+ <primary><literal>include_if_exists</></primary>
+ <secondary>in configuration file</secondary>
+ </indexterm>
+ Use the same approach as the <literal>include</> directive, continuing
+ normally if the file does not exist. A regular <literal>include</>
+ will stop with an error if the referenced file is missing, while
+ <literal>include_if_exists</> does not. A warning about the missing
+ file will be logged.
+ </para>
+
+ <para>
+ <indexterm>
<primary>SIGHUP</primary>
</indexterm>
The configuration file is reread whenever the main server process receives a
diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l
index a094c7a..6ba130c 100644
*** a/src/backend/utils/misc/guc-file.l
--- b/src/backend/utils/misc/guc-file.l
*************** ProcessConfigFile(GucContext context)
*** 129,135 ****
/* Parse the file into a list of option names and values */
head = tail = NULL;
! if (!ParseConfigFile(ConfigFileName, NULL, 0, elevel, &head, &tail))
{
/* Syntax error(s) detected in the file, so bail out */
error = true;
--- 129,135 ----
/* Parse the file into a list of option names and values */
head = tail = NULL;
! if (!ParseConfigFile(ConfigFileName, NULL, true, 0, elevel, &head, &tail))
{
/* Syntax error(s) detected in the file, so bail out */
error = true;
*************** ProcessConfigFile(GucContext context)
*** 363,369 ****
* and absolute-ifying the path name if necessary.
*/
bool
! ParseConfigFile(const char *config_file, const char *calling_file,
int depth, int elevel,
ConfigVariable **head_p,
ConfigVariable **tail_p)
--- 363,369 ----
* and absolute-ifying the path name if necessary.
*/
bool
! ParseConfigFile(const char *config_file, const char *calling_file, bool strict,
int depth, int elevel,
ConfigVariable **head_p,
ConfigVariable **tail_p)
*************** ParseConfigFile(const char *config_file,
*** 414,424 ****
fp = AllocateFile(config_file, "r");
if (!fp)
{
! ereport(elevel,
! (errcode_for_file_access(),
! errmsg("could not open configuration file \"%s\": %m",
! config_file)));
! return false;
}
OK = ParseConfigFp(fp, config_file, depth, elevel, head_p, tail_p);
--- 414,430 ----
fp = AllocateFile(config_file, "r");
if (!fp)
{
! if (strict)
! {
! ereport(elevel,
! (errcode_for_file_access(),
! errmsg("could not open configuration file \"%s\": %m",
! config_file)));
! return false;
! }
!
! elog(LOG, "skipping missing configuration file \"%s\"", config_file);
! return OK;
}
OK = ParseConfigFp(fp, config_file, depth, elevel, head_p, tail_p);
*************** ParseConfigFp(FILE *fp, const char *conf
*** 512,518 ****
}
/* OK, process the option name and value */
! if (guc_name_compare(opt_name, "include") == 0)
{
/*
* An include directive isn't a variable and should be processed
--- 518,541 ----
}
/* OK, process the option name and value */
! if (guc_name_compare(opt_name, "include_if_exists") == 0)
! {
! /*
! * An include_if_exists directive isn't a variable and should be
! * processed immediately.
! */
! unsigned int save_ConfigFileLineno = ConfigFileLineno;
!
! if (!ParseConfigFile(opt_value, config_file, false,
! depth + 1, elevel,
! head_p, tail_p))
! OK = false;
! yy_switch_to_buffer(lex_buffer);
! ConfigFileLineno = save_ConfigFileLineno;
! pfree(opt_name);
! pfree(opt_value);
! }
! else if (guc_name_compare(opt_name, "include") == 0)
{
/*
* An include directive isn't a variable and should be processed
*************** ParseConfigFp(FILE *fp, const char *conf
*** 520,526 ****
*/
unsigned int save_ConfigFileLineno = ConfigFileLineno;
! if (!ParseConfigFile(opt_value, config_file,
depth + 1, elevel,
head_p, tail_p))
OK = false;
--- 543,549 ----
*/
unsigned int save_ConfigFileLineno = ConfigFileLineno;
! if (!ParseConfigFile(opt_value, config_file, true,
depth + 1, elevel,
head_p, tail_p))
OK = false;
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 8e3057a..52109e5 100644
*** a/src/include/utils/guc.h
--- b/src/include/utils/guc.h
*************** typedef struct ConfigVariable
*** 111,117 ****
} ConfigVariable;
extern bool ParseConfigFile(const char *config_file, const char *calling_file,
! int depth, int elevel,
ConfigVariable **head_p, ConfigVariable **tail_p);
extern bool ParseConfigFp(FILE *fp, const char *config_file,
int depth, int elevel,
--- 111,117 ----
} ConfigVariable;
extern bool ParseConfigFile(const char *config_file, const char *calling_file,
! bool strict, int depth, int elevel,
ConfigVariable **head_p, ConfigVariable **tail_p);
extern bool ParseConfigFp(FILE *fp, const char *config_file,
int depth, int elevel,