Skip to content

Commit ee1b3a5

Browse files
committed
Handle dsn modification correctly
Fixes #59
1 parent 8b733a4 commit ee1b3a5

File tree

2 files changed

+34
-18
lines changed

2 files changed

+34
-18
lines changed

expected/init_fail.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ SELECT * FROM pglogical.create_subscription(
3030
forward_origins := '{}');
3131
ERROR: could not connect to the postgresql server: FATAL: role "nonexisting" does not exist
3232

33-
DETAIL: dsn was: dbname=regression user=nonexisting fallback_application_name='create_subscription'
33+
DETAIL: dsn was: dbname=regression user=nonexisting
3434
-- fail (remote node not existing)
3535
SELECT * FROM pglogical.create_subscription(
3636
subscription_name := 'test_subscription',
@@ -55,7 +55,7 @@ SELECT * FROM pglogical.create_subscription(
5555
forward_origins := '{}');
5656
ERROR: could not connect to the postgresql server in replication mode: FATAL: no pg_hba.conf entry for replication connection from host "[local]", user "nonreplica"
5757

58-
DETAIL: dsn was: dbname=regression user=nonreplica replication=database fallback_application_name='create_subscription'
58+
DETAIL: dsn was: dbname=regression user=nonreplica
5959
-- cleanup
6060
SELECT * FROM pglogical.drop_node('test_subscriber');
6161
drop_node

pglogical.c

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -134,20 +134,27 @@ PGconn *
134134
pglogical_connect(const char *connstring, const char *connname)
135135
{
136136
PGconn *conn;
137-
StringInfoData dsn;
137+
const char *keys[3];
138+
const char *vals[3];
138139

139-
initStringInfo(&dsn);
140-
appendStringInfo(&dsn,
141-
"%s fallback_application_name='%s'",
142-
connstring, connname);
143-
144-
conn = PQconnectdb(dsn.data);
140+
/*
141+
* We use the expand_dbname parameter to process the connection string
142+
* (or URI), and pass some extra options.
143+
*/
144+
keys[0] = "dbname";
145+
vals[0] = connstring;
146+
keys[1] = "fallback_application_name";
147+
vals[1] = connname;
148+
keys[2] = NULL;
149+
vals[2] = NULL;
150+
151+
conn = PQconnectdbParams(keys, vals, /* expand_dbname = */ true);
145152
if (PQstatus(conn) != CONNECTION_OK)
146153
{
147154
ereport(ERROR,
148155
(errmsg("could not connect to the postgresql server: %s",
149156
PQerrorMessage(conn)),
150-
errdetail("dsn was: %s", dsn.data)));
157+
errdetail("dsn was: %s", connstring)));
151158
}
152159

153160
return conn;
@@ -160,20 +167,29 @@ PGconn *
160167
pglogical_connect_replica(const char *connstring, const char *connname)
161168
{
162169
PGconn *conn;
163-
StringInfoData dsn;
170+
const char *keys[4];
171+
const char *vals[4];
164172

165-
initStringInfo(&dsn);
166-
appendStringInfo(&dsn,
167-
"%s replication=database fallback_application_name='%s'",
168-
connstring, connname);
169-
170-
conn = PQconnectdb(dsn.data);
173+
/*
174+
* We use the expand_dbname parameter to process the connection string
175+
* (or URI), and pass some extra options.
176+
*/
177+
keys[0] = "dbname";
178+
vals[0] = connstring;
179+
keys[1] = "replication";
180+
vals[1] = "database";
181+
keys[2] = "fallback_application_name";
182+
vals[2] = connname;
183+
keys[3] = NULL;
184+
vals[3] = NULL;
185+
186+
conn = PQconnectdbParams(keys, vals, /* expand_dbname = */ true);
171187
if (PQstatus(conn) != CONNECTION_OK)
172188
{
173189
ereport(ERROR,
174190
(errmsg("could not connect to the postgresql server in replication mode: %s",
175191
PQerrorMessage(conn)),
176-
errdetail("dsn was: %s", dsn.data)));
192+
errdetail("dsn was: %s", connstring)));
177193
}
178194

179195
return conn;

0 commit comments

Comments
 (0)