PostgreSQL Source Code git master
Loading...
Searching...
No Matches
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 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)
 
charReadStr (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)
 
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 431 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 428 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 410 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

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 { \
pg_fatal("could not read from input file: end of file"); \
pg_fatal("could not read from input file: %m"); \
} while (0)
static int fd(const char *x, int i)
static int fb(int x)

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

Definition at line 88 of file pg_backup_archiver.h.

◆ 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

◆ 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 */

◆ RestorePass

Enumerator
RESTORE_PASS_MAIN 
RESTORE_PASS_ACL 
RESTORE_PASS_POST_ACL 

Definition at line 190 of file pg_backup_archiver.h.

◆ sqlparseState

Enumerator
SQL_SCAN 
SQL_IN_SINGLE_QUOTE 
SQL_IN_DOUBLE_QUOTE 

Definition at line 142 of file pg_backup_archiver.h.

◆ 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 1850 of file pg_backup_archiver.c.

1851{
1852 int bytes_written = 0;
1853
1854 if (AH->writingLO)
1855 {
1856 size_t remaining = size * nmemb;
1857
1858 while (AH->lo_buf_used + remaining > AH->lo_buf_size)
1859 {
1860 size_t avail = AH->lo_buf_size - AH->lo_buf_used;
1861
1862 memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, avail);
1863 ptr = (const char *) ptr + avail;
1864 remaining -= avail;
1865 AH->lo_buf_used += avail;
1866 dump_lo_buf(AH);
1867 }
1868
1869 memcpy((char *) AH->lo_buf + AH->lo_buf_used, ptr, remaining);
1870 AH->lo_buf_used += remaining;
1871
1872 bytes_written = size * nmemb;
1873 }
1874 else if (AH->CustomOutPtr)
1875 bytes_written = AH->CustomOutPtr(AH, ptr, size * nmemb);
1876
1877 /*
1878 * If we're doing a restore, and it's direct to DB, and we're connected
1879 * then send it to the DB.
1880 */
1881 else if (RestoringToDB(AH))
1882 bytes_written = ExecuteSqlCommandBuf(&AH->public, (const char *) ptr, size * nmemb);
1883 else
1884 {
1886
1887 CFH->write_func(ptr, size * nmemb, CFH);
1888 bytes_written = size * nmemb;
1889 }
1890
1891 if (bytes_written != size * nmemb)
1893}
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
int remaining
Definition informix.c:692
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)
CustomOutPtrType CustomOutPtr

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

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

◆ ArchiveEntry()

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

Definition at line 1242 of file pg_backup_archiver.c.

1244{
1245 ArchiveHandle *AH = (ArchiveHandle *) AHX;
1247
1249
1250 AH->tocCount++;
1251 if (dumpId > AH->maxDumpId)
1252 AH->maxDumpId = dumpId;
1253
1254 newToc->prev = AH->toc->prev;
1255 newToc->next = AH->toc;
1256 AH->toc->prev->next = newToc;
1257 AH->toc->prev = newToc;
1258
1259 newToc->catalogId = catalogId;
1260 newToc->dumpId = dumpId;
1261 newToc->section = opts->section;
1262
1263 newToc->tag = pg_strdup(opts->tag);
1264 newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL;
1265 newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL;
1266 newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL;
1267 newToc->relkind = opts->relkind;
1268 newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL;
1269 newToc->desc = pg_strdup(opts->description);
1270 newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL;
1271 newToc->dropStmt = opts->dropStmt ? pg_strdup(opts->dropStmt) : NULL;
1272 newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL;
1273
1274 if (opts->nDeps > 0)
1275 {
1276 newToc->dependencies = pg_malloc_array(DumpId, opts->nDeps);
1277 memcpy(newToc->dependencies, opts->deps, opts->nDeps * sizeof(DumpId));
1278 newToc->nDeps = opts->nDeps;
1279 }
1280 else
1281 {
1282 newToc->dependencies = NULL;
1283 newToc->nDeps = 0;
1284 }
1285
1286 newToc->dataDumper = opts->dumpFn;
1287 newToc->dataDumperArg = opts->dumpArg;
1288 newToc->hadDumper = opts->dumpFn ? true : false;
1289
1290 newToc->defnDumper = opts->defnFn;
1291 newToc->defnDumperArg = opts->defnArg;
1292
1293 newToc->formatData = NULL;
1294 newToc->dataLength = 0;
1295
1296 if (AH->ArchiveEntryPtr != NULL)
1297 AH->ArchiveEntryPtr(AH, newToc);
1298
1299 return newToc;
1300}
char * pg_strdup(const char *in)
Definition fe_memutils.c:91
#define pg_malloc_array(type, count)
Definition fe_memutils.h:66
#define pg_malloc0_object(type)
Definition fe_memutils.h:61
return true
Definition isn.c:130
static AmcheckOptions opts
Definition pg_amcheck.c:112
int DumpId
Definition pg_backup.h:285
struct _tocEntry * toc
ArchiveEntryPtrType ArchiveEntryPtr
struct _tocEntry * prev
CatalogId catalogId
struct _tocEntry * next

