Fix lo_import and lo_export to return useful error messages more often.

I found that these functions tend to return -1 while leaving an empty error
message string in the PGconn, if they suffer some kind of I/O error on the
file.  The reason is that lo_close, which thinks it's executed a perfectly
fine SQL command, clears the errorMessage.  The minimum-change workaround
is to reorder operations here so that we don't fill the errorMessage until
after lo_close.
This commit is contained in:
Tom Lane 2012-10-08 21:53:04 -04:00
parent d2fc891219
commit 36df743a4a
1 changed files with 24 additions and 9 deletions

View File

@ -544,10 +544,16 @@ lo_import(PGconn *conn, const char *filename)
if (nbytes < 0)
{
/* We must do lo_close before setting the errorMessage */
int save_errno = errno;
(void) lo_close(conn, lobj);
(void) close(fd);
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("could not read from file \"%s\": %s\n"),
filename, pqStrerror(errno, sebuf, sizeof(sebuf)));
lobjOid = InvalidOid;
filename,
pqStrerror(save_errno, sebuf, sizeof(sebuf)));
return InvalidOid;
}
(void) close(fd);
@ -592,11 +598,15 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
*/
fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | PG_BINARY, 0666);
if (fd < 0)
{ /* error */
{
/* We must do lo_close before setting the errorMessage */
int save_errno = errno;
(void) lo_close(conn, lobj);
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("could not open file \"%s\": %s\n"),
filename, pqStrerror(errno, sebuf, sizeof(sebuf)));
(void) lo_close(conn, lobj);
filename,
pqStrerror(save_errno, sebuf, sizeof(sebuf)));
return -1;
}
@ -608,11 +618,15 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
tmp = write(fd, buf, nbytes);
if (tmp != nbytes)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("could not write to file \"%s\": %s\n"),
filename, pqStrerror(errno, sebuf, sizeof(sebuf)));
/* We must do lo_close before setting the errorMessage */
int save_errno = errno;
(void) lo_close(conn, lobj);
(void) close(fd);
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("could not write to file \"%s\": %s\n"),
filename,
pqStrerror(save_errno, sebuf, sizeof(sebuf)));
return -1;
}
}
@ -630,7 +644,8 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
result = -1;
}
if (close(fd))
/* if we already failed, don't overwrite that msg with a close error */
if (close(fd) && result >= 0)
{
printfPQExpBuffer(&conn->errorMessage,
libpq_gettext("could not write to file \"%s\": %s\n"),