Please find attached a small patch so that "pg_restore" ignores some sql

errors. This is the second submission, which integrates Tom comments about
localisation and exit code. I also added some comments about one sql
command which is not ignored.

Fabien COELHO
This commit is contained in:
Bruce Momjian 2004-04-22 02:39:10 +00:00
parent be6bbcef56
commit ec7c4c1b66
5 changed files with 57 additions and 12 deletions

View File

@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup.h,v 1.29 2004/03/24 03:06:08 momjian Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup.h,v 1.30 2004/04/22 02:39:09 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -57,6 +57,11 @@ typedef struct _Archive
int remoteVersion;
int minRemoteVersion;
int maxRemoteVersion;
/* error handling */
bool die_on_errors; /* whether to die on sql errors... */
int n_errors; /* number of errors (if no die) */
/* The rest is private */
} Archive;

View File

@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.85 2004/03/24 03:06:08 momjian Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.86 2004/04/22 02:39:10 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -1197,6 +1197,24 @@ die_horribly(ArchiveHandle *AH, const char *modulename, const char *fmt,...)
va_end(ap);
}
/* on some error, we may decide to go on... */
void
warn_or_die_horribly(ArchiveHandle *AH,
const char *modulename, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
if (AH->public.die_on_errors)
{
_die_horribly(AH, modulename, fmt, ap);
}
else
{
_write_msg(modulename, fmt, ap);
AH->public.n_errors++;
}
va_end(ap);
}
static void
_moveAfter(ArchiveHandle *AH, TocEntry *pos, TocEntry *te)
@ -1651,6 +1669,10 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
die_horribly(AH, modulename, "unrecognized file format \"%d\"\n", fmt);
}
/* sql error handling */
AH->public.die_on_errors = true;
AH->public.n_errors = 0;
return AH;
}
@ -2011,6 +2033,7 @@ _doSetSessionAuth(ArchiveHandle *AH, const char *user)
res = PQexec(AH->connection, cmd->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
/* NOT warn_or_die_horribly... use -O instead to skip this. */
die_horribly(AH, modulename, "could not set session user to \"%s\": %s",
user, PQerrorMessage(AH->connection));
@ -2042,8 +2065,9 @@ _doSetWithOids(ArchiveHandle *AH, const bool withOids)
res = PQexec(AH->connection, cmd->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
die_horribly(AH, modulename, "could not set default_with_oids: %s",
PQerrorMessage(AH->connection));
warn_or_die_horribly(AH, modulename,
"could not set default_with_oids: %s",
PQerrorMessage(AH->connection));
PQclear(res);
}
@ -2181,8 +2205,9 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName)
res = PQexec(AH->connection, qry->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
die_horribly(AH, modulename, "could not set search_path to \"%s\": %s",
schemaName, PQerrorMessage(AH->connection));
warn_or_die_horribly(AH, modulename,
"could not set search_path to \"%s\": %s",
schemaName, PQerrorMessage(AH->connection));
PQclear(res);
}

View File

@ -17,7 +17,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.57 2004/03/24 03:06:08 momjian Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.58 2004/04/22 02:39:10 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -281,6 +281,7 @@ typedef struct _tocEntry
extern const char *progname;
extern void die_horribly(ArchiveHandle *AH, const char *modulename, const char *fmt,...) __attribute__((format(printf, 3, 4)));
extern void warn_or_die_horribly(ArchiveHandle *AH, const char *modulename, const char *fmt,...) __attribute__((format(printf, 3, 4)));
extern void write_msg(const char *modulename, const char *fmt,...) __attribute__((format(printf, 2, 3)));
extern void WriteTOC(ArchiveHandle *AH);

View File

@ -5,7 +5,7 @@
* Implements the basic DB functions used by the archiver.
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.52 2004/03/03 21:28:54 tgl Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.53 2004/04/22 02:39:10 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -316,8 +316,8 @@ _executeSqlCommand(ArchiveHandle *AH, PGconn *conn, PQExpBuffer qry, char *desc)
AH->pgCopyIn = 1;
}
else
die_horribly(AH, modulename, "%s: %s",
desc, PQerrorMessage(AH->connection));
warn_or_die_horribly(AH, modulename, "%s: %s",
desc, PQerrorMessage(AH->connection));
}
PQclear(res);

View File

@ -34,7 +34,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.55 2003/12/06 03:00:16 tgl Exp $
* $PostgreSQL: pgsql/src/bin/pg_dump/pg_restore.c,v 1.56 2004/04/22 02:39:10 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -77,6 +77,7 @@ main(int argc, char **argv)
{
RestoreOptions *opts;
int c;
int exit_code;
Archive *AH;
char *inputFileSpec;
extern int optind;
@ -323,6 +324,11 @@ main(int argc, char **argv)
/* Let the archiver know how noisy to be */
AH->verbose = opts->verbose;
/* restore keeps submitting sql commands as "pg_restore ... | psql ... "
* this behavior choice could be turned into an option.
*/
AH->die_on_errors = false;
if (opts->tocFile)
SortTocFromFile(AH, opts);
@ -331,9 +337,17 @@ main(int argc, char **argv)
else
RestoreArchive(AH, opts);
/* done, print a summary of ignored errors */
if (AH->n_errors)
fprintf(stderr, _("WARNING, errors ignored on restore: %d\n"),
AH->n_errors);
/* AH may be freed in CloseArchive? */
exit_code = AH->n_errors? 1: 0;
CloseArchive(AH);
return 0;
return exit_code;
}
static void