Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)
        {