Make vacuumlo prompt for password when needed, thus making its -W
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 Dec 2007 02:08:59 +0000 (02:08 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 11 Dec 2007 02:08:59 +0000 (02:08 +0000)
switch optional, as is the case for every other one of our programs.
I had already documented its -W as being optional, so this is bringing
the code into line with the docs ...

contrib/vacuumlo/vacuumlo.c

index 763257267f8bb44bf58c25f6114c9e9a08aabdcd..5bfd378f8a04e0bbdbf5f33a8c5295c5518b850b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/contrib/vacuumlo/vacuumlo.c,v 1.33 2007/01/05 22:19:18 momjian Exp $
+ *   $PostgreSQL: pgsql/contrib/vacuumlo/vacuumlo.c,v 1.34 2007/12/11 02:08:59 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -61,32 +61,50 @@ vacuumlo(char *database, struct _param * param)
    int         matched;
    int         deleted;
    int         i;
-   char       *password = NULL;
+   static char *password = NULL;
+   bool        new_pass;
 
-   if (param->pg_prompt)
+   if (param->pg_prompt && password == NULL)
+       password = simple_prompt("Password: ", 100, false);
+
+   /*
+    * Start the connection.  Loop until we have a password if requested by
+    * backend.
+    */
+   do
    {
-       password = simple_prompt("Password: ", 32, 0);
-       if (!password)
+       new_pass = false;
+
+       conn = PQsetdbLogin(param->pg_host,
+                           param->pg_port,
+                           NULL,
+                           NULL,
+                           database,
+                           param->pg_user,
+                           password);
+       if (!conn)
        {
-           fprintf(stderr, "failed to get password\n");
-           exit(1);
+           fprintf(stderr, "Connection to database \"%s\" failed\n",
+                   database);
+           return -1;
        }
-   }
 
-   conn = PQsetdbLogin(param->pg_host,
-                       param->pg_port,
-                       NULL,
-                       NULL,
-                       database,
-                       param->pg_user,
-                       password
-       );
+       if (PQstatus(conn) == CONNECTION_BAD &&
+           PQconnectionNeedsPassword(conn) &&
+           password == NULL &&
+           !feof(stdin))
+       {
+           PQfinish(conn);
+           password = simple_prompt("Password: ", 100, false);
+           new_pass = true;
+       }
+   } while (new_pass);
 
    /* check to see that the backend connection was successfully made */
    if (PQstatus(conn) == CONNECTION_BAD)
    {
-       fprintf(stderr, "Connection to database '%s' failed:\n", database);
-       fprintf(stderr, "%s", PQerrorMessage(conn));
+       fprintf(stderr, "Connection to database \"%s\" failed:\n%s",
+               database, PQerrorMessage(conn));
        PQfinish(conn);
        return -1;
    }