References _archiveHandle::ArchiveEntryPtr, _tocEntry::catalogId, fb(), _archiveHandle::maxDumpId, memcpy(), _tocEntry::next, opts, pg_malloc0_object, pg_malloc_array, pg_strdup(), _tocEntry::prev, _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(), dumpStatisticsExtStats(), dumpStdStrings(), dumpSubscription(), dumpSubscriptionTable(), dumpTableAttach(), dumpTableComment(), dumpTableData(), dumpTableSchema(), dumpTableSecLabel(), dumpTransform(), dumpTrigger(), dumpTSConfig(), dumpTSDictionary(), dumpTSParser(), dumpTSTemplate(), dumpUndefinedType(), dumpUserMappings(), and refreshMatViewData().

◆ checkSeek()

bool checkSeek ( FILE fp)
extern

Definition at line 4315 of file pg_backup_archiver.c.

4316{
4317 pgoff_t tpos;
4318
4319 /* Check that ftello works on this file */
4320 tpos = ftello(fp);
4321 if (tpos < 0)
4322 return false;
4323
4324 /*
4325 * Check that fseeko(SEEK_SET) works, too. NB: we used to try to test
4326 * this with fseeko(fp, 0, SEEK_CUR). But some platforms treat that as a
4327 * successful no-op even on files that are otherwise unseekable.
4328 */
4329 if (fseeko(fp, tpos, SEEK_SET) != 0)
4330 return false;
4331
4332 return true;
4333}
off_t pgoff_t
Definition port.h:422
#define ftello(stream)
Definition win32_port.h:209
#define fseeko(stream, offset, origin)
Definition win32_port.h:206

References fb(), fseeko, and ftello.

Referenced by InitArchiveFmt_Custom(), and InitArchiveFmt_Tar().

◆ CloneArchive()

ArchiveHandle * CloneArchive ( ArchiveHandle AH)
extern

Definition at line 5182 of file pg_backup_archiver.c.

5183{
5185
5186 /* Make a "flat" copy */
5188 memcpy(clone, AH, sizeof(ArchiveHandle));
5189
5190 /* Likewise flat-copy the RestoreOptions, so we can alter them locally */
5191 clone->public.ropt = pg_malloc_object(RestoreOptions);
5192 memcpy(clone->public.ropt, AH->public.ropt, sizeof(RestoreOptions));
5193
5194 /* Handle format-independent fields */
5195 memset(&(clone->sqlparse), 0, sizeof(clone->sqlparse));
5196
5197 /* The clone will have its own connection, so disregard connection state */
5198 clone->connection = NULL;
5199 clone->connCancel = NULL;
5200 clone->currUser = NULL;
5201 clone->currSchema = NULL;
5202 clone->currTableAm = NULL;
5203 clone->currTablespace = NULL;
5204
5205 /* savedPassword must be local in case we change it while connecting */
5206 if (clone->savedPassword)
5207 clone->savedPassword = pg_strdup(clone->savedPassword);
5208
5209 /* clone has its own error count, too */
5210 clone->public.n_errors = 0;
5211
5212 /* clones should not share lo_buf */
5213 clone->lo_buf = NULL;
5214
5215 /*
5216 * Clone connections disregard --transaction-size; they must commit after
5217 * each command so that the results are immediately visible to other
5218 * workers.
5219 */
5220 clone->public.ropt->txn_size = 0;
5221
5222 /*
5223 * Connect our new clone object to the database, using the same connection
5224 * parameters used for the original connection.
5225 */
5226 ConnectDatabaseAhx((Archive *) clone, &clone->public.ropt->cparams, true);
5227
5228 /* re-establish fixed state */
5229 if (AH->mode == archModeRead)
5231 /* in write case, setupDumpWorker will fix up connection state */
5232
5233 /* Let the format-specific code have a chance too */
5234 clone->ClonePtr(clone);
5235
5236 Assert(clone->connection != NULL);
5237 return clone;
5238}
#define Assert(condition)
Definition c.h:1002
#define pg_malloc_object(type)
Definition fe_memutils.h:60
void ConnectDatabaseAhx(Archive *AHX, const ConnParams *cparams, bool isReconnect)
@ archModeRead
Definition pg_backup.h:52
static void _doSetFixedOutputState(ArchiveHandle *AH)
RestoreOptions * ropt
Definition pg_backup.h:230

