]> granicus.if.org Git - postgresql/commitdiff
Fix pg_isready to handle -d option properly.
authorFujii Masao <fujii@postgresql.org>
Thu, 21 Nov 2013 12:52:03 +0000 (21:52 +0900)
committerFujii Masao <fujii@postgresql.org>
Thu, 21 Nov 2013 12:52:03 +0000 (21:52 +0900)
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.

src/bin/scripts/pg_isready.c

index d27ccea70fbf3626eb4ff3440f6595e0b79c53d8..33b9ff7ffe166f6f8641c546be2eb71957a2cde4 100644 (file)
@@ -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)
                {