summaryrefslogtreecommitdiff
path: root/src/bin/pg_dump/pg_backup_archiver.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_dump/pg_backup_archiver.h')
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.h122
1 files changed, 101 insertions, 21 deletions
diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
index f34e158409..f3b0ba5385 100644
--- a/src/bin/pg_dump/pg_backup_archiver.h
+++ b/src/bin/pg_dump/pg_backup_archiver.h
@@ -29,6 +29,10 @@
#define __PG_BACKUP_ARCHIVE__
#include <stdio.h>
+#include <time.h>
+
+#include "postgres.h"
+#include "pqexpbuffer.h"
#ifdef HAVE_LIBZ
#include <zlib.h>
@@ -51,15 +55,23 @@ typedef z_stream *z_streamp;
#endif
#include "pg_backup.h"
+#include "libpq-fe.h"
#define K_VERS_MAJOR 1
-#define K_VERS_MINOR 2
-#define K_VERS_REV 2
+#define K_VERS_MINOR 4
+#define K_VERS_REV 3
+
+/* Data block types */
+#define BLK_DATA 1
+#define BLK_BLOB 2
+#define BLK_BLOBS 3
/* Some important version numbers (checked in code) */
#define K_VERS_1_0 (( (1 * 256 + 0) * 256 + 0) * 256 + 0)
-#define K_VERS_1_2 (( (1 * 256 + 2) * 256 + 0) * 256 + 0)
-#define K_VERS_MAX (( (1 * 256 + 2) * 256 + 255) * 256 + 0)
+#define K_VERS_1_2 (( (1 * 256 + 2) * 256 + 0) * 256 + 0) /* Allow No ZLIB */
+#define K_VERS_1_3 (( (1 * 256 + 3) * 256 + 0) * 256 + 0) /* BLOBs */
+#define K_VERS_1_4 (( (1 * 256 + 4) * 256 + 0) * 256 + 0) /* Date & name in header */
+#define K_VERS_MAX (( (1 * 256 + 4) * 256 + 255) * 256 + 0)
struct _archiveHandle;
struct _tocEntry;
@@ -72,10 +84,15 @@ typedef void (*StartDataPtr) (struct _archiveHandle* AH, struct _tocEntry* te);
typedef int (*WriteDataPtr) (struct _archiveHandle* AH, const void* data, int dLen);
typedef void (*EndDataPtr) (struct _archiveHandle* AH, struct _tocEntry* te);
-typedef int (*WriteBytePtr) (struct _archiveHandle* AH, const int i);
+typedef void (*StartBlobsPtr) (struct _archiveHandle* AH, struct _tocEntry* te);
+typedef void (*StartBlobPtr) (struct _archiveHandle* AH, struct _tocEntry* te, int oid);
+typedef void (*EndBlobPtr) (struct _archiveHandle* AH, struct _tocEntry* te, int oid);
+typedef void (*EndBlobsPtr) (struct _archiveHandle* AH, struct _tocEntry* te);
+
+typedef int (*WriteBytePtr) (struct _archiveHandle* AH, const int i);
typedef int (*ReadBytePtr) (struct _archiveHandle* AH);
-typedef int (*WriteBufPtr) (struct _archiveHandle* AH, const void* c, int len);
-typedef int (*ReadBufPtr) (struct _archiveHandle* AH, void* buf, int len);
+typedef int (*WriteBufPtr) (struct _archiveHandle* AH, const void* c, int len);
+typedef int (*ReadBufPtr) (struct _archiveHandle* AH, void* buf, int len);
typedef void (*SaveArchivePtr) (struct _archiveHandle* AH);
typedef void (*WriteExtraTocPtr) (struct _archiveHandle* AH, struct _tocEntry* te);
typedef void (*ReadExtraTocPtr) (struct _archiveHandle* AH, struct _tocEntry* te);
@@ -83,6 +100,8 @@ typedef void (*PrintExtraTocPtr) (struct _archiveHandle* AH, struct _tocEntry* t
typedef void (*PrintTocDataPtr) (struct _archiveHandle* AH, struct _tocEntry* te,
RestoreOptions *ropt);
+typedef int (*CustomOutPtr) (struct _archiveHandle* AH, const void* buf, int len);
+
typedef int (*TocSortCompareFn) (const void* te1, const void *te2);
typedef enum _archiveMode {
@@ -95,16 +114,44 @@ typedef struct _outputContext {
int gzOut;
} OutputContext;
+typedef enum {
+ SQL_SCAN = 0,
+ SQL_IN_SQL_COMMENT,
+ SQL_IN_EXT_COMMENT,
+ SQL_IN_QUOTE} sqlparseState;
+
+typedef struct {
+ int backSlash;
+ sqlparseState state;
+ char lastChar;
+ char quoteChar;
+} sqlparseInfo;
+
typedef struct _archiveHandle {
+ Archive public; /* Public part of archive */
char vmaj; /* Version of file */
char vmin;
char vrev;
int version; /* Conveniently formatted version */
+ int debugLevel; /* Not used. Intended for logging */
int intSize; /* Size of an integer in the archive */
ArchiveFormat format; /* Archive format */
+ sqlparseInfo sqlparse;
+ PQExpBuffer sqlBuf;
+
+ time_t createDate; /* Date archive created */
+
+ /*
+ * Fields used when discovering header.
+ * A format can always get the previous read bytes from here...
+ */
int readHeader; /* Used if file header has been read already */
+ char *lookahead; /* Buffer used when reading header to discover format */
+ int lookaheadSize; /* Size of allocated buffer */
+ int lookaheadLen; /* Length of data in lookahead */
+ int lookaheadPos; /* Current read position in lookahead buffer */
ArchiveEntryPtr ArchiveEntryPtr; /* Called for each metadata object */
StartDataPtr StartDataPtr; /* Called when table data is about to be dumped */
@@ -121,11 +168,33 @@ typedef struct _archiveHandle {
PrintExtraTocPtr PrintExtraTocPtr; /* Extra TOC info for format */
PrintTocDataPtr PrintTocDataPtr;
- int lastID; /* Last internal ID for a TOC entry */
- char* fSpec; /* Archive File Spec */
- FILE *FH; /* General purpose file handle */
- void *OF;
- int gzOut; /* Output file */
+ StartBlobsPtr StartBlobsPtr;
+ EndBlobsPtr EndBlobsPtr;
+ StartBlobPtr StartBlobPtr;
+ EndBlobPtr EndBlobPtr;
+
+ CustomOutPtr CustomOutPtr; /* Alternate script output routine */
+
+ /* Stuff for direct DB connection */
+ char username[100];
+ char *dbname; /* Name of db for connection */
+ char *archdbname; /* DB name *read* from archive */
+ char *pghost;
+ char *pgport;
+ PGconn *connection;
+ int connectToDB; /* Flag to indicate if direct DB connection is required */
+ int pgCopyIn; /* Currently in libpq 'COPY IN' mode. */
+ PQExpBuffer pgCopyBuf; /* Left-over data from incomplete lines in COPY IN */
+
+ int loFd; /* BLOB fd */
+ int writingBlob; /* Flag */
+ int createdBlobXref; /* Flag */
+
+ int lastID; /* Last internal ID for a TOC entry */
+ char* fSpec; /* Archive File Spec */
+ FILE *FH; /* General purpose file handle */
+ void *OF;
+ int gzOut; /* Output file */
struct _tocEntry* toc; /* List of TOC entries */
int tocCount; /* Number of TOC entries */
@@ -135,6 +204,7 @@ typedef struct _archiveHandle {
ArchiveMode mode; /* File mode - r or w */
void* formatData; /* Header data specific to file format */
+ RestoreOptions *ropt; /* Used to check restore options in ahwrite etc */
} ArchiveHandle;
typedef struct _tocEntry {
@@ -148,6 +218,7 @@ typedef struct _tocEntry {
char* desc;
char* defn;
char* dropStmt;
+ char* copyStmt;
char* owner;
char** depOid;
int printed; /* Indicates if entry defn has been dumped */
@@ -159,7 +230,8 @@ typedef struct _tocEntry {
} TocEntry;
-extern void die_horribly(const char *fmt, ...);
+/* Used everywhere */
+extern void die_horribly(ArchiveHandle *AH, const char *fmt, ...);
extern void WriteTOC(ArchiveHandle* AH);
extern void ReadTOC(ArchiveHandle* AH);
@@ -175,19 +247,27 @@ extern int TocIDRequired(ArchiveHandle* AH, int id, RestoreOptions *ropt);
* Mandatory routines for each supported format
*/
-extern int WriteInt(ArchiveHandle* AH, int i);
-extern int ReadInt(ArchiveHandle* AH);
-extern char* ReadStr(ArchiveHandle* AH);
-extern int WriteStr(ArchiveHandle* AH, char* s);
+extern int WriteInt(ArchiveHandle* AH, int i);
+extern int ReadInt(ArchiveHandle* AH);
+extern char* ReadStr(ArchiveHandle* AH);
+extern int WriteStr(ArchiveHandle* AH, char* s);
+
+extern void StartRestoreBlob(ArchiveHandle* AH, int oid);
+extern void EndRestoreBlob(ArchiveHandle* AH, int oid);
-extern void InitArchiveFmt_Custom(ArchiveHandle* AH);
-extern void InitArchiveFmt_Files(ArchiveHandle* AH);
-extern void InitArchiveFmt_PlainText(ArchiveHandle* AH);
+extern void InitArchiveFmt_Custom(ArchiveHandle* AH);
+extern void InitArchiveFmt_Files(ArchiveHandle* AH);
+extern void InitArchiveFmt_Null(ArchiveHandle* AH);
+extern void InitArchiveFmt_Tar(ArchiveHandle* AH);
+
+extern int isValidTarHeader(char *header);
extern OutputContext SetOutput(ArchiveHandle* AH, char *filename, int compression);
-extern void ResetOutput(ArchiveHandle* AH, OutputContext savedContext);
+extern void ResetOutput(ArchiveHandle* AH, OutputContext savedContext);
int ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle* AH);
int ahprintf(ArchiveHandle* AH, const char *fmt, ...);
+void ahlog(ArchiveHandle* AH, int level, const char *fmt, ...);
+
#endif