Implement dry-run mode for pg_archivecleanup
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 1 Feb 2012 16:56:59 +0000 (13:56 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 1 Feb 2012 17:18:12 +0000 (14:18 -0300)
In dry-run mode, just the name of the file to be removed is printed to
stdout; this is so the user can easily plug it into another program
through a pipe.  If debug mode is also specified, a more verbose message
is printed to stderr.

Author: Gabriele Bartolini
Reviewer: Josh Kupershmidt

contrib/pg_archivecleanup/pg_archivecleanup.c
doc/src/sgml/pgarchivecleanup.sgml

index 400968ce399c82c318b3ff78c5c47991c8c0c3d1..adfc83dea70eca52beebcd73e53f061161a1b300 100644 (file)
@@ -36,6 +36,7 @@ const char *progname;
 
 /* Options and defaults */
 bool       debug = false;      /* are we debugging? */
+bool       dryrun = false;     /* are we performing a dry-run operation? */
 
 char      *archiveLocation;    /* where to find the archive? */
 char      *restartWALFileName; /* the file from which we can restart restore */
@@ -119,6 +120,22 @@ CleanupPriorWALFiles(void)
            {
                snprintf(WALFilePath, MAXPGPATH, "%s/%s",
                         archiveLocation, xlde->d_name);
+
+               if (dryrun)
+               {
+                   /*
+                    * Prints the name of the file to be removed and skips the
+                    * actual removal.  The regular printout is so that the
+                    * user can pipe the output into some other program.
+                    */
+                   printf("%s\n", WALFilePath);
+                   if (debug)
+                       fprintf(stderr,
+                               "%s: file \"%s\" would be removed\n",
+                               progname, WALFilePath);
+                   continue;
+               }
+
                if (debug)
                    fprintf(stderr, "%s: removing file \"%s\"\n",
                            progname, WALFilePath);
@@ -205,6 +222,7 @@ usage(void)
    printf("  %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n", progname);
    printf("\nOptions:\n");
    printf("  -d                 generates debug output (verbose mode)\n");
+   printf("  -n                 shows the names of the files that would have been removed (dry-run)\n");
    printf("  --help             show this help, then exit\n");
    printf("  --version          output version information, then exit\n");
    printf("\n"
@@ -241,13 +259,16 @@ main(int argc, char **argv)
        }
    }
 
-   while ((c = getopt(argc, argv, "d")) != -1)
+   while ((c = getopt(argc, argv, "dn")) != -1)
    {
        switch (c)
        {
            case 'd':           /* Debug mode */
                debug = true;
                break;
+           case 'n':           /* Dry-Run mode */
+               dryrun = true;
+               break;
            default:
                fprintf(stderr, "Try \"%s --help\" for more information.\n", progname);
                exit(2);
index ddffa321f6368cf52df31bbbe0c5904639a1c10c..8148c53d3a0a591f8912fa0a2180a4df4bc0333d 100644 (file)
@@ -98,6 +98,15 @@ pg_archivecleanup:  removing file "archive/00000001000000370000000E"
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>-n</option></term>
+      <listitem>
+       <para>
+        Print the names of the files that would have been removed on <filename>stdout</> (performs a dry run).
+       </para>
+      </listitem>
+     </varlistentry>
+
     </variablelist>
    </para>