Fix case of pg_dump -Fc to an unseekable file (such as a pipe).

This was accidentally broken in commits cfa1b4a711/5e8e794e3b.
It saves a line or so to call ftello unconditionally in _CloseArchive,
but we have to expect that it might fail if we're not in hasSeek mode.
Per report from Bernd Helmle.

In passing, improve _getFilePos to print an appropriate message if
ftello fails unexpectedly, rather than just a vague complaint about
"ftell mismatch".
This commit is contained in:
Tom Lane 2014-05-05 11:26:41 -04:00
parent f8db074049
commit e03485ae8a
1 changed files with 14 additions and 10 deletions

View File

@ -707,8 +707,9 @@ _CloseArchive(ArchiveHandle *AH)
if (AH->mode == archModeWrite)
{
WriteHead(AH);
/* Remember TOC's seek position for use below */
tpos = ftello(AH->FH);
if (tpos < 0)
if (tpos < 0 && ctx->hasSeek)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n",
strerror(errno));
WriteToc(AH);
@ -899,17 +900,20 @@ _getFilePos(ArchiveHandle *AH, lclContext *ctx)
if (ctx->hasSeek)
{
/*
* Prior to 1.7 (pg7.3) we relied on the internally maintained
* pointer. Now we rely on ftello() always, unless the file has been
* found to not support it. For debugging purposes, print a warning
* if the internal pointer disagrees, so that we're more likely to
* notice if something's broken about the internal position tracking.
*/
pos = ftello(AH->FH);
if (pos != ctx->filePos)
{
write_msg(modulename, "WARNING: ftell mismatch with expected position -- ftell used\n");
if (pos < 0)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n",
strerror(errno));
/*
* Prior to 1.7 (pg7.3) we relied on the internally maintained
* pointer. Now we rely on ftello() always, unless the file has
* been found to not support it.
*/
}
if (pos != ctx->filePos)
write_msg(modulename, "WARNING: ftell mismatch with expected position -- ftell used\n");
}
else
pos = ctx->filePos;