aboutsummaryrefslogtreecommitdiff
path: root/src/bin/scripts/common.c
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2011-12-06 08:48:15 -0500
committerRobert Haas <rhaas@postgresql.org>2011-12-06 08:48:15 -0500
commit68281e00540a29e7f9bfc154c25a78b875f560d1 (patch)
treeedd65f9661d0efcdc11780cea0466c1f8aeb6715 /src/bin/scripts/common.c
parent6ef4ae1d4e829675c332c39895fdf90e15c3faeb (diff)
downloadpostgresql-68281e00540a29e7f9bfc154c25a78b875f560d1.tar.gz
postgresql-68281e00540a29e7f9bfc154c25a78b875f560d1.zip
Make command-line tools smarter about finding a DB to connect to.
If unable to connect to "postgres", try "template1". This allows things to work more smoothly in the case where the postgres database has been dropped. And just in case that's not good enough, also allow the user to specify a maintenance database to be used for the initial connection, to cover the case where neither postgres nor template1 is suitable.
Diffstat (limited to 'src/bin/scripts/common.c')
-rw-r--r--src/bin/scripts/common.c42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c
index 9a7cc2c264c..99be4ae83ae 100644
--- a/src/bin/scripts/common.c
+++ b/src/bin/scripts/common.c
@@ -93,7 +93,7 @@ handle_help_version_opts(int argc, char *argv[],
PGconn *
connectDatabase(const char *dbname, const char *pghost, const char *pgport,
const char *pguser, enum trivalue prompt_password,
- const char *progname)
+ const char *progname, bool fail_ok)
{
PGconn *conn;
char *password = NULL;
@@ -163,6 +163,11 @@ connectDatabase(const char *dbname, const char *pghost, const char *pgport,
/* check to see that the backend connection was successfully made */
if (PQstatus(conn) == CONNECTION_BAD)
{
+ if (fail_ok)
+ {
+ PQfinish(conn);
+ return NULL;
+ }
fprintf(stderr, _("%s: could not connect to database %s: %s"),
progname, dbname, PQerrorMessage(conn));
exit(1);
@@ -171,6 +176,41 @@ connectDatabase(const char *dbname, const char *pghost, const char *pgport,
return conn;
}
+/*
+ * Try to connect to the appropriate maintenance database.
+ */
+PGconn *
+connectMaintenanceDatabase(const char *maintenance_db, const char *pghost,
+ const char *pgport, const char *pguser,
+ enum trivalue prompt_password,
+ const char *progname)
+{
+ PGconn *conn;
+
+ /* If a maintenance database name was specified, just connect to it. */
+ if (maintenance_db)
+ return connectDatabase(maintenance_db, pghost, pgport, pguser,
+ prompt_password, progname, false);
+
+ /* Otherwise, try postgres first and then template1. */
+ conn = connectDatabase("postgres", pghost, pgport, pguser, prompt_password,
+ progname, true);
+ if (!conn)
+ conn = connectDatabase("template1", pghost, pgport, pguser,
+ prompt_password, progname, true);
+
+ if (!conn)
+ {
+ fprintf(stderr, _("%s: could not connect to databases \"postgres\" or \"template1\"\n"
+ "Please specify an alternative maintenance database.\n"),
+ progname);
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ progname);
+ exit(1);
+ }
+
+ return conn;
+}
/*
* Run a query, return the results, exit program on failure.