From b2e431a4db81a735d1474c4d1565a20b835878c9 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Wed, 1 Feb 2012 13:56:59 -0300 Subject: [PATCH] Implement dry-run mode for pg_archivecleanup 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 | 23 ++++++++++++++++++- doc/src/sgml/pgarchivecleanup.sgml | 9 ++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/contrib/pg_archivecleanup/pg_archivecleanup.c b/contrib/pg_archivecleanup/pg_archivecleanup.c index 400968ce39..adfc83dea7 100644 --- a/contrib/pg_archivecleanup/pg_archivecleanup.c +++ b/contrib/pg_archivecleanup/pg_archivecleanup.c @@ -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); diff --git a/doc/src/sgml/pgarchivecleanup.sgml b/doc/src/sgml/pgarchivecleanup.sgml index ddffa321f6..8148c53d3a 100644 --- a/doc/src/sgml/pgarchivecleanup.sgml +++ b/doc/src/sgml/pgarchivecleanup.sgml @@ -98,6 +98,15 @@ pg_archivecleanup: removing file "archive/00000001000000370000000E" + + + + + Print the names of the files that would have been removed on stdout (performs a dry run). + + + +