int i;
const char **keywords;
const char **values;
- char *password = NULL;
const char *tmpparam;
+ bool need_password;
PQconninfoOption *conn_opts = NULL;
PQconninfoOption *conn_opt;
char *err_msg = NULL;
i++;
}
+ /* If -W was given, force prompt for password, but only the first time */
+ need_password = (dbgetpassword == 1 && dbpassword == NULL);
+
while (true)
{
- if (password)
- free(password);
+ /* Get a new password if appropriate */
+ if (need_password)
+ {
+ if (dbpassword)
+ free(dbpassword);
+ dbpassword = simple_prompt(_("Password: "), 100, false);
+ need_password = false;
+ }
+ /* Use (or reuse, on a subsequent connection) password if we have it */
if (dbpassword)
{
- /*
- * We've saved a password when a previous connection succeeded,
- * meaning this is the call for a second session to the same
- * database, so just forcibly reuse that password.
- */
keywords[i] = "password";
values[i] = dbpassword;
- dbgetpassword = -1; /* Don't try again if this fails */
}
- else if (dbgetpassword == 1)
+ else
{
- password = simple_prompt(_("Password: "), 100, false);
- keywords[i] = "password";
- values[i] = password;
+ keywords[i] = NULL;
+ values[i] = NULL;
}
tmpconn = PQconnectdbParams(keywords, values, true);
exit(1);
}
+ /* If we need a password and -w wasn't given, loop back and get one */
if (PQstatus(tmpconn) == CONNECTION_BAD &&
PQconnectionNeedsPassword(tmpconn) &&
dbgetpassword != -1)
{
- dbgetpassword = 1; /* ask for password next time */
- PQfinish(tmpconn);
- continue;
- }
-
- if (PQstatus(tmpconn) != CONNECTION_OK)
- {
- fprintf(stderr, _("%s: could not connect to server: %s\n"),
- progname, PQerrorMessage(tmpconn));
PQfinish(tmpconn);
- free(values);
- free(keywords);
- if (conn_opts)
- PQconninfoFree(conn_opts);
- return NULL;
+ need_password = true;
}
+ else
+ break;
+ }
- /* Connection ok! */
+ if (PQstatus(tmpconn) != CONNECTION_OK)
+ {
+ fprintf(stderr, _("%s: could not connect to server: %s\n"),
+ progname, PQerrorMessage(tmpconn));
+ PQfinish(tmpconn);
free(values);
free(keywords);
if (conn_opts)
PQconninfoFree(conn_opts);
+ return NULL;
+ }
- /*
- * Ensure we have the same value of integer timestamps as the server
- * we are connecting to.
- */
- tmpparam = PQparameterStatus(tmpconn, "integer_datetimes");
- if (!tmpparam)
- {
- fprintf(stderr,
- _("%s: could not determine server setting for integer_datetimes\n"),
- progname);
- PQfinish(tmpconn);
- exit(1);
- }
+ /* Connection ok! */
+ free(values);
+ free(keywords);
+ if (conn_opts)
+ PQconninfoFree(conn_opts);
+
+ /*
+ * Ensure we have the same value of integer timestamps as the server we
+ * are connecting to.
+ */
+ tmpparam = PQparameterStatus(tmpconn, "integer_datetimes");
+ if (!tmpparam)
+ {
+ fprintf(stderr,
+ _("%s: could not determine server setting for integer_datetimes\n"),
+ progname);
+ PQfinish(tmpconn);
+ exit(1);
+ }
#ifdef HAVE_INT64_TIMESTAMP
- if (strcmp(tmpparam, "on") != 0)
+ if (strcmp(tmpparam, "on") != 0)
#else
- if (strcmp(tmpparam, "off") != 0)
+ if (strcmp(tmpparam, "off") != 0)
#endif
- {
- fprintf(stderr,
+ {
+ fprintf(stderr,
_("%s: integer_datetimes compile flag does not match server\n"),
- progname);
- PQfinish(tmpconn);
- exit(1);
- }
-
- /* Store the password for next run */
- if (password)
- dbpassword = password;
- return tmpconn;
+ progname);
+ PQfinish(tmpconn);
+ exit(1);
}
+
+ return tmpconn;
}