References _doSetFixedOutputState(), archModeRead, Assert, ConnectDatabaseAhx(), fb(), memcpy(), _archiveHandle::mode, pg_malloc_object, pg_strdup(), _archiveHandle::public, and Archive::ropt.

Referenced by RunWorker().

◆ DeCloneArchive()

void DeCloneArchive ( ArchiveHandle AH)
extern

Definition at line 5246 of file pg_backup_archiver.c.

5247{
5248 /* Should not have an open database connection */
5249 Assert(AH->connection == NULL);
5250
5251 /* Clear format-specific state */
5252 AH->DeClonePtr(AH);
5253
5254 /* Clear state allocated by CloneArchive */
5255 if (AH->sqlparse.curCmd)
5257
5258 /* Clear any connection-local state */
5259 free(AH->currUser);
5260 free(AH->currSchema);
5261 free(AH->currTablespace);
5262 free(AH->currTableAm);
5263 free(AH->savedPassword);
5264
5265 free(AH);
5266}
void destroyPQExpBuffer(PQExpBuffer str)
#define free(a)
DeClonePtrType DeClonePtr
sqlparseInfo sqlparse

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

Referenced by RunWorker().

◆ DropLOIfExists()

void DropLOIfExists ( ArchiveHandle AH,
Oid  oid 
)
extern

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 
)
extern

Definition at line 1545 of file pg_backup_archiver.c.

1546{
1547 if (AH->lo_buf_used > 0)
1548 {
1549 /* Write remaining bytes from the LO buffer */
1550 dump_lo_buf(AH);
1551 }
1552
1553 AH->writingLO = false;
1554
1555 if (AH->connection)
1556 {
1557 lo_close(AH->connection, AH->loFd);
1558 AH->loFd = -1;
1559 }
1560 else
1561 {
1562 ahprintf(AH, "SELECT pg_catalog.lo_close(0);\n\n");
1563 }
1564}
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(), _LoadLOs(), and _LoadLOs().

◆ EndRestoreLOs()

void EndRestoreLOs ( ArchiveHandle AH)
extern

Definition at line 1472 of file pg_backup_archiver.c.

1473{
1474 RestoreOptions *ropt = AH->public.ropt;
1475
1476 if (!(ropt->single_txn || ropt->txn_size > 0))
1477 {
1478 if (AH->connection)
1480 else
1481 ahprintf(AH, "COMMIT;\n\n");
1482 }
1483
1484 pg_log_info(ngettext("restored %d large object",
1485 "restored %d large objects",
1486 AH->loCount),
1487 AH->loCount);
1488}
#define ngettext(s, p, n)
Definition c.h:1329
#define pg_log_info(...)
Definition logging.h:126
static void CommitTransaction(void)
Definition xact.c:2270

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(), _LoadLOs(), and _LoadLOs().

◆ getTocEntryByDumpId()

TocEntry * getTocEntryByDumpId ( ArchiveHandle AH,
DumpId  id 
)

Definition at line 2030 of file pg_backup_archiver.c.

2031{
2032 /* build index arrays if we didn't already */
2033 if (AH->tocsByDumpId == NULL)
2035
2036 if (id > 0 && id <= AH->maxDumpId)
2037 return AH->tocsByDumpId[id];
2038
2039 return NULL;
2040}
static void buildTocEntryArrays(ArchiveHandle *AH)
struct _tocEntry ** tocsByDumpId

References buildTocEntryArrays(), fb(), and _archiveHandle::tocsByDumpId.

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

◆ InitArchiveFmt_Custom()

