7
7
*
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.55 1999/09/28 11:41:07 vadim Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.56 1999/10/06 06:38:04 inoue Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -233,7 +233,7 @@ mdunlink(Relation reln)
233
233
int
234
234
mdextend (Relation reln , char * buffer )
235
235
{
236
- long pos ;
236
+ long pos , nbytes ;
237
237
int nblocks ;
238
238
MdfdVec * v ;
239
239
@@ -243,8 +243,22 @@ mdextend(Relation reln, char *buffer)
243
243
if ((pos = FileSeek (v -> mdfd_vfd , 0L , SEEK_END )) < 0 )
244
244
return SM_FAIL ;
245
245
246
- if (FileWrite (v -> mdfd_vfd , buffer , BLCKSZ ) != BLCKSZ )
246
+ if (pos % BLCKSZ != 0 ) /* the last block is incomplete */
247
+ {
248
+ pos -= pos % BLCKSZ ;
249
+ if (FileSeek (v -> mdfd_vfd , pos , SEEK_SET ) < 0 )
250
+ return SM_FAIL ;
251
+ }
252
+
253
+ if ((nbytes = FileWrite (v -> mdfd_vfd , buffer , BLCKSZ )) != BLCKSZ )
254
+ {
255
+ if (nbytes > 0 )
256
+ {
257
+ FileTruncate (v -> mdfd_vfd , pos );
258
+ FileSeek (v -> mdfd_vfd , pos , SEEK_SET );
259
+ }
247
260
return SM_FAIL ;
261
+ }
248
262
249
263
/* remember that we did a write, so we can sync at xact commit */
250
264
v -> mdfd_flags |= MDFD_DIRTY ;
@@ -432,6 +446,8 @@ mdread(Relation reln, BlockNumber blocknum, char *buffer)
432
446
{
433
447
if (nbytes == 0 )
434
448
MemSet (buffer , 0 , BLCKSZ );
449
+ else if (blocknum == 0 && nbytes > 0 && mdnblocks (reln ) == 0 )
450
+ MemSet (buffer , 0 , BLCKSZ );
435
451
else
436
452
status = SM_FAIL ;
437
453
}
@@ -1067,6 +1083,7 @@ _mdnblocks(File file, Size blcksz)
1067
1083
{
1068
1084
long len ;
1069
1085
1070
- len = FileSeek (file , 0L , SEEK_END ) - 1 ;
1071
- return (BlockNumber ) ((len < 0 ) ? 0 : 1 + len / blcksz );
1086
+ len = FileSeek (file , 0L , SEEK_END );
1087
+ if (len < 0 ) return 0 ; /* on failure, assume file is empty */
1088
+ return (BlockNumber ) (len / blcksz );
1072
1089
}
0 commit comments