From 4f642f83325cf2966840860252f4556afda61507 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 13 Apr 2018 17:40:49 +0900 Subject: [PATCH] Detect and store BDR major version number when executing "is_bdr_db()" BDR3 metadata structure is very different to BDR1/2, so we'll need to generate queries according to version. --- dbutils.c | 17 ++++++++++++++--- repmgr.h | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/dbutils.c b/dbutils.c index c1a3c8f8..f186cc5f 100644 --- a/dbutils.c +++ b/dbutils.c @@ -33,6 +33,12 @@ /* mainly for use by repmgrd */ int server_version_num = UNKNOWN_SERVER_VERSION_NUM; +/* + * This is set by is_bdr_db(), which is called by every BDR-related + * action anyway; this is required to be able to generate appropriate + * queries for versions 2 and 3. + */ +int bdr_version_num = UNKNOWN_BDR_VERSION_NUM; static PGconn *_establish_db_connection(const char *conninfo, const bool exit_on_error, @@ -4321,7 +4327,9 @@ _is_bdr_db(PGconn *conn, PQExpBufferData *output, bool quiet) initPQExpBuffer(&query); appendPQExpBuffer(&query, - "SELECT pg_catalog.count(*) FROM pg_catalog.pg_extension WHERE extname='bdr'"); + " SELECT (pg_catalog.regexp_match(extversion, '^\\d+'))[1] AS major_version " + " FROM pg_catalog.pg_extension " + " WHERE extname = 'bdr' "); res = PQexec(conn, query.data); termPQExpBuffer(&query); @@ -4329,10 +4337,12 @@ _is_bdr_db(PGconn *conn, PQExpBufferData *output, bool quiet) if (PQresultStatus(res) != PGRES_TUPLES_OK || PQntuples(res) == 0) { is_bdr_db = false; + bdr_version_num = UNKNOWN_BDR_VERSION_NUM; } else { - is_bdr_db = atoi(PQgetvalue(res, 0, 0)) == 1 ? true : false; + is_bdr_db = true; + bdr_version_num = atoi(PQgetvalue(res, 0, 0)); } PQclear(res); @@ -4373,12 +4383,14 @@ _is_bdr_db(PGconn *conn, PQExpBufferData *output, bool quiet) return is_bdr_db; } + bool is_bdr_db(PGconn *conn, PQExpBufferData *output) { return _is_bdr_db(conn, output, false); } + bool is_bdr_db_quiet(PGconn *conn) { @@ -4386,7 +4398,6 @@ is_bdr_db_quiet(PGconn *conn) } - bool is_active_bdr_node(PGconn *conn, const char *node_name) { diff --git a/repmgr.h b/repmgr.h index 392139d6..ac5bacfb 100644 --- a/repmgr.h +++ b/repmgr.h @@ -49,6 +49,8 @@ #define REPLICATION_TYPE_BDR 2 #define UNKNOWN_SERVER_VERSION_NUM -1 +#define UNKNOWN_BDR_VERSION_NUM -1 + #define UNKNOWN_TIMELINE_ID -1 #define UNKNOWN_SYSTEM_IDENTIFIER 0