diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml index c80cbac5173eb2b90b38740f89c953684314c5b2..1573145b9234a0962dc5ec141186b21dbc09cd89 100644 --- a/doc/src/sgml/ref/clusterdb.sgml +++ b/doc/src/sgml/ref/clusterdb.sgml @@ -229,6 +229,18 @@ PostgreSQL documentation </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>--maintenance-db=<replaceable class="parameter">dbname</replaceable></></term> + <listitem> + <para> + Specifies the name of the database to connect to discover what other + databases should be clustered. If not specified, the + <literal>postgres</literal> database will be used, + and if that does not exist, <literal>template1</literal> will be used. + </para> + </listitem> + </varlistentry> </variablelist> </para> </refsect1> diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml index 1516f3396d6e2dc03890f8f01abd80417c6cf546..cbbc5c05455371a5e0efeb7bc2ef190b45d4c08f 100644 --- a/doc/src/sgml/ref/createdb.sgml +++ b/doc/src/sgml/ref/createdb.sgml @@ -276,6 +276,19 @@ PostgreSQL documentation </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>--maintenance-db=<replaceable class="parameter">dbname</replaceable></></term> + <listitem> + <para> + Specifies the name of the database to connect to when creating the + new database. If not specified, the <literal>postgres</literal> + database will be used; if that does not exist (or if it is the name + of the new database being created), <literal>template1</literal> will + be used. + </para> + </listitem> + </varlistentry> </variablelist> </para> diff --git a/doc/src/sgml/ref/dropdb.sgml b/doc/src/sgml/ref/dropdb.sgml index aedfa580751babc774439bafd855c5743cb55937..ba781cce52b5bd05918ce1021add76617e6b3321 100644 --- a/doc/src/sgml/ref/dropdb.sgml +++ b/doc/src/sgml/ref/dropdb.sgml @@ -196,6 +196,18 @@ PostgreSQL documentation </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>--maintenance-db=<replaceable class="parameter">dbname</replaceable></></term> + <listitem> + <para> + Specifies the name of the database to connect to in order to drop the + target database. If not specified, the <literal>postgres</literal> + database will be used; if that does not exist (or is the database + being dropped), <literal>template1</literal> will be used. + </para> + </listitem> + </varlistentry> </variablelist> </para> </refsect1> diff --git a/doc/src/sgml/ref/reindexdb.sgml b/doc/src/sgml/ref/reindexdb.sgml index 7b0263c5a1c27cb95e0d119fc10833db9ed02d83..9caaa952668642912d26deca7390d76944250939 100644 --- a/doc/src/sgml/ref/reindexdb.sgml +++ b/doc/src/sgml/ref/reindexdb.sgml @@ -243,6 +243,18 @@ PostgreSQL documentation </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>--maintenance-db=<replaceable class="parameter">dbname</replaceable></></term> + <listitem> + <para> + Specifies the name of the database to connect to discover what other + databases should be vacuumed. If not specified, the + <literal>postgres</literal> database will be used, + and if that does not exist, <literal>template1</literal> will be used. + </para> + </listitem> + </varlistentry> </variablelist> </para> </refsect1> diff --git a/doc/src/sgml/ref/vacuumdb.sgml b/doc/src/sgml/ref/vacuumdb.sgml index 4effa4188a610412dd74aaa110054d516f491b14..89d634747dd1cfb8dc93473806a856f49d995ec0 100644 --- a/doc/src/sgml/ref/vacuumdb.sgml +++ b/doc/src/sgml/ref/vacuumdb.sgml @@ -284,6 +284,18 @@ PostgreSQL documentation </para> </listitem> </varlistentry> + + <varlistentry> + <term><option>--maintenance-db=<replaceable class="parameter">dbname</replaceable></></term> + <listitem> + <para> + Specifies the name of the database to connect to discover what other + databases should be vacuumed. If not specified, the + <literal>postgres</literal> database will be used, + and if that does not exist, <literal>template1</literal> will be used. + </para> + </listitem> + </varlistentry> </variablelist> </para> </refsect1> diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c index 3742091e2a4d2741ff78d0885a70510fd71a8295..fc88692b4e345c27fcd706a3233172cbbd75c0ba 100644 --- a/src/bin/scripts/clusterdb.c +++ b/src/bin/scripts/clusterdb.c @@ -18,7 +18,8 @@ static void cluster_one_database(const char *dbname, bool verbose, const char *t const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo); -static void cluster_all_databases(bool verbose, const char *host, const char *port, +static void cluster_all_databases(bool verbose, const char *maintenance_db, + const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, bool quiet); @@ -40,6 +41,7 @@ main(int argc, char *argv[]) {"all", no_argument, NULL, 'a'}, {"table", required_argument, NULL, 't'}, {"verbose", no_argument, NULL, 'v'}, + {"maintenance-db", required_argument, NULL, 2}, {NULL, 0, NULL, 0} }; @@ -48,6 +50,7 @@ main(int argc, char *argv[]) int c; const char *dbname = NULL; + const char *maintenance_db = NULL; char *host = NULL; char *port = NULL; char *username = NULL; @@ -100,6 +103,9 @@ main(int argc, char *argv[]) case 'v': verbose = true; break; + case 2: + maintenance_db = optarg; + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -137,7 +143,7 @@ main(int argc, char *argv[]) exit(1); } - cluster_all_databases(verbose, host, port, username, prompt_password, + cluster_all_databases(verbose, maintenance_db, host, port, username, prompt_password, progname, echo, quiet); } else @@ -180,7 +186,8 @@ cluster_one_database(const char *dbname, bool verbose, const char *table, appendPQExpBuffer(&sql, " %s", table); appendPQExpBuffer(&sql, ";\n"); - conn = connectDatabase(dbname, host, port, username, prompt_password, progname); + conn = connectDatabase(dbname, host, port, username, prompt_password, + progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) { if (table) @@ -198,7 +205,8 @@ cluster_one_database(const char *dbname, bool verbose, const char *table, static void -cluster_all_databases(bool verbose, const char *host, const char *port, +cluster_all_databases(bool verbose, const char *maintenance_db, + const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, bool quiet) { @@ -206,7 +214,8 @@ cluster_all_databases(bool verbose, const char *host, const char *port, PGresult *result; int i; - conn = connectDatabase("postgres", host, port, username, prompt_password, progname); + conn = connectMaintenanceDatabase(maintenance_db, host, port, username, + prompt_password, progname); result = executeQuery(conn, "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;", progname, echo); PQfinish(conn); @@ -250,6 +259,7 @@ help(const char *progname) printf(_(" -U, --username=USERNAME user name to connect as\n")); printf(_(" -w, --no-password never prompt for password\n")); printf(_(" -W, --password force password prompt\n")); + printf(_(" --maintenance-db=DBNAME alternate maintenance database\n")); printf(_("\nRead the description of the SQL command CLUSTER for details.\n")); printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); } diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c index 9a7cc2c264cc6b31c7f232ecbe402ce63b3fe398..99be4ae83aecf643f4377a9d5d9cc48ea36761f4 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. diff --git a/src/bin/scripts/common.h b/src/bin/scripts/common.h index caa9e81f457f31b1a7a46cb46d2075a822352b70..9ebd72873d4040d71dc999f0d2ecde09042a2d17 100644 --- a/src/bin/scripts/common.h +++ b/src/bin/scripts/common.h @@ -30,6 +30,11 @@ extern void handle_help_version_opts(int argc, char *argv[], extern PGconn *connectDatabase(const char *dbname, const char *pghost, const char *pgport, const char *pguser, + enum trivalue prompt_password, const char *progname, + bool fail_ok); + +extern PGconn *connectMaintenanceDatabase(const char *maintenance_db, + const char *pghost, const char *pgport, const char *pguser, enum trivalue prompt_password, const char *progname); extern PGresult *executeQuery(PGconn *conn, const char *query, diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index d7c3928eb6e23135653d4905150a842378895e77..64105412589e145f2305c8144911789dc90e39b1 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -35,6 +35,7 @@ main(int argc, char *argv[]) {"lc-collate", required_argument, NULL, 1}, {"lc-ctype", required_argument, NULL, 2}, {"locale", required_argument, NULL, 'l'}, + {"maintenance-db", required_argument, NULL, 3}, {NULL, 0, NULL, 0} }; @@ -43,6 +44,7 @@ main(int argc, char *argv[]) int c; const char *dbname = NULL; + const char *maintenance_db = NULL; char *comment = NULL; char *host = NULL; char *port = NULL; @@ -110,6 +112,9 @@ main(int argc, char *argv[]) case 'l': locale = optarg; break; + case 3: + maintenance_db = optarg; + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -192,13 +197,12 @@ main(int argc, char *argv[]) appendPQExpBuffer(&sql, ";\n"); - /* - * Connect to the 'postgres' database by default, except have the - * 'postgres' user use 'template1' so he can create the 'postgres' - * database. - */ - conn = connectDatabase(strcmp(dbname, "postgres") == 0 ? "template1" : "postgres", - host, port, username, prompt_password, progname); + /* No point in trying to use postgres db when creating postgres db. */ + if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0) + maintenance_db = "template1"; + + conn = connectMaintenanceDatabase(maintenance_db, host, port, username, + prompt_password, progname); if (echo) printf("%s", sql.data); @@ -264,6 +268,7 @@ help(const char *progname) printf(_(" -U, --username=USERNAME user name to connect as\n")); printf(_(" -w, --no-password never prompt for password\n")); printf(_(" -W, --password force password prompt\n")); + printf(_(" --maintenance-db=DBNAME alternate maintenance database\n")); printf(_("\nBy default, a database with the same name as the current user is created.\n")); printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); } diff --git a/src/bin/scripts/createlang.c b/src/bin/scripts/createlang.c index 2f667e864a573e3cf01edc350b56ad3399e8e736..a0720de33956a8e6fe95edcca5e10f7a77e88553 100644 --- a/src/bin/scripts/createlang.c +++ b/src/bin/scripts/createlang.c @@ -132,7 +132,7 @@ main(int argc, char *argv[]) static const bool translate_columns[] = {false, true}; conn = connectDatabase(dbname, host, port, username, prompt_password, - progname); + progname, false); printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " "(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" " @@ -169,7 +169,8 @@ main(int argc, char *argv[]) if (*p >= 'A' && *p <= 'Z') *p += ('a' - 'A'); - conn = connectDatabase(dbname, host, port, username, prompt_password, progname); + conn = connectDatabase(dbname, host, port, username, prompt_password, + progname, false); /* * Make sure the language isn't already installed diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c index d6e05dd793994b05df24a193daf75e4777df2b11..4ed400a2bd6f3a85e674854c6081b362e1830d80 100644 --- a/src/bin/scripts/createuser.c +++ b/src/bin/scripts/createuser.c @@ -230,7 +230,8 @@ main(int argc, char *argv[]) if (login == 0) login = TRI_YES; - conn = connectDatabase("postgres", host, port, username, prompt_password, progname); + conn = connectDatabase("postgres", host, port, username, prompt_password, + progname, false); initPQExpBuffer(&sql); diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c index 0e6749efec0e2e1f23dcc5a1a5fb3d2882d58e50..621c0aecc03874293f9f73ef2b0d4dc7f37f9ecd 100644 --- a/src/bin/scripts/dropdb.c +++ b/src/bin/scripts/dropdb.c @@ -32,6 +32,7 @@ main(int argc, char *argv[]) {"echo", no_argument, NULL, 'e'}, {"interactive", no_argument, NULL, 'i'}, {"if-exists", no_argument, &if_exists, 1}, + {"maintenance-db", required_argument, NULL, 2}, {NULL, 0, NULL, 0} }; @@ -40,6 +41,7 @@ main(int argc, char *argv[]) int c; char *dbname = NULL; + char *maintenance_db = NULL; char *host = NULL; char *port = NULL; char *username = NULL; @@ -85,6 +87,9 @@ main(int argc, char *argv[]) case 0: /* this covers the long options */ break; + case 2: + maintenance_db = optarg; + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -119,11 +124,11 @@ main(int argc, char *argv[]) appendPQExpBuffer(&sql, "DROP DATABASE %s%s;\n", (if_exists ? "IF EXISTS " : ""), fmtId(dbname)); - /* - * Connect to the 'postgres' database by default, except have the - * 'postgres' user use 'template1' so he can drop the 'postgres' database. - */ - conn = connectDatabase(strcmp(dbname, "postgres") == 0 ? "template1" : "postgres", + /* Avoid trying to drop postgres db while we are connected to it. */ + if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0) + maintenance_db = "template1"; + + conn = connectMaintenanceDatabase(maintenance_db, host, port, username, prompt_password, progname); if (echo) @@ -161,5 +166,6 @@ help(const char *progname) printf(_(" -U, --username=USERNAME user name to connect as\n")); printf(_(" -w, --no-password never prompt for password\n")); printf(_(" -W, --password force password prompt\n")); + printf(_(" --maintenance-db=DBNAME alternate maintenance database\n")); printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); } diff --git a/src/bin/scripts/droplang.c b/src/bin/scripts/droplang.c index f136a760ff052f1ce17cc2507535de4d126dadf8..d04b4dd9733a4ab43381fd5656ec466b93dad2af 100644 --- a/src/bin/scripts/droplang.c +++ b/src/bin/scripts/droplang.c @@ -131,7 +131,7 @@ main(int argc, char *argv[]) static const bool translate_columns[] = {false, true}; conn = connectDatabase(dbname, host, port, username, prompt_password, - progname); + progname, false); printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " "(CASE WHEN lanpltrusted THEN '%s' ELSE '%s' END) as \"%s\" " @@ -170,7 +170,8 @@ main(int argc, char *argv[]) if (*p >= 'A' && *p <= 'Z') *p += ('a' - 'A'); - conn = connectDatabase(dbname, host, port, username, prompt_password, progname); + conn = connectDatabase(dbname, host, port, username, prompt_password, + progname, false); /* * Force schema search path to be just pg_catalog, so that we don't have diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c index bfd5b1cfd5a551c482758505331dc82c537447ba..f67fb0bcb8faa6f35deee2364acd3bd56cd68746 100644 --- a/src/bin/scripts/dropuser.c +++ b/src/bin/scripts/dropuser.c @@ -119,7 +119,8 @@ main(int argc, char *argv[]) appendPQExpBuffer(&sql, "DROP ROLE %s%s;\n", (if_exists ? "IF EXISTS " : ""), fmtId(dropuser)); - conn = connectDatabase("postgres", host, port, username, prompt_password, progname); + conn = connectDatabase("postgres", host, port, username, prompt_password, + progname, false); if (echo) printf("%s", sql.data); diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index caeed7511ee25dd7a52d1cce0409677fe33c3982..9ff15d85d62e8b84cb1b034f966f2c67eef2a1c7 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -19,7 +19,8 @@ static void reindex_one_database(const char *name, const char *dbname, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo); -static void reindex_all_databases(const char *host, const char *port, +static void reindex_all_databases(const char *maintenance_db, + const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, bool quiet); @@ -45,6 +46,7 @@ main(int argc, char *argv[]) {"system", no_argument, NULL, 's'}, {"table", required_argument, NULL, 't'}, {"index", required_argument, NULL, 'i'}, + {"maintenance-db", required_argument, NULL, 2}, {NULL, 0, NULL, 0} }; @@ -53,6 +55,7 @@ main(int argc, char *argv[]) int c; const char *dbname = NULL; + const char *maintenance_db = NULL; const char *host = NULL; const char *port = NULL; const char *username = NULL; @@ -110,6 +113,9 @@ main(int argc, char *argv[]) case 'i': index = optarg; break; + case 2: + maintenance_db = optarg; + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -154,8 +160,8 @@ main(int argc, char *argv[]) exit(1); } - reindex_all_databases(host, port, username, prompt_password, - progname, echo, quiet); + reindex_all_databases(maintenance_db, host, port, username, + prompt_password, progname, echo, quiet); } else if (syscatalog) { @@ -230,7 +236,8 @@ reindex_one_database(const char *name, const char *dbname, const char *type, appendPQExpBuffer(&sql, " DATABASE %s", fmtId(name)); appendPQExpBuffer(&sql, ";\n"); - conn = connectDatabase(dbname, host, port, username, prompt_password, progname); + conn = connectDatabase(dbname, host, port, username, prompt_password, + progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) { @@ -252,7 +259,8 @@ reindex_one_database(const char *name, const char *dbname, const char *type, } static void -reindex_all_databases(const char *host, const char *port, +reindex_all_databases(const char *maintenance_db, + const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, bool quiet) { @@ -260,7 +268,8 @@ reindex_all_databases(const char *host, const char *port, PGresult *result; int i; - conn = connectDatabase("postgres", host, port, username, prompt_password, progname); + conn = connectMaintenanceDatabase(maintenance_db, host, port, username, + prompt_password, progname); result = executeQuery(conn, "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;", progname, echo); PQfinish(conn); @@ -294,7 +303,8 @@ reindex_system_catalogs(const char *dbname, const char *host, const char *port, appendPQExpBuffer(&sql, "REINDEX SYSTEM %s;\n", dbname); - conn = connectDatabase(dbname, host, port, username, prompt_password, progname); + conn = connectDatabase(dbname, host, port, username, prompt_password, + progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) { fprintf(stderr, _("%s: reindexing of system catalogs failed: %s"), @@ -328,6 +338,7 @@ help(const char *progname) printf(_(" -U, --username=USERNAME user name to connect as\n")); printf(_(" -w, --no-password never prompt for password\n")); printf(_(" -W, --password force password prompt\n")); + printf(_(" --maintenance-db=DBNAME alternate maintenance database\n")); printf(_("\nRead the description of the SQL command REINDEX for details.\n")); printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); } diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index 7457e6d3046cd256fbf0b81448afc73e7f9059db..a82e10a2a2777c7649f9c5b0eba8e7fd372d70de 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -21,6 +21,7 @@ static void vacuum_one_database(const char *dbname, bool full, bool verbose, const char *progname, bool echo); static void vacuum_all_databases(bool full, bool verbose, bool and_analyze, bool analyze_only, bool freeze, + const char *maintenance_db, const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, bool quiet); @@ -47,6 +48,7 @@ main(int argc, char *argv[]) {"table", required_argument, NULL, 't'}, {"full", no_argument, NULL, 'f'}, {"verbose", no_argument, NULL, 'v'}, + {"maintenance-db", required_argument, NULL, 2}, {NULL, 0, NULL, 0} }; @@ -55,6 +57,7 @@ main(int argc, char *argv[]) int c; const char *dbname = NULL; + const char *maintenance_db = NULL; char *host = NULL; char *port = NULL; char *username = NULL; @@ -123,6 +126,9 @@ main(int argc, char *argv[]) case 'v': verbose = true; break; + case 2: + maintenance_db = optarg; + break; default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); @@ -178,8 +184,8 @@ main(int argc, char *argv[]) } vacuum_all_databases(full, verbose, and_analyze, analyze_only, freeze, - host, port, username, prompt_password, - progname, echo, quiet); + maintenance_db, host, port, username, + prompt_password, progname, echo, quiet); } else { @@ -216,7 +222,8 @@ vacuum_one_database(const char *dbname, bool full, bool verbose, bool and_analyz initPQExpBuffer(&sql); - conn = connectDatabase(dbname, host, port, username, prompt_password, progname); + conn = connectDatabase(dbname, host, port, username, prompt_password, + progname, false); if (analyze_only) { @@ -290,7 +297,8 @@ vacuum_one_database(const char *dbname, bool full, bool verbose, bool and_analyz static void vacuum_all_databases(bool full, bool verbose, bool and_analyze, bool analyze_only, - bool freeze, const char *host, const char *port, + bool freeze, const char *maintenance_db, + const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, bool quiet) { @@ -298,7 +306,8 @@ vacuum_all_databases(bool full, bool verbose, bool and_analyze, bool analyze_onl PGresult *result; int i; - conn = connectDatabase("postgres", host, port, username, prompt_password, progname); + conn = connectMaintenanceDatabase(maintenance_db, host, port, + username, prompt_password, progname); result = executeQuery(conn, "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;", progname, echo); PQfinish(conn); @@ -346,6 +355,7 @@ help(const char *progname) printf(_(" -U, --username=USERNAME user name to connect as\n")); printf(_(" -w, --no-password never prompt for password\n")); printf(_(" -W, --password force password prompt\n")); + printf(_(" --maintenance-db=DBNAME alternate maintenance database\n")); printf(_("\nRead the description of the SQL command VACUUM for details.\n")); printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n")); }