aboutsummaryrefslogtreecommitdiff
path: root/src/common/archive.c
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2020-03-24 12:13:36 +0900
committerMichael Paquier <michael@paquier.xyz>2020-03-24 12:13:36 +0900
commite09ad07b21a244c3cbcdbe3048e9ab0834ac6d41 (patch)
tree3239e46294bfd6bbf897e1a2470a2fad20fef653 /src/common/archive.c
parentb8e20d6dabdafbe905b62910dc0236037c7881e1 (diff)
downloadpostgresql-e09ad07b21a244c3cbcdbe3048e9ab0834ac6d41.tar.gz
postgresql-e09ad07b21a244c3cbcdbe3048e9ab0834ac6d41.zip
Move routine building restore_command to src/common/
restore_command has only been used until now by the backend, but there is a pending patch for pg_rewind to make use of that in the frontend. Author: Alexey Kondratov Reviewed-by: Andrey Borodin, Andres Freund, Alvaro Herrera, Alexander Korotkov, Michael Paquier Discussion: https://postgr.es/m/a3acff50-5a0d-9a2c-b3b2-ee36168955c1@postgrespro.ru
Diffstat (limited to 'src/common/archive.c')
-rw-r--r--src/common/archive.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/src/common/archive.c b/src/common/archive.c
new file mode 100644
index 00000000000..a94e4d0a5eb
--- /dev/null
+++ b/src/common/archive.c
@@ -0,0 +1,121 @@
+/*-------------------------------------------------------------------------
+ *
+ * archive.c
+ * Common WAL archive routines
+ *
+ * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * src/common/archive.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef FRONTEND
+#include "postgres.h"
+#else
+#include "postgres_fe.h"
+#endif
+
+#include "common/archive.h"
+#include "lib/stringinfo.h"
+
+/*
+ * BuildRestoreCommand
+ *
+ * Builds a restore command to retrieve a file from WAL archives, replacing
+ * the supported aliases with values supplied by the caller as defined by
+ * the GUC parameter restore_command: xlogpath for %p, xlogfname for %f and
+ * lastRestartPointFname for %r.
+ *
+ * The result is a palloc'd string for the restore command built. The
+ * caller is responsible for freeing it. If any of the required arguments
+ * is NULL and that the corresponding alias is found in the command given
+ * by the caller, then NULL is returned.
+ */
+char *
+BuildRestoreCommand(const char *restoreCommand,
+ const char *xlogpath,
+ const char *xlogfname,
+ const char *lastRestartPointFname)
+{
+ StringInfoData result;
+ const char *sp;
+
+ /*
+ * Build the command to be executed.
+ */
+ initStringInfo(&result);
+
+ for (sp = restoreCommand; *sp; sp++)
+ {
+ if (*sp == '%')
+ {
+ switch (sp[1])
+ {
+ case 'p':
+ {
+ char *nativePath;
+
+ /* %p: relative path of target file */
+ if (xlogpath == NULL)
+ {
+ pfree(result.data);
+ return NULL;
+ }
+ sp++;
+
+ /*
+ * This needs to use a placeholder to not modify the
+ * input with the conversion done via
+ * make_native_path().
+ */
+ nativePath = pstrdup(xlogpath);
+ make_native_path(nativePath);
+ appendStringInfoString(&result,
+ nativePath);
+ pfree(nativePath);
+ break;
+ }
+ case 'f':
+ /* %f: filename of desired file */
+ if (xlogfname == NULL)
+ {
+ pfree(result.data);
+ return NULL;
+ }
+ sp++;
+ appendStringInfoString(&result, xlogfname);
+ break;
+ case 'r':
+ /* %r: filename of last restartpoint */
+ if (lastRestartPointFname == NULL)
+ {
+ pfree(result.data);
+ return NULL;
+ }
+ sp++;
+ appendStringInfoString(&result,
+ lastRestartPointFname);
+ break;
+ case '%':
+ /* convert %% to a single % */
+ sp++;
+ appendStringInfoChar(&result, *sp);
+ break;
+ default:
+ /* otherwise treat the % as not special */
+ appendStringInfoChar(&result, *sp);
+ break;
+ }
+ }
+ else
+ {
+ appendStringInfoChar(&result, *sp);
+ }
+ }
+
+ return result.data;
+}