diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c index 763257267f8bb44bf58c25f6114c9e9a08aabdcd..5bfd378f8a04e0bbdbf5f33a8c5295c5518b850b 100644 --- a/contrib/vacuumlo/vacuumlo.c +++ b/contrib/vacuumlo/vacuumlo.c @@ -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; }