From 5eb56611e3053c2d64f04eb9932a67d314647ecc Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 11 Dec 2007 02:08:59 +0000 Subject: [PATCH] Make vacuumlo prompt for password when needed, thus making its -W 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 | 54 ++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c index 763257267f..5bfd378f8a 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; } -- 2.40.0