Skip to content

Commit 2193beb

Browse files
committed
Further thoughts about lo_export/lo_import error handling: if one of
the lower-level large object functions fails, it will have already set a suitable error message --- probably something from the backend --- and it is not useful to overwrite that with a generic 'error while reading large object' message. So remove redundant messages.
1 parent f3164c0 commit 2193beb

File tree

1 file changed

+20
-28
lines changed

1 file changed

+20
-28
lines changed

src/interfaces/libpq/fe-lobj.c

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/interfaces/libpq/fe-lobj.c,v 1.57 2006/06/14 01:28:55 tgl Exp $
11+
* $PostgreSQL: pgsql/src/interfaces/libpq/fe-lobj.c,v 1.58 2006/06/14 17:49:25 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -32,7 +32,6 @@
3232

3333
#include <fcntl.h>
3434
#include <sys/stat.h>
35-
#include <errno.h>
3635

3736
#include "libpq-fe.h"
3837
#include "libpq-int.h"
@@ -458,19 +457,15 @@ lo_import(PGconn *conn, const char *filename)
458457
lobjOid = lo_creat(conn, INV_READ | INV_WRITE);
459458
if (lobjOid == InvalidOid)
460459
{
461-
printfPQExpBuffer(&conn->errorMessage,
462-
libpq_gettext("could not create large object for file \"%s\"\n"),
463-
filename);
460+
/* we assume lo_creat() already set a suitable error message */
464461
(void) close(fd);
465462
return InvalidOid;
466463
}
467464

468465
lobj = lo_open(conn, lobjOid, INV_WRITE);
469466
if (lobj == -1)
470467
{
471-
printfPQExpBuffer(&conn->errorMessage,
472-
libpq_gettext("could not open large object %u\n"),
473-
lobjOid);
468+
/* we assume lo_open() already set a suitable error message */
474469
(void) close(fd);
475470
return InvalidOid;
476471
}
@@ -484,16 +479,11 @@ lo_import(PGconn *conn, const char *filename)
484479
if (tmp != nbytes)
485480
{
486481
/*
487-
* If the lo_write failed, we are probably in an aborted
488-
* transaction and so lo_close will fail. Try it anyway for
489-
* cleanliness, but don't let it determine the returned error
490-
* message.
482+
* If lo_write() failed, we are now in an aborted transaction
483+
* so there's no need for lo_close(); furthermore, if we tried
484+
* it we'd overwrite the useful error result with a useless one.
485+
* So just nail the doors shut and get out of town.
491486
*/
492-
(void) lo_close(conn, lobj);
493-
494-
printfPQExpBuffer(&conn->errorMessage,
495-
libpq_gettext("error while writing large object %u\n"),
496-
lobjOid);
497487
(void) close(fd);
498488
return InvalidOid;
499489
}
@@ -511,9 +501,7 @@ lo_import(PGconn *conn, const char *filename)
511501

512502
if (lo_close(conn, lobj) != 0)
513503
{
514-
printfPQExpBuffer(&conn->errorMessage,
515-
libpq_gettext("error while writing large object %u\n"),
516-
lobjOid);
504+
/* we assume lo_close() already set a suitable error message */
517505
return InvalidOid;
518506
}
519507

@@ -542,8 +530,7 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
542530
lobj = lo_open(conn, lobjId, INV_READ);
543531
if (lobj == -1)
544532
{
545-
printfPQExpBuffer(&conn->errorMessage,
546-
libpq_gettext("could not open large object %u\n"), lobjId);
533+
/* we assume lo_open() already set a suitable error message */
547534
return -1;
548535
}
549536

@@ -569,26 +556,31 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
569556
if (tmp != nbytes)
570557
{
571558
printfPQExpBuffer(&conn->errorMessage,
572-
libpq_gettext("error while writing to file \"%s\": %s\n"),
559+
libpq_gettext("could not write to file \"%s\": %s\n"),
573560
filename, pqStrerror(errno, sebuf, sizeof(sebuf)));
574561
(void) lo_close(conn, lobj);
575562
(void) close(fd);
576563
return -1;
577564
}
578565
}
579566

580-
if (lo_close(conn, lobj) != 0 || nbytes < 0)
567+
/*
568+
* If lo_read() failed, we are now in an aborted transaction
569+
* so there's no need for lo_close(); furthermore, if we tried
570+
* it we'd overwrite the useful error result with a useless one.
571+
* So skip lo_close() if we got a failure result.
572+
*/
573+
if (nbytes < 0 ||
574+
lo_close(conn, lobj) != 0)
581575
{
582-
printfPQExpBuffer(&conn->errorMessage,
583-
libpq_gettext("error while reading large object %u\n"),
584-
lobjId);
576+
/* assume lo_read() or lo_close() left a suitable error message */
585577
result = -1;
586578
}
587579

588580
if (close(fd))
589581
{
590582
printfPQExpBuffer(&conn->errorMessage,
591-
libpq_gettext("error while writing to file \"%s\": %s\n"),
583+
libpq_gettext("could not write to file \"%s\": %s\n"),
592584
filename, pqStrerror(errno, sebuf, sizeof(sebuf)));
593585
result = -1;
594586
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy