Add pg_dump -X no-data-for-failed-tables option to suppress loading data
authorBruce Momjian <bruce@momjian.us>
Tue, 1 Aug 2006 18:21:44 +0000 (18:21 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 1 Aug 2006 18:21:44 +0000 (18:21 +0000)
if table creation failed (the table already exists).

Martin Pitt

doc/src/sgml/ref/pg_restore.sgml
src/bin/pg_dump/pg_backup.h
src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_restore.c

index f40e38e54fb72cbdd0063de36d7d0086d1b510d7..690e09aed6c4bee2f9a5dfaba8426b3635dfb84b 100644 (file)
       </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>
       </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>
 
index 54833963714bb0598afc4c21731c0ad4d684aeb4..dc057b7836fde7fe6fa221ea7812fd70dd1bbd3e 100644 (file)
@@ -109,6 +109,7 @@ typedef struct _restoreOptions
        char       *pghost;
        char       *username;
        int                     ignoreVersion;
+       int                     noDataForFailedTables;
        int                     requirePassword;
        int                     exit_on_error;
 
index c8c7074e56da3bf0aeb58c0c2fe7bb85afd3e0f5..99abc0d0d7ade124eddcc1da7083fa274dc9e887 100644 (file)
@@ -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)
                        {
index 2147e44f289563ab02534f4649992e1e2b9eff8e..c21f8bf1aa4619d8211a8c8100f8664e20d3369a 100644 (file)
@@ -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"));