mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
pg_dump: Reduce use of global variables
Most pg_dump.c global variables, which were passed down individually to dumping routines, are now grouped as members of the new DumpOptions struct, which is used as a local variable and passed down into routines that need it. This helps future development efforts; in particular it is said to enable a mode in which a parallel pg_dump run can output multiple streams, and have them restored in parallel. Also take the opportunity to clean up the pg_dump header files somewhat, to avoid circularity. Author: Joachim Wieland, revised by Álvaro Herrera Reviewed by Peter Eisentraut
This commit is contained in:
@@ -19,10 +19,12 @@
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include "parallel.h"
|
||||
#include "pg_backup_archiver.h"
|
||||
#include "pg_backup_db.h"
|
||||
#include "pg_backup_utils.h"
|
||||
#include "parallel.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
@@ -106,6 +108,61 @@ static void reduce_dependencies(ArchiveHandle *AH, TocEntry *te,
|
||||
static void mark_create_done(ArchiveHandle *AH, TocEntry *te);
|
||||
static void inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te);
|
||||
|
||||
/*
|
||||
* Allocate a new DumpOptions block.
|
||||
* This is mainly so we can initialize it, but also for future expansion.
|
||||
* We pg_malloc0 the structure, so we don't need to initialize whatever is
|
||||
* 0, NULL or false anyway.
|
||||
*/
|
||||
DumpOptions *
|
||||
NewDumpOptions(void)
|
||||
{
|
||||
DumpOptions *opts;
|
||||
|
||||
opts = (DumpOptions *) pg_malloc0(sizeof(DumpOptions));
|
||||
|
||||
/* set any fields that shouldn't default to zeroes */
|
||||
opts->include_everything = true;
|
||||
opts->dumpSections = DUMP_UNSECTIONED;
|
||||
|
||||
return opts;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a freshly allocated DumpOptions with options equivalent to those
|
||||
* found in the given RestoreOptions.
|
||||
*/
|
||||
DumpOptions *
|
||||
dumpOptionsFromRestoreOptions(RestoreOptions *ropt)
|
||||
{
|
||||
DumpOptions *dopt = NewDumpOptions();
|
||||
|
||||
/* this is the inverse of what's at the end of pg_dump.c's main() */
|
||||
dopt->outputClean = ropt->dropSchema;
|
||||
dopt->dataOnly = ropt->dataOnly;
|
||||
dopt->schemaOnly = ropt->schemaOnly;
|
||||
dopt->if_exists = ropt->if_exists;
|
||||
dopt->column_inserts = ropt->column_inserts;
|
||||
dopt->dumpSections = ropt->dumpSections;
|
||||
dopt->aclsSkip = ropt->aclsSkip;
|
||||
dopt->outputSuperuser = ropt->superuser;
|
||||
dopt->outputCreateDB = ropt->createDB;
|
||||
dopt->outputNoOwner = ropt->noOwner;
|
||||
dopt->outputNoTablespaces = ropt->noTablespace;
|
||||
dopt->disable_triggers = ropt->disable_triggers;
|
||||
dopt->use_setsessauth = ropt->use_setsessauth;
|
||||
|
||||
dopt->disable_dollar_quoting = ropt->disable_dollar_quoting;
|
||||
dopt->dump_inserts = ropt->dump_inserts;
|
||||
dopt->no_security_labels = ropt->no_security_labels;
|
||||
dopt->lockWaitTimeout = ropt->lockWaitTimeout;
|
||||
dopt->include_everything = ropt->include_everything;
|
||||
dopt->enable_row_security = ropt->enable_row_security;
|
||||
|
||||
return dopt;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Wrapper functions.
|
||||
*
|
||||
@@ -120,7 +177,7 @@ static void inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te);
|
||||
* setup doesn't need to know anything much, so it's defined here.
|
||||
*/
|
||||
static void
|
||||
setupRestoreWorker(Archive *AHX, RestoreOptions *ropt)
|
||||
setupRestoreWorker(Archive *AHX, DumpOptions *dopt, RestoreOptions *ropt)
|
||||
{
|
||||
ArchiveHandle *AH = (ArchiveHandle *) AHX;
|
||||
|
||||
@@ -152,12 +209,12 @@ OpenArchive(const char *FileSpec, const ArchiveFormat fmt)
|
||||
|
||||
/* Public */
|
||||
void
|
||||
CloseArchive(Archive *AHX)
|
||||
CloseArchive(Archive *AHX, DumpOptions *dopt)
|
||||
{
|
||||
int res = 0;
|
||||
ArchiveHandle *AH = (ArchiveHandle *) AHX;
|
||||
|
||||
(*AH->ClosePtr) (AH);
|
||||
(*AH->ClosePtr) (AH, dopt);
|
||||
|
||||
/* Close the output */
|
||||
if (AH->gzOut)
|
||||
@@ -368,7 +425,7 @@ RestoreArchive(Archive *AHX)
|
||||
if (ropt->single_txn)
|
||||
{
|
||||
if (AH->connection)
|
||||
StartTransaction(AH);
|
||||
StartTransaction(AHX);
|
||||
else
|
||||
ahprintf(AH, "BEGIN;\n\n");
|
||||
}
|
||||
@@ -548,7 +605,7 @@ RestoreArchive(Archive *AHX)
|
||||
Assert(AH->connection == NULL);
|
||||
|
||||
/* ParallelBackupStart() will actually fork the processes */
|
||||
pstate = ParallelBackupStart(AH, ropt);
|
||||
pstate = ParallelBackupStart(AH, NULL, ropt);
|
||||
restore_toc_entries_parallel(AH, pstate, &pending_list);
|
||||
ParallelBackupEnd(AH, pstate);
|
||||
|
||||
@@ -586,7 +643,7 @@ RestoreArchive(Archive *AHX)
|
||||
if (ropt->single_txn)
|
||||
{
|
||||
if (AH->connection)
|
||||
CommitTransaction(AH);
|
||||
CommitTransaction(AHX);
|
||||
else
|
||||
ahprintf(AH, "COMMIT;\n\n");
|
||||
}
|
||||
@@ -767,7 +824,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te,
|
||||
* Parallel restore is always talking directly to a
|
||||
* server, so no need to see if we should issue BEGIN.
|
||||
*/
|
||||
StartTransaction(AH);
|
||||
StartTransaction(&AH->public);
|
||||
|
||||
/*
|
||||
* If the server version is >= 8.4, make sure we issue
|
||||
@@ -798,12 +855,12 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te,
|
||||
*/
|
||||
if (AH->outputKind == OUTPUT_COPYDATA &&
|
||||
RestoringToDB(AH))
|
||||
EndDBCopyMode(AH, te);
|
||||
EndDBCopyMode(&AH->public, te->tag);
|
||||
AH->outputKind = OUTPUT_SQLCMDS;
|
||||
|
||||
/* close out the transaction started above */
|
||||
if (is_parallel && te->created)
|
||||
CommitTransaction(AH);
|
||||
CommitTransaction(&AH->public);
|
||||
|
||||
_enableTriggersIfNecessary(AH, te, ropt);
|
||||
}
|
||||
@@ -1099,7 +1156,7 @@ StartRestoreBlobs(ArchiveHandle *AH)
|
||||
if (!AH->ropt->single_txn)
|
||||
{
|
||||
if (AH->connection)
|
||||
StartTransaction(AH);
|
||||
StartTransaction(&AH->public);
|
||||
else
|
||||
ahprintf(AH, "BEGIN;\n\n");
|
||||
}
|
||||
@@ -1116,7 +1173,7 @@ EndRestoreBlobs(ArchiveHandle *AH)
|
||||
if (!AH->ropt->single_txn)
|
||||
{
|
||||
if (AH->connection)
|
||||
CommitTransaction(AH);
|
||||
CommitTransaction(&AH->public);
|
||||
else
|
||||
ahprintf(AH, "COMMIT;\n\n");
|
||||
}
|
||||
@@ -1573,7 +1630,7 @@ ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
|
||||
* connected then send it to the DB.
|
||||
*/
|
||||
if (RestoringToDB(AH))
|
||||
bytes_written = ExecuteSqlCommandBuf(AH, (const char *) ptr, size * nmemb);
|
||||
bytes_written = ExecuteSqlCommandBuf(&AH->public, (const char *) ptr, size * nmemb);
|
||||
else
|
||||
bytes_written = fwrite(ptr, size, nmemb, AH->OF) * size;
|
||||
}
|
||||
@@ -2240,7 +2297,7 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
|
||||
}
|
||||
|
||||
void
|
||||
WriteDataChunks(ArchiveHandle *AH, ParallelState *pstate)
|
||||
WriteDataChunks(ArchiveHandle *AH, DumpOptions *dopt, ParallelState *pstate)
|
||||
{
|
||||
TocEntry *te;
|
||||
|
||||
@@ -2263,13 +2320,13 @@ WriteDataChunks(ArchiveHandle *AH, ParallelState *pstate)
|
||||
DispatchJobForTocEntry(AH, pstate, te, ACT_DUMP);
|
||||
}
|
||||
else
|
||||
WriteDataChunksForTocEntry(AH, te);
|
||||
WriteDataChunksForTocEntry(AH, dopt, te);
|
||||
}
|
||||
EnsureWorkersFinished(AH, pstate);
|
||||
}
|
||||
|
||||
void
|
||||
WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te)
|
||||
WriteDataChunksForTocEntry(ArchiveHandle *AH, DumpOptions *dopt, TocEntry *te)
|
||||
{
|
||||
StartDataPtr startPtr;
|
||||
EndDataPtr endPtr;
|
||||
@@ -2293,7 +2350,7 @@ WriteDataChunksForTocEntry(ArchiveHandle *AH, TocEntry *te)
|
||||
/*
|
||||
* The user-provided DataDumper routine needs to call AH->WriteData
|
||||
*/
|
||||
(*te->dataDumper) ((Archive *) AH, te->dataDumperArg);
|
||||
(*te->dataDumper) ((Archive *) AH, dopt, te->dataDumperArg);
|
||||
|
||||
if (endPtr != NULL)
|
||||
(*endPtr) (AH, te);
|
||||
|
Reference in New Issue
Block a user