|
BadgerDB
|
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 }
1.7.6.1