LCOV - code coverage report
Current view: top level - src/backend/access/transam - xlogbackup.c (source / functions) Hit Total Coverage
Test: PostgreSQL 18devel Lines: 33 33 100.0 %
Date: 2024-12-02 21:15:08 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*-------------------------------------------------------------------------
       2             :  *
       3             :  * xlogbackup.c
       4             :  *      Internal routines for base backups.
       5             :  *
       6             :  * Portions Copyright (c) 1996-2024, 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         606 : build_backup_content(BackupState *state, bool ishistoryfile)
      30             : {
      31             :     char        startstrbuf[128];
      32             :     char        startxlogfile[MAXFNAMELEN]; /* backup start WAL file */
      33             :     XLogSegNo   startsegno;
      34         606 :     StringInfo  result = makeStringInfo();
      35             :     char       *data;
      36             : 
      37             :     Assert(state != NULL);
      38             : 
      39             :     /* Use the log timezone here, not the session timezone */
      40         606 :     pg_strftime(startstrbuf, sizeof(startstrbuf), "%Y-%m-%d %H:%M:%S %Z",
      41         606 :                 pg_localtime(&state->starttime, log_timezone));
      42             : 
      43         606 :     XLByteToSeg(state->startpoint, startsegno, wal_segment_size);
      44         606 :     XLogFileName(startxlogfile, state->starttli, startsegno, wal_segment_size);
      45         606 :     appendStringInfo(result, "START WAL LOCATION: %X/%X (file %s)\n",
      46         606 :                      LSN_FORMAT_ARGS(state->startpoint), startxlogfile);
      47             : 
      48         606 :     if (ishistoryfile)
      49             :     {
      50             :         char        stopxlogfile[MAXFNAMELEN];  /* backup stop WAL file */
      51             :         XLogSegNo   stopsegno;
      52             : 
      53         290 :         XLByteToSeg(state->stoppoint, stopsegno, wal_segment_size);
      54         290 :         XLogFileName(stopxlogfile, state->stoptli, stopsegno, wal_segment_size);
      55         290 :         appendStringInfo(result, "STOP WAL LOCATION: %X/%X (file %s)\n",
      56         290 :                          LSN_FORMAT_ARGS(state->stoppoint), stopxlogfile);
      57             :     }
      58             : 
      59         606 :     appendStringInfo(result, "CHECKPOINT LOCATION: %X/%X\n",
      60         606 :                      LSN_FORMAT_ARGS(state->checkpointloc));
      61         606 :     appendStringInfoString(result, "BACKUP METHOD: streamed\n");
      62         606 :     appendStringInfo(result, "BACKUP FROM: %s\n",
      63         606 :                      state->started_in_recovery ? "standby" : "primary");
      64         606 :     appendStringInfo(result, "START TIME: %s\n", startstrbuf);
      65         606 :     appendStringInfo(result, "LABEL: %s\n", state->name);
      66         606 :     appendStringInfo(result, "START TIMELINE: %u\n", state->starttli);
      67             : 
      68         606 :     if (ishistoryfile)
      69             :     {
      70             :         char        stopstrfbuf[128];
      71             : 
      72             :         /* Use the log timezone here, not the session timezone */
      73         290 :         pg_strftime(stopstrfbuf, sizeof(stopstrfbuf), "%Y-%m-%d %H:%M:%S %Z",
      74         290 :                     pg_localtime(&state->stoptime, log_timezone));
      75             : 
      76         290 :         appendStringInfo(result, "STOP TIME: %s\n", stopstrfbuf);
      77         290 :         appendStringInfo(result, "STOP TIMELINE: %u\n", state->stoptli);
      78             :     }
      79             : 
      80             :     /* either both istartpoint and istarttli should be set, or neither */
      81             :     Assert(XLogRecPtrIsInvalid(state->istartpoint) == (state->istarttli == 0));
      82         606 :     if (!XLogRecPtrIsInvalid(state->istartpoint))
      83             :     {
      84          36 :         appendStringInfo(result, "INCREMENTAL FROM LSN: %X/%X\n",
      85          36 :                          LSN_FORMAT_ARGS(state->istartpoint));
      86          36 :         appendStringInfo(result, "INCREMENTAL FROM TLI: %u\n",
      87             :                          state->istarttli);
      88             :     }
      89             : 
      90         606 :     data = result->data;
      91         606 :     pfree(result);
      92             : 
      93         606 :     return data;
      94             : }

Generated by: LCOV version 1.14