From b3fc6727ce54a16ae9227bcccfebfa028ac5b16f Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Tue, 25 Nov 2014 18:24:07 +0200 Subject: [PATCH] Allow using connection URI in primary_conninfo. The old method of appending options to the connection string didn't work if the primary_conninfo was a postgres:// style URI, instead of a traditional connection string. Use PQconnectdbParams instead. Alex Shulgin --- .../libpqwalreceiver/libpqwalreceiver.c | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index 65e95c59f0..96e73fb6a4 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -89,18 +89,28 @@ _PG_init(void) static void libpqrcv_connect(char *conninfo) { - char conninfo_repl[MAXCONNINFO + 75]; + const char *keys[5]; + const char *vals[5]; /* - * Connect using deliberately undocumented parameter: replication. The - * database name is ignored by the server in replication mode, but specify - * "replication" for .pgpass lookup. + * We use the expand_dbname parameter to process the connection string + * (or URI), and pass some extra options. The deliberately undocumented + * parameter "replication=true" makes it a replication connection. + * The database name is ignored by the server in replication mode, but + * specify "replication" for .pgpass lookup. */ - snprintf(conninfo_repl, sizeof(conninfo_repl), - "%s dbname=replication replication=true fallback_application_name=walreceiver", - conninfo); - - streamConn = PQconnectdb(conninfo_repl); + keys[0] = "dbname"; + vals[0] = conninfo; + keys[1] = "replication"; + vals[1] = "true"; + keys[2] = "dbname"; + vals[2] = "replication"; + keys[3] = "fallback_application_name"; + vals[3] = "walreceiver"; + keys[4] = NULL; + vals[4] = NULL; + + streamConn = PQconnectdbParams(keys, vals, /* expand_dbname = */ true); if (PQstatus(streamConn) != CONNECTION_OK) ereport(ERROR, (errmsg("could not connect to the primary server: %s", -- 2.40.0