From 06b79f2263e60198d3f6a193a3e9011c4b195bdc Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 5 May 2017 00:13:04 +0900 Subject: [PATCH] "standby clone": ensure replication user is used when conninfo str provided --- dbutils.c | 40 +++++++++++++++++++++++++++++++++++++++- dbutils.h | 1 + repmgr-action-standby.c | 18 ++++++++++++++++-- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/dbutils.c b/dbutils.c index 50560b36..4dc7050d 100644 --- a/dbutils.c +++ b/dbutils.c @@ -424,7 +424,7 @@ conn_to_param_list(PGconn *conn, t_conninfo_param_list *param_list) connOptions = PQconninfo(conn); for (option = connOptions; option && option->keyword; option++) { - /* Ignore non-set or blank parameter values*/ + /* Ignore non-set or blank parameter values */ if ((option->val == NULL) || (option->val != NULL && option->val[0] == '\0')) continue; @@ -434,6 +434,44 @@ conn_to_param_list(PGconn *conn, t_conninfo_param_list *param_list) } +/* + * Converts param list to string; caller must free returned pointer + */ +char * +param_list_to_string(t_conninfo_param_list *param_list) +{ + int c; + PQExpBufferData conninfo_buf; + char *conninfo_str; + int len; + + initPQExpBuffer(&conninfo_buf); + + for (c = 0; c < param_list->size && param_list->keywords[c] != NULL; c++) + { + if (param_list->values[c] != NULL && param_list->values[c][0] != '\0') + { + if (c > 0) + appendPQExpBufferChar(&conninfo_buf, ' '); + + appendPQExpBuffer(&conninfo_buf, + "%s=%s", + param_list->keywords[c], + param_list->values[c]); + } + } + + len = strlen(conninfo_buf.data) + 1; + conninfo_str = pg_malloc0(len); + + strncpy(conninfo_str, conninfo_buf.data, len); + + termPQExpBuffer(&conninfo_buf); + + return conninfo_str; +} + + /* ===================== */ /* transaction functions */ /* ===================== */ diff --git a/dbutils.h b/dbutils.h index e4aa6602..c339a0ed 100644 --- a/dbutils.h +++ b/dbutils.h @@ -143,6 +143,7 @@ void conn_to_param_list(PGconn *conn, t_conninfo_param_list *param_list); void param_set(t_conninfo_param_list *param_list, const char *param, const char *value); char *param_get(t_conninfo_param_list *param_list, const char *param); bool parse_conninfo_string(const char *conninfo_str, t_conninfo_param_list *param_list, char *errmsg, bool ignore_application_name); +char *param_list_to_string(t_conninfo_param_list *param_list); /* transaction functions */ bool begin_transaction(PGconn *conn); diff --git a/repmgr-action-standby.c b/repmgr-action-standby.c index 3fe6ae9b..430aaaee 100644 --- a/repmgr-action-standby.c +++ b/repmgr-action-standby.c @@ -1100,8 +1100,22 @@ run_basebackup(void) */ if (runtime_options.conninfo_provided == true) { - // XXX need to override user with runtime_options.replication_user! - appendPQExpBuffer(¶ms, " -d '%s'", runtime_options.dbname); + t_conninfo_param_list conninfo; + char *conninfo_str; + + initialize_conninfo_params(&conninfo, false); + + /* string will already have been parsed */ + (void) parse_conninfo_string(runtime_options.dbname, &conninfo, NULL, false); + + if (*runtime_options.replication_user) + param_set(&conninfo, "user", runtime_options.replication_user); + + conninfo_str = param_list_to_string(&conninfo); + + appendPQExpBuffer(¶ms, " -d '%s'", conninfo_str); + + pfree(conninfo_str); } /*