void InitArchiveFmt_Custom ( ArchiveHandle AH)
extern

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 */
137
138 /* Set up a private area. */
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:1447
#define PG_BINARY_W
Definition c.h:1448
@ 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)
#define pg_fatal(...)
EndLOsPtrType EndLOsPtr
ReadExtraTocPtrType ReadExtraTocPtr
WorkerJobDumpPtrType WorkerJobDumpPtr
StartLOsPtrType StartLOsPtr
WriteDataPtrType WriteDataPtr
StartLOPtrType StartLOPtr
ClonePtrType ClonePtr
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, fb(), _archiveHandle::FH, _archiveHandle::formatData, _archiveHandle::fSpec, lclContext::hasSeek, lclContext::lastFilePos, _archiveHandle::mode, PG_BINARY_R, PG_BINARY_W, pg_fatal, pg_malloc0_object, _archiveHandle::PrepParallelRestorePtr, _archiveHandle::PrintExtraTocPtr, _archiveHandle::PrintTocDataPtr, _archiveHandle::ReadBufPtr, _archiveHandle::ReadBytePtr, _archiveHandle::ReadExtraTocPtr, ReadHead(), ReadToc(), _archiveHandle::ReopenPtr, _archiveHandle::StartDataPtr, _archiveHandle::StartLOPtr, _archiveHandle::StartLOsPtr, _archiveHandle::WorkerJobDumpPtr, _archiveHandle::WorkerJobRestorePtr, _archiveHandle::WriteBufPtr, _archiveHandle::WriteBytePtr, _archiveHandle::WriteDataPtr, and _archiveHandle::WriteExtraTocPtr.

Referenced by _allocAH().

◆ InitArchiveFmt_Directory()

void InitArchiveFmt_Directory ( ArchiveHandle AH)
extern

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 */
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];
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... */
187 pg_fatal("could not close TOC file: %m");
188 ctx->dataFH = NULL;
189 }
190}
bool EndCompressFileHandle(CompressFileHandle *CFH)
CompressFileHandle * InitDiscoverCompressFileHandle(const char *path, const char *mode)
void create_or_open_dir(const char *dirname)
Definition dumputils.c:943
@ 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, fb(), _archiveHandle::format, _archiveHandle::formatData, _archiveHandle::fSpec, InitDiscoverCompressFileHandle(), lclContext::LOsTocFH, MAXPGPATH, _archiveHandle::mode, PG_BINARY_R, pg_fatal, pg_malloc0_object, _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)
extern

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, fb(), _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)
extern

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
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
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
pgoff_t filePos
pgoff_t tarFHpos
TAR_MEMBER * FH
int isSpecialScript
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(), fb(), lclContext::FH, lclContext::filePos, lclContext::hasSeek, lclContext::isSpecialScript, PG_BINARY_R, PG_BINARY_W, PG_COMPRESSION_NONE, pg_fatal, pg_malloc0_object, ReadHead(), ReadToc(), tarClose(), lclContext::tarFH, lclContext::tarFHpos, and tarOpen().

Referenced by _allocAH().

◆ IssueACLPerBlob()

void IssueACLPerBlob ( ArchiveHandle AH,
TocEntry te 
)
extern

Definition at line 538 of file pg_backup_db.c.

539{
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 == '"')
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 */
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)
TocEntry * getTocEntryByDumpId(ArchiveHandle *AH, DumpId id)
void IssueCommandPerBlob(ArchiveHandle *AH, TocEntry *te, const char *cmdBegin, const char *cmdEnd)
static char buf[DEFAULT_XLOG_SEG_SIZE]
DumpId * dependencies

References Assert, buf, _tocEntry::defn, _tocEntry::dependencies, fb(), 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 
)
extern

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}
static void StartTransaction(void)
Definition xact.c:2106

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

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

◆ on_exit_close_archive()

void on_exit_close_archive ( Archive AHX)
extern

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:341
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().

◆ parallel_restore()

int parallel_restore ( ArchiveHandle AH,
TocEntry te 
)
extern

Definition at line 4815 of file pg_backup_archiver.c.

4816{
4817 int status;
4818
4819 Assert(AH->connection != NULL);
4820
4821 /* Count only errors associated with this TOC entry */
4822 AH->public.n_errors = 0;
4823
4824 /* Restore the TOC item */
4825 status = restore_toc_entry(AH, te, true);
4826
4827 return status;
4828}
static int restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
int n_errors
Definition pg_backup.h:253

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

Referenced by _WorkerJobRestoreCustom(), and _WorkerJobRestoreDirectory().

◆ ReadHead()

void ReadHead ( ArchiveHandle AH)
extern

Definition at line 4182 of file pg_backup_archiver.c.

