8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $PostgreSQL: pgsql/src/interfaces/libpq/fe-lobj.c,v 1.56 2006/03/05 15:59:09 momjian Exp $
11
+ * $PostgreSQL: pgsql/src/interfaces/libpq/fe-lobj.c,v 1.57 2006/06/14 01:28:55 tgl Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -58,6 +58,12 @@ lo_open(PGconn *conn, Oid lobjId, int mode)
58
58
PQArgBlock argv [2 ];
59
59
PGresult * res ;
60
60
61
+ if (conn -> lobjfuncs == NULL )
62
+ {
63
+ if (lo_initialize (conn ) < 0 )
64
+ return -1 ;
65
+ }
66
+
61
67
argv [0 ].isint = 1 ;
62
68
argv [0 ].len = 4 ;
63
69
argv [0 ].u .integer = lobjId ;
@@ -66,12 +72,6 @@ lo_open(PGconn *conn, Oid lobjId, int mode)
66
72
argv [1 ].len = 4 ;
67
73
argv [1 ].u .integer = mode ;
68
74
69
- if (conn -> lobjfuncs == NULL )
70
- {
71
- if (lo_initialize (conn ) < 0 )
72
- return -1 ;
73
- }
74
-
75
75
res = PQfn (conn , conn -> lobjfuncs -> fn_lo_open , & fd , & result_len , 1 , argv , 2 );
76
76
if (PQresultStatus (res ) == PGRES_COMMAND_OK )
77
77
{
@@ -438,23 +438,22 @@ lo_import(PGconn *conn, const char *filename)
438
438
char buf [LO_BUFSIZE ];
439
439
Oid lobjOid ;
440
440
int lobj ;
441
+ char sebuf [256 ];
441
442
442
443
/*
443
444
* open the file to be read in
444
445
*/
445
446
fd = open (filename , O_RDONLY | PG_BINARY , 0666 );
446
447
if (fd < 0 )
447
448
{ /* error */
448
- char sebuf [256 ];
449
-
450
449
printfPQExpBuffer (& conn -> errorMessage ,
451
450
libpq_gettext ("could not open file \"%s\": %s\n" ),
452
451
filename , pqStrerror (errno , sebuf , sizeof (sebuf )));
453
452
return InvalidOid ;
454
453
}
455
454
456
455
/*
457
- * create an inversion " object"
456
+ * create an inversion object
458
457
*/
459
458
lobjOid = lo_creat (conn , INV_READ | INV_WRITE );
460
459
if (lobjOid == InvalidOid )
@@ -477,41 +476,65 @@ lo_import(PGconn *conn, const char *filename)
477
476
}
478
477
479
478
/*
480
- * read in from the Unix file and write to the inversion file
479
+ * read in from the file and write to the large object
481
480
*/
482
481
while ((nbytes = read (fd , buf , LO_BUFSIZE )) > 0 )
483
482
{
484
483
tmp = lo_write (conn , lobj , buf , nbytes );
485
- if (tmp < nbytes )
484
+ if (tmp != nbytes )
486
485
{
486
+ /*
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.
491
+ */
492
+ (void ) lo_close (conn , lobj );
493
+
487
494
printfPQExpBuffer (& conn -> errorMessage ,
488
- libpq_gettext ("error while reading file \"%s\" \n" ),
489
- filename );
495
+ libpq_gettext ("error while writing large object %u \n" ),
496
+ lobjOid );
490
497
(void ) close (fd );
491
- (void ) lo_close (conn , lobj );
492
498
return InvalidOid ;
493
499
}
494
500
}
495
501
502
+ if (nbytes < 0 )
503
+ {
504
+ printfPQExpBuffer (& conn -> errorMessage ,
505
+ libpq_gettext ("could not read from file \"%s\": %s\n" ),
506
+ filename , pqStrerror (errno , sebuf , sizeof (sebuf )));
507
+ lobjOid = InvalidOid ;
508
+ }
509
+
496
510
(void ) close (fd );
497
- (void ) lo_close (conn , lobj );
511
+
512
+ if (lo_close (conn , lobj ) != 0 )
513
+ {
514
+ printfPQExpBuffer (& conn -> errorMessage ,
515
+ libpq_gettext ("error while writing large object %u\n" ),
516
+ lobjOid );
517
+ return InvalidOid ;
518
+ }
498
519
499
520
return lobjOid ;
500
521
}
501
522
502
523
/*
503
524
* lo_export -
504
525
* exports an (inversion) large object.
505
- * returns -1 upon failure, 1 otherwise
526
+ * returns -1 upon failure, 1 if OK
506
527
*/
507
528
int
508
529
lo_export (PGconn * conn , Oid lobjId , const char * filename )
509
530
{
531
+ int result = 1 ;
510
532
int fd ;
511
533
int nbytes ,
512
534
tmp ;
513
535
char buf [LO_BUFSIZE ];
514
536
int lobj ;
537
+ char sebuf [256 ];
515
538
516
539
/*
517
540
* open the large object.
@@ -530,8 +553,6 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
530
553
fd = open (filename , O_CREAT | O_WRONLY | O_TRUNC | PG_BINARY , 0666 );
531
554
if (fd < 0 )
532
555
{ /* error */
533
- char sebuf [256 ];
534
-
535
556
printfPQExpBuffer (& conn -> errorMessage ,
536
557
libpq_gettext ("could not open file \"%s\": %s\n" ),
537
558
filename , pqStrerror (errno , sebuf , sizeof (sebuf )));
@@ -540,33 +561,39 @@ lo_export(PGconn *conn, Oid lobjId, const char *filename)
540
561
}
541
562
542
563
/*
543
- * read in from the inversion file and write to the Unix file
564
+ * read in from the large object and write to the file
544
565
*/
545
566
while ((nbytes = lo_read (conn , lobj , buf , LO_BUFSIZE )) > 0 )
546
567
{
547
568
tmp = write (fd , buf , nbytes );
548
- if (tmp < nbytes )
569
+ if (tmp != nbytes )
549
570
{
550
571
printfPQExpBuffer (& conn -> errorMessage ,
551
- libpq_gettext ("error while writing to file \"%s\"\n" ),
552
- filename );
572
+ libpq_gettext ("error while writing to file \"%s\": %s \n" ),
573
+ filename , pqStrerror ( errno , sebuf , sizeof ( sebuf )) );
553
574
(void ) lo_close (conn , lobj );
554
575
(void ) close (fd );
555
576
return -1 ;
556
577
}
557
578
}
558
579
559
- (void ) lo_close (conn , lobj );
580
+ if (lo_close (conn , lobj ) != 0 || nbytes < 0 )
581
+ {
582
+ printfPQExpBuffer (& conn -> errorMessage ,
583
+ libpq_gettext ("error while reading large object %u\n" ),
584
+ lobjId );
585
+ result = -1 ;
586
+ }
560
587
561
588
if (close (fd ))
562
589
{
563
590
printfPQExpBuffer (& conn -> errorMessage ,
564
- libpq_gettext ("error while writing to file \"%s\"\n" ),
565
- filename );
566
- return -1 ;
591
+ libpq_gettext ("error while writing to file \"%s\": %s \n" ),
592
+ filename , pqStrerror ( errno , sebuf , sizeof ( sebuf )) );
593
+ result = -1 ;
567
594
}
568
595
569
- return 1 ;
596
+ return result ;
570
597
}
571
598
572
599
0 commit comments