From d37881fd908e286d0c7b942ee13331c203f12eb1 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Thu, 25 Jan 2007 02:46:33 +0000
Subject: [PATCH] Allow pg_dumpall to specify a database name rather than the
 default 'template1'.

Dave Page
---
 doc/src/sgml/ref/pg_dumpall.sgml | 19 ++++++++++++-
 src/bin/pg_dump/pg_dumpall.c     | 46 +++++++++++++++++++++++++++-----
 2 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml
index 3f40be0f4a0..0a3b44c48ab 100644
--- a/doc/src/sgml/ref/pg_dumpall.sgml
+++ b/doc/src/sgml/ref/pg_dumpall.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v 1.60 2007/01/25 02:30:32 momjian Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v 1.61 2007/01/25 02:46:33 momjian Exp $
 PostgreSQL documentation
 -->
 
@@ -313,6 +313,7 @@ PostgreSQL documentation
    <variablelist>
      <varlistentry>
       <term>-h <replaceable>host</replaceable></term>
+      <term>--host=<replaceable>host</replaceable></term>
       <listitem>
        <para>
         Specifies the host name of the machine on which the database
@@ -323,9 +324,23 @@ PostgreSQL documentation
        </para>
       </listitem>
      </varlistentry>
+	 
+     <varlistentry>
+      <term>-l <replaceable>dbname</replaceable></term>
+      <term>--database=<replaceable>dbname</replaceable></term>
+      <listitem>
+       <para>
+         Specifies the name of the database to connect to to dump global
+         objects and discover what other databases should be dumped. If
+         not specified, the <quote>postgres</quote> database will be used,
+         and if that does not exist, <quote>template1</quote> will be used.
+       </para>
+      </listitem>
+     </varlistentry>
 
      <varlistentry>
       <term>-p <replaceable>port</replaceable></term>
+      <term>--port=<replaceable>port</replaceable></term>
       <listitem>
        <para>
         Specifies the TCP port or local Unix domain socket file
@@ -338,6 +353,7 @@ PostgreSQL documentation
 
      <varlistentry>
       <term>-U <replaceable>username</replaceable></term>
+      <term>--username=<replaceable>username</replaceable></term>
       <listitem>
        <para>
         Connect as the given user.
@@ -347,6 +363,7 @@ PostgreSQL documentation
 
      <varlistentry>
       <term>-W</term>
+	    <term>--password</term>
       <listitem>
        <para>
         Force a password prompt.  This should happen automatically if
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index 697754e7ec6..66c66d8a1a4 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.87 2007/01/25 02:30:32 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.88 2007/01/25 02:46:33 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -75,6 +75,7 @@ main(int argc, char *argv[])
 	char	   *pghost = NULL;
 	char	   *pgport = NULL;
 	char	   *pguser = NULL;
+	char	   *pgdb = NULL;
 	bool		force_password = false;
 	bool		data_only = false;
 	bool		globals_only = false;
@@ -96,6 +97,7 @@ main(int argc, char *argv[])
 		{"globals-only", no_argument, NULL, 'g'},
 		{"host", required_argument, NULL, 'h'},
 		{"ignore-version", no_argument, NULL, 'i'},
+		{"database", required_argument, NULL, 'l'},
 		{"oids", no_argument, NULL, 'o'},
 		{"no-owner", no_argument, NULL, 'O'},
 		{"port", required_argument, NULL, 'p'},
@@ -165,7 +167,7 @@ main(int argc, char *argv[])
 
 	pgdumpopts = createPQExpBuffer();
 
-	while ((c = getopt_long(argc, argv, "acdDgh:ioOp:rsS:tU:vWxX:", long_options, &optindex)) != -1)
+	while ((c = getopt_long(argc, argv, "acdDgh:il:oOp:rsS:tU:vWxX:", long_options, &optindex)) != -1)
 	{
 		switch (c)
 		{
@@ -201,6 +203,10 @@ main(int argc, char *argv[])
 				ignoreVersion = true;
 				appendPQExpBuffer(pgdumpopts, " -i");
 				break;
+				
+			case 'l':
+				pgdb = optarg;
+				break;
 
 			case 'o':
 				appendPQExpBuffer(pgdumpopts, " -o");
@@ -337,15 +343,40 @@ main(int argc, char *argv[])
 	}
 
 	/*
-	 * First try to connect to database "postgres", and failing that
+	 * If there was a database specified on the command line, use that,
+	 * otherwise try to connect to database "postgres", and failing that
 	 * "template1".  "postgres" is the preferred choice for 8.1 and later
 	 * servers, but it usually will not exist on older ones.
 	 */
-	conn = connectDatabase("postgres", pghost, pgport, pguser,
+	if (pgdb)
+	{
+		conn = connectDatabase(pgdb, pghost, pgport, pguser,
+								force_password, false);
+								
+		if (!conn)
+		{
+			fprintf(stderr, _("%s: could not connect to database \"%s\"\n"),
+					progname, pgdb);
+			exit(1);
+		}
+	}
+	else
+	{
+		conn = connectDatabase("postgres", pghost, pgport, pguser,
 						   force_password, false);
-	if (!conn)
-		conn = connectDatabase("template1", pghost, pgport, pguser,
-							   force_password, true);
+		if (!conn)
+			conn = connectDatabase("template1", pghost, pgport, pguser,
+									force_password, true);
+				
+		if (!conn)
+		{
+			fprintf(stderr, _("%s: could not connect to databases \"postgres\" or \"template1\". Please specify an alternative database\n"),
+					progname);
+			fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+					progname);
+			exit(1);
+		}
+	}
 
 	/*
 	 * Get the active encoding and the standard_conforming_strings setting, so
@@ -444,6 +475,7 @@ help(void)
 
 	printf(_("\nConnection options:\n"));
 	printf(_("  -h, --host=HOSTNAME      database server host or socket directory\n"));
+	printf(_("  -l, --database=dbname    specify an alternate default database\n"));
 	printf(_("  -p, --port=PORT          database server port number\n"));
 	printf(_("  -U, --username=NAME      connect as specified database user\n"));
 	printf(_("  -W, --password           force password prompt (should happen automatically)\n"));
-- 
GitLab