From c61607bd52d84bc543f451ea27c22e8212a48b24 Mon Sep 17 00:00:00 2001 From: Bruce Momjian <bruce@momjian.us> Date: Tue, 1 Aug 2006 18:21:44 +0000 Subject: [PATCH] Add pg_dump -X no-data-for-failed-tables option to suppress loading data if table creation failed (the table already exists). Martin Pitt --- doc/src/sgml/ref/pg_restore.sgml | 44 ++++++++++++++++++---------- src/bin/pg_dump/pg_backup.h | 3 +- src/bin/pg_dump/pg_backup_archiver.c | 19 +++++++++++- src/bin/pg_dump/pg_restore.c | 7 ++++- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml index b82969aaf63..2caea151517 100644 --- a/doc/src/sgml/ref/pg_restore.sgml +++ b/doc/src/sgml/ref/pg_restore.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.59 2006/03/17 16:02:47 petere Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/ref/pg_restore.sgml,v 1.60 2006/08/01 18:21:44 momjian Exp $ --> <refentry id="APP-PGRESTORE"> <refmeta> @@ -360,20 +360,6 @@ </listitem> </varlistentry> - <varlistentry> - <term><option>-X use-set-session-authorization</option></term> - <term><option>--use-set-session-authorization</option></term> - <listitem> - <para> - Output SQL-standard <command>SET SESSION AUTHORIZATION</> commands - instead of <command>ALTER OWNER</> commands to determine object - ownership. This makes the dump more standards compatible, but - depending on the history of the objects in the dump, may not restore - properly. - </para> - </listitem> - </varlistentry> - <varlistentry> <term><option>-X disable-triggers</></term> <term><option>--disable-triggers</></term> @@ -397,6 +383,34 @@ </listitem> </varlistentry> + <varlistentry> + <term><option>-X use-set-session-authorization</option></term> + <term><option>--use-set-session-authorization</option></term> + <listitem> + <para> + Output SQL-standard <command>SET SESSION AUTHORIZATION</> commands + instead of <command>ALTER OWNER</> commands to determine object + ownership. This makes the dump more standards compatible, but + depending on the history of the objects in the dump, may not restore + properly. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><option>-X no-data-for-failed-tables</></term> + <listitem> + <para> + By default, table data objects are restored even if the + associated table could not be successfully created (e. g. + because it already exists). With this option, such table + data is silently ignored. This is useful for dumping and + restoring databases with tables which contain auxiliary data + for PostgreSQL extensions (e. g. PostGIS). + </para> + </listitem> + </varlistentry> + </variablelist> </para> diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index 6f81b8deecc..426b5110fbd 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup.h,v 1.41 2006/07/14 14:52:26 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup.h,v 1.42 2006/08/01 18:21:44 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -109,6 +109,7 @@ typedef struct _restoreOptions char *pghost; char *username; int ignoreVersion; + int noDataForFailedTables; int requirePassword; int exit_on_error; diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 76ebc0b89b0..6100633d56e 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.134 2006/07/18 17:42:00 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.135 2006/08/01 18:21:44 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -278,6 +278,23 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt) _printTocEntry(AH, te, ropt, false, false); defnDumped = true; + /* If we could not create a table, ignore the respective TABLE DATA if + * -X no-data-for-failed-tables is given */ + if (ropt->noDataForFailedTables && AH->lastErrorTE == te && strcmp (te->desc, "TABLE") == 0) { + TocEntry *tes, *last; + + ahlog (AH, 1, "table %s could not be created, will not restore its data\n", te->tag); + + for (last = te, tes = te->next; tes != AH->toc; last = tes, tes = tes->next) { + if (strcmp (tes->desc, "TABLE DATA") == 0 && strcmp (tes->tag, te->tag) == 0 && + strcmp (tes->namespace ? tes->namespace : "", te->namespace ? te->namespace : "") == 0) { + /* remove this node */ + last->next = tes->next; + break; + } + } + } + /* If we created a DB, connect to it... */ if (strcmp(te->desc, "DATABASE") == 0) { diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index 410a2104f4f..474973ffda9 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -34,7 +34,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.79 2006/07/14 14:52:26 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.80 2006/08/01 18:21:44 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -252,6 +252,8 @@ main(int argc, char **argv) use_setsessauth = 1; else if (strcmp(optarg, "disable-triggers") == 0) disable_triggers = 1; + else if (strcmp(optarg, "no-data-for-failed-tables") == 0) + opts->noDataForFailedTables = 1; else { fprintf(stderr, @@ -397,6 +399,9 @@ usage(const char *progname) printf(_(" -X use-set-session-authorization, --use-set-session-authorization\n" " use SESSION AUTHORIZATION commands instead of\n" " OWNER TO commands\n")); + printf(_(" -X no-data-for-failed-tables\n" + " do not restore data of tables which could not be\n" + " created\n")); printf(_(" -1, --single-transaction restore as a single transaction\n")); printf(_("\nConnection options:\n")); -- GitLab