1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-19 13:42:17 +03:00

pg_rewind: Add dbname to primary_conninfo when using --write-recovery-conf.

This commit enhances pg_rewind's --write-recovery-conf option to
include the dbname in the generated primary_conninfo value when
specified in the --source-server option. With this modification, the
rewound server can connect to the primary server without manual
configuration file modifications when sync_replication_slots is
enabled.

Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com>
Reviewed-by: Peter Smith <smithpb2250@gmail.com>
Discussion: https://postgr.es/m/CAD21AoAkW=Ht0k9dVoBTCcqLiiZ2MXhVr+d=j2T_EZMerGrLWQ@mail.gmail.com
This commit is contained in:
Masahiko Sawada
2025-03-12 16:56:04 -07:00
parent cdc1471cc7
commit 4ecdd4110d
8 changed files with 81 additions and 76 deletions

View File

@@ -14,6 +14,7 @@
#include "fe_utils/string_utils.h"
static char *escape_quotes(const char *src);
static char *FindDbnameInConnOpts(PQconninfoOption *conn_opts);
/*
* Write recovery configuration contents into a fresh PQExpBuffer, and
@@ -168,3 +169,68 @@ escape_quotes(const char *src)
pg_fatal("out of memory");
return result;
}
/*
* FindDbnameInConnOpts
*
* This is a helper function for GetDbnameFromConnectionOptions(). Extract
* the value of dbname from PQconninfoOption parameters, if it's present.
* Returns a strdup'd result or NULL.
*/
static char *
FindDbnameInConnOpts(PQconninfoOption *conn_opts)
{
for (PQconninfoOption *conn_opt = conn_opts;
conn_opt->keyword != NULL;
conn_opt++)
{
if (strcmp(conn_opt->keyword, "dbname") == 0 &&
conn_opt->val != NULL && conn_opt->val[0] != '\0')
return pg_strdup(conn_opt->val);
}
return NULL;
}
/*
* GetDbnameFromConnectionOptions
*
* This is a special purpose function to retrieve the dbname from either the
* 'connstr' specified by the caller or from the environment variables.
*
* Returns NULL, if dbname is not specified by the user in the given
* connection options.
*/
char *
GetDbnameFromConnectionOptions(const char *connstr)
{
PQconninfoOption *conn_opts;
char *err_msg = NULL;
char *dbname;
/* First try to get the dbname from connection string. */
if (connstr)
{
conn_opts = PQconninfoParse(connstr, &err_msg);
if (conn_opts == NULL)
pg_fatal("%s", err_msg);
dbname = FindDbnameInConnOpts(conn_opts);
PQconninfoFree(conn_opts);
if (dbname)
return dbname;
}
/*
* Next try to get the dbname from default values that are available from
* the environment.
*/
conn_opts = PQconndefaults();
if (conn_opts == NULL)
pg_fatal("out of memory");
dbname = FindDbnameInConnOpts(conn_opts);
PQconninfoFree(conn_opts);
return dbname;
}