From time to time there are complaints because people mistakenly feed a
text format dump to pg_restore and get back a somewhat cryptic message
about the file not being a valid archive. It's been suggested that we
should have pg_restore run the file through psql, but that would involve
more work than I at least care to give the problem. However, I think we
should give a nicer message, suggesting the user try feeding the file to
psql instead. The attached small patch does that.
cheers
andrew
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 7d895c4..9918c4d 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -77,6 +77,9 @@ typedef struct _parallel_slot
#define NO_SLOT (-1)
+#define TEXT_DUMP_HEADER "--\n-- PostgreSQL database dump\n--\n\n"
+#define TEXT_DUMPALL_HEADER "--\n-- PostgreSQL database cluster dump\n--\n\n"
+
/* state needed to save/restore an archive's output target */
typedef struct _outputContext
{
@@ -1872,7 +1875,19 @@ _discoverArchiveFormat(ArchiveHandle *AH)
die_horribly(AH, modulename, "input file does not appear to be a valid archive (too short?)\n");
if (!isValidTarHeader(AH->lookahead))
- die_horribly(AH, modulename, "input file does not appear to be a valid archive\n");
+ {
+ if (strncmp(AH->lookahead, TEXT_DUMP_HEADER, strlen(TEXT_DUMP_HEADER)) == 0 ||
+ strncmp(AH->lookahead, TEXT_DUMPALL_HEADER, strlen(TEXT_DUMPALL_HEADER)) == 0)
+ {
+ /* looks like it's probably a text format dump. so suggest they try psql */
+ die_horribly(AH, modulename, "input file appears to be a text format dump. Please use psql.\n");
+ }
+ else
+ {
+ /* we have no idea what this is */
+ die_horribly(AH, modulename, "input file does not appear to be a valid archive\n");
+ }
+ }
AH->format = archTar;
}
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers