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

4315{
4316 pgoff_t tpos;
4317
4318 /* Check that ftello works on this file */
4319 tpos = ftello(fp);
4320 if (tpos < 0)
4321 return false;
4322
4323 /*
4324 * Check that fseeko(SEEK_SET) works, too. NB: we used to try to test
4325 * this with fseeko(fp, 0, SEEK_CUR). But some platforms treat that as a
4326 * successful no-op even on files that are otherwise unseekable.
4327 */
4328 if (fseeko(fp, tpos, SEEK_SET) != 0)
4329 return false;
4330
4331 return true;
4332}
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 5181 of file pg_backup_archiver.c.

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

5246{
5247 /* Should not have an open database connection */
5248 Assert(AH->connection == NULL);
5249
5250 /* Clear format-specific state */
5251 AH->DeClonePtr(AH);
5252
5253 /* Clear state allocated by CloneArchive */
5254 if (AH->sqlparse.curCmd)
5256
5257 /* Clear any connection-local state */
5258 free(AH->currUser);
5259 free(AH->currSchema);
5260 free(AH->currTablespace);
5261 free(AH->currTableAm);
5262 free(AH->savedPassword);
5263
5264 free(AH);
5265}
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 626 of file pg_backup_db.c.

627{
628 ahprintf(AH,
629 "SELECT pg_catalog.lo_unlink(oid) "
630 "FROM pg_catalog.pg_largeobject_metadata "
631 "WHERE oid = '%u';\n",
632 oid);
633}
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:1310
#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 2035 of file pg_backup_archiver.c.

2036{
2037 /* build index arrays if we didn't already */
2038 if (AH->tocsByDumpId == NULL)
2040
2041 if (id > 0 && id <= AH->maxDumpId)
2042 return AH->tocsByDumpId[id];
2043
2044 return NULL;
2045}
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:1433
#define PG_BINARY_W
Definition c.h:1434
@ 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 552 of file pg_backup_db.c.

553{
555 char *buf;
556 char *st;
557 char *st2;
558 char *en;
559 bool inquotes;
560
561 if (!blobte)
562 pg_fatal("could not find entry for ID %d", te->dependencies[0]);
563 Assert(strcmp(blobte->desc, "BLOB METADATA") == 0);
564
565 /* Make a writable copy of the ACL commands string */
566 buf = pg_strdup(te->defn);
567
568 /*
569 * We have to parse out the commands sufficiently to locate the blob OIDs
570 * and find the command-ending semicolons. The commands should not
571 * contain anything hard to parse except for double-quoted role names,
572 * which are easy to ignore. Once we've split apart the first and second
573 * halves of a command, apply IssueCommandPerBlob. (This means the
574 * updates on the blobs are interleaved if there's multiple commands, but
575 * that should cause no trouble.)
576 */
577 inquotes = false;
578 st = en = buf;
579 st2 = NULL;
580 while (*en)
581 {
582 /* Ignore double-quoted material */
583 if (*en == '"')
585 if (inquotes)
586 {
587 en++;
588 continue;
589 }
590 /* If we found "LARGE OBJECT", that's the end of the first half */
591 if (strncmp(en, "LARGE OBJECT ", 13) == 0)
592 {
593 /* Terminate the first-half string */
594 en += 13;
595 Assert(isdigit((unsigned char) *en));
596 *en++ = '\0';
597 /* Skip the rest of the blob OID */
598 while (isdigit((unsigned char) *en))
599 en++;
600 /* Second half starts here */
601 Assert(st2 == NULL);
602 st2 = en;
603 }
604 /* If we found semicolon, that's the end of the second half */
605 else if (*en == ';')
606 {
607 /* Terminate the second-half string */
608 *en++ = '\0';
609 Assert(st2 != NULL);
610 /* Issue this command for each blob */
612 /* For neatness, skip whitespace before the next command */
613 while (isspace((unsigned char) *en))
614 en++;
615 /* Reset for new command */
616 st = en;
617 st2 = NULL;
618 }
619 else
620 en++;
621 }
622 pg_free(buf);
623}
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 505 of file pg_backup_db.c.

507{
508 /* Make a writable copy of the command string */
509 char *buf = pg_strdup(te->defn);
510 RestoreOptions *ropt = AH->public.ropt;
511 char *st;
512 char *en;
513
514 st = buf;
515 while ((en = strchr(st, '\n')) != NULL)
516 {
517 *en++ = '\0';
518 ahprintf(AH, "%s%s%s;\n", cmdBegin, st, cmdEnd);
519
520 /* In --transaction-size mode, count each command as an action */
521 if (ropt && ropt->txn_size > 0)
522 {
523 if (++AH->txnCount >= ropt->txn_size)
524 {
525 if (AH->connection)
526 {
529 }
530 else
531 ahprintf(AH, "COMMIT;\nBEGIN;\n\n");
532 AH->txnCount = 0;
533 }
534 }
535
536 st = en;
537 }
538 ahprintf(AH, "\n");
539 pg_free(buf);
540}
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 4814 of file pg_backup_archiver.c.

4815{
4816 int status;
4817
4818 Assert(AH->connection != NULL);
4819
4820 /* Count only errors associated with this TOC entry */
4821 AH->public.n_errors = 0;
4822
4823 /* Restore the TOC item */
4824 status = restore_toc_entry(AH, te, true);
4825
4826 return status;
4827}
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 4181 of file pg_backup_archiver.c.

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

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

2212{
2213 char *buf;
2214 int l;
2215
2216 l = ReadInt(AH);
2217 if (l < 0)
2218 buf = NULL;
2219 else
2220 {
2221 buf = (char *) pg_malloc(l + 1);
2222 AH->ReadBufPtr(AH, buf, l);
2223
2224 buf[l] = '\0';
2225 }
2226
2227 return buf;
2228}
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 2708 of file pg_backup_archiver.c.

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

2049{
2050 TocEntry *te = getTocEntryByDumpId(AH, id);
2051
2052 if (!te)
2053 return 0;
2054
2055 return te->reqs;
2056}

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

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

2578{
2581
2582 AH->currToc = te;
2583
2584 if (strcmp(te->desc, "BLOBS") == 0)
2585 {
2586 startPtr = AH->StartLOsPtr;
2587 endPtr = AH->EndLOsPtr;
2588 }
2589 else
2590 {
2591 startPtr = AH->StartDataPtr;
2592 endPtr = AH->EndDataPtr;
2593 }
2594
2595 if (startPtr != NULL)
2596 (*startPtr) (AH, te);
2597
2598 /*
2599 * The user-provided DataDumper routine needs to call AH->WriteData
2600 */
2601 te->dataDumper((Archive *) AH, te->dataDumperArg);
2602
2603 if (endPtr != NULL)
2604 (*endPtr) (AH, te);
2605
2606 AH->currToc = NULL;
2607}
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 4155 of file pg_backup_archiver.c.

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

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 (size_t 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 2059 of file pg_backup_archiver.c.

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

References fb(), and _archiveHandle::WriteBytePtr.

Referenced by _WriteExtraToc().

◆ WriteStr()

size_t WriteStr ( ArchiveHandle AH,
const char c 
)
extern

Definition at line 2192 of file pg_backup_archiver.c.

2193{
2194 size_t res;
2195
2196 if (c)
2197 {
2198 int len = strlen(c);
2199
2200 res = WriteInt(AH, len);
2201 AH->WriteBufPtr(AH, c, len);
2202 res += len;
2203 }
2204 else
2205 res = WriteInt(AH, -1);
2206
2207 return res;
2208}
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 2610 of file pg_backup_archiver.c.

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