| /*------------------------------------------------------------------------- |
| * |
| * 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; |
| } |