summaryrefslogtreecommitdiffstats
path: root/src/backend/access/transam/xlogbackup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/xlogbackup.c')
-rw-r--r--src/backend/access/transam/xlogbackup.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/backend/access/transam/xlogbackup.c b/src/backend/access/transam/xlogbackup.c
new file mode 100644
index 0000000..23461c9
--- /dev/null
+++ b/src/backend/access/transam/xlogbackup.c
@@ -0,0 +1,84 @@
+/*-------------------------------------------------------------------------
+ *
+ * xlogbackup.c
+ * Internal routines for base backups.
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * IDENTIFICATION
+ * src/backend/access/transam/xlogbackup.c
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#include "access/xlog.h"
+#include "access/xlog_internal.h"
+#include "access/xlogbackup.h"
+
+/*
+ * Build contents for backup_label or backup history file.
+ *
+ * When ishistoryfile is true, it creates the contents for a backup history
+ * file, otherwise it creates contents for a backup_label file.
+ *
+ * Returns the result generated as a palloc'd string.
+ */
+char *
+build_backup_content(BackupState *state, bool ishistoryfile)
+{
+ char startstrbuf[128];
+ char startxlogfile[MAXFNAMELEN]; /* backup start WAL file */
+ XLogSegNo startsegno;
+ StringInfo result = makeStringInfo();
+ char *data;
+
+ Assert(state != NULL);
+
+ /* Use the log timezone here, not the session timezone */
+ pg_strftime(startstrbuf, sizeof(startstrbuf), "%Y-%m-%d %H:%M:%S %Z",
+ pg_localtime(&state->starttime, log_timezone));
+
+ XLByteToSeg(state->startpoint, startsegno, wal_segment_size);
+ XLogFileName(startxlogfile, state->starttli, startsegno, wal_segment_size);
+ appendStringInfo(result, "START WAL LOCATION: %X/%X (file %s)\n",
+ LSN_FORMAT_ARGS(state->startpoint), startxlogfile);
+
+ if (ishistoryfile)
+ {
+ char stopxlogfile[MAXFNAMELEN]; /* backup stop WAL file */
+ XLogSegNo stopsegno;
+
+ XLByteToSeg(state->stoppoint, stopsegno, wal_segment_size);
+ XLogFileName(stopxlogfile, state->stoptli, stopsegno, wal_segment_size);
+ appendStringInfo(result, "STOP WAL LOCATION: %X/%X (file %s)\n",
+ LSN_FORMAT_ARGS(state->stoppoint), stopxlogfile);
+ }
+
+ appendStringInfo(result, "CHECKPOINT LOCATION: %X/%X\n",
+ LSN_FORMAT_ARGS(state->checkpointloc));
+ appendStringInfo(result, "BACKUP METHOD: streamed\n");
+ appendStringInfo(result, "BACKUP FROM: %s\n",
+ state->started_in_recovery ? "standby" : "primary");
+ appendStringInfo(result, "START TIME: %s\n", startstrbuf);
+ appendStringInfo(result, "LABEL: %s\n", state->name);
+ appendStringInfo(result, "START TIMELINE: %u\n", state->starttli);
+
+ if (ishistoryfile)
+ {
+ char stopstrfbuf[128];
+
+ /* Use the log timezone here, not the session timezone */
+ pg_strftime(stopstrfbuf, sizeof(stopstrfbuf), "%Y-%m-%d %H:%M:%S %Z",
+ pg_localtime(&state->stoptime, log_timezone));
+
+ appendStringInfo(result, "STOP TIME: %s\n", stopstrfbuf);
+ appendStringInfo(result, "STOP TIMELINE: %u\n", state->stoptli);
+ }
+
+ data = result->data;
+ pfree(result);
+
+ return data;
+}