PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pg_backup_archiver.h File Reference
#include <time.h>
#include "libpq-fe.h"
#include "pg_backup.h"
#include "pqexpbuffer.h"
Include dependency graph for pg_backup_archiver.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  sqlparseInfo
 
struct  _archiveHandle
 
struct  _tocEntry
 
struct  _archiveOpts
 

Macros

#define LOBBUFSIZE   16384
 
#define BLK_DATA   1
 
#define BLK_BLOBS   3
 
#define MAKE_ARCHIVE_VERSION(major, minor, rev)   (((major) * 256 + (minor)) * 256 + (rev))
 
#define ARCHIVE_MAJOR(version)   (((version) >> 16) & 255)
 
#define ARCHIVE_MINOR(version)   (((version) >> 8) & 255)
 
#define ARCHIVE_REV(version)   (((version) ) & 255)
 
#define K_VERS_1_0   MAKE_ARCHIVE_VERSION(1, 0, 0)
 
#define K_VERS_1_2   MAKE_ARCHIVE_VERSION(1, 2, 0) /* Allow No ZLIB */
 
#define K_VERS_1_3   MAKE_ARCHIVE_VERSION(1, 3, 0) /* BLOBS */
 
#define K_VERS_1_4   MAKE_ARCHIVE_VERSION(1, 4, 0) /* Date & name in header */
 
#define K_VERS_1_5   MAKE_ARCHIVE_VERSION(1, 5, 0) /* Handle dependencies */
 
#define K_VERS_1_6   MAKE_ARCHIVE_VERSION(1, 6, 0) /* Schema field in TOCs */
 
#define K_VERS_1_7
 
#define K_VERS_1_8
 
#define K_VERS_1_9
 
#define K_VERS_1_10   MAKE_ARCHIVE_VERSION(1, 10, 0) /* add tablespace */
 
#define K_VERS_1_11
 
#define K_VERS_1_12
 
#define K_VERS_1_13
 
#define K_VERS_1_14   MAKE_ARCHIVE_VERSION(1, 14, 0) /* add tableam */
 
#define K_VERS_1_15
 
#define K_VERS_1_16
 
#define K_VERS_MAJOR   1
 
#define K_VERS_MINOR   16
 
#define K_VERS_REV   0
 
#define K_VERS_SELF   MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, K_VERS_REV)
 
#define K_VERS_MAX   MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, 255)
 
#define K_OFFSET_POS_NOT_SET   1
 
#define K_OFFSET_POS_SET   2
 
#define K_OFFSET_NO_DATA   3
 
#define WORKER_OK   0
 
#define WORKER_CREATE_DONE   10
 
#define WORKER_INHIBIT_DATA   11
 
#define WORKER_IGNORED_ERRORS   12
 
#define READ_ERROR_EXIT(fd)
 
#define WRITE_ERROR_EXIT
 
#define RESTORE_PASS_LAST   RESTORE_PASS_POST_ACL
 
#define REQ_SCHEMA   0x01 /* want schema */
 
#define REQ_DATA   0x02 /* want data */
 
#define REQ_STATS   0x04
 
#define REQ_SPECIAL   0x08 /* for special TOC entries */
 
#define ARCHIVE_OPTS(...)   &(ArchiveOpts){__VA_ARGS__}
 
#define appendStringLiteralAHX(buf, str, AH)    appendStringLiteral(buf, str, (AH)->public.encoding, (AH)->public.std_strings)
 
#define appendByteaLiteralAHX(buf, str, len, AH)    appendByteaLiteral(buf, str, len, (AH)->public.std_strings)
 

Typedefs

typedef struct _archiveHandle ArchiveHandle
 
typedef struct _tocEntry TocEntry
 
typedef enum T_Action T_Action
 
typedef void(* ClosePtrType) (ArchiveHandle *AH)
 
typedef void(* ReopenPtrType) (ArchiveHandle *AH)
 
typedef void(* ArchiveEntryPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* StartDataPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* WriteDataPtrType) (ArchiveHandle *AH, const void *data, size_t dLen)
 
typedef void(* EndDataPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* StartLOsPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* StartLOPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid)
 
typedef void(* EndLOPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid)
 
