"standby clone": ensure replication user is used when conninfo str provided

This commit is contained in:
Ian Barwick
2017-05-05 00:13:04 +09:00
parent c41ff2c442
commit 06b79f2263
3 changed files with 56 additions and 3 deletions

View File

@@ -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 */
/* ===================== */

View File

@@ -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);

View File

@@ -1100,8 +1100,22 @@ run_basebackup(void)
*/
if (runtime_options.conninfo_provided == true)
{
// XXX need to override user with runtime_options.replication_user!
appendPQExpBuffer(&params, " -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(&params, " -d '%s'", conninfo_str);
pfree(conninfo_str);
}
/*