diff options
Diffstat (limited to 'src/backend/access/transam/xlogbackup.c')
-rw-r--r-- | src/backend/access/transam/xlogbackup.c | 84 |
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; +} |