Branch data Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * xlogbackup.c
4 : : * Internal routines for base backups.
5 : : *
6 : : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 : : * Portions Copyright (c) 1994, Regents of the University of California
8 : : *
9 : : * IDENTIFICATION
10 : : * src/backend/access/transam/xlogbackup.c
11 : : *-------------------------------------------------------------------------
12 : : */
13 : :
14 : : #include "postgres.h"
15 : :
16 : : #include "access/xlog.h"
17 : : #include "access/xlog_internal.h"
18 : : #include "access/xlogbackup.h"
19 : :
20 : : /*
21 : : * Build contents for backup_label or backup history file.
22 : : *
23 : : * When ishistoryfile is true, it creates the contents for a backup history
24 : : * file, otherwise it creates contents for a backup_label file.
25 : : *
26 : : * Returns the result generated as a palloc'd string.
27 : : */
28 : : char *
29 : 0 : build_backup_content(BackupState *state, bool ishistoryfile)
30 : : {
31 : 0 : char startstrbuf[128];
32 : 0 : char startxlogfile[MAXFNAMELEN]; /* backup start WAL file */
33 : 0 : XLogSegNo startsegno;
34 : 0 : StringInfoData result;
35 : :
36 [ # # ]: 0 : Assert(state != NULL);
37 : :
38 : 0 : initStringInfo(&result);
39 : :
40 : : /* Use the log timezone here, not the session timezone */
41 : 0 : pg_strftime(startstrbuf, sizeof(startstrbuf), "%Y-%m-%d %H:%M:%S %Z",
42 : 0 : pg_localtime(&state->starttime, log_timezone));
43 : :
44 : 0 : XLByteToSeg(state->startpoint, startsegno, wal_segment_size);
45 : 0 : XLogFileName(startxlogfile, state->starttli, startsegno, wal_segment_size);
46 : 0 : appendStringInfo(&result, "START WAL LOCATION: %X/%08X (file %s)\n",
47 : 0 : LSN_FORMAT_ARGS(state->startpoint), startxlogfile);
48 : :
49 [ # # ]: 0 : if (ishistoryfile)
50 : : {
51 : 0 : char stopxlogfile[MAXFNAMELEN]; /* backup stop WAL file */
52 : 0 : XLogSegNo stopsegno;
53 : :
54 : 0 : XLByteToSeg(state->stoppoint, stopsegno, wal_segment_size);
55 : 0 : XLogFileName(stopxlogfile, state->stoptli, stopsegno, wal_segment_size);
56 : 0 : appendStringInfo(&result, "STOP WAL LOCATION: %X/%08X (file %s)\n",
57 : 0 : LSN_FORMAT_ARGS(state->stoppoint), stopxlogfile);
58 : 0 : }
59 : :
60 : 0 : appendStringInfo(&result, "CHECKPOINT LOCATION: %X/%08X\n",
61 : 0 : LSN_FORMAT_ARGS(state->checkpointloc));
62 : 0 : appendStringInfoString(&result, "BACKUP METHOD: streamed\n");
63 : 0 : appendStringInfo(&result, "BACKUP FROM: %s\n",
64 : 0 : state->started_in_recovery ? "standby" : "primary");
65 : 0 : appendStringInfo(&result, "START TIME: %s\n", startstrbuf);
66 : 0 : appendStringInfo(&result, "LABEL: %s\n", state->name);
67 : 0 : appendStringInfo(&result, "START TIMELINE: %u\n", state->starttli);
68 : :
69 [ # # ]: 0 : if (ishistoryfile)
70 : : {
71 : 0 : char stopstrfbuf[128];
72 : :
73 : : /* Use the log timezone here, not the session timezone */
74 : 0 : pg_strftime(stopstrfbuf, sizeof(stopstrfbuf), "%Y-%m-%d %H:%M:%S %Z",
75 : 0 : pg_localtime(&state->stoptime, log_timezone));
76 : :
77 : 0 : appendStringInfo(&result, "STOP TIME: %s\n", stopstrfbuf);
78 : 0 : appendStringInfo(&result, "STOP TIMELINE: %u\n", state->stoptli);
79 : 0 : }
80 : :
81 : : /* either both istartpoint and istarttli should be set, or neither */
82 [ # # ]: 0 : Assert(XLogRecPtrIsValid(state->istartpoint) == (state->istarttli != 0));
83 [ # # ]: 0 : if (XLogRecPtrIsValid(state->istartpoint))
84 : : {
85 : 0 : appendStringInfo(&result, "INCREMENTAL FROM LSN: %X/%08X\n",
86 : 0 : LSN_FORMAT_ARGS(state->istartpoint));
87 : 0 : appendStringInfo(&result, "INCREMENTAL FROM TLI: %u\n",
88 : 0 : state->istarttli);
89 : 0 : }
90 : :
91 : 0 : return result.data;
92 : 0 : }
|