From 52abe309df8365ebfbdaf4587c03892855da416a Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Thu, 17 Oct 2019 17:13:18 +0900 Subject: [PATCH] Add function is_replication_role() --- dbutils.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ dbutils.h | 3 ++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/dbutils.c b/dbutils.c index 555b32a7..fd61e511 100644 --- a/dbutils.c +++ b/dbutils.c @@ -354,6 +354,51 @@ is_superuser_connection(PGconn *conn, t_connection_user *userinfo) } +bool +is_replication_role(PGconn *conn, char *rolname) +{ + PQExpBufferData query; + PGresult *res; + bool is_replication_role = false; + + initPQExpBuffer(&query); + + appendPQExpBufferStr(&query, + " SELECT rolreplication " + " FROM pg_catalog.pg_authid " + " WHERE rolname = "); + + if (rolname != NULL) + { + appendPQExpBuffer(&query, + "'%s'", + rolname); + } + else + { + appendPQExpBufferStr(&query, + "CURRENT_USER"); + } + + res = PQexec(conn, query.data); + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + log_db_error(conn, query.data, + _("is_replication_role(): unable to query user roles")); + } + else + { + is_replication_role = atobool(PQgetvalue(res, 0, 0)); + } + + termPQExpBuffer(&query); + PQclear(res); + + return is_replication_role; +} + + bool connection_has_pg_settings(PGconn *conn) { diff --git a/dbutils.h b/dbutils.h index 19e30ced..2790ccf9 100644 --- a/dbutils.h +++ b/dbutils.h @@ -437,7 +437,8 @@ PGconn *establish_primary_db_connection(PGconn *conn, PGconn *get_primary_connection(PGconn *standby_conn, int *primary_id, char *primary_conninfo_out); PGconn *get_primary_connection_quiet(PGconn *standby_conn, int *primary_id, char *primary_conninfo_out); -bool is_superuser_connection(PGconn *conn, t_connection_user *userinfo); +bool is_superuser_connection(PGconn *conn, t_connection_user *userinfo);\ +bool is_replication_role(PGconn *conn, char *rolname); bool connection_has_pg_settings(PGconn *conn); void close_connection(PGconn **conn);