Hi again, Martin Pitt [2006-02-19 14:39 +0100]: > Since this changes the behaviour of pg_restore, this should probably > become an option, e. g. -D / --ignore-existing-table-data. I'll do > this if you agree to the principle of the current patch.
I improved the patch now to only ignore TABLE DATA for existing tables if '-X ignore-existing-tables' is specified. I also updated the documentation. Since this doesn't change the default behaviour now any more, I would like to put this patch into the Debian packages to provide automatic upgrades for PostGIS-enabled databases (see [1]). Does anyone object to this? Do you consider to adopt this upstream? Thanks in advance, and have a nice weekend! Martin [1] http://bugs.debian.org/351571 -- Martin Pitt http://www.piware.de Ubuntu Developer http://www.ubuntu.com Debian Developer http://www.debian.org In a world without walls and fences, who needs Windows and Gates?
--- postgresql-8.1.3/doc/src/sgml/ref/pg_restore.sgml
+++ postgresql-8.1.3/doc/src/sgml/ref/pg_restore.sgml
@@ -395,6 +395,19 @@
</listitem>
</varlistentry>
+ <varlistentry>
+ <term><option>-X ignore-existing-tables</></term>
+ <listitem>
+ <para>
+ By default, table data objects are restored even if the
+ associated table 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>
--- postgresql-8.1.3/src/bin/pg_dump/pg_backup_archiver.c
+++ postgresql-8.1.3/src/bin/pg_dump/pg_backup_archiver.c
@@ -268,6 +268,21 @@
_printTocEntry(AH, te, ropt, false, false);
defnDumped = true;
+ /* If we could not create a table, ignore the
respective TABLE DATA if
+ * -X ignore-existing-tables is given */
+ if (ropt->ignoreExistingTables && AH->lastErrorTE == te
&& strcmp (te->desc, "TABLE") == 0) {
+ TocEntry *tes;
+
+ ahlog (AH, 1, "table %s could not be created,
will not restore its data\n", te->tag);
+
+ for (tes = te->next; tes != AH->toc; tes =
tes->next) {
+ if (strcmp (tes->desc, "TABLE DATA") ==
0 && strcmp (tes->tag, te->tag) == 0) {
+ strcpy (tes->desc, "IGNOREDATA");
+ break;
+ }
+ }
+ }
+
/* If we created a DB, connect to it... */
if (strcmp(te->desc, "DATABASE") == 0)
{
@@ -1876,6 +1891,10 @@
if (strcmp(te->desc, "ENCODING") == 0)
return 0;
+ /* IGNOREDATA is a TABLE DATA which should not be restored */
+ if (strcmp (te->desc, "IGNOREDATA") == 0)
+ return 0;
+
/* If it's an ACL, maybe ignore it */
if ((!include_acls || ropt->aclsSkip) && strcmp(te->desc, "ACL") == 0)
return 0;
--- postgresql-8.1.3/src/bin/pg_dump/pg_backup.h
+++ postgresql-8.1.3/src/bin/pg_dump/pg_backup.h
@@ -106,6 +106,7 @@
char *pghost;
char *username;
int ignoreVersion;
+ int ignoreExistingTables;
int requirePassword;
int exit_on_error;
--- postgresql-8.1.3/src/bin/pg_dump/pg_restore.c
+++ postgresql-8.1.3/src/bin/pg_dump/pg_restore.c
@@ -254,6 +254,8 @@
use_setsessauth = 1;
else if (strcmp(optarg, "disable-triggers") ==
0)
disable_triggers = 1;
+ else if (strcmp(optarg,
"ignore-existing-tables") == 0)
+ opts->ignoreExistingTables = 1;
else
{
fprintf(stderr,
@@ -394,6 +396,8 @@
printf(_(" -X use-set-session-authorization,
--use-set-session-authorization\n"
" use SESSION AUTHORIZATION
commands instead of\n"
" OWNER TO commands\n"));
+ printf(_(" -X ignore-existing-tables\n"
+ " skip restoration of data for
already existing tables\n"));
printf(_("\nConnection options:\n"));
printf(_(" -h, --host=HOSTNAME database server host or socket
directory\n"));
signature.asc
Description: Digital signature
