Allow dumping of roles or tablespaces

Started by Dave Pageover 19 years ago7 messagespatches
Jump to latest
#1Dave Page
dpage@pgadmin.org

Per discussion on -hackers, the attached patch introduces an optional
parameter to pg_dumpall's -g (--globals-only) option to allow roles or
tablespaces to be dumped on their own.

eg.

pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only

Regards, Dave.

Attachments:

pg_dumpall_global_objects.difftext/plain; name=pg_dumpall_global_objects.diff; x-mac-creator=0; x-mac-type=0Download+60-43
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dave Page (#1)
Re: Allow dumping of roles or tablespaces

Dave Page <dpage@postgresql.org> writes:

pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only

This seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like

--roles-only
--tablespaces-only
--globals-only

Not sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...

regards, tom lane

#3Andrew Dunstan
andrew@dunslane.net
In reply to: Tom Lane (#2)
Re: Allow dumping of roles or tablespaces

Tom Lane wrote:

Dave Page <dpage@postgresql.org> writes:

pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only

This seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like

--roles-only
--tablespaces-only
--globals-only

Not sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...

I agree. In fact, as I understand the patch it would also allow "-g r"
and "-g t", and that seems ugly too.

We don't have to have a short form for every long option - e.g. initdb
has several like --no-locale for which there is no corresponding short
form. I suggest we make the new options long form only, along the lines
Tom suggests.

cheers

andrew

#4Dave Page
dpage@pgadmin.org
In reply to: Andrew Dunstan (#3)
Re: Allow dumping of roles or tablespaces

Andrew Dunstan wrote:

Tom Lane wrote:

Dave Page <dpage@postgresql.org> writes:

pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only

This seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like

--roles-only
--tablespaces-only
--globals-only

Not sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...

I agree. In fact, as I understand the patch it would also allow "-g r"
and "-g t", and that seems ugly too.

We don't have to have a short form for every long option - e.g. initdb
has several like --no-locale for which there is no corresponding short
form. I suggest we make the new options long form only, along the lines
Tom suggests.

OK, no probs. I'll fix it up as Tom suggests.

Regards, Dave.

#5Peter Eisentraut
peter_e@gmx.net
In reply to: Dave Page (#1)
Re: Allow dumping of roles or tablespaces

Am Freitag, 12. Januar 2007 15:08 schrieb Dave Page:

pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only

Also note that optional argument specifications in getopt like "g::" are not
portable, so this cannot be implemented in the first place.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

#6Dave Page
dpage@pgadmin.org
In reply to: Tom Lane (#2)
Re: Allow dumping of roles or tablespaces

Tom Lane wrote:

Dave Page <dpage@postgresql.org> writes:

pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only

This seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like

--roles-only
--tablespaces-only
--globals-only

Not sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...

Revised patch attached - it now has

-r --roles-only
-t --tablespaces-only
-g --globals-only

Regards, Dave.

Attachments:

pg_dumpall_global_objects2.difftext/plain; name=pg_dumpall_global_objects2.diff; x-mac-creator=0; x-mac-type=0Download+100-38
#7Bruce Momjian
bruce@momjian.us
In reply to: Dave Page (#6)
Re: Allow dumping of roles or tablespaces

Patch applied. Thanks.

---------------------------------------------------------------------------

Dave Page wrote:

Tom Lane wrote:

Dave Page <dpage@postgresql.org> writes:

pg_dumpall -g -- Dump roles and tablespaces per current behaviour
pg_dumpall -gr -- Dump roles only (or users and groups)
pg_dumpall -gt -- Dump tablespaces only

This seems a bit ugly, mainly because (1) it doesn't have a natural
translation to long-form switches, and (2) it screws up the usual
habit of merging multiple single-letter switches into one argument.
Perhaps something like

--roles-only
--tablespaces-only
--globals-only

Not sure if there are free single-letter codes for the first two,
but on the whole I'm more interested in having sane long-form names
than sane short ones ...

Revised patch attached - it now has

-r --roles-only
-t --tablespaces-only
-g --globals-only

Regards, Dave.

Index: doc/src/sgml/ref/pg_dumpall.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v
retrieving revision 1.58
diff -c -r1.58 pg_dumpall.sgml
*** doc/src/sgml/ref/pg_dumpall.sgml	7 Oct 2006 20:59:04 -0000	1.58
--- doc/src/sgml/ref/pg_dumpall.sgml	15 Jan 2007 09:10:31 -0000
***************
*** 134,140 ****
<term><option>--globals-only</option></term>
<listitem>
<para>
!         Dump only global objects (users and groups), no databases.
</para>
</listitem>
</varlistentry>
--- 134,140 ----
<term><option>--globals-only</option></term>
<listitem>
<para>
!         Dump only global objects (roles and tablespaces), no databases.
</para>
</listitem>
</varlistentry>
***************
*** 194,199 ****
--- 194,209 ----
</varlistentry>
<varlistentry>
+       <term><option>-r</option></term>
+       <term><option>--roles-only</option></term>
+       <listitem>
+        <para>
+         Dump only roles, no databases or tablespaces.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
+      <varlistentry>
<term><option>-s</option></term>
<term><option>--schema-only</option></term>
<listitem>
***************
*** 217,222 ****
--- 227,242 ----
</varlistentry>
<varlistentry>
+       <term><option>-t</option></term>
+       <term><option>--tablespaces-only</option></term>
+       <listitem>
+        <para>
+         Dump only tablespaces, no databases or roles.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
+      <varlistentry>
<term><option>-v</></term>
<term><option>--verbose</></term>
<listitem>
Index: src/bin/pg_dump/pg_dumpall.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v
retrieving revision 1.86
diff -c -r1.86 pg_dumpall.c
*** src/bin/pg_dump/pg_dumpall.c	5 Jan 2007 22:19:48 -0000	1.86
--- src/bin/pg_dump/pg_dumpall.c	15 Jan 2007 09:10:33 -0000
***************
*** 78,83 ****
--- 78,85 ----
bool		force_password = false;
bool		data_only = false;
bool		globals_only = false;
+ 	bool		roles_only = false;
+ 	bool		tablespaces_only = false;
bool		schema_only = false;
PGconn	   *conn;
int			encoding;
***************
*** 97,107 ****
{"oids", no_argument, NULL, 'o'},
{"no-owner", no_argument, NULL, 'O'},
{"port", required_argument, NULL, 'p'},
! 		{"password", no_argument, NULL, 'W'},
{"schema-only", no_argument, NULL, 's'},
{"superuser", required_argument, NULL, 'S'},
{"username", required_argument, NULL, 'U'},
{"verbose", no_argument, NULL, 'v'},
{"no-privileges", no_argument, NULL, 'x'},
{"no-acl", no_argument, NULL, 'x'},
--- 99,111 ----
{"oids", no_argument, NULL, 'o'},
{"no-owner", no_argument, NULL, 'O'},
{"port", required_argument, NULL, 'p'},
! 		{"roles-only", no_argument, NULL, 'r'},
{"schema-only", no_argument, NULL, 's'},
{"superuser", required_argument, NULL, 'S'},
+ 		{"tablespaces-only", no_argument, NULL, 't'},
{"username", required_argument, NULL, 'U'},
{"verbose", no_argument, NULL, 'v'},
+ 		{"password", no_argument, NULL, 'W'},
{"no-privileges", no_argument, NULL, 'x'},
{"no-acl", no_argument, NULL, 'x'},

***************
*** 161,167 ****

pgdumpopts = createPQExpBuffer();

! 	while ((c = getopt_long(argc, argv, "acdDgh:ioOp:sS:U:vWxX:", long_options, &optindex)) != -1)
{
switch (c)
{
--- 165,171 ----

pgdumpopts = createPQExpBuffer();

! 	while ((c = getopt_long(argc, argv, "acdDgh:ioOp:rsS:tU:vWxX:", long_options, &optindex)) != -1)
{
switch (c)
{
***************
*** 214,219 ****
--- 218,227 ----
appendPQExpBuffer(pgdumpopts, " -p \"%s\"", pgport);
#endif
break;
+ 				
+ 			case 'r':
+ 				roles_only = true;
+ 				break;
case 's':
schema_only = true;
***************
*** 227,232 ****
--- 235,244 ----
appendPQExpBuffer(pgdumpopts, " -S \"%s\"", optarg);
#endif
break;
+ 				
+ 			case 't':
+ 				tablespaces_only = true;
+ 				break;
case 'U':
pguser = optarg;
***************
*** 295,300 ****
--- 307,340 ----
progname);
exit(1);
}
+ 	
+ 	/* Make sure the user hasn't specified a mix of globals-only options */
+ 	if (globals_only && roles_only)
+ 	{
+ 		fprintf(stderr, _("%s: --globals-only and --roles-only cannot be used together\n"),
+ 				progname);
+ 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ 				progname);
+ 		exit(1);
+ 	}
+ 	
+ 	if (globals_only && tablespaces_only)
+ 	{
+ 		fprintf(stderr, _("%s: --globals-only and --tablespaces-only cannot be used together\n"),
+ 				progname);
+ 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ 				progname);
+ 		exit(1);
+ 	}
+ 	
+ 	if (roles_only && tablespaces_only)
+ 	{
+ 		fprintf(stderr, _("%s: --roles-only and --tablespaces-only cannot be used together\n"),
+ 				progname);
+ 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ 				progname);
+ 		exit(1);
+ 	}

/*
* First try to connect to database "postgres", and failing that
***************
*** 332,356 ****
printf("SET escape_string_warning = 'off';\n");
printf("\n");

! /* Dump roles (users) */
! dumpRoles(conn);

! /* Dump role memberships --- need different method for pre-8.1 */
! if (server_version >= 80100)
! dumpRoleMembership(conn);
! else
! dumpGroups(conn);

! /* Dump tablespaces */
! if (server_version >= 80000)
! dumpTablespaces(conn);

/* Dump CREATE DATABASE commands */
! if (!globals_only)
dumpCreateDB(conn);
}

! if (!globals_only)
dumpDatabases(conn);

PQfinish(conn);
--- 372,402 ----
printf("SET escape_string_warning = 'off';\n");
printf("\n");

! if (!tablespaces_only)
! {
! /* Dump roles (users) */
! dumpRoles(conn);

! /* Dump role memberships --- need different method for pre-8.1 */
! if (server_version >= 80100)
! dumpRoleMembership(conn);
! else
! dumpGroups(conn);
! }

! if (!roles_only)
! {
! /* Dump tablespaces */
! if (server_version >= 80000)
! dumpTablespaces(conn);
! }

/* Dump CREATE DATABASE commands */
! if (!globals_only && !roles_only && !tablespaces_only)
dumpCreateDB(conn);
}

! if (!globals_only && !roles_only && !tablespaces_only)
dumpDatabases(conn);

PQfinish(conn);
***************
*** 381,391 ****
printf(_("  -c, --clean              clean (drop) databases prior to create\n"));
printf(_("  -d, --inserts            dump data as INSERT, rather than COPY, commands\n"));
printf(_("  -D, --column-inserts     dump data as INSERT commands with column names\n"));
! 	printf(_("  -g, --globals-only       dump only global objects, no databases\n"));
printf(_("  -o, --oids               include OIDs in dump\n"));
printf(_("  -O, --no-owner           skip restoration of object ownership\n"));
printf(_("  -s, --schema-only        dump only the schema, no data\n"));
printf(_("  -S, --superuser=NAME     specify the superuser user name to use in the dump\n"));
printf(_("  -x, --no-privileges      do not dump privileges (grant/revoke)\n"));
printf(_("  --disable-dollar-quoting\n"
"                           disable dollar quoting, use SQL standard quoting\n"));
--- 427,439 ----
printf(_("  -c, --clean              clean (drop) databases prior to create\n"));
printf(_("  -d, --inserts            dump data as INSERT, rather than COPY, commands\n"));
printf(_("  -D, --column-inserts     dump data as INSERT commands with column names\n"));
! 	printf(_("  -g, --globals-only       dump only global objects, no databases.\n"));
printf(_("  -o, --oids               include OIDs in dump\n"));
printf(_("  -O, --no-owner           skip restoration of object ownership\n"));
+ 	printf(_("  -r, --roles-only         dump only roles, no databases or tablespaces.\n"));
printf(_("  -s, --schema-only        dump only the schema, no data\n"));
printf(_("  -S, --superuser=NAME     specify the superuser user name to use in the dump\n"));
+ 	printf(_("  -t, --tablespaces-only   dump only tablespaces, no databases or roles.\n"));
printf(_("  -x, --no-privileges      do not dump privileges (grant/revoke)\n"));
printf(_("  --disable-dollar-quoting\n"
"                           disable dollar quoting, use SQL standard quoting\n"));

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +