Rework option set of vacuumlo
authorMichael Paquier <michael@paquier.xyz>
Tue, 28 Aug 2018 12:42:45 +0000 (21:42 +0900)
committerMichael Paquier <michael@paquier.xyz>
Tue, 28 Aug 2018 12:42:45 +0000 (21:42 +0900)
Like oid2name, vacuumlo has been lacking consistency with other
utilities for its options:
- Connection options gain long aliases.
- Document environment variables which could be used: PGHOST, PGPORT and
PGUSER.

Documentation and code is reordered to be more consistent. A basic set
of TAP tests has been added while on it.

Author: Tatsuro Yamada
Reviewed-by: Michael Paquier
Discussion: https://postgr.es/m/c7e7f25c-1747-cd0f-9335-390bc97b2db5@lab.ntt.co.jp

contrib/vacuumlo/.gitignore
contrib/vacuumlo/Makefile
contrib/vacuumlo/t/001_basic.pl [new file with mode: 0644]
contrib/vacuumlo/vacuumlo.c
doc/src/sgml/vacuumlo.sgml

index 07f6ab4fd7c9d3483d245f97d3ebaae08d2a3db7..f3f0ce3d80b00eeba8973fc3b54d54fc1032b847 100644 (file)
@@ -1 +1,3 @@
 /vacuumlo
+
+/tmp_check/
index 71106ff69c6a9ceeb177554f83786433ff2750bb..06c5f43f1b646249893cbadb4344a3a66fea18d4 100644 (file)
@@ -19,3 +19,9 @@ top_builddir = ../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
+
+check:
+   $(prove_check)
+
+installcheck:
+   $(prove_installcheck)
diff --git a/contrib/vacuumlo/t/001_basic.pl b/contrib/vacuumlo/t/001_basic.pl
new file mode 100644 (file)
index 0000000..2bfb6ce
--- /dev/null
@@ -0,0 +1,9 @@
+use strict;
+use warnings;
+
+use TestLib;
+use Test::More tests => 8;
+
+program_help_ok('vacuumlo');
+program_version_ok('vacuumlo');
+program_options_handling_ok('vacuumlo');
index 7eb474ca3e41998b77167592dabeb852e07014af..3075781abe15fbe16eb2daaa0c9347ee98bc3b9c 100644 (file)
@@ -26,6 +26,7 @@
 #include "fe_utils/connect.h"
 #include "libpq-fe.h"
 #include "pg_getopt.h"
+#include "getopt_long.h"
 
 #define BUFSIZE            1024
 
@@ -434,17 +435,17 @@ usage(const char *progname)
    printf("%s removes unreferenced large objects from databases.\n\n", progname);
    printf("Usage:\n  %s [OPTION]... DBNAME...\n\n", progname);
    printf("Options:\n");
-   printf("  -l LIMIT       commit after removing each LIMIT large objects\n");
-   printf("  -n             don't remove large objects, just show what would be done\n");
-   printf("  -v             write a lot of progress messages\n");
-   printf("  -V, --version  output version information, then exit\n");
-   printf("  -?, --help     show this help, then exit\n");
+   printf("  -l, --limit=LIMIT         commit after removing each LIMIT large objects\n");
+   printf("  -n, --dry-run             don't remove large objects, just show what would be done\n");
+   printf("  -v, --verbose             write a lot of progress messages\n");
+   printf("  -V, --version             output version information, then exit\n");
+   printf("  -?, --help                show this help, then exit\n");
    printf("\nConnection options:\n");
-   printf("  -h HOSTNAME    database server host or socket directory\n");
-   printf("  -p PORT        database server port\n");
-   printf("  -U USERNAME    user name to connect as\n");
-   printf("  -w             never prompt for password\n");
-   printf("  -W             force password prompt\n");
+   printf("  -h, --host=HOSTNAME       database server host or socket directory\n");
+   printf("  -p, --port=PORT           database server port\n");
+   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("\n");
    printf("Report bugs to <pgsql-bugs@postgresql.org>.\n");
 }
@@ -453,11 +454,26 @@ usage(const char *progname)
 int
 main(int argc, char **argv)
 {
+   static struct option long_options[] = {
+       {"host", required_argument, NULL, 'h'},
+       {"limit", required_argument, NULL, 'l'},
+       {"dry-run", no_argument, NULL, 'n'},
+       {"port", required_argument, NULL, 'p'},
+       {"username", required_argument, NULL, 'U'},
+       {"verbose", no_argument, NULL, 'v'},
+       {"version", no_argument, NULL, 'V'},
+       {"no-password", no_argument, NULL, 'w'},
+       {"password", no_argument, NULL, 'W'},
+       {"help", no_argument, NULL, '?'},
+       {NULL, 0, NULL, 0}
+   };
+
    int         rc = 0;
    struct _param param;
    int         c;
    int         port;
    const char *progname;
+   int         optindex;
 
    progname = get_progname(argv[0]);
 
@@ -486,25 +502,15 @@ main(int argc, char **argv)
        }
    }
 