typedef void(* EndLOsPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef int(* WriteBytePtrType) (ArchiveHandle *AH, const int i)
 
typedef int(* ReadBytePtrType) (ArchiveHandle *AH)
 
typedef void(* WriteBufPtrType) (ArchiveHandle *AH, const void *c, size_t len)
 
typedef void(* ReadBufPtrType) (ArchiveHandle *AH, void *buf, size_t len)
 
typedef void(* WriteExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* ReadExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* PrintExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* PrintTocDataPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef void(* PrepParallelRestorePtrType) (ArchiveHandle *AH)
 
typedef void(* ClonePtrType) (ArchiveHandle *AH)
 
typedef void(* DeClonePtrType) (ArchiveHandle *AH)
 
typedef int(* WorkerJobDumpPtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef int(* WorkerJobRestorePtrType) (ArchiveHandle *AH, TocEntry *te)
 
typedef size_t(* CustomOutPtrType) (ArchiveHandle *AH, const void *buf, size_t len)
 
typedef char *(* DefnDumperPtr) (Archive *AH, const void *userArg, const TocEntry *te)
 
typedef int(* DataDumperPtr) (Archive *AH, const void *userArg)
 
typedef void struct _archiveOpts ArchiveOpts
 

Enumerations

enum  T_Action { ACT_DUMP , ACT_RESTORE }
 
enum  sqlparseState { SQL_SCAN = 0 , SQL_IN_SINGLE_QUOTE , SQL_IN_DOUBLE_QUOTE }
 
enum  ArchiverStage { STAGE_NONE = 0 , STAGE_INITIALIZING , STAGE_PROCESSING , STAGE_FINALIZING }
 
enum  ArchiverOutput { OUTPUT_SQLCMDS = 0 , OUTPUT_COPYDATA , OUTPUT_OTHERDATA }
 
enum  RestorePass { RESTORE_PASS_MAIN = 0 , RESTORE_PASS_ACL , RESTORE_PASS_POST_ACL }
 

Functions

int parallel_restore (ArchiveHandle *AH, TocEntry *te)
 
void on_exit_close_archive (Archive *AHX)
 
void replace_on_exit_close_archive (Archive *AHX)
 
void warn_or_exit_horribly (ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2
 
TocEntryArchiveEntry (Archive *AHX, CatalogId catalogId, DumpId dumpId, ArchiveOpts *opts)
 
void WriteHead (ArchiveHandle *AH)
 
void ReadHead (ArchiveHandle *AH)
 
void WriteToc (ArchiveHandle *AH)
 
void ReadToc (ArchiveHandle *AH)
 
void WriteDataChunks (ArchiveHandle *AH, struct ParallelState *pstate)
 
void WriteDataChunksForTocEntry (ArchiveHandle *AH, TocEntry *te)
 
ArchiveHandleCloneArchive (ArchiveHandle *AH)
 
void DeCloneArchive (ArchiveHandle *AH)
 
int TocIDRequired (ArchiveHandle *AH, DumpId id)
 
TocEntrygetTocEntryByDumpId (ArchiveHandle *AH, DumpId id)
 
bool checkSeek (FILE *fp)
 
size_t WriteInt (ArchiveHandle *AH, int i)
 
int ReadInt (ArchiveHandle *AH)
 
char * ReadStr (ArchiveHandle *AH)
 
size_t WriteStr (ArchiveHandle *AH, const char *c)
 
int ReadOffset (ArchiveHandle *, pgoff_t *)
 
size_t WriteOffset (ArchiveHandle *, pgoff_t, int)
 
void StartRestoreLOs (ArchiveHandle *AH)
 
void StartRestoreLO (ArchiveHandle *AH, Oid oid, bool drop)
 
void EndRestoreLO (ArchiveHandle *AH, Oid oid)
 
void EndRestoreLOs (ArchiveHandle *AH)
 
void InitArchiveFmt_Custom (ArchiveHandle *AH)
 
void InitArchiveFmt_Null (ArchiveHandle *AH)
 
void InitArchiveFmt_Directory (ArchiveHandle *AH)
 
void InitArchiveFmt_Tar (ArchiveHandle *AH)
 
bool isValidTarHeader (char *header)
 
void ReconnectToServer (ArchiveHandle *AH, const char *dbname)
 
void IssueCommandPerBlob (ArchiveHandle *AH, TocEntry *te, const char *cmdBegin, const char *cmdEnd)
 
void IssueACLPerBlob (ArchiveHandle *AH, TocEntry *te)
 
void DropLOIfExists (ArchiveHandle *AH, Oid oid)
 
void ahwrite (const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
 
int ahprintf (ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2
 

Macro Definition Documentation

◆ appendByteaLiteralAHX

#define appendByteaLiteralAHX (   buf,
  str,
  len,
  AH 
)     appendByteaLiteral(buf, str, len, (AH)->public.std_strings)

Definition at line 432 of file pg_backup_archiver.h.

◆ appendStringLiteralAHX

#define appendStringLiteralAHX (   buf,
  str,
  AH 
)     appendStringLiteral(buf, str, (AH)->public.encoding, (AH)->public.std_strings)

Definition at line 429 of file pg_backup_archiver.h.

◆ ARCHIVE_MAJOR

#define ARCHIVE_MAJOR (   version)    (((version) >> 16) & 255)

Definition at line 42 of file pg_backup_archiver.h.

◆ ARCHIVE_MINOR

#define ARCHIVE_MINOR (   version)    (((version) >> 8) & 255)

Definition at line 43 of file pg_backup_archiver.h.

◆ ARCHIVE_OPTS

#define ARCHIVE_OPTS (   ...)    &(ArchiveOpts){__VA_ARGS__}

Definition at line 411 of file pg_backup_archiver.h.

◆ ARCHIVE_REV

#define ARCHIVE_REV (   version)    (((version) ) & 255)

Definition at line 44 of file pg_backup_archiver.h.

◆ BLK_BLOBS

#define BLK_BLOBS   3

Definition at line 37 of file pg_backup_archiver.h.

◆ BLK_DATA

#define BLK_DATA   1

Definition at line 36 of file pg_backup_archiver.h.

◆ K_OFFSET_NO_DATA

#define K_OFFSET_NO_DATA   3

Definition at line 77 of file pg_backup_archiver.h.

◆ K_OFFSET_POS_NOT_SET

#define K_OFFSET_POS_NOT_SET   1

Definition at line 75 of file pg_backup_archiver.h.

◆ K_OFFSET_POS_SET

#define K_OFFSET_POS_SET   2

Definition at line 76 of file pg_backup_archiver.h.

◆ K_VERS_1_0

#define K_VERS_1_0   MAKE_ARCHIVE_VERSION(1, 0, 0)

Definition at line 47 of file pg_backup_archiver.h.

◆ K_VERS_1_10

#define K_VERS_1_10   MAKE_ARCHIVE_VERSION(1, 10, 0) /* add tablespace */

Definition at line 56 of file pg_backup_archiver.h.

◆ K_VERS_1_11

#define K_VERS_1_11
Value:
MAKE_ARCHIVE_VERSION(1, 11, 0) /* add toc section
* indicator */
#define MAKE_ARCHIVE_VERSION(major, minor, rev)

Definition at line 57 of file pg_backup_archiver.h.

◆ K_VERS_1_12

#define K_VERS_1_12
Value:
MAKE_ARCHIVE_VERSION(1, 12, 0) /* add separate BLOB
* entries */

Definition at line 58 of file pg_backup_archiver.h.

◆ K_VERS_1_13

#define K_VERS_1_13
Value:
MAKE_ARCHIVE_VERSION(1, 13, 0) /* change search_path
* behavior */

Definition at line 59 of file pg_backup_archiver.h.

◆ K_VERS_1_14

#define K_VERS_1_14   MAKE_ARCHIVE_VERSION(1, 14, 0) /* add tableam */

Definition at line 60 of file pg_backup_archiver.h.

◆ K_VERS_1_15

#define K_VERS_1_15
Value:
MAKE_ARCHIVE_VERSION(1, 15, 0) /* add
* compression_algorithm
* in header */

Definition at line 61 of file pg_backup_archiver.h.

◆ K_VERS_1_16

#define K_VERS_1_16
Value:
MAKE_ARCHIVE_VERSION(1, 16, 0) /* BLOB METADATA entries
* and multiple BLOBS,
* relkind */

Definition at line 62 of file pg_backup_archiver.h.

◆ K_VERS_1_2

#define K_VERS_1_2   MAKE_ARCHIVE_VERSION(1, 2, 0) /* Allow No ZLIB */

Definition at line 48 of file pg_backup_archiver.h.

◆ K_VERS_1_3

#define K_VERS_1_3   MAKE_ARCHIVE_VERSION(1, 3, 0) /* BLOBS */

Definition at line 49 of file pg_backup_archiver.h.

◆ K_VERS_1_4

#define K_VERS_1_4   MAKE_ARCHIVE_VERSION(1, 4, 0) /* Date & name in header */

Definition at line 50 of file pg_backup_archiver.h.

◆ K_VERS_1_5

#define K_VERS_1_5   MAKE_ARCHIVE_VERSION(1, 5, 0) /* Handle dependencies */

Definition at line 51 of file pg_backup_archiver.h.

◆ K_VERS_1_6

#define K_VERS_1_6   MAKE_ARCHIVE_VERSION(1, 6, 0) /* Schema field in TOCs */

Definition at line 52 of file pg_backup_archiver.h.

◆ K_VERS_1_7

#define K_VERS_1_7
Value:
MAKE_ARCHIVE_VERSION(1, 7, 0) /* File Offset size in
* header */

Definition at line 53 of file pg_backup_archiver.h.

◆ K_VERS_1_8

#define K_VERS_1_8
Value:
MAKE_ARCHIVE_VERSION(1, 8, 0) /* change interpretation
* of ID numbers and
* dependencies */

Definition at line 54 of file pg_backup_archiver.h.

◆ K_VERS_1_9

#define K_VERS_1_9
Value:
MAKE_ARCHIVE_VERSION(1, 9, 0) /* add default_with_oids
* tracking */

Definition at line 55 of file pg_backup_archiver.h.

◆ K_VERS_MAJOR

#define K_VERS_MAJOR   1

Definition at line 65 of file pg_backup_archiver.h.

◆ K_VERS_MAX

#define K_VERS_MAX   MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, 255)

Definition at line 71 of file pg_backup_archiver.h.

◆ K_VERS_MINOR

#define K_VERS_MINOR   16

Definition at line 66 of file pg_backup_archiver.h.

◆ K_VERS_REV

#define K_VERS_REV   0

Definition at line 67 of file pg_backup_archiver.h.

◆ K_VERS_SELF

Definition at line 68 of file pg_backup_archiver.h.

◆ LOBBUFSIZE

#define LOBBUFSIZE   16384

Definition at line 33 of file pg_backup_archiver.h.

◆ MAKE_ARCHIVE_VERSION

#define MAKE_ARCHIVE_VERSION (   major,
  minor,
  rev 
)    (((major) * 256 + (minor)) * 256 + (rev))

Definition at line 40 of file pg_backup_archiver.h.

◆ READ_ERROR_EXIT

#define READ_ERROR_EXIT (   fd)
Value:
do { \
if (feof(fd)) \
pg_fatal("could not read from input file: end of file"); \
pg_fatal("could not read from input file: %m"); \
} while (0)
#define pg_fatal(...)
static int fd(const char *x, int i)
Definition: preproc-init.c:105

Definition at line 92 of file pg_backup_archiver.h.

◆ REQ_DATA

#define REQ_DATA   0x02 /* want data */

Definition at line 200 of file pg_backup_archiver.h.

◆ REQ_SCHEMA

#define REQ_SCHEMA   0x01 /* want schema */

Definition at line 199 of file pg_backup_archiver.h.

◆ REQ_SPECIAL

#define REQ_SPECIAL   0x08 /* for special TOC entries */

Definition at line 202 of file pg_backup_archiver.h.

◆ REQ_STATS

#define REQ_STATS   0x04

Definition at line 201 of file pg_backup_archiver.h.

◆ RESTORE_PASS_LAST

#define RESTORE_PASS_LAST   RESTORE_PASS_POST_ACL

Definition at line 196 of file pg_backup_archiver.h.

◆ WORKER_CREATE_DONE

#define WORKER_CREATE_DONE   10

Definition at line 84 of file pg_backup_archiver.h.

◆ WORKER_IGNORED_ERRORS

#define WORKER_IGNORED_ERRORS   12

Definition at line 86 of file pg_backup_archiver.h.

◆ WORKER_INHIBIT_DATA

#define WORKER_INHIBIT_DATA   11

Definition at line 85 of file pg_backup_archiver.h.

◆ WORKER_OK

#define WORKER_OK   0

Definition at line 83 of file pg_backup_archiver.h.

◆ WRITE_ERROR_EXIT

#define WRITE_ERROR_EXIT
Value:
do { \
pg_fatal("could not write to output file: %m"); \
} while (0)

Definition at line 100 of file pg_backup_archiver.h.

Typedef Documentation

◆ ArchiveEntryPtrType

typedef void(* ArchiveEntryPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 113 of file pg_backup_archiver.h.

◆ ArchiveHandle

typedef struct _archiveHandle ArchiveHandle

Definition at line 88 of file pg_backup_archiver.h.

◆ ArchiveOpts

typedef void struct _archiveOpts ArchiveOpts

◆ ClonePtrType

typedef void(* ClonePtrType) (ArchiveHandle *AH)

Definition at line 134 of file pg_backup_archiver.h.

◆ ClosePtrType

typedef void(* ClosePtrType) (ArchiveHandle *AH)

Definition at line 111 of file pg_backup_archiver.h.

◆ CustomOutPtrType

typedef size_t(* CustomOutPtrType) (ArchiveHandle *AH, const void *buf, size_t len)

Definition at line 140 of file pg_backup_archiver.h.

◆ DataDumperPtr

typedef int(* DataDumperPtr) (Archive *AH, const void *userArg)

Definition at line 335 of file pg_backup_archiver.h.

◆ DeClonePtrType

typedef void(* DeClonePtrType) (ArchiveHandle *AH)

Definition at line 135 of file pg_backup_archiver.h.

◆ DefnDumperPtr

typedef char *(* DefnDumperPtr) (Archive *AH, const void *userArg, const TocEntry *te)

Definition at line 334 of file pg_backup_archiver.h.

◆ EndDataPtrType

typedef void(* EndDataPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 117 of file pg_backup_archiver.h.

◆ EndLOPtrType

typedef void(* EndLOPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid)

Definition at line 121 of file pg_backup_archiver.h.

◆ EndLOsPtrType

typedef void(* EndLOsPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 122 of file pg_backup_archiver.h.

◆ PrepParallelRestorePtrType

typedef void(* PrepParallelRestorePtrType) (ArchiveHandle *AH)

Definition at line 133 of file pg_backup_archiver.h.

◆ PrintExtraTocPtrType

typedef void(* PrintExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 130 of file pg_backup_archiver.h.

◆ PrintTocDataPtrType

typedef void(* PrintTocDataPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 131 of file pg_backup_archiver.h.

◆ ReadBufPtrType

typedef void(* ReadBufPtrType) (ArchiveHandle *AH, void *buf, size_t len)

Definition at line 127 of file pg_backup_archiver.h.

◆ ReadBytePtrType

typedef int(* ReadBytePtrType) (ArchiveHandle *AH)

Definition at line 125 of file pg_backup_archiver.h.

◆ ReadExtraTocPtrType

typedef void(* ReadExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 129 of file pg_backup_archiver.h.

◆ ReopenPtrType

typedef void(* ReopenPtrType) (ArchiveHandle *AH)

Definition at line 112 of file pg_backup_archiver.h.

◆ StartDataPtrType

typedef void(* StartDataPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 115 of file pg_backup_archiver.h.

◆ StartLOPtrType

typedef void(* StartLOPtrType) (ArchiveHandle *AH, TocEntry *te, Oid oid)

Definition at line 120 of file pg_backup_archiver.h.

◆ StartLOsPtrType

typedef void(* StartLOsPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 119 of file pg_backup_archiver.h.

◆ T_Action

typedef enum T_Action T_Action

◆ TocEntry

typedef struct _tocEntry TocEntry

Definition at line 89 of file pg_backup_archiver.h.

◆ WorkerJobDumpPtrType

typedef int(* WorkerJobDumpPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 137 of file pg_backup_archiver.h.

◆ WorkerJobRestorePtrType

typedef int(* WorkerJobRestorePtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 138 of file pg_backup_archiver.h.

◆ WriteBufPtrType

typedef void(* WriteBufPtrType) (ArchiveHandle *AH, const void *c, size_t len)

Definition at line 126 of file pg_backup_archiver.h.

◆ WriteBytePtrType

typedef int(* WriteBytePtrType) (ArchiveHandle *AH, const int i)

Definition at line 124 of file pg_backup_archiver.h.

◆ WriteDataPtrType

typedef void(* WriteDataPtrType) (ArchiveHandle *AH, const void *data, size_t dLen)

Definition at line 116 of file pg_backup_archiver.h.

◆ WriteExtraTocPtrType

typedef void(* WriteExtraTocPtrType) (ArchiveHandle *AH, TocEntry *te)

Definition at line 128 of file pg_backup_archiver.h.

Enumeration Type Documentation

◆ ArchiverOutput

Enumerator
OUTPUT_SQLCMDS 
OUTPUT_COPYDATA 
OUTPUT_OTHERDATA 

Definition at line 164 of file pg_backup_archiver.h.

168{
169 STAGE_NONE = 0,
@ STAGE_NONE

◆ ArchiverStage

Enumerator
STAGE_NONE 
STAGE_INITIALIZING 
STAGE_PROCESSING 
STAGE_FINALIZING 

Definition at line 156 of file pg_backup_archiver.h.

161{
162 sqlparseState state; /* see above */
sqlparseState
Definition: regguts.h:323

◆ RestorePass

Enumerator
RESTORE_PASS_MAIN 
RESTORE_PASS_ACL 
RESTORE_PASS_POST_ACL 

Definition at line 190 of file pg_backup_archiver.h.

202{

◆ sqlparseState

Enumerator
SQL_SCAN 
SQL_IN_SINGLE_QUOTE 
SQL_IN_DOUBLE_QUOTE 

Definition at line 142 of file pg_backup_archiver.h.

154{

◆ T_Action

enum T_Action
Enumerator
ACT_DUMP 
ACT_RESTORE 

Definition at line 105 of file pg_backup_archiver.h.

106 : end of file"); \
107 else \
108 pg_fatal("could not read from input file: %m"); \
109 } while (0)
FILE * input
#define read(a, b, c)
Definition: win32.h:13

Function Documentation

◆ ahprintf()

int ahprintf ( ArchiveHandle AH,
const char *  fmt,
  ... 
)

◆ ahwrite()

void ahwrite ( const void *  ptr,
size_t  size,
size_t  nmemb,
ArchiveHandle AH 
)

Definition at line 1834 of file pg_backup_archiver.c.

1835{
1836 int bytes_written = 0;
1837
1838 if (AH->writingLO)
1839 {
1840 size_t remaining = size * nmemb;
1841
1842 while (AH->lo_buf_used + remaining > AH->lo_buf_size)
1843 {
1844 size_t avail = AH->lo_buf_size - AH->lo_buf_used;
1845
1846 memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, avail);
1847 ptr = (const char *) ptr + avail;
1848 remaining -= avail;
1849 AH->lo_buf_used += avail;
1850 dump_lo_buf(AH);
1851 }
1852
1853 memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, remaining);
1854 AH->lo_buf_used += remaining;
1855
1856 bytes_written = size * nmemb;
1857 }
1858 else if (AH->CustomOutPtr)
1859 bytes_written = AH->CustomOutPtr(AH, ptr, size * nmemb);
1860
1861 /*
1862 * If we're doing a restore, and it's direct to DB, and we're connected
1863 * then send it to the DB.
1864 */
1865 else if (RestoringToDB(AH))
1866 bytes_written = ExecuteSqlCommandBuf(&AH->public, (const char *) ptr, size * nmemb);
1867 else
1868 {
1870
1871 if (CFH->write_func(ptr, size * nmemb, CFH))
1872 bytes_written = size * nmemb;
1873 }
1874
1875 if (bytes_written != size * nmemb)
1877}
int remaining
Definition: informix.c:692
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:81
static int RestoringToDB(ArchiveHandle *AH)
static void dump_lo_buf(ArchiveHandle *AH)
#define WRITE_ERROR_EXIT
int ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen)
Definition: pg_backup_db.c:384
bool(* write_func)(const void *ptr, size_t size, struct CompressFileHandle *CFH)
Definition: compress_io.h:139
CustomOutPtrType CustomOutPtr

References _archiveHandle::CustomOutPtr, dump_lo_buf(), ExecuteSqlCommandBuf(), if(), _archiveHandle::lo_buf, _archiveHandle::lo_buf_size, _archiveHandle::lo_buf_used, _archiveHandle::OF, _archiveHandle::public, remaining, RestoringToDB(), WRITE_ERROR_EXIT, CompressFileHandle::write_func, and _archiveHandle::writingLO.

Referenced by _LoadLOs(), _PrintFileData(), _PrintTocData(), _WriteData(), ahprintf(), and ReadDataFromArchiveNone().

◆ ArchiveEntry()

TocEntry * ArchiveEntry ( Archive AHX,
CatalogId  catalogId,
DumpId  dumpId,
ArchiveOpts opts 
)

Definition at line 1225 of file pg_backup_archiver.c.

1227{
1228 ArchiveHandle *AH = (ArchiveHandle *) AHX;
1229 TocEntry *newToc;
1230
1231 newToc = (TocEntry *) pg_malloc0(sizeof(TocEntry));
1232
1233 AH->tocCount++;
1234 if (dumpId > AH->maxDumpId)
1235 AH->maxDumpId = dumpId;
1236
1237 newToc->prev = AH->toc->prev;
1238 newToc->next = AH->toc;
1239 AH->toc->prev->next = newToc;
1240 AH->toc->prev = newToc;
1241
1242 newToc->catalogId = catalogId;
1243 newToc->dumpId = dumpId;
1244 newToc->section = opts->section;
1245
1246 newToc->tag = pg_strdup(opts->tag);
1247 newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL;
1248 newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL;
1249 newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL;
1250 newToc->relkind = opts->relkind;
1251 newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL;
1252 newToc->desc = pg_strdup(opts->description);
1253 newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL;
1254 newToc->dropStmt = opts->dropStmt ? pg_strdup(opts->dropStmt) : NULL;
1255 newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL;
1256
1257 if (opts->nDeps > 0)
1258 {
1259 newToc->dependencies = (DumpId *) pg_malloc(opts->nDeps * sizeof(DumpId));
1260 memcpy(newToc->dependencies, opts->deps, opts->nDeps * sizeof(DumpId));
1261 newToc->nDeps = opts->nDeps;
1262 }
1263 else
1264 {
1265 newToc->dependencies = NULL;
1266 newToc->nDeps = 0;
1267 }
1268
1269 newToc->dataDumper = opts->dumpFn;
1270 newToc->dataDumperArg = opts->dumpArg;
1271 newToc->hadDumper = opts->dumpFn ? true : false;
1272
1273 newToc->defnDumper = opts->defnFn;
1274 newToc->defnDumperArg = opts->defnArg;
1275
1276 newToc->formatData = NULL;
1277 newToc->dataLength = 0;
1278
1279 if (AH->ArchiveEntryPtr != NULL)
1280 AH->ArchiveEntryPtr(AH, newToc);
1281
1282 return newToc;
1283}
void * pg_malloc(size_t size)
Definition: fe_memutils.c:47
char * pg_strdup(const char *in)
Definition: fe_memutils.c:85
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
return true
Definition: isn.c:130
static AmcheckOptions opts
Definition: pg_amcheck.c:112
int DumpId
Definition: pg_backup.h:280
struct _tocEntry * toc
ArchiveEntryPtrType ArchiveEntryPtr
struct _tocEntry * prev
teSection section
DefnDumperPtr defnDumper
DataDumperPtr dataDumper
pgoff_t dataLength
CatalogId catalogId
struct _tocEntry * next
const void * dataDumperArg
const void * defnDumperArg
DumpId * dependencies

References _archiveHandle::ArchiveEntryPtr, _tocEntry::catalogId, _tocEntry::copyStmt, _tocEntry::dataDumper, _tocEntry::dataDumperArg, _tocEntry::dataLength, _tocEntry::defn, _tocEntry::defnDumper, _tocEntry::defnDumperArg, _tocEntry::dependencies, _tocEntry::desc, _tocEntry::dropStmt, _tocEntry::dumpId, _tocEntry::formatData, _tocEntry::hadDumper, _archiveHandle::maxDumpId, _tocEntry::nDeps, _tocEntry::next, opts, _tocEntry::owner, pg_malloc(), pg_malloc0(), pg_strdup(), _tocEntry::prev, _tocEntry::relkind, _tocEntry::section, _tocEntry::tableam, _tocEntry::tablespace, _tocEntry::tag, _archiveHandle::toc, _archiveHandle::tocCount, and true.

Referenced by dumpAccessMethod(), dumpACL(), dumpAgg(), dumpAttrDef(), dumpBaseType(), dumpCast(), dumpCollation(), dumpCommentExtended(), dumpCompositeType(), dumpCompositeTypeColComments(), dumpConstraint(), dumpConversion(), dumpDatabase(), dumpDefaultACL(), dumpDomain(), dumpDumpableObject(), dumpEncoding(), dumpEnumType(), dumpEventTrigger(), dumpExtension(), dumpForeignDataWrapper(), dumpForeignServer(), dumpFunc(), dumpIndex(), dumpIndexAttach(), dumpLO(), dumpNamespace(), dumpOpclass(), dumpOpfamily(), dumpOpr(), dumpPolicy(), dumpProcLang(), dumpPublication(), dumpPublicationNamespace(), dumpPublicationTable(), dumpRangeType(), dumpRelationStats(), dumpRule(), dumpSearchPath(), dumpSecLabel(), dumpSequence(), dumpSequenceData(), dumpShellType(), dumpStatisticsExt(), dumpStdStrings(), dumpSubscription(), dumpSubscriptionTable(), dumpTableAttach(), dumpTableComment(), dumpTableData(), dumpTableSchema(), dumpTableSecLabel(), dumpTransform(), dumpTrigger(), dumpTSConfig(), dumpTSDictionary(), dumpTSParser(), dumpTSTemplate(), dumpUndefinedType(), dumpUserMappings(), and refreshMatViewData().

◆ checkSeek()

bool checkSeek ( FILE *  fp)

Definition at line 4244 of file pg_backup_archiver.c.

4245{
4246 pgoff_t tpos;
4247
4248 /* Check that ftello works on this file */
4249 tpos = ftello(fp);
4250 if (tpos < 0)
4251 return false;
4252
4253 /*
4254 * Check that fseeko(SEEK_SET) works, too. NB: we used to try to test
4255 * this with fseeko(fp, 0, SEEK_CUR). But some platforms treat that as a
4256 * successful no-op even on files that are otherwise unseekable.
4257 */
4258 if (fseeko(fp, tpos, SEEK_SET) != 0)
4259 return false;
4260
4261 return true;
4262}
#define pgoff_t
Definition: port.h:401
#define ftello(stream)
Definition: win32_port.h:209
#define fseeko(stream, offset, origin)
Definition: win32_port.h:206

References fseeko, ftello, and pgoff_t.

Referenced by InitArchiveFmt_Custom(), and InitArchiveFmt_Tar().

◆ CloneArchive()

ArchiveHandle * CloneArchive ( ArchiveHandle AH)

Definition at line 5111 of file pg_backup_archiver.c.

5112{
5113 ArchiveHandle *clone;
5114
5115 /* Make a "flat" copy */
5116 clone = (ArchiveHandle *) pg_malloc(sizeof(ArchiveHandle));
5117 memcpy(clone, AH, sizeof(ArchiveHandle));
5118
5119 /* Likewise flat-copy the RestoreOptions, so we can alter them locally */
5120 clone->public.ropt = (RestoreOptions *) pg_malloc(sizeof(RestoreOptions));
5121 memcpy(clone->public.ropt, AH->public.ropt, sizeof(RestoreOptions));
5122
5123 /* Handle format-independent fields */
5124 memset(&(clone->sqlparse), 0, sizeof(clone->sqlparse));
5125
5126 /* The clone will have its own connection, so disregard connection state */
5127 clone->connection = NULL;
5128 clone->connCancel = NULL;
5129 clone->currUser = NULL;
5130 clone->currSchema = NULL;
5131 clone->currTableAm = NULL;
5132 clone->currTablespace = NULL;
5133
5134 /* savedPassword must be local in case we change it while connecting */
5135 if (clone->savedPassword)
5136 clone->savedPassword = pg_strdup(clone->savedPassword);
5137
5138 /* clone has its own error count, too */
5139 clone->public.n_errors = 0;
5140
5141 /* clones should not share lo_buf */
5142 clone->lo_buf = NULL;
5143
5144 /*
5145 * Clone connections disregard --transaction-size; they must commit after
5146 * each command so that the results are immediately visible to other
5147 * workers.
5148 */
5149 clone->public.ropt->txn_size = 0;
5150
5151 /*
5152 * Connect our new clone object to the database, using the same connection
5153 * parameters used for the original connection.
5154 */
5155 ConnectDatabaseAhx((Archive *) clone, &clone->public.ropt->cparams, true);
5156
5157 /* re-establish fixed state */
5158 if (AH->mode == archModeRead)
5160 /* in write case, setupDumpWorker will fix up connection state */
5161
5162 /* Let the format-specific code have a chance too */
5163 clone->ClonePtr(clone);
5164
5165 Assert(clone->connection != NULL);
5166 return clone;
5167}
Assert(PointerIsAligned(start, uint64))
void ConnectDatabaseAhx(Archive *AHX, const ConnParams *cparams, bool isReconnect)
Definition: pg_backup_db.c:109
@ archModeRead
Definition: pg_backup.h:52
static void _doSetFixedOutputState(ArchiveHandle *AH)
int n_errors
Definition: pg_backup.h:248
RestoreOptions * ropt
Definition: pg_backup.h:225
PGcancel *volatile connCancel
ClonePtrType ClonePtr
sqlparseInfo sqlparse
ConnParams cparams
Definition: pg_backup.h:145

References _doSetFixedOutputState(), archModeRead, Assert(), _archiveHandle::ClonePtr, _archiveHandle::connCancel, ConnectDatabaseAhx(), _archiveHandle::connection, _restoreOptions::cparams, _archiveHandle::currSchema, _archiveHandle::currTableAm, _archiveHandle::currTablespace, _archiveHandle::currUser, _archiveHandle::lo_buf, _archiveHandle::mode, Archive::n_errors, pg_malloc(), pg_strdup(), _archiveHandle::public, Archive::ropt, _archiveHandle::savedPassword, _archiveHandle::sqlparse, and _restoreOptions::txn_size.

Referenced by RunWorker().

◆ DeCloneArchive()

void DeCloneArchive ( ArchiveHandle AH)

Definition at line 5175 of file pg_backup_archiver.c.

5176{
5177 /* Should not have an open database connection */
5178 Assert(AH->connection == NULL);
5179
5180 /* Clear format-specific state */
5181 AH->DeClonePtr(AH);
5182
5183 /* Clear state allocated by CloneArchive */
5184 if (AH->sqlparse.curCmd)
5186
5187 /* Clear any connection-local state */
5188 free(AH->currUser);
5189 free(AH->currSchema);
5190 free(AH->currTablespace);
5191 free(AH->currTableAm);
5192 free(AH->savedPassword);
5193
5194 free(AH);
5195}
#define free(a)
Definition: header.h:65
void destroyPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:114
DeClonePtrType DeClonePtr
PQExpBuffer curCmd

References Assert(), _archiveHandle::connection, sqlparseInfo::curCmd, _archiveHandle::currSchema, _archiveHandle::currTableAm, _archiveHandle::currTablespace, _archiveHandle::currUser, _archiveHandle::DeClonePtr, destroyPQExpBuffer(), free, _archiveHandle::savedPassword, and _archiveHandle::sqlparse.

Referenced by RunWorker().

◆ DropLOIfExists()

void DropLOIfExists ( ArchiveHandle AH,
Oid  oid 
)

Definition at line 612 of file pg_backup_db.c.

613{
614 ahprintf(AH,
615 "SELECT pg_catalog.lo_unlink(oid) "
616 "FROM pg_catalog.pg_largeobject_metadata "
617 "WHERE oid = '%u';\n",
618 oid);
619}
int ahprintf(ArchiveHandle *AH, const char *fmt,...)

References ahprintf().

Referenced by _StartLO(), RestoreArchive(), and StartRestoreLO().

◆ EndRestoreLO()

void EndRestoreLO ( ArchiveHandle AH,
Oid  oid 
)

Definition at line 1528 of file pg_backup_archiver.c.

1529{
1530 if (AH->lo_buf_used > 0)
1531 {
1532 /* Write remaining bytes from the LO buffer */
1533 dump_lo_buf(AH);
1534 }
1535
1536 AH->writingLO = false;
1537
1538 if (AH->connection)
1539 {
1540 lo_close(AH->connection, AH->loFd);
1541 AH->loFd = -1;
1542 }
1543 else
1544 {
1545 ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
1546 }
1547}
int lo_close(PGconn *conn, int fd)
Definition: fe-lobj.c:96

References ahprintf(), _archiveHandle::connection, dump_lo_buf(), _archiveHandle::lo_buf_used, lo_close(), _archiveHandle::loFd, and _archiveHandle::writingLO.

Referenced by _LoadLOs().

◆ EndRestoreLOs()

void EndRestoreLOs ( ArchiveHandle AH)

Definition at line 1455 of file pg_backup_archiver.c.

1456{
1457 RestoreOptions *ropt = AH->public.ropt;
1458
1459 if (!(ropt->single_txn || ropt->txn_size > 0))
1460 {
1461 if (AH->connection)
1463 else
1464 ahprintf(AH, "COMMIT;\n\n");
1465 }
1466
1467 pg_log_info(ngettext("restored %d large object",
1468 "restored %d large objects",
1469 AH->loCount),
1470 AH->loCount);
1471}
#define ngettext(s, p, n)
Definition: c.h:1152
#define pg_log_info(...)
Definition: logging.h:124
static void CommitTransaction(void)
Definition: xact.c:2228

References ahprintf(), CommitTransaction(), _archiveHandle::connection, _archiveHandle::loCount, ngettext, pg_log_info, _archiveHandle::public, Archive::ropt, _restoreOptions::single_txn, and _restoreOptions::txn_size.

Referenced by _LoadLOs().

◆ getTocEntryByDumpId()

TocEntry * getTocEntryByDumpId ( ArchiveHandle AH,
DumpId  id 
)

Definition at line 2014 of file pg_backup_archiver.c.

2015{
2016 /* build index arrays if we didn't already */
2017 if (AH->tocsByDumpId == NULL)
2019
2020 if (id > 0 && id <= AH->maxDumpId)
2021 return AH->tocsByDumpId[id];
2022
2023 return NULL;
2024}
static void buildTocEntryArrays(ArchiveHandle *AH)
struct _tocEntry ** tocsByDumpId

References buildTocEntryArrays(), and _archiveHandle::tocsByDumpId.

Referenced by _PrintTocData(), _tocEntryRequired(), IssueACLPerBlob(), parseWorkerCommand(), SortTocFromFile(), and TocIDRequired().

◆ InitArchiveFmt_Custom()

void InitArchiveFmt_Custom ( ArchiveHandle AH)

Definition at line 105 of file pg_backup_custom.c.

106{
107 lclContext *ctx;
108
109 /* Assuming static functions, this can be copied for each format. */
113 AH->EndDataPtr = _EndData;
117 AH->ReadBufPtr = _ReadBuf;
124
126 AH->StartLOPtr = _StartLO;
127 AH->EndLOPtr = _EndLO;
128 AH->EndLOsPtr = _EndLOs;
129
131 AH->ClonePtr = _Clone;
132 AH->DeClonePtr = _DeClone;
133
134 /* no parallel dump in the custom archive, only parallel restore */
135 AH->WorkerJobDumpPtr = NULL;
137
138 /* Set up a private area. */
139 ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
140 AH->formatData = ctx;
141
142 /*
143 * Now open the file
144 */
145 if (AH->mode == archModeWrite)
146 {
147 if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
148 {
149 AH->FH = fopen(AH->fSpec, PG_BINARY_W);
150 if (!AH->FH)
151 pg_fatal("could not open output file \"%s\": %m", AH->fSpec);
152 }
153 else
154 {
155 AH->FH = stdout;
156 if (!AH->FH)
157 pg_fatal("could not open output file: %m");
158 }
159
160 ctx->hasSeek = checkSeek(AH->FH);
161 }
162 else
163 {
164 if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
165 {
166 AH->FH = fopen(AH->fSpec, PG_BINARY_R);
167 if (!AH->FH)
168 pg_fatal("could not open input file \"%s\": %m", AH->fSpec);
169 }
170 else
171 {
172 AH->FH = stdin;
173 if (!AH->FH)
174 pg_fatal("could not open input file: %m");
175 }
176
177 ctx->hasSeek = checkSeek(AH->FH);
178
179 ReadHead(AH);
180 ReadToc(AH);
181
182 /*
183 * Remember location of first data block (i.e., the point after TOC)
184 * in case we have to search for desired data blocks.
185 */
186 ctx->lastFilePos = _getFilePos(AH, ctx);
187 }
188}
#define PG_BINARY_R
Definition: c.h:1246
#define PG_BINARY_W
Definition: c.h:1247
@ archModeWrite
Definition: pg_backup.h:51
bool checkSeek(FILE *fp)
void ReadHead(ArchiveHandle *AH)
void ReadToc(ArchiveHandle *AH)
static void _PrintTocData(ArchiveHandle *AH, TocEntry *te)
static void _StartData(ArchiveHandle *AH, TocEntry *te)
static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
static void _CloseArchive(ArchiveHandle *AH)
static pgoff_t _getFilePos(ArchiveHandle *AH, lclContext *ctx)
static void _DeClone(ArchiveHandle *AH)
static void _ReopenArchive(ArchiveHandle *AH)
static void _StartLOs(ArchiveHandle *AH, TocEntry *te)
static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static void _EndLOs(ArchiveHandle *AH, TocEntry *te)
static int _WriteByte(ArchiveHandle *AH, const int i)
static void _PrepParallelRestore(ArchiveHandle *AH)
static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static int _ReadByte(ArchiveHandle *AH)
static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
static void _EndData(ArchiveHandle *AH, TocEntry *te)
static int _WorkerJobRestoreCustom(ArchiveHandle *AH, TocEntry *te)
static void _Clone(ArchiveHandle *AH)
static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
EndLOsPtrType EndLOsPtr
ReadExtraTocPtrType ReadExtraTocPtr
WorkerJobDumpPtrType WorkerJobDumpPtr
StartLOsPtrType StartLOsPtr
WriteDataPtrType WriteDataPtr
StartLOPtrType StartLOPtr
WriteBufPtrType WriteBufPtr
PrepParallelRestorePtrType PrepParallelRestorePtr
EndLOPtrType EndLOPtr
WriteExtraTocPtrType WriteExtraTocPtr
ReadBytePtrType ReadBytePtr
WorkerJobRestorePtrType WorkerJobRestorePtr
PrintTocDataPtrType PrintTocDataPtr
WriteBytePtrType WriteBytePtr
ReadBufPtrType ReadBufPtr
PrintExtraTocPtrType PrintExtraTocPtr
StartDataPtrType StartDataPtr
ReopenPtrType ReopenPtr
EndDataPtrType EndDataPtr
ClosePtrType ClosePtr
pgoff_t lastFilePos

References _ArchiveEntry(), _Clone(), _CloseArchive(), _DeClone(), _EndData(), _EndLO(), _EndLOs(), _getFilePos(), _PrepParallelRestore(), _PrintExtraToc(), _PrintTocData(), _ReadBuf(), _ReadByte(), _ReadExtraToc(), _ReopenArchive(), _StartData(), _StartLO(), _StartLOs(), _WorkerJobRestoreCustom(), _WriteBuf(), _WriteByte(), _WriteData(), _WriteExtraToc(), _archiveHandle::ArchiveEntryPtr, archModeWrite, checkSeek(), _archiveHandle::ClonePtr, _archiveHandle::ClosePtr, _archiveHandle::DeClonePtr, _archiveHandle::EndDataPtr, _archiveHandle::EndLOPtr, _archiveHandle::EndLOsPtr, _archiveHandle::FH, _archiveHandle::formatData, _archiveHandle::fSpec, lclContext::hasSeek, lclContext::lastFilePos, _archiveHandle::mode, PG_BINARY_R, PG_BINARY_W, pg_fatal, pg_malloc0(), _archiveHandle::PrepParallelRestorePtr, _archiveHandle::PrintExtraTocPtr, _archiveHandle::PrintTocDataPtr, _archiveHandle::ReadBufPtr, _archiveHandle::ReadBytePtr, _archiveHandle::ReadExtraTocPtr, ReadHead(), ReadToc(), _archiveHandle::ReopenPtr, _archiveHandle::StartDataPtr, _archiveHandle::StartLOPtr, _archiveHandle::StartLOsPtr, generate_unaccent_rules::stdout, _archiveHandle::WorkerJobDumpPtr, _archiveHandle::WorkerJobRestorePtr, _archiveHandle::WriteBufPtr, _archiveHandle::WriteBytePtr, _archiveHandle::WriteDataPtr, and _archiveHandle::WriteExtraTocPtr.

Referenced by _allocAH().

◆ InitArchiveFmt_Directory()

void InitArchiveFmt_Directory ( ArchiveHandle AH)

Definition at line 110 of file pg_backup_directory.c.

111{
112 lclContext *ctx;
113
114 /* Assuming static functions, this can be copied for each format. */
118 AH->EndDataPtr = _EndData;
122 AH->ReadBufPtr = _ReadBuf;
129
131 AH->StartLOPtr = _StartLO;
132 AH->EndLOPtr = _EndLO;
133 AH->EndLOsPtr = _EndLOs;
134
136 AH->ClonePtr = _Clone;
137 AH->DeClonePtr = _DeClone;
138
141
142 /* Set up our private context */
143 ctx = (lclContext *) pg_malloc0(sizeof(lclContext));
144 AH->formatData = ctx;
145
146 ctx->dataFH = NULL;
147 ctx->LOsTocFH = NULL;
148
149 /*
150 * Now open the TOC file
151 */
152
153 if (!AH->fSpec || strcmp(AH->fSpec, "") == 0)
154 pg_fatal("no output directory specified");
155
156 ctx->directory = AH->fSpec;
157
158 if (AH->mode == archModeWrite)
159 {
160 /* we accept an empty existing directory */
162 }
163 else
164 { /* Read Mode */
165 char fname[MAXPGPATH];
166 CompressFileHandle *tocFH;
167
168 setFilePath(AH, fname, "toc.dat");
169
171 if (tocFH == NULL)
172 pg_fatal("could not open input file \"%s\": %m", fname);
173
174 ctx->dataFH = tocFH;
175
176 /*
177 * The TOC of a directory format dump shares the format code of the
178 * tar format.
179 */
180 AH->format = archTar;
181 ReadHead(AH);
182 AH->format = archDirectory;
183 ReadToc(AH);
184
185 /* Nothing else in the file, so close it again... */
186 if (!EndCompressFileHandle(tocFH))
187 pg_fatal("could not close TOC file: %m");
188 ctx->dataFH = NULL;
189 }
190}
bool EndCompressFileHandle(CompressFileHandle *CFH)
Definition: compress_io.c:288
CompressFileHandle * InitDiscoverCompressFileHandle(const char *path, const char *mode)
Definition: compress_io.c:240
void create_or_open_dir(const char *dirname)
Definition: dumputils.c:897
@ archTar
Definition: pg_backup.h:43
@ archDirectory
Definition: pg_backup.h:45
static void _PrintTocData(ArchiveHandle *AH, TocEntry *te)
static void _StartData(ArchiveHandle *AH, TocEntry *te)
static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
static void _CloseArchive(ArchiveHandle *AH)
static void _DeClone(ArchiveHandle *AH)
static void _ReopenArchive(ArchiveHandle *AH)
static void _StartLOs(ArchiveHandle *AH, TocEntry *te)
static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static void _EndLOs(ArchiveHandle *AH, TocEntry *te)
static int _WriteByte(ArchiveHandle *AH, const int i)
static void _PrepParallelRestore(ArchiveHandle *AH)
static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static int _ReadByte(ArchiveHandle *AH)
static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
static void _EndData(ArchiveHandle *AH, TocEntry *te)
static void _Clone(ArchiveHandle *AH)
static int _WorkerJobRestoreDirectory(ArchiveHandle *AH, TocEntry *te)
static void setFilePath(ArchiveHandle *AH, char *buf, const char *relativeFilename)
static int _WorkerJobDumpDirectory(ArchiveHandle *AH, TocEntry *te)
static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
#define MAXPGPATH
ArchiveFormat format
CompressFileHandle * LOsTocFH
CompressFileHandle * dataFH

References _ArchiveEntry(), _Clone(), _CloseArchive(), _DeClone(), _EndData(), _EndLO(), _EndLOs(), _PrepParallelRestore(), _PrintExtraToc(), _PrintTocData(), _ReadBuf(), _ReadByte(), _ReadExtraToc(), _ReopenArchive(), _StartData(), _StartLO(), _StartLOs(), _WorkerJobDumpDirectory(), _WorkerJobRestoreDirectory(), _WriteBuf(), _WriteByte(), _WriteData(), _WriteExtraToc(), archDirectory, _archiveHandle::ArchiveEntryPtr, archModeWrite, archTar, _archiveHandle::ClonePtr, _archiveHandle::ClosePtr, create_or_open_dir(), lclContext::dataFH, _archiveHandle::DeClonePtr, lclContext::directory, EndCompressFileHandle(), _archiveHandle::EndDataPtr, _archiveHandle::EndLOPtr, _archiveHandle::EndLOsPtr, _archiveHandle::format, _archiveHandle::formatData, _archiveHandle::fSpec, InitDiscoverCompressFileHandle(), lclContext::LOsTocFH, MAXPGPATH, _archiveHandle::mode, PG_BINARY_R, pg_fatal, pg_malloc0(), _archiveHandle::PrepParallelRestorePtr, _archiveHandle::PrintExtraTocPtr, _archiveHandle::PrintTocDataPtr, _archiveHandle::ReadBufPtr, _archiveHandle::ReadBytePtr, _archiveHandle::ReadExtraTocPtr, ReadHead(), ReadToc(), _archiveHandle::ReopenPtr, setFilePath(), _archiveHandle::StartDataPtr, _archiveHandle::StartLOPtr, _archiveHandle::StartLOsPtr, _archiveHandle::WorkerJobDumpPtr, _archiveHandle::WorkerJobRestorePtr, _archiveHandle::WriteBufPtr, _archiveHandle::WriteBytePtr, _archiveHandle::WriteDataPtr, and _archiveHandle::WriteExtraTocPtr.

Referenced by _allocAH().

◆ InitArchiveFmt_Null()

void InitArchiveFmt_Null ( ArchiveHandle AH)

Definition at line 48 of file pg_backup_null.c.

49{
50 /* Assuming static functions, this can be copied for each format. */
52 AH->EndDataPtr = _EndData;
56 AH->ReopenPtr = NULL;
58
60 AH->StartLOPtr = _StartLO;
61 AH->EndLOPtr = _EndLO;
62 AH->EndLOsPtr = _EndLOs;
63 AH->ClonePtr = NULL;
64 AH->DeClonePtr = NULL;
65
66 /*
67 * Now prevent reading...
68 */
69 if (AH->mode == archModeRead)
70 pg_fatal("this format cannot be read");
71}
static void _PrintTocData(ArchiveHandle *AH, TocEntry *te)
static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
static void _CloseArchive(ArchiveHandle *AH)
static void _StartLOs(ArchiveHandle *AH, TocEntry *te)
static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static void _EndLOs(ArchiveHandle *AH, TocEntry *te)
static int _WriteByte(ArchiveHandle *AH, const int i)
static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static void _EndData(ArchiveHandle *AH, TocEntry *te)
static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)

References _CloseArchive(), _EndData(), _EndLO(), _EndLOs(), _PrintTocData(), _StartLO(), _StartLOs(), _WriteBuf(), _WriteByte(), _WriteData(), archModeRead, _archiveHandle::ClonePtr, _archiveHandle::ClosePtr, _archiveHandle::DeClonePtr, _archiveHandle::EndDataPtr, _archiveHandle::EndLOPtr, _archiveHandle::EndLOsPtr, _archiveHandle::mode, pg_fatal, _archiveHandle::PrintTocDataPtr, _archiveHandle::ReopenPtr, _archiveHandle::StartLOPtr, _archiveHandle::StartLOsPtr, _archiveHandle::WriteBufPtr, _archiveHandle::WriteBytePtr, and _archiveHandle::WriteDataPtr.

Referenced by _allocAH().

◆ InitArchiveFmt_Tar()

void InitArchiveFmt_Tar ( ArchiveHandle AH)

Definition at line 121 of file pg_backup_tar.c.

122{
123 lclContext *ctx;
124
125 /* Assuming static functions, this can be copied for each format. */
129 AH->EndDataPtr = _EndData;
133 AH->ReadBufPtr = _ReadBuf;
135 AH->ReopenPtr = NULL;
140
142 AH->StartLOPtr = _StartLO;
143 AH->EndLOPtr = _EndLO;
144 AH->EndLOsPtr = _EndLOs;
145 AH->ClonePtr = NULL;
146 AH->DeClonePtr = NULL;
147
148 AH->WorkerJobDumpPtr = NULL;
149 AH->WorkerJobRestorePtr = NULL;
150
151 /*
152 * Set up some special context used in compressing data.
153 */
155 AH->formatData = ctx;
156 ctx->filePos = 0;
157 ctx->isSpecialScript = 0;
158
159 /*
160 * Now open the tar file, and load the TOC if we're in read mode.
161 */
162 if (AH->mode == archModeWrite)
163 {
164 if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
165 {
166 ctx->tarFH = fopen(AH->fSpec, PG_BINARY_W);
167 if (ctx->tarFH == NULL)
168 pg_fatal("could not open TOC file \"%s\" for output: %m",
169 AH->fSpec);
170 }
171 else
172 {
173 ctx->tarFH = stdout;
174 if (ctx->tarFH == NULL)
175 pg_fatal("could not open TOC file for output: %m");
176 }
177
178 ctx->tarFHpos = 0;
179
180 /*
181 * Make unbuffered since we will dup() it, and the buffers screw each
182 * other
183 */
184 /* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */
185
186 ctx->hasSeek = checkSeek(ctx->tarFH);
187
188 /*
189 * We don't support compression because reading the files back is not
190 * possible since gzdopen uses buffered IO which totally screws file
191 * positioning.
192 */
194 pg_fatal("compression is not supported by tar archive format");
195 }
196 else
197 { /* Read Mode */
198 if (AH->fSpec && strcmp(AH->fSpec, "") != 0)
199 {
200 ctx->tarFH = fopen(AH->fSpec, PG_BINARY_R);
201 if (ctx->tarFH == NULL)
202 pg_fatal("could not open TOC file \"%s\" for input: %m",
203 AH->fSpec);
204 }
205 else
206 {
207 ctx->tarFH = stdin;
208 if (ctx->tarFH == NULL)
209 pg_fatal("could not open TOC file for input: %m");
210 }
211
212 /*
213 * Make unbuffered since we will dup() it, and the buffers screw each
214 * other
215 */
216 /* setvbuf(ctx->tarFH, NULL, _IONBF, 0); */
217
218 ctx->tarFHpos = 0;
219
220 ctx->hasSeek = checkSeek(ctx->tarFH);
221
222 ctx->FH = tarOpen(AH, "toc.dat", 'r');
223 ReadHead(AH);
224 ReadToc(AH);
225 tarClose(AH, ctx->FH); /* Nothing else in the file... */
226 }
227}
@ PG_COMPRESSION_NONE
Definition: compression.h:23
#define pg_malloc0_object(type)
Definition: fe_memutils.h:51
static void _PrintTocData(ArchiveHandle *AH, TocEntry *te)
static void _StartData(ArchiveHandle *AH, TocEntry *te)
static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
static void _CloseArchive(ArchiveHandle *AH)
static void _StartLOs(ArchiveHandle *AH, TocEntry *te)
static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static void _EndLOs(ArchiveHandle *AH, TocEntry *te)
static int _WriteByte(ArchiveHandle *AH, const int i)
static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid)
static int _ReadByte(ArchiveHandle *AH)
static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
static void _ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
static TAR_MEMBER * tarOpen(ArchiveHandle *AH, const char *filename, char mode)
static void _EndData(ArchiveHandle *AH, TocEntry *te)
static void _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
static void tarClose(ArchiveHandle *AH, TAR_MEMBER *th)
pg_compress_specification compression_spec
FILE * tarFH
Definition: pg_backup_tar.c:83
pgoff_t filePos
Definition: pg_backup_tar.c:81
pgoff_t tarFHpos
Definition: pg_backup_tar.c:84
TAR_MEMBER * FH
Definition: pg_backup_tar.c:86
int isSpecialScript
Definition: pg_backup_tar.c:87
pg_compress_algorithm algorithm
Definition: compression.h:34

References _ArchiveEntry(), _CloseArchive(), _EndData(), _EndLO(), _EndLOs(), _PrintExtraToc(), _PrintTocData(), _ReadBuf(), _ReadByte(), _ReadExtraToc(), _StartData(), _StartLO(), _StartLOs(), _WriteBuf(), _WriteByte(), _WriteData(), _WriteExtraToc(), archModeWrite, checkSeek(), lclContext::FH, lclContext::filePos, lclContext::hasSeek, lclContext::isSpecialScript, PG_BINARY_R, PG_BINARY_W, PG_COMPRESSION_NONE, pg_fatal, pg_malloc0_object, ReadHead(), ReadToc(), generate_unaccent_rules::stdout, tarClose(), lclContext::tarFH, lclContext::tarFHpos, and tarOpen().

Referenced by _allocAH().

◆ IssueACLPerBlob()

void IssueACLPerBlob ( ArchiveHandle AH,
TocEntry te 
)

Definition at line 538 of file pg_backup_db.c.

539{
540 TocEntry *blobte = getTocEntryByDumpId(AH, te->dependencies[0]);
541 char *buf;
542 char *st;
543 char *st2;
544 char *en;
545 bool inquotes;
546
547 if (!blobte)
548 pg_fatal("could not find entry for ID %d", te->dependencies[0]);
549 Assert(strcmp(blobte->desc, "BLOB METADATA") == 0);
550
551 /* Make a writable copy of the ACL commands string */
552 buf = pg_strdup(te->defn);
553
554 /*
555 * We have to parse out the commands sufficiently to locate the blob OIDs
556 * and find the command-ending semicolons. The commands should not
557 * contain anything hard to parse except for double-quoted role names,
558 * which are easy to ignore. Once we've split apart the first and second
559 * halves of a command, apply IssueCommandPerBlob. (This means the
560 * updates on the blobs are interleaved if there's multiple commands, but
561 * that should cause no trouble.)
562 */
563 inquotes = false;
564 st = en = buf;
565 st2 = NULL;
566 while (*en)
567 {
568 /* Ignore double-quoted material */
569 if (*en == '"')
570 inquotes = !inquotes;
571 if (inquotes)
572 {
573 en++;
574 continue;
575 }
576 /* If we found "LARGE OBJECT", that's the end of the first half */
577 if (strncmp(en, "LARGE OBJECT ", 13) == 0)
578 {
579 /* Terminate the first-half string */
580 en += 13;
581 Assert(isdigit((unsigned char) *en));
582 *en++ = '\0';
583 /* Skip the rest of the blob OID */
584 while (isdigit((unsigned char) *en))
585 en++;
586 /* Second half starts here */
587 Assert(st2 == NULL);
588 st2 = en;
589 }
590 /* If we found semicolon, that's the end of the second half */
591 else if (*en == ';')
592 {
593 /* Terminate the second-half string */
594 *en++ = '\0';
595 Assert(st2 != NULL);
596 /* Issue this command for each blob */
597 IssueCommandPerBlob(AH, blobte, st, st2);
598 /* For neatness, skip whitespace before the next command */
599 while (isspace((unsigned char) *en))
600 en++;
601 /* Reset for new command */
602 st = en;
603 st2 = NULL;
604 }
605 else
606 en++;
607 }
608 pg_free(buf);
609}
void pg_free(void *ptr)
Definition: fe_memutils.c:105
TocEntry * getTocEntryByDumpId(ArchiveHandle *AH, DumpId id)
void IssueCommandPerBlob(ArchiveHandle *AH, TocEntry *te, const char *cmdBegin, const char *cmdEnd)
Definition: pg_backup_db.c:491
static char * buf
Definition: pg_test_fsync.c:72

References Assert(), buf, _tocEntry::defn, _tocEntry::dependencies, _tocEntry::desc, getTocEntryByDumpId(), IssueCommandPerBlob(), pg_fatal, pg_free(), and pg_strdup().

Referenced by _printTocEntry().

◆ IssueCommandPerBlob()

void IssueCommandPerBlob ( ArchiveHandle AH,
TocEntry te,
const char *  cmdBegin,
const char *  cmdEnd 
)

Definition at line 491 of file pg_backup_db.c.

493{
494 /* Make a writable copy of the command string */
495 char *buf = pg_strdup(te->defn);
496 RestoreOptions *ropt = AH->public.ropt;
497 char *st;
498 char *en;
499
500 st = buf;
501 while ((en = strchr(st, '\n')) != NULL)
502 {
503 *en++ = '\0';
504 ahprintf(AH, "%s%s%s;\n", cmdBegin, st, cmdEnd);
505
506 /* In --transaction-size mode, count each command as an action */
507 if (ropt && ropt->txn_size > 0)
508 {
509 if (++AH->txnCount >= ropt->txn_size)
510 {
511 if (AH->connection)
512 {
515 }
516 else
517 ahprintf(AH, "COMMIT;\nBEGIN;\n\n");
518 AH->txnCount = 0;
519 }
520 }
521
522 st = en;
523 }
524 ahprintf(AH, "\n");
525 pg_free(buf);
526}
void StartTransaction(Archive *AHX)
Definition: pg_backup_db.c:468
void CommitTransaction(Archive *AHX)
Definition: pg_backup_db.c:476

References ahprintf(), buf, CommitTransaction(), _archiveHandle::connection, _tocEntry::defn, pg_free(), pg_strdup(), _archiveHandle::public, Archive::ropt, StartTransaction(), _restoreOptions::txn_size, and _archiveHandle::txnCount.

Referenced by _printTocEntry(), IssueACLPerBlob(), and RestoreArchive().

◆ isValidTarHeader()

bool isValidTarHeader ( char *  header)

Definition at line 988 of file pg_backup_tar.c.

989{
990 int sum;
991 int chk = tarChecksum(header);
992
993 sum = read_tar_number(&header[TAR_OFFSET_CHECKSUM], 8);
994
995 if (sum != chk)
996 return false;
997
998 /* POSIX tar format */
999 if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar\0", 6) == 0 &&
1000 memcmp(&header[TAR_OFFSET_VERSION], "00", 2) == 0)
1001 return true;
1002 /* GNU tar format */
1003 if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar \0", 8) == 0)
1004 return true;
1005 /* not-quite-POSIX format written by pre-9.3 pg_dump */
1006 if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar00\0", 8) == 0)
1007 return true;
1008
1009 return false;
1010}
uint64 read_tar_number(const char *s, int len)
Definition: tar.c:58
int tarChecksum(char *header)
Definition: tar.c:90
@ TAR_OFFSET_VERSION
Definition: pgtar.h:49
@ TAR_OFFSET_CHECKSUM
Definition: pgtar.h:45
@ TAR_OFFSET_MAGIC
Definition: pgtar.h:48

References read_tar_number(), TAR_OFFSET_CHECKSUM, TAR_OFFSET_MAGIC, TAR_OFFSET_VERSION, and tarChecksum().

Referenced by _discoverArchiveFormat().

◆ on_exit_close_archive()

void on_exit_close_archive ( Archive AHX)

Definition at line 330 of file parallel.c.

331{
332 shutdown_info.AHX = AHX;
334}
static void archive_close_connection(int code, void *arg)
Definition: parallel.c:351
static ShutdownInformation shutdown_info
Definition: parallel.c:154
void on_exit_nicely(on_exit_nicely_callback function, void *arg)

References ShutdownInformation::AHX, archive_close_connection(), on_exit_nicely(), and shutdown_info.

Referenced by main(), and restore_one_database().

◆ parallel_restore()

int parallel_restore ( ArchiveHandle AH,
TocEntry te 
)

Definition at line 4744 of file pg_backup_archiver.c.

4745{
4746 int status;
4747
4748 Assert(AH->connection != NULL);
4749
4750 /* Count only errors associated with this TOC entry */
4751 AH->public.n_errors = 0;
4752
4753 /* Restore the TOC item */
4754 status = restore_toc_entry(AH, te, true);
4755
4756 return status;
4757}
static int restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)

References Assert(), _archiveHandle::connection, Archive::n_errors, _archiveHandle::public, and restore_toc_entry().

Referenced by _WorkerJobRestoreCustom(), and _WorkerJobRestoreDirectory().

◆ ReadHead()

void ReadHead ( ArchiveHandle AH)

Definition at line 4110 of file pg_backup_archiver.c.

4111{
4112 char *errmsg;
4113 char vmaj,
4114 vmin,
4115 vrev;
4116 int fmt;
4117
4118 /*
4119 * If we haven't already read the header, do so.
4120 *
4121 * NB: this code must agree with _discoverArchiveFormat(). Maybe find a
4122 * way to unify the cases?
4123 */
4124 if (!AH->readHeader)
4125 {
4126 char tmpMag[7];
4127
4128 AH->ReadBufPtr(AH, tmpMag, 5);
4129
4130 if (strncmp(tmpMag, "PGDMP", 5) != 0)
4131 pg_fatal("did not find magic string in file header");
4132 }
4133
4134 vmaj = AH->ReadBytePtr(AH);
4135 vmin = AH->ReadBytePtr(AH);
4136
4137 if (vmaj > 1 || (vmaj == 1 && vmin > 0)) /* Version > 1.0 */
4138 vrev = AH->ReadBytePtr(AH);
4139 else
4140 vrev = 0;
4141
4142 AH->version = MAKE_ARCHIVE_VERSION(vmaj, vmin, vrev);
4143
4144 if (AH->version < K_VERS_1_0 || AH->version > K_VERS_MAX)
4145 pg_fatal("unsupported version (%d.%d) in file header",
4146 vmaj, vmin);
4147
4148 AH->intSize = AH->ReadBytePtr(AH);
4149 if (AH->intSize > 32)
4150 pg_fatal("sanity check on integer size (%lu) failed",
4151 (unsigned long) AH->intSize);
4152
4153 if (AH->intSize > sizeof(int))
4154 pg_log_warning("archive was made on a machine with larger integers, some operations might fail");
4155
4156 if (AH->version >= K_VERS_1_7)
4157 AH->offSize = AH->ReadBytePtr(AH);
4158 else
4159 AH->offSize = AH->intSize;
4160
4161 fmt = AH->ReadBytePtr(AH);
4162
4163 if (AH->format != fmt)
4164 pg_fatal("expected format (%d) differs from format found in file (%d)",
4165 AH->format, fmt);
4166
4167 if (AH->version >= K_VERS_1_15)
4169 else if (AH->version >= K_VERS_1_2)
4170 {
4171 /* Guess the compression method based on the level */
4172 if (AH->version < K_VERS_1_4)
4173 AH->compression_spec.level = AH->ReadBytePtr(AH);
4174 else
4175 AH->compression_spec.level = ReadInt(AH);
4176
4177 if (AH->compression_spec.level != 0)
4179 }
4180 else
4182
4184 if (errmsg)
4185 {
4186 pg_log_warning("archive is compressed, but this installation does not support compression (%s) -- no data will be available",
4187 errmsg);
4188 pg_free(errmsg);
4189 }
4190
4191 if (AH->version >= K_VERS_1_4)
4192 {
4193 struct tm crtm;
4194
4195 crtm.tm_sec = ReadInt(AH);
4196 crtm.tm_min = ReadInt(AH);
4197 crtm.tm_hour = ReadInt(AH);
4198 crtm.tm_mday = ReadInt(AH);
4199 crtm.tm_mon = ReadInt(AH);
4200 crtm.tm_year = ReadInt(AH);
4201 crtm.tm_isdst = ReadInt(AH);
4202
4203 /*
4204 * Newer versions of glibc have mktime() report failure if tm_isdst is
4205 * inconsistent with the prevailing timezone, e.g. tm_isdst = 1 when
4206 * TZ=UTC. This is problematic when restoring an archive under a
4207 * different timezone setting. If we get a failure, try again with
4208 * tm_isdst set to -1 ("don't know").
4209 *
4210 * XXX with or without this hack, we reconstruct createDate
4211 * incorrectly when the prevailing timezone is different from
4212 * pg_dump's. Next time we bump the archive version, we should flush
4213 * this representation and store a plain seconds-since-the-Epoch
4214 * timestamp instead.
4215 */
4216 AH->createDate = mktime(&crtm);
4217 if (AH->createDate == (time_t) -1)
4218 {
4219 crtm.tm_isdst = -1;
4220 AH->createDate = mktime(&crtm);
4221 if (AH->createDate == (time_t) -1)
4222 pg_log_warning("invalid creation date in header");
4223 }
4224 }
4225
4226 if (AH->version >= K_VERS_1_4)
4227 {
4228 AH->archdbname = ReadStr(AH);
4229 }
4230
4231 if (AH->version >= K_VERS_1_10)
4232 {
4233 AH->archiveRemoteVersion = ReadStr(AH);
4234 AH->archiveDumpVersion = ReadStr(AH);
4235 }
4236}
char * supports_compression(const pg_compress_specification compression_spec)
Definition: compress_io.c:87
@ PG_COMPRESSION_GZIP
Definition: compression.h:24
int errmsg(const char *fmt,...)
Definition: elog.c:1071
static struct pg_tm tm
Definition: localtime.c:104
char * ReadStr(ArchiveHandle *AH)
int ReadInt(ArchiveHandle *AH)
#define K_VERS_1_15
#define K_VERS_1_10
#define K_VERS_1_2
#define K_VERS_1_4
#define K_VERS_1_0
#define K_VERS_MAX
#define K_VERS_1_7
#define pg_log_warning(...)
Definition: pgfnames.c:24
int tm_sec
Definition: pgtime.h:36

References pg_compress_specification::algorithm, _archiveHandle::archdbname, _archiveHandle::archiveDumpVersion, _archiveHandle::archiveRemoteVersion, _archiveHandle::compression_spec, _archiveHandle::createDate, errmsg(), _archiveHandle::format, _archiveHandle::intSize, K_VERS_1_0, K_VERS_1_10, K_VERS_1_15, K_VERS_1_2, K_VERS_1_4, K_VERS_1_7, K_VERS_MAX, pg_compress_specification::level, MAKE_ARCHIVE_VERSION, _archiveHandle::offSize, PG_COMPRESSION_GZIP, pg_fatal, pg_free(), pg_log_warning, _archiveHandle::ReadBufPtr, _archiveHandle::ReadBytePtr, _archiveHandle::readHeader, ReadInt(), ReadStr(), supports_compression(), tm, pg_tm::tm_sec, and _archiveHandle::version.

Referenced by InitArchiveFmt_Custom(), InitArchiveFmt_Directory(), and InitArchiveFmt_Tar().

◆ ReadInt()

int ReadInt ( ArchiveHandle AH)

Definition at line 2150 of file pg_backup_archiver.c.

2151{
2152 int res = 0;
2153 int bv,
2154 b;
2155 int sign = 0; /* Default positive */
2156 int bitShift = 0;
2157
2158 if (AH->version > K_VERS_1_0)
2159 /* Read a sign byte */
2160 sign = AH->ReadBytePtr(AH);
2161
2162 for (b = 0; b < AH->intSize; b++)
2163 {
2164 bv = AH->ReadBytePtr(AH) & 0xFF;
2165 if (bv != 0)
2166 res = res + (bv << bitShift);
2167 bitShift += 8;
2168 }
2169
2170 if (sign)
2171 res = -res;
2172
2173 return res;
2174}
char sign
Definition: informix.c:693
int b
Definition: isn.c:74

References b, _archiveHandle::intSize, K_VERS_1_0, _archiveHandle::ReadBytePtr, sign, and _archiveHandle::version.

Referenced by _CustomReadFunc(), _LoadLOs(), _readBlockHeader(), _ReadExtraToc(), _skipData(), _skipLOs(), ReadHead(), ReadOffset(), ReadStr(), and ReadToc().

◆ ReadOffset()

int ReadOffset ( ArchiveHandle AH,
pgoff_t o 
)

Definition at line 2055 of file pg_backup_archiver.c.

2056{
2057 int i;
2058 int off;
2059 int offsetFlg;
2060
2061 /* Initialize to zero */
2062 *o = 0;
2063
2064 /* Check for old version */
2065 if (AH->version < K_VERS_1_7)
2066 {
2067 /* Prior versions wrote offsets using WriteInt */
2068 i = ReadInt(AH);
2069 /* -1 means not set */
2070 if (i < 0)
2071 return K_OFFSET_POS_NOT_SET;
2072 else if (i == 0)
2073 return K_OFFSET_NO_DATA;
2074
2075 /* Cast to pgoff_t because it was written as an int. */
2076 *o = (pgoff_t) i;
2077 return K_OFFSET_POS_SET;
2078 }
2079
2080 /*
2081 * Read the flag indicating the state of the data pointer. Check if valid
2082 * and die if not.
2083 *
2084 * This used to be handled by a negative or zero pointer, now we use an
2085 * extra byte specifically for the state.
2086 */
2087 offsetFlg = AH->ReadBytePtr(AH) & 0xFF;
2088
2089 switch (offsetFlg)
2090 {
2092 case K_OFFSET_NO_DATA:
2093 case K_OFFSET_POS_SET:
2094
2095 break;
2096
2097 default:
2098 pg_fatal("unexpected data offset flag %d", offsetFlg);
2099 }
2100
2101 /*
2102 * Read the bytes
2103 */
2104 for (off = 0; off < AH->offSize; off++)
2105 {
2106 if (off < sizeof(pgoff_t))
2107 *o |= ((pgoff_t) (AH->ReadBytePtr(AH))) << (off * 8);
2108 else
2109 {
2110 if (AH->ReadBytePtr(AH) != 0)
2111 pg_fatal("file offset in dump file is too large");
2112 }
2113 }
2114
2115 return offsetFlg;
2116}
int i
Definition: isn.c:77
#define K_OFFSET_NO_DATA
#define K_OFFSET_POS_NOT_SET
#define K_OFFSET_POS_SET

References i, K_OFFSET_NO_DATA, K_OFFSET_POS_NOT_SET, K_OFFSET_POS_SET, K_VERS_1_7, _archiveHandle::offSize, pg_fatal, pgoff_t, _archiveHandle::ReadBytePtr, ReadInt(), and _archiveHandle::version.

Referenced by _ReadExtraToc().

◆ ReadStr()

char * ReadStr ( ArchiveHandle AH)

Definition at line 2196 of file pg_backup_archiver.c.

2197{
2198 char *buf;
2199 int l;
2200
2201 l = ReadInt(AH);
2202 if (l < 0)
2203 buf = NULL;
2204 else
2205 {
2206 buf = (char *) pg_malloc(l + 1);
2207 AH->ReadBufPtr(AH, buf, l);
2208
2209 buf[l] = '\0';
2210 }
2211
2212 return buf;
2213}

References buf, pg_malloc(), _archiveHandle::ReadBufPtr, and ReadInt().

Referenced by _ReadExtraToc(), ReadHead(), and ReadToc().

◆ ReadToc()

void ReadToc ( ArchiveHandle AH)

Definition at line 2694 of file pg_backup_archiver.c.

2695{
2696 int i;
2697 char *tmp;
2698 DumpId *deps;
2699 int depIdx;
2700 int depSize;
2701 TocEntry *te;
2702 bool is_supported;
2703
2704 AH->tocCount = ReadInt(AH);
2705 AH->maxDumpId = 0;
2706
2707 for (i = 0; i < AH->tocCount; i++)
2708 {
2709 te = (TocEntry *) pg_malloc0(sizeof(TocEntry));
2710 te->dumpId = ReadInt(AH);
2711
2712 if (te->dumpId > AH->maxDumpId)
2713 AH->maxDumpId = te->dumpId;
2714
2715 /* Sanity check */
2716 if (te->dumpId <= 0)
2717 pg_fatal("entry ID %d out of range -- perhaps a corrupt TOC",
2718 te->dumpId);
2719
2720 te->hadDumper = ReadInt(AH);
2721
2722 if (AH->version >= K_VERS_1_8)
2723 {
2724 tmp = ReadStr(AH);
2725 sscanf(tmp, "%u", &te->catalogId.tableoid);
2726 free(tmp);
2727 }
2728 else
2730 tmp = ReadStr(AH);
2731 sscanf(tmp, "%u", &te->catalogId.oid);
2732 free(tmp);
2733
2734 te->tag = ReadStr(AH);
2735 te->desc = ReadStr(AH);
2736
2737 if (AH->version >= K_VERS_1_11)
2738 {
2739 te->section = ReadInt(AH);
2740 }
2741 else
2742 {
2743 /*
2744 * Rules for pre-8.4 archives wherein pg_dump hasn't classified
2745 * the entries into sections. This list need not cover entry
2746 * types added later than 8.4.
2747 */
2748 if (strcmp(te->desc, "COMMENT") == 0 ||
2749 strcmp(te->desc, "ACL") == 0 ||
2750 strcmp(te->desc, "ACL LANGUAGE") == 0)
2751 te->section = SECTION_NONE;
2752 else if (strcmp(te->desc, "TABLE DATA") == 0 ||
2753 strcmp(te->desc, "BLOBS") == 0 ||
2754 strcmp(te->desc, "BLOB COMMENTS") == 0)
2755 te->section = SECTION_DATA;
2756 else if (strcmp(te->desc, "CONSTRAINT") == 0 ||
2757 strcmp(te->desc, "CHECK CONSTRAINT") == 0 ||
2758 strcmp(te->desc, "FK CONSTRAINT") == 0 ||
2759 strcmp(te->desc, "INDEX") == 0 ||
2760 strcmp(te->desc, "RULE") == 0 ||
2761 strcmp(te->desc, "TRIGGER") == 0)
2763 else
2765 }
2766
2767 te->defn = ReadStr(AH);
2768 te->dropStmt = ReadStr(AH);
2769
2770 if (AH->version >= K_VERS_1_3)
2771 te->copyStmt = ReadStr(AH);
2772
2773 if (AH->version >= K_VERS_1_6)
2774 te->namespace = ReadStr(AH);
2775
2776 if (AH->version >= K_VERS_1_10)
2777 te->tablespace = ReadStr(AH);
2778
2779 if (AH->version >= K_VERS_1_14)
2780 te->tableam = ReadStr(AH);
2781
2782 if (AH->version >= K_VERS_1_16)
2783 te->relkind = ReadInt(AH);
2784
2785 te->owner = ReadStr(AH);
2786 is_supported = true;
2787 if (AH->version < K_VERS_1_9)
2788 is_supported = false;
2789 else
2790 {
2791 tmp = ReadStr(AH);
2792
2793 if (strcmp(tmp, "true") == 0)
2794 is_supported = false;
2795
2796 free(tmp);
2797 }
2798
2799 if (!is_supported)
2800 pg_log_warning("restoring tables WITH OIDS is not supported anymore");
2801
2802 /* Read TOC entry dependencies */
2803 if (AH->version >= K_VERS_1_5)
2804 {
2805 depSize = 100;
2806 deps = (DumpId *) pg_malloc(sizeof(DumpId) * depSize);
2807 depIdx = 0;
2808 for (;;)
2809 {
2810 tmp = ReadStr(AH);
2811 if (!tmp)
2812 break; /* end of list */
2813 if (depIdx >= depSize)
2814 {
2815 depSize *= 2;
2816 deps = (DumpId *) pg_realloc(deps, sizeof(DumpId) * depSize);
2817 }
2818 sscanf(tmp, "%d", &deps[depIdx]);
2819 free(tmp);
2820 depIdx++;
2821 }
2822
2823 if (depIdx > 0) /* We have a non-null entry */
2824 {
2825 deps = (DumpId *) pg_realloc(deps, sizeof(DumpId) * depIdx);
2826 te->dependencies = deps;
2827 te->nDeps = depIdx;
2828 }
2829 else
2830 {
2831 free(deps);
2832 te->dependencies = NULL;
2833 te->nDeps = 0;
2834 }
2835 }
2836 else
2837 {
2838 te->dependencies = NULL;
2839 te->nDeps = 0;
2840 }
2841 te->dataLength = 0;
2842
2843 if (AH->ReadExtraTocPtr)
2844 AH->ReadExtraTocPtr(AH, te);
2845
2846 pg_log_debug("read TOC entry %d (ID %d) for %s %s",
2847 i, te->dumpId, te->desc, te->tag);
2848
2849 /* link completed entry into TOC circular list */
2850 te->prev = AH->toc->prev;
2851 AH->toc->prev->next = te;
2852 AH->toc->prev = te;
2853 te->next = AH->toc;
2854
2855 /* special processing immediately upon read for some items */
2856 if (strcmp(te->desc, "ENCODING") == 0)
2857 processEncodingEntry(AH, te);
2858 else if (strcmp(te->desc, "STDSTRINGS") == 0)
2859 processStdStringsEntry(AH, te);
2860 else if (strcmp(te->desc, "SEARCHPATH") == 0)
2861 processSearchPathEntry(AH, te);
2862 }
2863}
void * pg_realloc(void *ptr, size_t size)
Definition: fe_memutils.c:65
#define pg_log_debug(...)
Definition: logging.h:133
@ SECTION_NONE
Definition: pg_backup.h:57
@ SECTION_POST_DATA
Definition: pg_backup.h:60
@ SECTION_PRE_DATA
Definition: pg_backup.h:58
@ SECTION_DATA
Definition: pg_backup.h:59
static void processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
static void processSearchPathEntry(ArchiveHandle *AH, TocEntry *te)
static void processStdStringsEntry(ArchiveHandle *AH, TocEntry *te)
#define K_VERS_1_14
#define K_VERS_1_5
#define K_VERS_1_6
#define K_VERS_1_8
#define K_VERS_1_11
#define K_VERS_1_9
#define K_VERS_1_16
#define K_VERS_1_3
#define InvalidOid
Definition: postgres_ext.h:35
Oid tableoid
Definition: pg_backup.h:276

References _tocEntry::catalogId, _tocEntry::copyStmt, _tocEntry::dataLength, _tocEntry::defn, _tocEntry::dependencies, _tocEntry::desc, _tocEntry::dropStmt, _tocEntry::dumpId, free, _tocEntry::hadDumper, i, InvalidOid, K_VERS_1_10, K_VERS_1_11, K_VERS_1_14, K_VERS_1_16, K_VERS_1_3, K_VERS_1_5, K_VERS_1_6, K_VERS_1_8, K_VERS_1_9, _archiveHandle::maxDumpId, _tocEntry::nDeps, _tocEntry::next, CatalogId::oid, _tocEntry::owner, pg_fatal, pg_log_debug, pg_log_warning, pg_malloc(), pg_malloc0(), pg_realloc(), _tocEntry::prev, processEncodingEntry(), processSearchPathEntry(), processStdStringsEntry(), _archiveHandle::ReadExtraTocPtr, ReadInt(), ReadStr(), _tocEntry::relkind, _tocEntry::section, SECTION_DATA, SECTION_NONE, SECTION_POST_DATA, SECTION_PRE_DATA, _tocEntry::tableam, CatalogId::tableoid, _tocEntry::tablespace, _tocEntry::tag, _archiveHandle::toc, _archiveHandle::tocCount, and _archiveHandle::version.

Referenced by InitArchiveFmt_Custom(), InitArchiveFmt_Directory(), and InitArchiveFmt_Tar().

◆ ReconnectToServer()

void ReconnectToServer ( ArchiveHandle AH,
const char *  dbname 
)

Definition at line 73 of file pg_backup_db.c.

74{
75 PGconn *oldConn = AH->connection;
76 RestoreOptions *ropt = AH->public.ropt;
77
78 /*
79 * Save the dbname, if given, in override_dbname so that it will also
80 * affect any later reconnection attempt.
81 */
82 if (dbname)
84
85 /*
86 * Note: we want to establish the new connection, and in particular update
87 * ArchiveHandle's connCancel, before closing old connection. Otherwise
88 * an ill-timed SIGINT could try to access a dead connection.
89 */
90 AH->connection = NULL; /* dodge error check in ConnectDatabaseAhx */
91
92 ConnectDatabaseAhx((Archive *) AH, &ropt->cparams, true);
93
94 PQfinish(oldConn);
95}
void PQfinish(PGconn *conn)
Definition: fe-connect.c:5296
void ConnectDatabaseAhx(Archive *AHX, const ConnParams *cparams, bool isReconnect)
Definition: pg_backup_db.c:109
char * dbname
Definition: streamutil.c:49
char * override_dbname
Definition: pg_backup.h:93

References ConnectDatabaseAhx(), _archiveHandle::connection, _restoreOptions::cparams, dbname, _connParams::override_dbname, pg_strdup(), PQfinish(), _archiveHandle::public, and Archive::ropt.

Referenced by _reconnectToDB().

◆ replace_on_exit_close_archive()

void replace_on_exit_close_archive ( Archive AHX)

Definition at line 341 of file parallel.c.

342{
343 shutdown_info.AHX = AHX;
344}

References ShutdownInformation::AHX, and shutdown_info.

Referenced by restore_one_database().

◆ StartRestoreLO()

void StartRestoreLO ( ArchiveHandle AH,
Oid  oid,
bool  drop 
)

Definition at line 1478 of file pg_backup_archiver.c.

1479{
1480 bool old_lo_style = (AH->version < K_VERS_1_12);
1481 Oid loOid;
1482
1483 AH->loCount++;
1484
1485 /* Initialize the LO Buffer */
1486 if (AH->lo_buf == NULL)
1487 {
1488 /* First time through (in this process) so allocate the buffer */
1489 AH->lo_buf_size = LOBBUFSIZE;
1491 }
1492 AH->lo_buf_used = 0;
1493
1494 pg_log_info("restoring large object with OID %u", oid);
1495
1496 /* With an old archive we must do drop and create logic here */
1497 if (old_lo_style && drop)
1498 DropLOIfExists(AH, oid);
1499
1500 if (AH->connection)
1501 {
1502 if (old_lo_style)
1503 {
1504 loOid = lo_create(AH->connection, oid);
1505 if (loOid == 0 || loOid != oid)
1506 pg_fatal("could not create large object %u: %s",
1507 oid, PQerrorMessage(AH->connection));
1508 }
1509 AH->loFd = lo_open(AH->connection, oid, INV_WRITE);
1510 if (AH->loFd == -1)
1511 pg_fatal("could not open large object %u: %s",
1512 oid, PQerrorMessage(AH->connection));
1513 }
1514 else
1515 {
1516 if (old_lo_style)
1517 ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
1518 oid, INV_WRITE);
1519 else
1520 ahprintf(AH, "SELECT pg_catalog.lo_open('%u', %d);\n",
1521 oid, INV_WRITE);
1522 }
1523
1524 AH->writingLO = true;
1525}
char * PQerrorMessage(const PGconn *conn)
Definition: fe-connect.c:7625
int lo_open(PGconn *conn, Oid lobjId, int mode)
Definition: fe-lobj.c:57
Oid lo_create(PGconn *conn, Oid lobjId)
Definition: fe-lobj.c:474
#define INV_WRITE
Definition: libpq-fs.h:21
#define LOBBUFSIZE
void DropLOIfExists(ArchiveHandle *AH, Oid oid)
Definition: pg_backup_db.c:612
#define K_VERS_1_12
unsigned int Oid
Definition: postgres_ext.h:30

References ahprintf(), _archiveHandle::connection, DropLOIfExists(), INV_WRITE, K_VERS_1_12, _archiveHandle::lo_buf, _archiveHandle::lo_buf_size, _archiveHandle::lo_buf_used, lo_create(), lo_open(), LOBBUFSIZE, _archiveHandle::loCount, _archiveHandle::loFd, pg_fatal, pg_log_info, pg_malloc(), PQerrorMessage(), _archiveHandle::version, and _archiveHandle::writingLO.

Referenced by _LoadLOs().

◆ StartRestoreLOs()

void StartRestoreLOs ( ArchiveHandle AH)

Definition at line 1431 of file pg_backup_archiver.c.

1432{
1433 RestoreOptions *ropt = AH->public.ropt;
1434
1435 /*
1436 * LOs must be restored within a transaction block, since we need the LO
1437 * handle to stay open while we write it. Establish a transaction unless
1438 * there's one being used globally.
1439 */
1440 if (!(ropt->single_txn || ropt->txn_size > 0))
1441 {
1442 if (AH->connection)
1444 else
1445 ahprintf(AH, "BEGIN;\n\n");
1446 }
1447
1448 AH->loCount = 0;
1449}
static void StartTransaction(void)
Definition: xact.c:2064

References ahprintf(), _archiveHandle::connection, _archiveHandle::loCount, _archiveHandle::public, Archive::ropt, _restoreOptions::single_txn, StartTransaction(), and _restoreOptions::txn_size.

Referenced by _LoadLOs().

◆ TocIDRequired()

int TocIDRequired ( ArchiveHandle AH,
DumpId  id 
)

Definition at line 2027 of file pg_backup_archiver.c.

2028{
2029 TocEntry *te = getTocEntryByDumpId(AH, id);
2030
2031 if (!te)
2032 return 0;
2033
2034 return te->reqs;
2035}

References getTocEntryByDumpId(), and _tocEntry::reqs.

Referenced by _tarPositionTo(), and findDumpableDependencies().

◆ warn_or_exit_horribly()

void warn_or_exit_horribly ( ArchiveHandle AH,
const char *  fmt,
  ... 
)

◆ WriteDataChunks()

void WriteDataChunks ( ArchiveHandle AH,
struct ParallelState pstate 
)

Definition at line 2482 of file pg_backup_archiver.c.

2483{
2484 TocEntry *te;
2485
2486 if (pstate && pstate->numWorkers > 1)
2487 {
2488 /*
2489 * In parallel mode, this code runs in the leader process. We
2490 * construct an array of candidate TEs, then sort it into decreasing
2491 * size order, then dispatch each TE to a data-transfer worker. By
2492 * dumping larger tables first, we avoid getting into a situation
2493 * where we're down to one job and it's big, losing parallelism.
2494 */
2495 TocEntry **tes;
2496 int ntes;
2497
2498 tes = (TocEntry **) pg_malloc(AH->tocCount * sizeof(TocEntry *));
2499 ntes = 0;
2500 for (te = AH->toc->next; te != AH->toc; te = te->next)
2501 {
2502 /* Consider only TEs with dataDumper functions ... */
2503 if (!te->dataDumper)
2504 continue;
2505 /* ... and ignore ones not enabled for dump */
2506 if ((te->reqs & REQ_DATA) == 0)
2507 continue;
2508
2509 tes[ntes++] = te;
2510 }
2511
2512 if (ntes > 1)
2513 qsort(tes, ntes, sizeof(TocEntry *), TocEntrySizeCompareQsort);
2514
2515 for (int i = 0; i < ntes; i++)
2516 DispatchJobForTocEntry(AH, pstate, tes[i], ACT_DUMP,
2517 mark_dump_job_done, NULL);
2518
2519 pg_free(tes);
2520
2521 /* Now wait for workers to finish. */
2522 WaitForWorkers(AH, pstate, WFW_ALL_IDLE);
2523 }
2524 else
2525 {
2526 /* Non-parallel mode: just dump all candidate TEs sequentially. */
2527 for (te = AH->toc->next; te != AH->toc; te = te->next)
2528 {
2529 /* Must have same filter conditions as above */
2530 if (!te->dataDumper)
2531 continue;
2532 if ((te->reqs & REQ_DATA) == 0)
2533 continue;
2534
2536 }
2537 }
2538}
void WaitForWorkers(ArchiveHandle *AH, ParallelState *pstate, WFW_WaitOption mode)
Definition: parallel.c:1463
void DispatchJobForTocEntry(ArchiveHandle *AH, ParallelState *pstate, TocEntry *te, T_Action act, ParallelCompletionPtr callback, void *callback_data)
Definition: parallel.c:1217
@ WFW_ALL_IDLE
Definition: parallel.h:35
void WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te)
static int TocEntrySizeCompareQsort(const void *p1, const void *p2)
static void mark_dump_job_done(ArchiveHandle *AH, TocEntry *te, int status, void *callback_data)
@ ACT_DUMP
#define REQ_DATA
#define qsort(a, b, c, d)
Definition: port.h:479
int numWorkers
Definition: parallel.h:57

References ACT_DUMP, _tocEntry::dataDumper, DispatchJobForTocEntry(), i, mark_dump_job_done(), _tocEntry::next, ParallelState::numWorkers, pg_free(), pg_malloc(), qsort, REQ_DATA, _tocEntry::reqs, _archiveHandle::toc, _archiveHandle::tocCount, TocEntrySizeCompareQsort(), WaitForWorkers(), WFW_ALL_IDLE, and WriteDataChunksForTocEntry().

Referenced by _CloseArchive().

◆ WriteDataChunksForTocEntry()

void WriteDataChunksForTocEntry ( ArchiveHandle AH,
TocEntry te 
)

Definition at line 2563 of file pg_backup_archiver.c.

2564{
2565 StartDataPtrType startPtr;
2566 EndDataPtrType endPtr;
2567
2568 AH->currToc = te;
2569
2570 if (strcmp(te->desc, "BLOBS") == 0)
2571 {
2572 startPtr = AH->StartLOsPtr;
2573 endPtr = AH->EndLOsPtr;
2574 }
2575 else
2576 {
2577 startPtr = AH->StartDataPtr;
2578 endPtr = AH->EndDataPtr;
2579 }
2580
2581 if (startPtr != NULL)
2582 (*startPtr) (AH, te);
2583
2584 /*
2585 * The user-provided DataDumper routine needs to call AH->WriteData
2586 */
2587 te->dataDumper((Archive *) AH, te->dataDumperArg);
2588
2589 if (endPtr != NULL)
2590 (*endPtr) (AH, te);
2591
2592 AH->currToc = NULL;
2593}
void(* EndDataPtrType)(ArchiveHandle *AH, TocEntry *te)
void(* StartDataPtrType)(ArchiveHandle *AH, TocEntry *te)
struct _tocEntry * currToc

References _archiveHandle::currToc, _tocEntry::dataDumper, _tocEntry::dataDumperArg, _tocEntry::desc, _archiveHandle::EndDataPtr, _archiveHandle::EndLOsPtr, _archiveHandle::StartDataPtr, and _archiveHandle::StartLOsPtr.

Referenced by _WorkerJobDumpDirectory(), and WriteDataChunks().

◆ WriteHead()

void WriteHead ( ArchiveHandle AH)

Definition at line 4084 of file pg_backup_archiver.c.

4085{
4086 struct tm crtm;
4087
4088 AH->WriteBufPtr(AH, "PGDMP", 5); /* Magic code */
4089 AH->WriteBytePtr(AH, ARCHIVE_MAJOR(AH->version));
4090 AH->WriteBytePtr(AH, ARCHIVE_MINOR(AH->version));
4091 AH->WriteBytePtr(AH, ARCHIVE_REV(AH->version));
4092 AH->WriteBytePtr(AH, AH->intSize);
4093 AH->WriteBytePtr(AH, AH->offSize);
4094 AH->WriteBytePtr(AH, AH->format);
4096 crtm = *localtime(&AH->createDate);
4097 WriteInt(AH, crtm.tm_sec);
4098 WriteInt(AH, crtm.tm_min);
4099 WriteInt(AH, crtm.tm_hour);
4100 WriteInt(AH, crtm.tm_mday);
4101 WriteInt(AH, crtm.tm_mon);
4102 WriteInt(AH, crtm.tm_year);
4103 WriteInt(AH, crtm.tm_isdst);
4104 WriteStr(AH, PQdb(AH->connection));
4106 WriteStr(AH, PG_VERSION);
4107}
char * PQdb(const PGconn *conn)
Definition: fe-connect.c:7453
size_t WriteInt(ArchiveHandle *AH, int i)
size_t WriteStr(ArchiveHandle *AH, const char *c)
#define ARCHIVE_MAJOR(version)
#define ARCHIVE_MINOR(version)
#define ARCHIVE_REV(version)
char * remoteVersionStr
Definition: pg_backup.h:228

References pg_compress_specification::algorithm, ARCHIVE_MAJOR, ARCHIVE_MINOR, ARCHIVE_REV, _archiveHandle::compression_spec, _archiveHandle::connection, _archiveHandle::createDate, _archiveHandle::format, _archiveHandle::intSize, _archiveHandle::offSize, PQdb(), _archiveHandle::public, Archive::remoteVersionStr, tm, _archiveHandle::version, _archiveHandle::WriteBufPtr, _archiveHandle::WriteBytePtr, WriteInt(), and WriteStr().

Referenced by _CloseArchive().

◆ WriteInt()

size_t WriteInt ( ArchiveHandle AH,
int  i 
)

Definition at line 2119 of file pg_backup_archiver.c.

2120{
2121 int b;
2122
2123 /*
2124 * This is a bit yucky, but I don't want to make the binary format very
2125 * dependent on representation, and not knowing much about it, I write out
2126 * a sign byte. If you change this, don't forget to change the file
2127 * version #, and modify ReadInt to read the new format AS WELL AS the old
2128 * formats.
2129 */
2130
2131 /* SIGN byte */
2132 if (i < 0)
2133 {
2134 AH->WriteBytePtr(AH, 1);
2135 i = -i;
2136 }
2137 else
2138 AH->WriteBytePtr(AH, 0);
2139
2140 for (b = 0; b < AH->intSize; b++)
2141 {
2142 AH->WriteBytePtr(AH, i & 0xFF);
2143 i >>= 8;
2144 }
2145
2146 return AH->intSize + 1;
2147}

References b, i, _archiveHandle::intSize, and _archiveHandle::WriteBytePtr.

Referenced by _CustomWriteFunc(), _EndData(), _EndLO(), _EndLOs(), _StartData(), _StartLO(), _StartLOs(), WriteHead(), WriteStr(), and WriteToc().

◆ WriteOffset()

size_t WriteOffset ( ArchiveHandle AH,
pgoff_t  o,
int  wasSet 
)

Definition at line 2038 of file pg_backup_archiver.c.

2039{
2040 int off;
2041
2042 /* Save the flag */
2043 AH->WriteBytePtr(AH, wasSet);
2044
2045 /* Write out pgoff_t smallest byte first, prevents endian mismatch */
2046 for (off = 0; off < sizeof(pgoff_t); off++)
2047 {
2048 AH->WriteBytePtr(AH, o & 0xFF);
2049 o >>= 8;
2050 }
2051 return sizeof(pgoff_t) + 1;
2052}

References pgoff_t, and _archiveHandle::WriteBytePtr.

Referenced by _WriteExtraToc().

◆ WriteStr()

size_t WriteStr ( ArchiveHandle AH,
const char *  c 
)

Definition at line 2177 of file pg_backup_archiver.c.

2178{
2179 size_t res;
2180
2181 if (c)
2182 {
2183 int len = strlen(c);
2184
2185 res = WriteInt(AH, len);
2186 AH->WriteBufPtr(AH, c, len);
2187 res += len;
2188 }
2189 else
2190 res = WriteInt(AH, -1);
2191
2192 return res;
2193}
const void size_t len
char * c

References len, _archiveHandle::WriteBufPtr, and WriteInt().

Referenced by _WriteExtraToc(), WriteHead(), and WriteToc().

◆ WriteToc()

void WriteToc ( ArchiveHandle AH)

Definition at line 2596 of file pg_backup_archiver.c.

2597{
2598 TocEntry *te;
2599 char workbuf[32];
2600 int tocCount;
2601 int i;
2602
2603 /* count entries that will actually be dumped */
2604 tocCount = 0;
2605 for (te = AH->toc->next; te != AH->toc; te = te->next)
2606 {
2607 if ((te->reqs & (REQ_SCHEMA | REQ_DATA | REQ_STATS | REQ_SPECIAL)) != 0)
2608 tocCount++;
2609 }
2610
2611 /* printf("%d TOC Entries to save\n", tocCount); */
2612
2613 WriteInt(AH, tocCount);
2614
2615 for (te = AH->toc->next; te != AH->toc; te = te->next)
2616 {
2617 if ((te->reqs & (REQ_SCHEMA | REQ_DATA | REQ_STATS | REQ_SPECIAL)) == 0)
2618 continue;
2619
2620 WriteInt(AH, te->dumpId);
2621 WriteInt(AH, te->dataDumper ? 1 : 0);
2622
2623 /* OID is recorded as a string for historical reasons */
2624 sprintf(workbuf, "%u", te->catalogId.tableoid);
2625 WriteStr(AH, workbuf);
2626 sprintf(workbuf, "%u", te->catalogId.oid);
2627 WriteStr(AH, workbuf);
2628
2629 WriteStr(AH, te->tag);
2630 WriteStr(AH, te->desc);
2631 WriteInt(AH, te->section);
2632
2633 if (te->defnLen)
2634 {
2635 /*
2636 * defnLen should only be set for custom format's second call to
2637 * WriteToc(), which rewrites the TOC in place to update data
2638 * offsets. Instead of calling the defnDumper a second time
2639 * (which could involve re-executing queries), just skip writing
2640 * the entry. While regenerating the definition should
2641 * theoretically produce the same result as before, it's expensive
2642 * and feels risky.
2643 *
2644 * The custom format only calls WriteToc() a second time if
2645 * fseeko() is usable (see _CloseArchive() in pg_backup_custom.c),
2646 * so we can safely use it without checking. For other formats,
2647 * we fail because one of our assumptions must no longer hold
2648 * true.
2649 *
2650 * XXX This is a layering violation, but the alternative is an
2651 * awkward and complicated callback infrastructure for this
2652 * special case. This might be worth revisiting in the future.
2653 */
2654 if (AH->format != archCustom)
2655 pg_fatal("unexpected TOC entry in WriteToc(): %d %s %s",
2656 te->dumpId, te->desc, te->tag);
2657
2658 if (fseeko(AH->FH, te->defnLen, SEEK_CUR != 0))
2659 pg_fatal("error during file seek: %m");
2660 }
2661 else if (te->defnDumper)
2662 {
2663 char *defn = te->defnDumper((Archive *) AH, te->defnDumperArg, te);
2664
2665 te->defnLen = WriteStr(AH, defn);
2666 pg_free(defn);
2667 }
2668 else
2669 WriteStr(AH, te->defn);
2670
2671 WriteStr(AH, te->dropStmt);
2672 WriteStr(AH, te->copyStmt);
2673 WriteStr(AH, te->namespace);
2674 WriteStr(AH, te->tablespace);
2675 WriteStr(AH, te->tableam);
2676 WriteInt(AH, te->relkind);
2677 WriteStr(AH, te->owner);
2678 WriteStr(AH, "false");
2679
2680 /* Dump list of dependencies */
2681 for (i = 0; i < te->nDeps; i++)
2682 {
2683 sprintf(workbuf, "%d", te->dependencies[i]);
2684 WriteStr(AH, workbuf);
2685 }
2686 WriteStr(AH, NULL); /* Terminate List */
2687
2688 if (AH->WriteExtraTocPtr)
2689 AH->WriteExtraTocPtr(AH, te);
2690 }
2691}
@ archCustom
Definition: pg_backup.h:42
#define REQ_SCHEMA
#define REQ_STATS
#define REQ_SPECIAL
#define sprintf
Definition: port.h:241

References archCustom, _tocEntry::catalogId, _tocEntry::copyStmt, _tocEntry::dataDumper, _tocEntry::defn, _tocEntry::defnDumper, _tocEntry::defnDumperArg, _tocEntry::defnLen, _tocEntry::dependencies, _tocEntry::desc, _tocEntry::dropStmt, _tocEntry::dumpId, _archiveHandle::FH, _archiveHandle::format, fseeko, i, _tocEntry::nDeps, _tocEntry::next, CatalogId::oid, _tocEntry::owner, pg_fatal, pg_free(), _tocEntry::relkind, REQ_DATA, REQ_SCHEMA, REQ_SPECIAL, REQ_STATS, _tocEntry::reqs, _tocEntry::section, sprintf, _tocEntry::tableam, CatalogId::tableoid, _tocEntry::tablespace, _tocEntry::tag, _archiveHandle::toc, _archiveHandle::WriteExtraTocPtr, WriteInt(), and WriteStr().

Referenced by _CloseArchive().