9
9
*
10
10
*
11
11
* IDENTIFICATION
12
- * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.67 2000/04/12 17:15:37 momjian Exp $
12
+ * $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.67.2.1 2000/06/15 06:10:27 tgl Exp $
13
13
*
14
14
*-------------------------------------------------------------------------
15
15
*/
@@ -185,6 +185,7 @@ inv_create(int flags)
185
185
retval -> idesc = RelationGetDescr (indr );
186
186
retval -> offset = retval -> lowbyte = retval -> highbyte = 0 ;
187
187
ItemPointerSetInvalid (& (retval -> htid ));
188
+ retval -> flags = 0 ;
188
189
189
190
if (flags & INV_WRITE )
190
191
{
@@ -196,7 +197,7 @@ inv_create(int flags)
196
197
LockRelation (r ,ShareLock );
197
198
retval -> flags = IFS_RDLOCK ;
198
199
}
199
- retval -> flags |=IFS_ATEOF ;
200
+ retval -> flags |=IFS_ATEOF ;/* since we know the object is empty */
200
201
201
202
return retval ;
202
203
}
@@ -233,6 +234,7 @@ inv_open(Oid lobjId, int flags)
233
234
retval -> idesc = RelationGetDescr (indrel );
234
235
retval -> offset = retval -> lowbyte = retval -> highbyte = 0 ;
235
236
ItemPointerSetInvalid (& (retval -> htid ));
237
+ retval -> flags = 0 ;
236
238
237
239
if (flags & INV_WRITE )
238
240
{
@@ -371,14 +373,8 @@ inv_seek(LargeObjectDesc *obj_desc, int offset, int whence)
371
373
if (whence == SEEK_CUR )
372
374
{
373
375
offset += obj_desc -> offset ;/* calculate absolute position */
374
- return inv_seek (obj_desc ,offset ,SEEK_SET );
375
376
}
376
-
377
- /*
378
- * if you seek past the end (offset > 0) I have no clue what happens
379
- * :-( B.L. 9/1/93
380
- */
381
- if (whence == SEEK_END )
377
+ else if (whence == SEEK_END )
382
378
{
383
379
/* need read lock for getsize */
384
380
if (!(obj_desc -> flags & IFS_RDLOCK ))
@@ -389,8 +385,8 @@ inv_seek(LargeObjectDesc *obj_desc, int offset, int whence)
389
385
offset += _inv_getsize (obj_desc -> heap_r ,
390
386
obj_desc -> hdesc ,
391
387
obj_desc -> index_r );
392
- return inv_seek (obj_desc ,offset ,SEEK_SET );
393
388
}
389
+ /* now we can assume that the operation is SEEK_SET */
394
390
395
391
/*
396
392
* Whenever we do a seek, we turn off the EOF flag bit to force
@@ -414,17 +410,13 @@ inv_seek(LargeObjectDesc *obj_desc, int offset, int whence)
414
410
* stores the offset of the last byte that appears on it, and we have
415
411
* an index on this.
416
412
*/
417
-
418
-
419
- /* right now, just assume that the operation is SEEK_SET */
420
413
if (obj_desc -> iscan != (IndexScanDesc )NULL )
421
414
{
422
415
d = Int32GetDatum (offset );
423
416
btmovescan (obj_desc -> iscan ,d );
424
417
}
425
418
else
426
419
{
427
-
428
420
ScanKeyEntryInitialize (& skey ,0x0 ,1 ,F_INT4GE ,
429
421
Int32GetDatum (offset ));
430
422
@@ -487,9 +479,27 @@ inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
487
479
488
480
/* copy the data from this block into the buffer */
489
481
d = heap_getattr (& tuple ,2 ,obj_desc -> hdesc ,& isNull );
482
+ fsblock = (struct varlena * )DatumGetPointer (d );
490
483
ReleaseBuffer (buffer );
491
484
492
- fsblock = (struct varlena * )DatumGetPointer (d );
485
+ /*
486
+ * If block starts beyond current seek point, then we are looking
487
+ * at a "hole" (unwritten area) in the object. Return zeroes for
488
+ * the "hole".
489
+ */
490
+ if (obj_desc -> offset < obj_desc -> lowbyte )
491
+ {
492
+ int nzeroes = obj_desc -> lowbyte - obj_desc -> offset ;
493
+
494
+ if (nzeroes > (nbytes - nread ))
495
+ nzeroes = (nbytes - nread );
496
+ MemSet (buf ,0 ,nzeroes );
497
+ buf += nzeroes ;
498
+ nread += nzeroes ;
499
+ obj_desc -> offset += nzeroes ;
500
+ if (nread >=nbytes )
501
+ break ;
502
+ }
493
503
494
504
off = obj_desc -> offset - obj_desc -> lowbyte ;
495
505
ncopy = obj_desc -> highbyte - obj_desc -> offset + 1 ;
@@ -535,14 +545,11 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
535
545
Buffer buffer ;
536
546
537
547
/*
538
- * Fetch the current inversion file system block. If the class
539
- * storing the inversion file is empty, we don't want to do an
540
- * index lookup, since index lookups choke on empty files (should
541
- * be fixed someday).
548
+ * Fetch the current inversion file system block. We can skip
549
+ * the work if we already know we are at EOF.
542
550
*/
543
551
544
- if ((obj_desc -> flags & IFS_ATEOF )
545
- || obj_desc -> heap_r -> rd_nblocks == 0 )
552
+ if (obj_desc -> flags & IFS_ATEOF )
546
553
tuple .t_data = NULL ;
547
554
else
548
555
inv_fetchtup (obj_desc ,& tuple ,& buffer );
@@ -657,6 +664,7 @@ inv_fetchtup(LargeObjectDesc *obj_desc, HeapTuple tuple, Buffer *buffer)
657
664
}
658
665
else
659
666
index_rescan (obj_desc -> iscan , false,& skey );
667
+
660
668
do
661
669
{
662
670
res = index_getnext (obj_desc -> iscan ,ForwardScanDirection );
@@ -1147,7 +1155,8 @@ inv_indextup(LargeObjectDesc *obj_desc, HeapTuple tuple)
1147
1155
pfree (res );
1148
1156
}
1149
1157
1150
- /*
1158
+ #ifdef NOT_USED
1159
+
1151
1160
static void
1152
1161
DumpPage (Page page ,int blkno )
1153
1162
{
@@ -1237,7 +1246,8 @@ ItemPointerFormExternal(ItemPointer pointer)
1237
1246
1238
1247
return itemPointerString ;
1239
1248
}
1240
- */
1249
+
1250
+ #endif
1241
1251
1242
1252
static int
1243
1253
_inv_getsize (Relation hreln ,TupleDesc hdesc ,Relation ireln )