v11-0002-introduce-routine-for-checking-mutually-exclusiv.patch
text/x-diff
Filename: v11-0002-introduce-routine-for-checking-mutually-exclusiv.patch
Type: text/x-diff
Part: 1
Message:
Re: recovery modules
Patch
Format: format-patch
Series: patch v11-0002
Subject: introduce routine for checking mutually exclusive parameters
| File | + | − |
|---|---|---|
| src/backend/postmaster/pgarch.c | 2 | 5 |
| src/backend/utils/misc/guc.c | 18 | 0 |
| src/include/utils/guc.h | 2 | 0 |
From f6caa58074a6dd66c57f2e8a1ff36e9fbe6530b9 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Wed, 25 Jan 2023 15:54:35 +0900
Subject: [PATCH v11 2/3] introduce routine for checking mutually exclusive
parameters
---
src/include/utils/guc.h | 2 ++
src/backend/postmaster/pgarch.c | 7 ++-----
src/backend/utils/misc/guc.c | 18 ++++++++++++++++++
3 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index ba89d013e6..d7785785c2 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -372,6 +372,8 @@ extern int NewGUCNestLevel(void);
extern void AtEOXact_GUC(bool isCommit, int nestLevel);
extern void BeginReportingGUCOptions(void);
extern void ReportChangedGUCOptions(void);
+extern void CheckMutuallyExclusiveGUCs(const char *p1val, const char *p1name,
+ const char *p2val, const char *p2name);
extern void ParseLongOption(const char *string, char **name, char **value);
extern const char *get_config_unit_name(int flags);
extern bool parse_int(const char *value, int *result, int flags,
diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c
index 8ecdb9ca23..8e91f2d70f 100644
--- a/src/backend/postmaster/pgarch.c
+++ b/src/backend/postmaster/pgarch.c
@@ -831,11 +831,8 @@ LoadArchiveLibrary(void)
{
ArchiveModuleInit archive_init;
- if (XLogArchiveLibrary[0] != '\0' && XLogArchiveCommand[0] != '\0')
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("both archive_command and archive_library set"),
- errdetail("Only one of archive_command, archive_library may be set.")));
+ CheckMutuallyExclusiveGUCs(XLogArchiveLibrary, "archive_library",
+ XLogArchiveCommand, "archive_command");
memset(&ArchiveContext, 0, sizeof(ArchiveModuleCallbacks));
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index d52069f446..e63515d624 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -2558,6 +2558,24 @@ ReportChangedGUCOptions(void)
}
}
+/*
+ * Check if two GUCs are mutually set. Works only when comparing two
+ * string GUCs.
+ *
+ * ERROR if both parameters are set.
+ */
+void
+CheckMutuallyExclusiveGUCs(const char *p1val, const char *p1name,
+ const char *p2val, const char *p2name)
+{
+ if (p1val[0] != '\0' && p2val[0] != '\0')
+ ereport(ERROR,
+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("cannot set both %s and %s", p1name, p2name),
+ errdetail("Only one of %s or %s may be set.",
+ p1name, p2name)));
+}
+
/*
* ReportGUCOption: if appropriate, transmit option value to frontend
*
--
2.39.0