BadgerDB
/afs/cs.wisc.edu/u/m/o/mohan/private/cs564/btree/btree/src/filescan.cpp
00001 
00008 #include "filescan.h"
00009 #include "exceptions/end_of_file_exception.h"
00010 
00011 namespace badgerdb { 
00012 
00013 FileScan::FileScan(const std::string &name, BufMgr *bufferMgr)
00014 {
00015   file = new PageFile(name, false); //dont create new file
00016   bufMgr = bufferMgr;
00017   curDirtyFlag = false;
00018   curPage = NULL;
00019   filePageIter = file->begin();
00020 }
00021 
00022 FileScan::~FileScan()
00023 {
00024   // generally must unpin last page of the scan
00025   if (curPage != NULL)
00026   {
00027     bufMgr->unPinPage(file, (*filePageIter).page_number(), curDirtyFlag);
00028     curPage = NULL;
00029     curDirtyFlag = false;
00030     filePageIter = file->begin();
00031   }
00032   delete file;
00033 }
00034 
00035 void FileScan::scanNext(RecordId& outRid)
00036 {
00037   std::string rec;
00038 
00039   if (filePageIter == file->end())
00040   {
00041     throw EndOfFileException();
00042   }
00043 
00044   // special case of the first record of the first page of the file
00045   if (curPage == NULL)
00046   {
00047     // need to get the first page of the file
00048     filePageIter = file->begin();
00049     if(filePageIter == file->end())
00050     {
00051       throw EndOfFileException();
00052     }
00053    
00054     // read the first page of the file
00055     bufMgr->readPage(file, (*filePageIter).page_number(), curPage); 
00056     curDirtyFlag = false;
00057 
00058     // get the first record off the page
00059     pageRecordIter = curPage->begin(); 
00060 
00061     if(pageRecordIter != curPage->end()) 
00062     {
00063       // get pointer to record
00064       rec = *pageRecordIter;
00065 
00066       outRid = pageRecordIter.getCurrentRecord();
00067       return;
00068     }
00069   }
00070 
00071   // Loop, looking for a record that satisfied the predicate.
00072   // First try and get the next record off the current page
00073   pageRecordIter++;
00074 
00075   while (pageRecordIter == curPage->end())
00076   {
00077     // unpin the current page
00078     bufMgr->unPinPage(file, (*filePageIter).page_number(), curDirtyFlag);
00079     curPage = NULL;
00080     curDirtyFlag = false;
00081 
00082     filePageIter++;
00083     if (filePageIter == file->end())
00084     {
00085       curPage = NULL;
00086       throw EndOfFileException();
00087     }
00088 
00089     // read the next page of the file
00090     bufMgr->readPage(file, (*filePageIter).page_number(), curPage);
00091 
00092     // get the first record off the page
00093     pageRecordIter = curPage->begin(); 
00094   }
00095 
00096   // curRec points at a valid record
00097   // see if the record satisfies the scan's predicate 
00098   // get a pointer to the record
00099   rec = *pageRecordIter;
00100 
00101   // return rid of the record
00102   outRid = pageRecordIter.getCurrentRecord();
00103   return;
00104 }
00105 
00106 // returns pointer to the current record.  page is left pinned
00107 // and the scan logic is required to unpin the page 
00108 std::string FileScan::getRecord()
00109 {
00110   return *pageRecordIter;
00111 }
00112 
00113 // mark current page of scan dirty
00114 void FileScan::markDirty()
00115 {
00116   curDirtyFlag = true;
00117 }
00118 
00119 }
 All Classes Namespaces Functions Variables Typedefs Enumerations Friends