-   while (1)
+   while ((c = getopt_long(argc, argv, "h:l:np:U:vwW", long_options, &optindex)) != -1)
    {
-       c = getopt(argc, argv, "h:l:U:p:vnwW");
-       if (c == -1)
-           break;
-
        switch (c)
        {
            case '?':
                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
                exit(1);
-           case ':':
-               exit(1);
-           case 'v':
-               param.verbose = 1;
-               break;
-           case 'n':
-               param.dry_run = 1;
-               param.verbose = 1;
+           case 'h':
+               param.pg_host = pg_strdup(optarg);
                break;
            case 'l':
                param.transaction_limit = strtol(optarg, NULL, 10);
@@ -516,14 +522,9 @@ main(int argc, char **argv)
                    exit(1);
                }
                break;
-           case 'U':
-               param.pg_user = pg_strdup(optarg);
-               break;
-           case 'w':
-               param.pg_prompt = TRI_NO;
-               break;
-           case 'W':
-               param.pg_prompt = TRI_YES;
+           case 'n':
+               param.dry_run = 1;
+               param.verbose = 1;
                break;
            case 'p':
                port = strtol(optarg, NULL, 10);
@@ -534,9 +535,21 @@ main(int argc, char **argv)
                }
                param.pg_port = pg_strdup(optarg);
                break;
-           case 'h':
-               param.pg_host = pg_strdup(optarg);
+           case 'U':
+               param.pg_user = pg_strdup(optarg);
                break;
+           case 'v':
+               param.verbose = 1;
+               break;
+           case 'w':
+               param.pg_prompt = TRI_NO;
+               break;
+           case 'W':
+               param.pg_prompt = TRI_YES;
+               break;
+           default:
+               fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
+               exit(1);
        }
    }
 
index 0b4dfc2b17a25475fb3c1d40000dcbaae0b02547..0b57a77af417ed3a3a885933c03a340deef220e3 100644 (file)
@@ -55,7 +55,8 @@
 
   <variablelist>
    <varlistentry>
-    <term><option>-l</option> <replaceable>limit</replaceable></term>
+    <term><option>-l <replaceable class="parameter">limit</replaceable></option></term>
+    <term><option>--limit=<replaceable class="parameter">limit</replaceable></option></term>
     <listitem>
      <para>
       Remove no more than <replaceable>limit</replaceable> large objects per
@@ -69,6 +70,7 @@
 
    <varlistentry>
     <term><option>-n</option></term>
+    <term><option>--dry-run</option></term>
     <listitem>
      <para>Don't remove anything, just show what would be done.</para>
     </listitem>
@@ -76,6 +78,7 @@
 
    <varlistentry>
     <term><option>-v</option></term>
+    <term><option>--verbose</option></term>
     <listitem>
      <para>Write a lot of progress messages.</para>
     </listitem>
 
   <variablelist>
    <varlistentry>
-    <term><option>-h</option> <replaceable>hostname</replaceable></term>
+    <term><option>-h <replaceable class="parameter">host</replaceable></option></term>
+    <term><option>--host=<replaceable class="parameter">host</replaceable></option></term>
     <listitem>
      <para>Database server's host.</para>
     </listitem>
    </varlistentry>
 
    <varlistentry>
-    <term><option>-p</option> <replaceable>port</replaceable></term>
+    <term><option>-p <replaceable>port</replaceable></option></term>
+    <term><option>--port=<replaceable class="parameter">port</replaceable></option></term>
     <listitem>
      <para>Database server's port.</para>
     </listitem>
    </varlistentry>
 
    <varlistentry>
-    <term><option>-U</option> <replaceable>username</replaceable></term>
+    <term><option>-U <replaceable>username</replaceable></option></term>
+    <term><option>--username=<replaceable class="parameter">username</replaceable></option></term>
     <listitem>
      <para>User name to connect as.</para>
     </listitem>
 
    <varlistentry>
     <term><option>-W</option></term>
+    <term><option>--password</option></term>
     <listitem>
      <para>
       Force <application>vacuumlo</application> to prompt for a
   </para>
  </refsect1>
 
+ <refsect1>
+  <title>Environment</title>
+
+  <variablelist>
+   <varlistentry>
+    <term><envar>PGHOST</envar></term>
+    <term><envar>PGPORT</envar></term>
+    <term><envar>PGUSER</envar></term>
+
+    <listitem>
+     <para>
+      Default connection parameters.
+     </para>
+    </listitem>
+   </varlistentry>
+  </variablelist>
+
+  <para>
+   This utility, like most other <productname>PostgreSQL</productname> utilities,
+   also uses the environment variables supported by <application>libpq</application>
+   (see <xref linkend="libpq-envars"/>).
+  </para>
+ </refsect1>
+
  <refsect1>
   <title>Notes</title>