diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 9ecfd0c..8ee00f3 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -144,7 +144,7 @@ static int serializable_deferrable = 0; static void help(const char *progname); static void setup_connection(Archive *AH, const char *dumpencoding, - char *use_role); + const char *dumpsnapshot, char *use_role); static ArchiveFormat parseArchiveFormat(const char *format, ArchiveMode *mode); static void expand_schema_name_patterns(Archive *fout, SimpleStringList *patterns, @@ -280,6 +280,7 @@ main(int argc, char **argv) const char *pgport = NULL; const char *username = NULL; const char *dumpencoding = NULL; + const char *dumpsnapshot = NULL; bool oids = false; TableInfo *tblinfo; int numTables; @@ -359,6 +360,7 @@ main(int argc, char **argv) {"no-security-labels", no_argument, &no_security_labels, 1}, {"no-synchronized-snapshots", no_argument, &no_synchronized_snapshots, 1}, {"no-unlogged-table-data", no_argument, &no_unlogged_table_data, 1}, + {"snapshot", required_argument, NULL, 6}, {NULL, 0, NULL, 0} }; @@ -536,6 +538,10 @@ main(int argc, char **argv) set_dump_section(optarg, &dumpSections); break; + case 6: /* snapshot */ + dumpsnapshot = pg_strdup(optarg); + break; + default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit_nicely(1); @@ -635,7 +641,7 @@ main(int argc, char **argv) * death. */ ConnectDatabase(fout, dbname, pghost, pgport, username, prompt_password); - setup_connection(fout, dumpencoding, use_role); + setup_connection(fout, dumpencoding, dumpsnapshot, use_role); /* * Disable security label support if server version < v9.1.x (prevents @@ -679,6 +685,10 @@ main(int argc, char **argv) "Run with --no-synchronized-snapshots instead if you do not need\n" "synchronized snapshots.\n"); + if (fout->remoteVersion < 90200) + exit_horribly(NULL, + "Exported snapshots are not supported by this server version.\n"); + /* Find the last built-in OID, if needed */ if (fout->remoteVersion < 70300) { @@ -916,7 +926,8 @@ help(const char *progname) } static void -setup_connection(Archive *AH, const char *dumpencoding, char *use_role) +setup_connection(Archive *AH, const char *dumpencoding, + const char *dumpsnapshot, char *use_role) { PGconn *conn = GetConnection(AH); const char *std_strings; @@ -1024,28 +1035,29 @@ setup_connection(Archive *AH, const char *dumpencoding, char *use_role) ExecuteSqlStatement(AH, "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"); + if (dumpsnapshot) + AH->sync_snapshot_id = strdup(dumpsnapshot); + else if (AH->numWorkers > 1 && AH->remoteVersion >= 90200 && !no_synchronized_snapshots) + { + if (AH->sync_snapshot_id == NULL) + AH->sync_snapshot_id = get_synchronized_snapshot(AH); + } - - if (AH->numWorkers > 1 && AH->remoteVersion >= 90200 && !no_synchronized_snapshots) + if (AH->sync_snapshot_id) { - if (AH->sync_snapshot_id) - { - PQExpBuffer query = createPQExpBuffer(); + PQExpBuffer query = createPQExpBuffer(); - appendPQExpBuffer(query, "SET TRANSACTION SNAPSHOT "); - appendStringLiteralConn(query, AH->sync_snapshot_id, conn); - ExecuteSqlStatement(AH, query->data); - destroyPQExpBuffer(query); - } - else - AH->sync_snapshot_id = get_synchronized_snapshot(AH); + appendPQExpBuffer(query, "SET TRANSACTION SNAPSHOT "); + appendStringLiteralConn(query, AH->sync_snapshot_id, conn); + ExecuteSqlStatement(AH, query->data); + destroyPQExpBuffer(query); } } static void setupDumpWorker(Archive *AHX, RestoreOptions *ropt) { - setup_connection(AHX, NULL, NULL); + setup_connection(AHX, NULL, NULL, NULL); } static char *