From 2e9bc31c8cc2c8fec427839ce28fd70d5fa167b5 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Wed, 25 Mar 2020 11:01:41 +0900 Subject: [PATCH] Consolidate code for establishing a superuser connection --- dbutils.c | 40 ++++++++++++++++++++++++++++++++++++ dbutils.h | 4 ++++ repmgr-action-node.c | 48 +++++++++++++++++--------------------------- 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/dbutils.c b/dbutils.c index ded07784..b01481cb 100644 --- a/dbutils.c +++ b/dbutils.c @@ -236,6 +236,46 @@ establish_db_connection_quiet(const char *conninfo) } +PGconn * +establish_db_connection_with_replacement_param(const char *conninfo, + const char *param, + const char *value, + const bool exit_on_error) +{ + t_conninfo_param_list node_conninfo = T_CONNINFO_PARAM_LIST_INITIALIZER; + char *errmsg = NULL; + bool parse_success = false; + PGconn *conn = NULL; + + initialize_conninfo_params(&node_conninfo, false); + + parse_success = parse_conninfo_string(conninfo, + &node_conninfo, + &errmsg, false); + + if (parse_success == false) + { + log_error(_("unable to parse conninfo string \"%s\" for local node"), + conninfo); + log_detail("%s", errmsg); + + if (exit_on_error == true) + exit(ERR_BAD_CONFIG); + + return NULL; + } + + param_set(&node_conninfo, + param, + value); + + conn = establish_db_connection_by_params(&node_conninfo, exit_on_error); + + free_conninfo_params(&node_conninfo); + + return conn; +} + PGconn * establish_primary_db_connection(PGconn *conn, const bool exit_on_error) diff --git a/dbutils.h b/dbutils.h index 4923252b..a5459146 100644 --- a/dbutils.h +++ b/dbutils.h @@ -388,6 +388,10 @@ PGconn *establish_db_connection(const char *conninfo, PGconn *establish_db_connection_quiet(const char *conninfo); PGconn *establish_db_connection_by_params(t_conninfo_param_list *param_list, const bool exit_on_error); +PGconn *establish_db_connection_with_replacement_param(const char *conninfo, + const char *param, + const char *value, + const bool exit_on_error); PGconn *establish_replication_connection_from_conn(PGconn *conn, const char *repluser); PGconn *establish_replication_connection_from_conninfo(const char *conninfo, const char *repluser); diff --git a/repmgr-action-node.c b/repmgr-action-node.c index 56e3e64a..f19278e2 100644 --- a/repmgr-action-node.c +++ b/repmgr-action-node.c @@ -744,12 +744,16 @@ do_node_check(void) if (runtime_options.superuser[0] != '\0') { - param_set(&node_conninfo, - "user", - runtime_options.superuser); + conn = establish_db_connection_with_replacement_param( + config_file_options.conninfo, + "user", + runtime_options.superuser, + true); + } + else + { + conn = establish_db_connection_by_params(&node_conninfo, true); } - - conn = establish_db_connection_by_params(&node_conninfo, true); } else { @@ -2030,37 +2034,21 @@ do_node_service(void) if (config_file_options.conninfo[0] != '\0') { - t_conninfo_param_list node_conninfo = T_CONNINFO_PARAM_LIST_INITIALIZER; - char *errmsg = NULL; - bool parse_success = false; - - initialize_conninfo_params(&node_conninfo, false); - - parse_success = parse_conninfo_string(config_file_options.conninfo, - &node_conninfo, - &errmsg, false); - - if (parse_success == false) - { - log_error(_("unable to parse conninfo string \"%s\" for local node"), - config_file_options.conninfo); - log_detail("%s", errmsg); - - exit(ERR_BAD_CONFIG); - } - /* * If --superuser option provided, attempt to connect as the specified user */ - if (runtime_options.superuser[0] != '\0') { - param_set(&node_conninfo, - "user", - runtime_options.superuser); + conn = establish_db_connection_with_replacement_param( + config_file_options.conninfo, + "user", + runtime_options.superuser, + true); + } + else + { + conn = establish_db_connection(config_file_options.conninfo, true); } - - conn = establish_db_connection_by_params(&node_conninfo, true); } else {