RC PF_FileHandle::GetNextPage (PageNum current, PF_PageHandle &pageHandle) const { /* Search for the next allocated page on disk */ for (PageNum i = current+1; i <= pageCount; i++) { if (GetPageType(i) == ALLOCATED_PAGE) { return GetThisPage(i, pageHandle); } } /* If search failed return EOF */ return PF_EOF; }
const RC AllocatePage(PF_FileHandle *fileHandle,PF_PageHandle *pageHandle) { PF_PageHandle *pPageHandle=pageHandle; RC tmp; int i,byte,bit; fileHandle->pHdrFrame->bDirty=true; if((fileHandle->pFileSubHeader->nAllocatedPages)<=(fileHandle->pFileSubHeader->pageCount)){ for(i=0;i<=fileHandle->pFileSubHeader->pageCount;i++){ byte=i/8; bit=i%8; if(((fileHandle->pBitmap[byte])&(1<<bit))==0){ (fileHandle->pFileSubHeader->nAllocatedPages)++; fileHandle->pBitmap[byte]|=(1<<bit); break; } } if(i<=fileHandle->pFileSubHeader->pageCount) return GetThisPage(fileHandle,i,pageHandle); } fileHandle->pFileSubHeader->nAllocatedPages++; fileHandle->pFileSubHeader->pageCount++; byte=fileHandle->pFileSubHeader->pageCount/8; bit=fileHandle->pFileSubHeader->pageCount%8; fileHandle->pBitmap[byte]|=(1<<bit); if((tmp=AllocateBlock(&(pPageHandle->pFrame)))!=SUCCESS){ return tmp; } pPageHandle->pFrame->bDirty=false; pPageHandle->pFrame->fileDesc=fileHandle->fileDesc; pPageHandle->pFrame->fileName=fileHandle->fileName; pPageHandle->pFrame->pinCount=1; pPageHandle->pFrame->accTime=clock(); memset(&(pPageHandle->pFrame->page),0,sizeof(Page)); pPageHandle->pFrame->page.pageNum=fileHandle->pFileSubHeader->pageCount; if(_lseek(fileHandle->fileDesc,0,SEEK_END)==-1){ bf_manager.allocated[pPageHandle->pFrame-bf_manager.frame]=false; return PF_FILEERR; } if(_write(fileHandle->fileDesc,&(pPageHandle->pFrame->page),sizeof(Page))!=sizeof(Page)){ bf_manager.allocated[pPageHandle->pFrame-bf_manager.frame]=false; return PF_FILEERR; } return SUCCESS; }