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.
This commit is contained in:
Ian Barwick
2018-04-13 17:40:49 +09:00
committed by Ian Barwick
parent 029ba46470
commit 4f642f8332
2 changed files with 16 additions and 3 deletions

View File

@@ -33,6 +33,12 @@
/* mainly for use by repmgrd */ /* mainly for use by repmgrd */
int server_version_num = UNKNOWN_SERVER_VERSION_NUM; 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, static PGconn *_establish_db_connection(const char *conninfo,
const bool exit_on_error, const bool exit_on_error,
@@ -4321,7 +4327,9 @@ _is_bdr_db(PGconn *conn, PQExpBufferData *output, bool quiet)
initPQExpBuffer(&query); initPQExpBuffer(&query);
appendPQExpBuffer(&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); res = PQexec(conn, query.data);
termPQExpBuffer(&query); termPQExpBuffer(&query);
@@ -4329,10 +4337,12 @@ _is_bdr_db(PGconn *conn, PQExpBufferData *output, bool quiet)
if (PQresultStatus(res) != PGRES_TUPLES_OK || PQntuples(res) == 0) if (PQresultStatus(res) != PGRES_TUPLES_OK || PQntuples(res) == 0)
{ {
is_bdr_db = false; is_bdr_db = false;
bdr_version_num = UNKNOWN_BDR_VERSION_NUM;
} }
else 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); PQclear(res);
@@ -4373,12 +4383,14 @@ _is_bdr_db(PGconn *conn, PQExpBufferData *output, bool quiet)
return is_bdr_db; return is_bdr_db;
} }
bool bool
is_bdr_db(PGconn *conn, PQExpBufferData *output) is_bdr_db(PGconn *conn, PQExpBufferData *output)
{ {
return _is_bdr_db(conn, output, false); return _is_bdr_db(conn, output, false);
} }
bool bool
is_bdr_db_quiet(PGconn *conn) is_bdr_db_quiet(PGconn *conn)
{ {
@@ -4386,7 +4398,6 @@ is_bdr_db_quiet(PGconn *conn)
} }
bool bool
is_active_bdr_node(PGconn *conn, const char *node_name) is_active_bdr_node(PGconn *conn, const char *node_name)
{ {

View File

@@ -49,6 +49,8 @@
#define REPLICATION_TYPE_BDR 2 #define REPLICATION_TYPE_BDR 2
#define UNKNOWN_SERVER_VERSION_NUM -1 #define UNKNOWN_SERVER_VERSION_NUM -1
#define UNKNOWN_BDR_VERSION_NUM -1
#define UNKNOWN_TIMELINE_ID -1 #define UNKNOWN_TIMELINE_ID -1
#define UNKNOWN_SYSTEM_IDENTIFIER 0 #define UNKNOWN_SYSTEM_IDENTIFIER 0