4183{
4184 char *errmsg;
4185 char vmaj,
4186 vmin,
4187 vrev;
4188 int fmt;
4189
4190 /*
4191 * If we haven't already read the header, do so.
4192 *
4193 * NB: this code must agree with _discoverArchiveFormat(). Maybe find a
4194 * way to unify the cases?
4195 */
4196 if (!AH->readHeader)
4197 {
4198 char tmpMag[7];
4199
4200 AH->ReadBufPtr(AH, tmpMag, 5);
4201
4202 if (strncmp(tmpMag, "PGDMP", 5) != 0)
4203 pg_fatal("did not find magic string in file header");
4204 }
4205
4206 vmaj = AH->ReadBytePtr(AH);
4207 vmin = AH->ReadBytePtr(AH);
4208
4209 if (vmaj > 1 || (vmaj == 1 && vmin > 0)) /* Version > 1.0 */
4210 vrev = AH->ReadBytePtr(AH);
4211 else
4212 vrev = 0;
4213
4215
4216 if (AH->version < K_VERS_1_0 || AH->version > K_VERS_MAX)
4217 pg_fatal("unsupported version (%d.%d) in file header",
4218 vmaj, vmin);
4219
4220 AH->intSize = AH->ReadBytePtr(AH);
4221 if (AH->intSize > 32)
4222 pg_fatal("sanity check on integer size (%zu) failed", AH->intSize);
4223
4224 if (AH->intSize > sizeof(int))
4225 pg_log_warning("archive was made on a machine with larger integers, some operations might fail");
4226
4227 if (AH->version >= K_VERS_1_7)
4228 AH->offSize = AH->ReadBytePtr(AH);
4229 else
4230 AH->offSize = AH->intSize;
4231
4232 fmt = AH->ReadBytePtr(AH);
4233
4234 if (AH->format != fmt)
4235 pg_fatal("expected format (%d) differs from format found in file (%d)",
4236 AH->format, fmt);
4237
4238 if (AH->version >= K_VERS_1_15)
4240 else if (AH->version >= K_VERS_1_2)
4241 {
4242 /* Guess the compression method based on the level */
4243 if (AH->version < K_VERS_1_4)
4244 AH->compression_spec.level = AH->ReadBytePtr(AH);
4245 else
4246 AH->compression_spec.level = ReadInt(AH);
4247
4248 if (AH->compression_spec.level != 0)
4250 }
4251 else
4253
4255 if (errmsg)
4256 {
4257 pg_log_warning("archive is compressed, but this installation does not support compression (%s) -- no data will be available",
4258 errmsg);
4259 pg_free(errmsg);
4260 }
4261
4262 if (AH->version >= K_VERS_1_4)
4263 {
4264 struct tm crtm;
4265
4266 crtm.tm_sec = ReadInt(AH);
4267 crtm.tm_min = ReadInt(AH);
4268 crtm.tm_hour = ReadInt(AH);
4269 crtm.tm_mday = ReadInt(AH);
4270 crtm.tm_mon = ReadInt(AH);
4271 crtm.tm_year = ReadInt(AH);
4272 crtm.tm_isdst = ReadInt(AH);
4273
4274 /*
4275 * Newer versions of glibc have mktime() report failure if tm_isdst is
4276 * inconsistent with the prevailing timezone, e.g. tm_isdst = 1 when
4277 * TZ=UTC. This is problematic when restoring an archive under a
4278 * different timezone setting. If we get a failure, try again with
4279 * tm_isdst set to -1 ("don't know").
4280 *
4281 * XXX with or without this hack, we reconstruct createDate
4282 * incorrectly when the prevailing timezone is different from
4283 * pg_dump's. Next time we bump the archive version, we should flush
4284 * this representation and store a plain seconds-since-the-Epoch
4285 * timestamp instead.
4286 */
4287 AH->createDate = mktime(&crtm);
4288 if (AH->createDate == (time_t) -1)
4289 {
4290 crtm.tm_isdst = -1;
4291 AH->createDate = mktime(&crtm);
4292 if (AH->createDate == (time_t) -1)
4293 pg_log_warning("invalid creation date in header");
4294 }
4295 }
4296
4297 if (AH->version >= K_VERS_1_4)
4298 {
4299 AH->archdbname = ReadStr(AH);
4300 }
4301
4302 if (AH->version >= K_VERS_1_10)
4303 {
4304 AH->archiveRemoteVersion = ReadStr(AH);
4305 AH->archiveDumpVersion = ReadStr(AH);
4306 }
4307}
char * supports_compression(const pg_compress_specification compression_spec)
Definition compress_io.c:87
@ PG_COMPRESSION_GZIP
Definition compression.h:24
static struct pg_tm tm
Definition localtime.c:148
static char * errmsg
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, fb(), _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)
extern

Definition at line 2166 of file pg_backup_archiver.c.

