aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-10-08 21:52:42 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-10-08 21:52:42 -0400
commitc5b8daa08d9abf7812d58617b834a6589760f8af (patch)
treef13c7c74ba3d1c9f8c65e3d21d3455e9f61a9f20 /src
parentcf9d99298cf8b59f8cd0f73f5e74e45c2462eb7e (diff)
downloadpostgresql-c5b8daa08d9abf7812d58617b834a6589760f8af.tar.gz
postgresql-c5b8daa08d9abf7812d58617b834a6589760f8af.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-lobj.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/interfaces/libpq/fe-lobj.c b/src/interfaces/libpq/fe-lobj.c
index f3a6d0341c1..4bcacbda283 100644
--- a/src/interfaces/libpq/fe-lobj.c
+++ b/src/interfaces/libpq/fe-lobj.c
@@ -569,10 +569,16 @@ lo_import_internal(PGconn *conn, const char *filename, Oid oid)
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);
@@ -617,11 +623,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;
}
@@ -633,11 +643,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;
}
}
@@ -655,7 +669,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"),