88 *
99 *
1010 * IDENTIFICATION
11- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-lobj.c,v 1.57 2006/06/1401:28:55 tgl Exp $
11+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-lobj.c,v 1.58 2006/06/1417:49:25 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
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)
458457lobjOid = lo_creat (conn ,INV_READ |INV_WRITE );
459458if (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 );
465462return InvalidOid ;
466463}
467464
468465lobj = lo_open (conn ,lobjOid ,INV_WRITE );
469466if (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 );
475470return InvalidOid ;
476471}
@@ -484,16 +479,11 @@ lo_import(PGconn *conn, const char *filename)
484479if (tmp != nbytes )
485480{
486481/*
487- * Ifthe lo_write failed, we areprobably in an aborted
488- *transaction and solo_close will fail. Try it anyway for
489- *cleanliness, but don't let it determine thereturned error
490- *message .
482+ * If lo_write() failed, we arenow in an aborted transaction
483+ * sothere's no need for lo_close(); furthermore, if we tried
484+ *it we'd overwrite theuseful 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 );
498488return InvalidOid ;
499489}
@@ -511,9 +501,7 @@ lo_import(PGconn *conn, const char *filename)
511501
512502if (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 */
517505return InvalidOid ;
518506}
519507
@@ -542,8 +530,7 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
542530lobj = lo_open (conn ,lobjId ,INV_READ );
543531if (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 */
547534return -1 ;
548535}
549536
@@ -569,26 +556,31 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
569556if (tmp != nbytes )
570557{
571558printfPQExpBuffer (& conn -> errorMessage ,
572- libpq_gettext ("error while writing to file \"%s\": %s\n" ),
559+ libpq_gettext ("could not write to file \"%s\": %s\n" ),
573560filename ,pqStrerror (errno ,sebuf ,sizeof (sebuf )));
574561(void )lo_close (conn ,lobj );
575562(void )close (fd );
576563return -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 */
585577result = -1 ;
586578}
587579
588580if (close (fd ))
589581{
590582printfPQExpBuffer (& conn -> errorMessage ,
591- libpq_gettext ("error while writing to file \"%s\": %s\n" ),
583+ libpq_gettext ("could not write to file \"%s\": %s\n" ),
592584filename ,pqStrerror (errno ,sebuf ,sizeof (sebuf )));
593585result = -1 ;
594586}