2167{
2168 int res = 0;
2169 int bv,
2170 b;
2171 int sign = 0; /* Default positive */
2172 int bitShift = 0;
2173
2174 if (AH->version > K_VERS_1_0)
2175 /* Read a sign byte */
2176 sign = AH->ReadBytePtr(AH);
2177
2178 for (b = 0; b < AH->intSize; b++)
2179 {
2180 bv = AH->ReadBytePtr(AH) & 0xFF;
2181 if (bv != 0)
2182 res = res + (bv << bitShift);
2183 bitShift += 8;
2184 }
2185
2186 if (sign)
2187 res = -res;
2188
2189 return res;
2190}
char sign
Definition informix.c:693
int b
Definition isn.c:74

References b, fb(), _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 2071 of file pg_backup_archiver.c.

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

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

Referenced by _ReadExtraToc().

◆ ReadStr()

char * ReadStr ( ArchiveHandle AH)
extern

Definition at line 2212 of file pg_backup_archiver.c.

2213{
2214 char *buf;
2215 int l;
2216
2217 l = ReadInt(AH);
2218 if (l < 0)
2219 buf = NULL;
2220 else
2221 {
2222 buf = (char *) pg_malloc(l + 1);
2223 AH->ReadBufPtr(AH, buf, l);
2224
2225 buf[l] = '\0';
2226 }
2227
2228 return buf;
2229}
void * pg_malloc(size_t size)
Definition fe_memutils.c:53

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

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

◆ ReadToc()

void ReadToc ( ArchiveHandle AH)
extern

Definition at line 2709 of file pg_backup_archiver.c.

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

References _tocEntry::catalogId, _tocEntry::copyStmt, _tocEntry::dataLength, _tocEntry::defn, _tocEntry::dependencies, _tocEntry::desc, _tocEntry::dropStmt, _tocEntry::dumpId, fb(), 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_free(), pg_log_debug, pg_log_warning, pg_malloc0_object, pg_malloc_array, pg_realloc_array, _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 
)
extern

Definition at line 73 of file pg_backup_db.c.

74{
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
95}
void PQfinish(PGconn *conn)
void ConnectDatabaseAhx(Archive *AHX, const ConnParams *cparams, bool isReconnect)
char * dbname
Definition streamutil.c:49
char * override_dbname
Definition pg_backup.h:94
ConnParams cparams
Definition pg_backup.h:146

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

Referenced by _reconnectToDB().

◆ StartRestoreLO()

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

Definition at line 1495 of file pg_backup_archiver.c.

1496{
1497 bool old_lo_style = (AH->version < K_VERS_1_12);
1498 Oid loOid;
1499
1500 AH->loCount++;
1501
1502 /* Initialize the LO Buffer */
1503 if (AH->lo_buf == NULL)
1504 {
1505 /* First time through (in this process) so allocate the buffer */
1506 AH->lo_buf_size = LOBBUFSIZE;
1508 }
1509 AH->lo_buf_used = 0;
1510
1511 pg_log_info("restoring large object with OID %u", oid);
1512
1513 /* With an old archive we must do drop and create logic here */
1514 if (old_lo_style && drop)
1515 DropLOIfExists(AH, oid);
1516
1517 if (AH->connection)
1518 {
1519 if (old_lo_style)
1520 {
1521 loOid = lo_create(AH->connection, oid);
1522 if (loOid == 0 || loOid != oid)
1523 pg_fatal("could not create large object %u: %s",
1524 oid, PQerrorMessage(AH->connection));
1525 }
1526 AH->loFd = lo_open(AH->connection, oid, INV_WRITE);
1527 if (AH->loFd == -1)
1528 pg_fatal("could not open large object %u: %s",
1529 oid, PQerrorMessage(AH->connection));
1530 }
1531 else
1532 {
1533 if (old_lo_style)
1534 ahprintf(AH, "SELECT pg_catalog.lo_open(pg_catalog.lo_create('%u'), %d);\n",
1535 oid, INV_WRITE);
1536 else
1537 ahprintf(AH, "SELECT pg_catalog.lo_open('%u', %d);\n",
1538 oid, INV_WRITE);
1539 }
1540
1541 AH->writingLO = true;
1542}
char * PQerrorMessage(const PGconn *conn)
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)
#define K_VERS_1_12
unsigned int Oid

References ahprintf(), _archiveHandle::connection, DropLOIfExists(), fb(), 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(), _LoadLOs(), and _LoadLOs().

◆ StartRestoreLOs()

void StartRestoreLOs ( ArchiveHandle AH)
extern

Definition at line 1448 of file pg_backup_archiver.c.

