]> granicus.if.org Git - postgresql/commitdiff
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;
        }