Thread: Allow dumping of roles or tablespaces

Allow dumping of roles or tablespaces

From
Dave Page
Date:
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.
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    12 Jan 2007 14:01:10 -0000
***************
*** 130,140 ****
       </varlistentry>

       <varlistentry>
!       <term><option>-g</option></term>
!       <term><option>--globals-only</option></term>
        <listitem>
         <para>
!         Dump only global objects (users and groups), no databases.
         </para>
        </listitem>
       </varlistentry>
--- 130,145 ----
       </varlistentry>

       <varlistentry>
!       <term><option>-g[<replaceable class="parameter">r</replaceable>|<replaceable
class="parameter">t</replaceable></option></term>
!       <term><option>--globals-only[=<replaceable class="parameter">r</replaceable>|<replaceable
class="parameter">t</replaceable></option></term>
        <listitem>
         <para>
!         Dump only global objects (roles and/or tablespaces), no databases.
!         The <replaceable class="parameter">r</replaceable> parameter will
!         cause only roles to be dumped, and the
!         <replaceable class="parameter">t</replaceable> parameter will cause
!         only tablespaces to be dumped. If no parameter is specified, all
!         global object types will be dumped.
         </para>
        </listitem>
       </varlistentry>
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    12 Jan 2007 14:01:12 -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;
***************
*** 91,97 ****
          {"inserts", no_argument, NULL, 'd'},
          {"attribute-inserts", no_argument, NULL, 'D'},
          {"column-inserts", no_argument, NULL, 'D'},
!         {"globals-only", no_argument, NULL, 'g'},
          {"host", required_argument, NULL, 'h'},
          {"ignore-version", no_argument, NULL, 'i'},
          {"oids", no_argument, NULL, 'o'},
--- 93,99 ----
          {"inserts", no_argument, NULL, 'd'},
          {"attribute-inserts", no_argument, NULL, 'D'},
          {"column-inserts", no_argument, NULL, 'D'},
!         {"globals-only", optional_argument, NULL, 'g'},
          {"host", required_argument, NULL, 'h'},
          {"ignore-version", no_argument, NULL, 'i'},
          {"oids", no_argument, NULL, 'o'},
***************
*** 161,167 ****

      pgdumpopts = createPQExpBuffer();

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

      pgdumpopts = createPQExpBuffer();

!     while ((c = getopt_long(argc, argv, "acdDg::h:ioOp:sS:U:vWxX:", long_options, &optindex)) != -1)
      {
          switch (c)
          {
***************
*** 181,186 ****
--- 183,203 ----

              case 'g':
                  globals_only = true;
+                 if (optarg)
+                 {
+                     if (strcmp(optarg, "r") == 0)
+                         roles_only = true;
+                     else if    (strcmp(optarg, "t") == 0)
+                         tablespaces_only = true;
+                     else
+                     {
+                         fprintf(stderr,
+                                 _("%s: invalid -g option -- %s\n"),
+                                 progname, optarg);
+                         fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+                         exit(1);
+                     }
+                 }
                  break;

              case 'h':
***************
*** 332,349 ****
              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)
--- 349,372 ----
              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)
***************
*** 381,387 ****
      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"));
--- 404,410 ----
      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=[r|t] dump only global objects, no databases. Optionally restrict to roles or
tablespaces\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"));

Re: Allow dumping of roles or tablespaces

From
Tom Lane
Date:
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

Re: Allow dumping of roles or tablespaces

From
Andrew Dunstan
Date:
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


Re: Allow dumping of roles or tablespaces

From
Dave Page
Date:
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.

Re: Allow dumping of roles or tablespaces

From
Peter Eisentraut
Date:
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/

Re: Allow dumping of roles or tablespaces

From
Dave Page
Date:
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"));

Re: Allow dumping of roles or tablespaces

From
Bruce Momjian
Date:
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. +