1449{
1450 RestoreOptions *ropt = AH->public.ropt;
1451
1452 /*
1453 * LOs must be restored within a transaction block, since we need the LO
1454 * handle to stay open while we write it. Establish a transaction unless
1455 * there's one being used globally.
1456 */
1457 if (!(ropt->single_txn || ropt->txn_size > 0))
1458 {
1459 if (AH->connection)
1461 else
1462 ahprintf(AH, "BEGIN;\n\n");
1463 }
1464
1465 AH->loCount = 0;
1466}

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

Referenced by _LoadLOs(), _LoadLOs(), and _LoadLOs().

◆ TocIDRequired()

int TocIDRequired ( ArchiveHandle AH,
DumpId  id 
)
extern

Definition at line 2043 of file pg_backup_archiver.c.

2044{
2045 TocEntry *te = getTocEntryByDumpId(AH, id);
2046
2047 if (!te)
2048 return 0;
2049
2050 return te->reqs;
2051}

References getTocEntryByDumpId(), and _tocEntry::reqs.

Referenced by _tarPositionTo(), and findDumpableDependencies().

◆ warn_or_exit_horribly()

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

◆ WriteDataChunks()

void WriteDataChunks ( ArchiveHandle AH,
struct ParallelState pstate 
)
extern

Definition at line 2497 of file pg_backup_archiver.c.

2498{
2499 TocEntry *te;
2500
2501 if (pstate && pstate->numWorkers > 1)
2502 {
2503 /*
2504 * In parallel mode, this code runs in the leader process. We
2505 * construct an array of candidate TEs, then sort it into decreasing
2506 * size order, then dispatch each TE to a data-transfer worker. By
2507 * dumping larger tables first, we avoid getting into a situation
2508 * where we're down to one job and it's big, losing parallelism.
2509 */
2510 TocEntry **tes;
2511 int ntes;
2512
2514 ntes = 0;
2515 for (te = AH->toc->next; te != AH->toc; te = te->next)
2516 {
2517 /* Consider only TEs with dataDumper functions ... */
2518 if (!te->dataDumper)
2519 continue;
2520 /* ... and ignore ones not enabled for dump */
2521 if ((te->reqs & REQ_DATA) == 0)
2522 continue;
2523
2524 tes[ntes++] = te;
2525 }
2526
2527 if (ntes > 1)
2529
2530 for (int i = 0; i < ntes; i++)
2531 DispatchJobForTocEntry(AH, pstate, tes[i], ACT_DUMP,
2533
2534 pg_free(tes);
2535
2536 /* Now wait for workers to finish. */
2537 WaitForWorkers(AH, pstate, WFW_ALL_IDLE);
2538 }
2539 else
2540 {
2541 /* Non-parallel mode: just dump all candidate TEs sequentially. */
2542 for (te = AH->toc->next; te != AH->toc; te = te->next)
2543 {
2544 /* Must have same filter conditions as above */
2545 if (!te->dataDumper)
2546 continue;
2547 if ((te->reqs & REQ_DATA) == 0)
2548 continue;
2549
2551 }
2552 }
2553}
void WaitForWorkers(ArchiveHandle *AH, ParallelState *pstate, WFW_WaitOption mode)
Definition parallel.c:1453
void DispatchJobForTocEntry(ArchiveHandle *AH, ParallelState *pstate, TocEntry *te, T_Action act, ParallelCompletionPtr callback, void *callback_data)
Definition parallel.c:1207
@ 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)
#define REQ_DATA
#define qsort(a, b, c, d)
Definition port.h:496
DataDumperPtr dataDumper

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

Referenced by _CloseArchive(), _CloseArchive(), and _CloseArchive().

◆ WriteDataChunksForTocEntry()

void WriteDataChunksForTocEntry ( ArchiveHandle AH,
TocEntry te 
)
extern

Definition at line 2578 of file pg_backup_archiver.c.

2579{
2582
2583 AH->currToc = te;
2584
2585 if (strcmp(te->desc, "BLOBS") == 0)
2586 {
2587 startPtr = AH->StartLOsPtr;
2588 endPtr = AH->EndLOsPtr;
2589 }
2590 else
2591 {
2592 startPtr = AH->StartDataPtr;
2593 endPtr = AH->EndDataPtr;
2594 }
2595
2596 if (startPtr != NULL)
2597 (*startPtr) (AH, te);
2598
2599 /*
2600 * The user-provided DataDumper routine needs to call AH->WriteData
2601 */
2602 te->dataDumper((Archive *) AH, te->dataDumperArg);
2603
2604 if (endPtr != NULL)
2605 (*endPtr) (AH, te);
2606
2607 AH->currToc = NULL;
2608}
void(* EndDataPtrType)(ArchiveHandle *AH, TocEntry *te)
void(* StartDataPtrType)(ArchiveHandle *AH, TocEntry *te)
struct _tocEntry * currToc
const void * dataDumperArg

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

