Commit 38f43289 authored by Fujii Masao's avatar Fujii Masao

Fix pg_isready to handle -d option properly.

Previously, -d option for pg_isready was broken. When the name of the
database was specified by -d option, pg_isready failed with an error.
When the conninfo specified by -d option contained the setting of the
host name but not Numeric IP address (i.e., hostaddr), pg_isready
displayed wrong connection message. -d option could not handle a valid
URI prefix at all. This commit fixes these bugs of pg_isready.

Backpatch to 9.3, where pg_isready was introduced.

Per report from Josh Berkus and Robert Haas.
Original patch by Fabrízio de Royes Mello, heavily modified by me.
parent 04eee1fa
...@@ -31,6 +31,7 @@ main(int argc, char **argv) ...@@ -31,6 +31,7 @@ main(int argc, char **argv)
const char *connect_timeout = DEFAULT_CONNECT_TIMEOUT; const char *connect_timeout = DEFAULT_CONNECT_TIMEOUT;
const char *pghost_str = NULL; const char *pghost_str = NULL;
const char *pghostaddr_str = NULL;
const char *pgport_str = NULL; const char *pgport_str = NULL;
#define PARAMS_ARRAY_SIZE 7 #define PARAMS_ARRAY_SIZE 7
...@@ -130,7 +131,10 @@ main(int argc, char **argv) ...@@ -130,7 +131,10 @@ main(int argc, char **argv)
/* /*
* Get the host and port so we can display them in our output * Get the host and port so we can display them in our output
*/ */
if (pgdbname) if (pgdbname &&
(strncmp(pgdbname, "postgresql://", 13) == 0 ||
strncmp(pgdbname, "postgres://", 11) == 0 ||
strchr(pgdbname, '=') != NULL))
{ {
opts = PQconninfoParse(pgdbname, &errmsg); opts = PQconninfoParse(pgdbname, &errmsg);
if (opts == NULL) if (opts == NULL)
...@@ -149,8 +153,7 @@ main(int argc, char **argv) ...@@ -149,8 +153,7 @@ main(int argc, char **argv)
for (opt = opts, def = defs; def->keyword; def++) for (opt = opts, def = defs; def->keyword; def++)
{ {
if (strcmp(def->keyword, "hostaddr") == 0 || if (strcmp(def->keyword, "host") == 0)
strcmp(def->keyword, "host") == 0)
{ {
if (opt && opt->val) if (opt && opt->val)
pghost_str = opt->val; pghost_str = opt->val;
...@@ -161,6 +164,13 @@ main(int argc, char **argv) ...@@ -161,6 +164,13 @@ main(int argc, char **argv)
else else
pghost_str = DEFAULT_PGSOCKET_DIR; pghost_str = DEFAULT_PGSOCKET_DIR;
} }
else if (strcmp(def->keyword, "hostaddr") == 0)
{
if (opt && opt->val)
pghostaddr_str = opt->val;
else if (def->val)
pghostaddr_str = def->val;
}
else if (strcmp(def->keyword, "port") == 0) else if (strcmp(def->keyword, "port") == 0)
{ {
if (opt && opt->val) if (opt && opt->val)
...@@ -179,7 +189,9 @@ main(int argc, char **argv) ...@@ -179,7 +189,9 @@ main(int argc, char **argv)
if (!quiet) if (!quiet)
{ {
printf("%s:%s - ", pghost_str, pgport_str); printf("%s:%s - ",
pghostaddr_str != NULL ? pghostaddr_str : pghost_str,
pgport_str);
switch (rv) switch (rv)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment