From 68be86349b3089e21c8e7299ec7c5cb43a637461 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Tue, 6 Aug 2019 20:50:27 +0900 Subject: [PATCH] Add function to parse version string returned by "repmgr --version" --- repmgr.h | 1 + sysutils.c | 41 +++++++++++++++++++++++++++++++++++++++++ sysutils.h | 1 + 3 files changed, 43 insertions(+) diff --git a/repmgr.h b/repmgr.h index 23f3ec17..d99032af 100644 --- a/repmgr.h +++ b/repmgr.h @@ -51,6 +51,7 @@ #define UNKNOWN_SERVER_VERSION_NUM -1 #define UNKNOWN_BDR_VERSION_NUM -1 +#define UNKNOWN_REPMGR_VERSION_NUM -1 #define UNKNOWN_TIMELINE_ID -1 #define UNKNOWN_SYSTEM_IDENTIFIER 0 diff --git a/sysutils.c b/sysutils.c index 929cb08e..96772f53 100644 --- a/sysutils.c +++ b/sysutils.c @@ -364,3 +364,44 @@ enable_wal_receiver(PGconn *conn, bool wait_startup) return wal_receiver_pid; } + + +/** + * Parse the string returned by "repmgr --version", e.g. "repmgr 4.1.2", + * and return it as a version integer (e.g. 40102). + * + * This is required for backwards compatibility as versions prior to + * 4.3 do not have the --version-number option. + */ +int +parse_repmgr_version(const char *version_string) +{ + int series, major, minor; + int version_integer = UNKNOWN_REPMGR_VERSION_NUM; + PQExpBufferData sscanf_string; + + initPQExpBuffer(&sscanf_string); + + appendPQExpBuffer(&sscanf_string, "%s ", + progname()); + appendPQExpBufferStr(&sscanf_string, "%i.%i.%i"); + + if (sscanf(version_string, sscanf_string.data, &series, &major, &minor) == 3) + { + version_integer = (series * 10000) + (major * 100) + minor; + } + else + { + resetPQExpBuffer(&sscanf_string); + appendPQExpBuffer(&sscanf_string, "%s ", + progname()); + appendPQExpBufferStr(&sscanf_string, "%i.%i"); + + if (sscanf(version_string, "repmgr %i.%i", &series, &major) == 2) + { + version_integer = (series * 10000) + (major * 100); + } + } + + return version_integer; +} diff --git a/sysutils.h b/sysutils.h index 6c046920..cc358f67 100644 --- a/sysutils.h +++ b/sysutils.h @@ -28,5 +28,6 @@ extern bool remote_command(const char *host, const char *user, const char *comma extern pid_t disable_wal_receiver(PGconn *conn); extern pid_t enable_wal_receiver(PGconn *conn, bool wait_startup); +extern int parse_repmgr_version(const char *version_string); #endif /* _SYSUTILS_H_ */