diff options
author | Fujii Masao <fujii@postgresql.org> | 2013-11-21 21:52:03 +0900 |
---|---|---|
committer | Fujii Masao <fujii@postgresql.org> | 2013-11-21 21:52:03 +0900 |
commit | 38f432898131270e5b64245786cb67f322538bae (patch) | |
tree | b5dd8c5d96c832b9af432f17e74f2f02c69da9e4 | |
parent | 04eee1fa9ee80dabf7cf4b8b9106897272e9b291 (diff) | |
download | postgresql-38f432898131270e5b64245786cb67f322538bae.tar.gz postgresql-38f432898131270e5b64245786cb67f322538bae.zip |
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.
-rw-r--r-- | src/bin/scripts/pg_isready.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/bin/scripts/pg_isready.c b/src/bin/scripts/pg_isready.c index d27ccea70fb..33b9ff7ffe1 100644 --- a/src/bin/scripts/pg_isready.c +++ b/src/bin/scripts/pg_isready.c @@ -31,6 +31,7 @@ main(int argc, char **argv) const char *connect_timeout = DEFAULT_CONNECT_TIMEOUT; const char *pghost_str = NULL; + const char *pghostaddr_str = NULL; const char *pgport_str = NULL; #define PARAMS_ARRAY_SIZE 7 @@ -130,7 +131,10 @@ main(int argc, char **argv) /* * 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); if (opts == NULL) @@ -149,8 +153,7 @@ main(int argc, char **argv) for (opt = opts, def = defs; def->keyword; def++) { - if (strcmp(def->keyword, "hostaddr") == 0 || - strcmp(def->keyword, "host") == 0) + if (strcmp(def->keyword, "host") == 0) { if (opt && opt->val) pghost_str = opt->val; @@ -161,6 +164,13 @@ main(int argc, char **argv) else 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) { if (opt && opt->val) @@ -179,7 +189,9 @@ main(int argc, char **argv) if (!quiet) { - printf("%s:%s - ", pghost_str, pgport_str); + printf("%s:%s - ", + pghostaddr_str != NULL ? pghostaddr_str : pghost_str, + pgport_str); switch (rv) { |