diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile index 033fb1e4d0c29da98a1f49669439e82cbfd6a046..e9be18bd0b3d58f958c7d7d3e8cd4c03fc5e5223 100644 --- a/src/bin/pg_dump/Makefile +++ b/src/bin/pg_dump/Makefile @@ -19,7 +19,7 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) OBJS= pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \ - pg_backup_files.o pg_backup_null.o pg_backup_tar.o \ + pg_backup_null.o pg_backup_tar.o \ pg_backup_directory.o dumpmem.o dumputils.o compress_io.o $(WIN32RES) KEYWRDOBJS = keywords.o kwlookup.o diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index ff0db467fe1e3775fd0ebfb2d134f4b369921ab9..61c68636669029b679a515a3064c2dd1e1be8f86 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -48,7 +48,6 @@ typedef enum _archiveFormat { archUnknown = 0, archCustom = 1, - archFiles = 2, archTar = 3, archNull = 4, archDirectory = 5 diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 79f7dda211a9683da2ecdc6bd2d1613e4adfb454..927950caff23b1e7641d3e47722a7b0742ade1c8 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -827,9 +827,6 @@ PrintTOCSummary(Archive *AHX, RestoreOptions *ropt) switch (AH->format) { - case archFiles: - fmtName = "FILES"; - break; case archCustom: fmtName = "CUSTOM"; break; @@ -2017,10 +2014,6 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt, InitArchiveFmt_Custom(AH); break; - case archFiles: - InitArchiveFmt_Files(AH); - break; - case archNull: InitArchiveFmt_Null(AH); break; diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h index fa8c58cc807f59fe469d1cbd565211c28b69cc23..3e304081f215b42f5561659113dfa7966a38643c 100644 --- a/src/bin/pg_dump/pg_backup_archiver.h +++ b/src/bin/pg_dump/pg_backup_archiver.h @@ -363,7 +363,6 @@ extern void EndRestoreBlob(ArchiveHandle *AH, Oid oid); extern void EndRestoreBlobs(ArchiveHandle *AH); extern void InitArchiveFmt_Custom(ArchiveHandle *AH); -extern void InitArchiveFmt_Files(ArchiveHandle *AH); extern void InitArchiveFmt_Null(ArchiveHandle *AH); extern void InitArchiveFmt_Directory(ArchiveHandle *AH); extern void InitArchiveFmt_Tar(ArchiveHandle *AH); diff --git a/src/bin/pg_dump/pg_backup_files.c b/src/bin/pg_dump/pg_backup_files.c deleted file mode 100644 index a7fd91d1c53a7a96e6cee8238964a8e49863d248..0000000000000000000000000000000000000000 --- a/src/bin/pg_dump/pg_backup_files.c +++ /dev/null @@ -1,562 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_backup_files.c - * - * This file is copied from the 'custom' format file, but dumps data into - * separate files, and the TOC into the 'main' file. - * - * IT IS FOR DEMONSTRATION PURPOSES ONLY. - * - * (and could probably be used as a basis for writing a tar file) - * - * See the headers to pg_restore for more details. - * - * Copyright (c) 2000, Philip Warner - * Rights are granted to use this software in any way so long - * as this notice is not removed. - * - * The author is not responsible for loss or damages that may - * result from it's use. - * - * - * IDENTIFICATION - * src/bin/pg_dump/pg_backup_files.c - * - *------------------------------------------------------------------------- - */ - -#include "pg_backup_archiver.h" -#include "dumputils.h" -#include "dumpmem.h" - -static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te); -static void _StartData(ArchiveHandle *AH, TocEntry *te); -static size_t _WriteData(ArchiveHandle *AH, const void *data, size_t dLen); -static void _EndData(ArchiveHandle *AH, TocEntry *te); -static int _WriteByte(ArchiveHandle *AH, const int i); -static int _ReadByte(ArchiveHandle *); -static size_t _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len); -static size_t _ReadBuf(ArchiveHandle *AH, void *buf, size_t len); -static void _CloseArchive(ArchiveHandle *AH); -static void _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt); -static void _WriteExtraToc(ArchiveHandle *AH, TocEntry *te); -static void _ReadExtraToc(ArchiveHandle *AH, TocEntry *te); -static void _PrintExtraToc(ArchiveHandle *AH, TocEntry *te); - -static void _StartBlobs(ArchiveHandle *AH, TocEntry *te); -static void _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid); -static void _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid); -static void _EndBlobs(ArchiveHandle *AH, TocEntry *te); - -#define K_STD_BUF_SIZE 1024 - -typedef struct -{ - int hasSeek; - pgoff_t filePos; - FILE *blobToc; -} lclContext; - -typedef struct -{ -#ifdef HAVE_LIBZ - gzFile FH; -#else - FILE *FH; -#endif - char *filename; -} lclTocEntry; - -static const char *modulename = gettext_noop("file archiver"); -static void _LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt); -static void _getBlobTocEntry(ArchiveHandle *AH, Oid *oid, char *fname); - -/* - * Initializer - */ -void -InitArchiveFmt_Files(ArchiveHandle *AH) -{ - lclContext *ctx; - - /* Assuming static functions, this can be copied for each format. */ - AH->ArchiveEntryPtr = _ArchiveEntry; - AH->StartDataPtr = _StartData; - AH->WriteDataPtr = _WriteData; - AH->EndDataPtr = _EndData; - AH->WriteBytePtr = _WriteByte; - AH->ReadBytePtr = _ReadByte; - AH->WriteBufPtr = _WriteBuf; - AH->ReadBufPtr = _ReadBuf; - AH->ClosePtr = _CloseArchive; - AH->ReopenPtr = NULL; - AH->PrintTocDataPtr = _PrintTocData; - AH->ReadExtraTocPtr = _ReadExtraToc; - AH->WriteExtraTocPtr = _WriteExtraToc; - AH->PrintExtraTocPtr = _PrintExtraToc; - - AH->StartBlobsPtr = _StartBlobs; - AH->StartBlobPtr = _StartBlob; - AH->EndBlobPtr = _EndBlob; - AH->EndBlobsPtr = _EndBlobs; - AH->ClonePtr = NULL; - AH->DeClonePtr = NULL; - - /* - * Set up some special context used in compressing data. - */ - ctx = (lclContext *) pg_calloc(1, sizeof(lclContext)); - AH->formatData = (void *) ctx; - ctx->filePos = 0; - - /* Initialize LO buffering */ - AH->lo_buf_size = LOBBUFSIZE; - AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE); - - /* - * Now open the TOC file - */ - if (AH->mode == archModeWrite) - { - - write_msg(modulename, "WARNING:\n" - " This format is for demonstration purposes; it is not intended for\n" - " normal use. Files will be written in the current working directory.\n"); - - if (AH->fSpec && strcmp(AH->fSpec, "") != 0) - { - AH->FH = fopen(AH->fSpec, PG_BINARY_W); - if (AH->FH == NULL) - exit_horribly(modulename, "could not open output file \"%s\": %s\n", - AH->fSpec, strerror(errno)); - } - else - { - AH->FH = stdout; - if (AH->FH == NULL) - exit_horribly(modulename, "could not open output file: %s\n", - strerror(errno)); - } - - ctx->hasSeek = checkSeek(AH->FH); - - if (AH->compression < 0 || AH->compression > 9) - AH->compression = Z_DEFAULT_COMPRESSION; - - - } - else - { /* Read Mode */ - - if (AH->fSpec && strcmp(AH->fSpec, "") != 0) - { - AH->FH = fopen(AH->fSpec, PG_BINARY_R); - if (AH->FH == NULL) - exit_horribly(modulename, "could not open input file \"%s\": %s\n", - AH->fSpec, strerror(errno)); - } - else - { - AH->FH = stdin; - if (AH->FH == NULL) - exit_horribly(modulename, "could not open input file: %s\n", - strerror(errno)); - } - - ctx->hasSeek = checkSeek(AH->FH); - - ReadHead(AH); - ReadToc(AH); - /* Nothing else in the file... */ - if (fclose(AH->FH) != 0) - die_horribly(AH, modulename, "could not close TOC file: %s\n", strerror(errno)); - } -} - -/* - * - Start a new TOC entry - * Setup the output file name. - */ -static void -_ArchiveEntry(ArchiveHandle *AH, TocEntry *te) -{ - lclTocEntry *ctx; - char fn[K_STD_BUF_SIZE]; - - ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry)); - if (te->dataDumper) - { -#ifdef HAVE_LIBZ - if (AH->compression == 0) - sprintf(fn, "%d.dat", te->dumpId); - else - sprintf(fn, "%d.dat.gz", te->dumpId); -#else - sprintf(fn, "%d.dat", te->dumpId); -#endif - ctx->filename = pg_strdup(fn); - } - else - { - ctx->filename = NULL; - ctx->FH = NULL; - } - te->formatData = (void *) ctx; -} - -static void -_WriteExtraToc(ArchiveHandle *AH, TocEntry *te) -{ - lclTocEntry *ctx = (lclTocEntry *) te->formatData; - - if (ctx->filename) - WriteStr(AH, ctx->filename); - else - WriteStr(AH, ""); -} - -static void -_ReadExtraToc(ArchiveHandle *AH, TocEntry *te) -{ - lclTocEntry *ctx = (lclTocEntry *) te->formatData; - - if (ctx == NULL) - { - ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry)); - te->formatData = (void *) ctx; - } - - ctx->filename = ReadStr(AH); - if (strlen(ctx->filename) == 0) - { - free(ctx->filename); - ctx->filename = NULL; - } - ctx->FH = NULL; -} - -static void -_PrintExtraToc(ArchiveHandle *AH, TocEntry *te) -{ - lclTocEntry *ctx = (lclTocEntry *) te->formatData; - - if (AH->public.verbose) - ahprintf(AH, "-- File: %s\n", ctx->filename); -} - -static void -_StartData(ArchiveHandle *AH, TocEntry *te) -{ - lclTocEntry *tctx = (lclTocEntry *) te->formatData; - char fmode[10]; - - sprintf(fmode, "wb%d", AH->compression); - -#ifdef HAVE_LIBZ - tctx->FH = gzopen(tctx->filename, fmode); -#else - tctx->FH = fopen(tctx->filename, PG_BINARY_W); -#endif - - if (tctx->FH == NULL) - die_horribly(AH, modulename, "could not open output file \"%s\": %s\n", - tctx->filename, strerror(errno)); -} - -static size_t -_WriteData(ArchiveHandle *AH, const void *data, size_t dLen) -{ - lclTocEntry *tctx = (lclTocEntry *) AH->currToc->formatData; - - GZWRITE(data, 1, dLen, tctx->FH); - - return dLen; -} - -static void -_EndData(ArchiveHandle *AH, TocEntry *te) -{ - lclTocEntry *tctx = (lclTocEntry *) te->formatData; - - /* Close the file */ - if (GZCLOSE(tctx->FH) != 0) - die_horribly(AH, modulename, "could not close data file\n"); - - tctx->FH = NULL; -} - -/* - * Print data for a given file - */ -static void -_PrintFileData(ArchiveHandle *AH, char *filename, RestoreOptions *ropt) -{ - char buf[4096]; - size_t cnt; - - if (!filename) - return; - -#ifdef HAVE_LIBZ - AH->FH = gzopen(filename, "rb"); -#else - AH->FH = fopen(filename, PG_BINARY_R); -#endif - - if (AH->FH == NULL) - die_horribly(AH, modulename, "could not open input file \"%s\": %s\n", - filename, strerror(errno)); - - while ((cnt = GZREAD(buf, 1, 4095, AH->FH)) > 0) - { - buf[cnt] = '\0'; - ahwrite(buf, 1, cnt, AH); - } - - if (GZCLOSE(AH->FH) != 0) - die_horribly(AH, modulename, "could not close data file after reading\n"); -} - - -/* - * Print data for a given TOC entry -*/ -static void -_PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt) -{ - lclTocEntry *tctx = (lclTocEntry *) te->formatData; - - if (!tctx->filename) - return; - - if (strcmp(te->desc, "BLOBS") == 0) - _LoadBlobs(AH, ropt); - else - _PrintFileData(AH, tctx->filename, ropt); -} - -static void -_getBlobTocEntry(ArchiveHandle *AH, Oid *oid, char fname[K_STD_BUF_SIZE]) -{ - lclContext *ctx = (lclContext *) AH->formatData; - char blobTe[K_STD_BUF_SIZE]; - - if (fgets(blobTe, sizeof(blobTe), ctx->blobToc) != NULL) - { - size_t fpos; - size_t eos; - - *oid = atooid(blobTe); - - fpos = strcspn(blobTe, " "); - - strlcpy(fname, &blobTe[fpos + 1], K_STD_BUF_SIZE); - - eos = strlen(fname) - 1; - - if (fname[eos] == '\n') - fname[eos] = '\0'; - } - else - { - *oid = 0; - fname[0] = '\0'; - } -} - -static void -_LoadBlobs(ArchiveHandle *AH, RestoreOptions *ropt) -{ - Oid oid; - lclContext *ctx = (lclContext *) AH->formatData; - char fname[K_STD_BUF_SIZE]; - - StartRestoreBlobs(AH); - - ctx->blobToc = fopen("blobs.toc", PG_BINARY_R); - - if (ctx->blobToc == NULL) - die_horribly(AH, modulename, "could not open large object TOC for input: %s\n", strerror(errno)); - - _getBlobTocEntry(AH, &oid, fname); - - while (oid != 0) - { - StartRestoreBlob(AH, oid, ropt->dropSchema); - _PrintFileData(AH, fname, ropt); - EndRestoreBlob(AH, oid); - _getBlobTocEntry(AH, &oid, fname); - } - - if (fclose(ctx->blobToc) != 0) - die_horribly(AH, modulename, "could not close large object TOC file: %s\n", strerror(errno)); - - EndRestoreBlobs(AH); -} - - -static int -_WriteByte(ArchiveHandle *AH, const int i) -{ - lclContext *ctx = (lclContext *) AH->formatData; - - if (fputc(i, AH->FH) == EOF) - die_horribly(AH, modulename, "could not write byte\n"); - - ctx->filePos += 1; - - return 1; -} - -static int -_ReadByte(ArchiveHandle *AH) -{ - lclContext *ctx = (lclContext *) AH->formatData; - int res; - - res = getc(AH->FH); - if (res == EOF) - die_horribly(AH, modulename, "unexpected end of file\n"); - ctx->filePos += 1; - return res; -} - -static size_t -_WriteBuf(ArchiveHandle *AH, const void *buf, size_t len) -{ - lclContext *ctx = (lclContext *) AH->formatData; - size_t res; - - res = fwrite(buf, 1, len, AH->FH); - if (res != len) - die_horribly(AH, modulename, "could not write to output file: %s\n", strerror(errno)); - - ctx->filePos += res; - return res; -} - -static size_t -_ReadBuf(ArchiveHandle *AH, void *buf, size_t len) -{ - lclContext *ctx = (lclContext *) AH->formatData; - size_t res; - - res = fread(buf, 1, len, AH->FH); - ctx->filePos += res; - return res; -} - -static void -_CloseArchive(ArchiveHandle *AH) -{ - if (AH->mode == archModeWrite) - { - WriteHead(AH); - WriteToc(AH); - if (fclose(AH->FH) != 0) - die_horribly(AH, modulename, "could not close TOC file: %s\n", strerror(errno)); - WriteDataChunks(AH); - } - - AH->FH = NULL; -} - - - -/* - * BLOB support - */ - -/* - * Called by the archiver when starting to save all BLOB DATA (not schema). - * This routine should save whatever format-specific information is needed - * to read the BLOBs back into memory. - * - * It is called just prior to the dumper's DataDumper routine. - * - * Optional, but strongly recommended. - */ -static void -_StartBlobs(ArchiveHandle *AH, TocEntry *te) -{ - lclContext *ctx = (lclContext *) AH->formatData; - char fname[K_STD_BUF_SIZE]; - - sprintf(fname, "blobs.toc"); - ctx->blobToc = fopen(fname, PG_BINARY_W); - - if (ctx->blobToc == NULL) - die_horribly(AH, modulename, - "could not open large object TOC for output: %s\n", strerror(errno)); -} - -/* - * Called by the archiver when the dumper calls StartBlob. - * - * Mandatory. - * - * Must save the passed OID for retrieval at restore-time. - */ -static void -_StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) -{ - lclContext *ctx = (lclContext *) AH->formatData; - lclTocEntry *tctx = (lclTocEntry *) te->formatData; - char fmode[10]; - char fname[255]; - char *sfx; - - if (oid == 0) - die_horribly(AH, modulename, "invalid OID for large object (%u)\n", oid); - - if (AH->compression != 0) - sfx = ".gz"; - else - sfx = ""; - - sprintf(fmode, "wb%d", AH->compression); - sprintf(fname, "blob_%u.dat%s", oid, sfx); - - fprintf(ctx->blobToc, "%u %s\n", oid, fname); - -#ifdef HAVE_LIBZ - tctx->FH = gzopen(fname, fmode); -#else - tctx->FH = fopen(fname, PG_BINARY_W); -#endif - - if (tctx->FH == NULL) - die_horribly(AH, modulename, "could not open large object file \"%s\" for input: %s\n", - fname, strerror(errno)); -} - -/* - * Called by the archiver when the dumper calls EndBlob. - * - * Optional. - */ -static void -_EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid) -{ - lclTocEntry *tctx = (lclTocEntry *) te->formatData; - - if (GZCLOSE(tctx->FH) != 0) - die_horribly(AH, modulename, "could not close large object file\n"); -} - -/* - * Called by the archiver when finishing saving all BLOB DATA. - * - * Optional. - */ -static void -_EndBlobs(ArchiveHandle *AH, TocEntry *te) -{ - lclContext *ctx = (lclContext *) AH->formatData; - - /* Write out a fake zero OID to mark end-of-blobs. */ - /* WriteInt(AH, 0); */ - - if (fclose(ctx->blobToc) != 0) - die_horribly(AH, modulename, "could not close large object TOC file: %s\n", strerror(errno)); -} diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 57a6ccb56f36df1d895005461e227c11c8855940..4545f97a63d804af41cb8a4e20010bc495f28e9f 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -934,13 +934,6 @@ parseArchiveFormat(const char *format, ArchiveMode *mode) archiveFormat = archDirectory; else if (pg_strcasecmp(format, "directory") == 0) archiveFormat = archDirectory; - else if (pg_strcasecmp(format, "f") == 0 || pg_strcasecmp(format, "file") == 0) - - /* - * Dump files into the current directory; for demonstration only, not - * documented. - */ - archiveFormat = archFiles; else if (pg_strcasecmp(format, "p") == 0) archiveFormat = archNull; else if (pg_strcasecmp(format, "plain") == 0) diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index b5f4c627c4063cd5c90bd96ec94e48bb2c57056a..1e2b6fd046bdbdcf480f802b32ef2cf7703e305d 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -365,11 +365,6 @@ main(int argc, char **argv) opts->format = archDirectory; break; - case 'f': - case 'F': - opts->format = archFiles; - break; - case 't': case 'T': opts->format = archTar;