|
7 | 7 | * |
8 | 8 | * |
9 | 9 | * IDENTIFICATION |
10 | | - * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.45 1999/06/11 02:39:43 momjian Exp $ |
| 10 | + * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.46 1999/06/18 16:47:23 momjian Exp $ |
11 | 11 | * |
12 | 12 | *------------------------------------------------------------------------- |
13 | 13 | */ |
@@ -674,11 +674,12 @@ mdnblocks(Relation reln) |
674 | 674 | segno=0; |
675 | 675 | for (;;) |
676 | 676 | { |
677 | | -if (v->mdfd_lstbcnt==RELSEG_SIZE |
678 | | -|| (nblocks=_mdnblocks(v->mdfd_vfd,BLCKSZ))==RELSEG_SIZE) |
| 677 | +nblocks=_mdnblocks(v->mdfd_vfd,BLCKSZ); |
| 678 | +if (nblocks>RELSEG_SIZE) |
| 679 | +elog(FATAL,"segment too big in mdnblocks!"); |
| 680 | +v->mdfd_lstbcnt=nblocks; |
| 681 | +if (nblocks==RELSEG_SIZE) |
679 | 682 | { |
680 | | - |
681 | | -v->mdfd_lstbcnt=RELSEG_SIZE; |
682 | 683 | segno++; |
683 | 684 |
|
684 | 685 | if (v->mdfd_chain== (MdfdVec*)NULL) |
@@ -711,22 +712,55 @@ mdtruncate(Relation reln, int nblocks) |
711 | 712 | MdfdVec*v; |
712 | 713 |
|
713 | 714 | #ifndefLET_OS_MANAGE_FILESIZE |
714 | | -intcurnblk; |
| 715 | +intcurnblk, |
| 716 | +i, |
| 717 | +oldsegno, |
| 718 | +newsegno, |
| 719 | +lastsegblocks; |
| 720 | +MdfdVec**varray; |
715 | 721 |
|
716 | 722 | curnblk=mdnblocks(reln); |
717 | | -if (curnblk /RELSEG_SIZE>0) |
718 | | -{ |
719 | | -elog(NOTICE,"Can't truncate multi-segments relation %s", |
720 | | -reln->rd_rel->relname.data); |
721 | | -returncurnblk; |
722 | | -} |
| 723 | +if (nblocks>curnblk) |
| 724 | +return-1; |
| 725 | +oldsegno=curnblk /RELSEG_SIZE; |
| 726 | +newsegno=nblocks /RELSEG_SIZE; |
| 727 | + |
723 | 728 | #endif |
724 | 729 |
|
725 | 730 | fd=RelationGetFile(reln); |
726 | 731 | v=&Md_fdvec[fd]; |
727 | 732 |
|
| 733 | +#ifndefLET_OS_MANAGE_FILESIZE |
| 734 | +varray= (MdfdVec**)palloc((oldsegno+1)*sizeof(MdfdVec*)); |
| 735 | +for (i=0;i <=oldsegno;i++) |
| 736 | +{ |
| 737 | +if (!v) |
| 738 | +elog(ERROR,"segment isn't open in mdtruncate!"); |
| 739 | +varray[i]=v; |
| 740 | +v=v->mdfd_chain; |
| 741 | +} |
| 742 | +for (i=oldsegno;i>newsegno;i--) |
| 743 | +{ |
| 744 | +v=varray[i]; |
| 745 | +if (FileTruncate(v->mdfd_vfd,0)<0) |
| 746 | +{ |
| 747 | +pfree(varray); |
| 748 | +return-1; |
| 749 | +} |
| 750 | +v->mdfd_lstbcnt=0; |
| 751 | +} |
| 752 | +/* Calculate the # of blocks in the last segment */ |
| 753 | +lastsegblocks=nblocks- (newsegno*RELSEG_SIZE); |
| 754 | +v=varray[i]; |
| 755 | +pfree(varray); |
| 756 | +if (FileTruncate(v->mdfd_vfd,lastsegblocks*BLCKSZ)<0) |
| 757 | +return-1; |
| 758 | +v->mdfd_lstbcnt=lastsegblocks; |
| 759 | +#else |
728 | 760 | if (FileTruncate(v->mdfd_vfd,nblocks*BLCKSZ)<0) |
729 | 761 | return-1; |
| 762 | +v->mdfd_lstbcnt=nblocks; |
| 763 | +#endif |
730 | 764 |
|
731 | 765 | returnnblocks; |
732 | 766 |
|
|