Referenced by _WorkerJobDumpDirectory(), and WriteDataChunks().

◆ WriteHead()

void WriteHead ( ArchiveHandle AH)
extern

Definition at line 4156 of file pg_backup_archiver.c.

4157{
4158 struct tm crtm;
4159
4160 AH->WriteBufPtr(AH, "PGDMP", 5); /* Magic code */
4161 AH->WriteBytePtr(AH, ARCHIVE_MAJOR(AH->version));
4162 AH->WriteBytePtr(AH, ARCHIVE_MINOR(AH->version));
4163 AH->WriteBytePtr(AH, ARCHIVE_REV(AH->version));
4164 AH->WriteBytePtr(AH, AH->intSize);
4165 AH->WriteBytePtr(AH, AH->offSize);
4166 AH->WriteBytePtr(AH, AH->format);
4168 crtm = *localtime(&AH->createDate);
4169 WriteInt(AH, crtm.tm_sec);
4170 WriteInt(AH, crtm.tm_min);
4171 WriteInt(AH, crtm.tm_hour);
4172 WriteInt(AH, crtm.tm_mday);
4173 WriteInt(AH, crtm.tm_mon);
4174 WriteInt(AH, crtm.tm_year);
4175 WriteInt(AH, crtm.tm_isdst);
4176 WriteStr(AH, PQdb(AH->connection));
4178 WriteStr(AH, PG_VERSION);
4179}
char * PQdb(const PGconn *conn)
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:233

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

Referenced by _CloseArchive(), _CloseArchive(), and _CloseArchive().

◆ WriteInt()

size_t WriteInt ( ArchiveHandle AH,
int  i 
)
extern

Definition at line 2135 of file pg_backup_archiver.c.

2136{
2137 int b;
2138
2139 /*
2140 * This is a bit yucky, but I don't want to make the binary format very
2141 * dependent on representation, and not knowing much about it, I write out
2142 * a sign byte. If you change this, don't forget to change the file
2143 * version #, and modify ReadInt to read the new format AS WELL AS the old
2144 * formats.
2145 */
2146
2147 /* SIGN byte */
2148 if (i < 0)
2149 {
2150 AH->WriteBytePtr(AH, 1);
2151 i = -i;
2152 }
2153 else
2154 AH->WriteBytePtr(AH, 0);
2155
2156 for (b = 0; b < AH->intSize; b++)
2157 {
2158 AH->WriteBytePtr(AH, i & 0xFF);
2159 i >>= 8;
2160 }
2161
2162 return AH->intSize + 1;
2163}

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 2054 of file pg_backup_archiver.c.

2055{
2056 int off;
2057
2058 /* Save the flag */
2059 AH->WriteBytePtr(AH, wasSet);
2060
2061 /* Write out pgoff_t smallest byte first, prevents endian mismatch */
2062 for (off = 0; off < sizeof(pgoff_t); off++)
2063 {
2064 AH->WriteBytePtr(AH, o & 0xFF);
2065 o >>= 8;
2066 }
2067 return sizeof(pgoff_t) + 1;
2068}

References fb(), and _archiveHandle::WriteBytePtr.

Referenced by _WriteExtraToc().

◆ WriteStr()

size_t WriteStr ( ArchiveHandle AH,
const char c 
)
extern

Definition at line 2193 of file pg_backup_archiver.c.

2194{
2195 size_t res;
2196
2197 if (c)
2198 {
2199 int len = strlen(c);
2200
2201 res = WriteInt(AH, len);
2202 AH->WriteBufPtr(AH, c, len);
2203 res += len;
2204 }
2205 else
2206 res = WriteInt(AH, -1);
2207
2208 return res;
2209}
const void size_t len
char * c

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

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

◆ WriteToc()

void WriteToc ( ArchiveHandle AH)
extern

Definition at line 2611 of file pg_backup_archiver.c.

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

References archCustom, _tocEntry::catalogId, _tocEntry::copyStmt, _tocEntry::dataDumper, _tocEntry::defn, _tocEntry::defnDumper, _tocEntry::defnDumperArg, _tocEntry::defnLen, _tocEntry::dependencies, _tocEntry::desc, _tocEntry::dropStmt, _tocEntry::dumpId, fb(), _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(), _CloseArchive(), and _CloseArchive().