BadgerDB
|
00001 00008 #pragma once 00009 00010 #include <fstream> 00011 #include <string> 00012 #include <map> 00013 #include <memory> 00014 00015 #include "page.h" 00016 00017 namespace badgerdb { 00018 00019 class FileIterator; 00020 00024 struct FileHeader { 00028 PageId num_pages; 00029 00033 PageId first_used_page; 00034 00038 PageId num_free_pages; 00039 00043 PageId first_free_page; 00044 00051 bool operator==(const FileHeader& rhs) const { 00052 return num_pages == rhs.num_pages && 00053 num_free_pages == rhs.num_free_pages && 00054 first_used_page == rhs.first_used_page && 00055 first_free_page == rhs.first_free_page; 00056 } 00057 }; 00058 00073 class File { 00074 public: 00081 static File create(const std::string& filename); 00082 00093 static File open(const std::string& filename); 00094 00102 static void remove(const std::string& filename); 00103 00109 static bool isOpen(const std::string& filename); 00110 00111 00117 static bool exists(const std::string& filename); 00118 00125 File(const File& other); 00126 00133 File& operator=(const File& rhs); 00134 00139 ~File(); 00140 00146 Page allocatePage(); 00147 00156 Page readPage(const PageId page_number) const; 00157 00165 void writePage(const Page& new_page); 00166 00172 void deletePage(const PageId page_number); 00173 00179 const std::string& filename() const { return filename_; } 00180 00186 FileIterator begin(); 00187 00194 FileIterator end(); 00195 00196 private: 00204 static std::streampos pagePosition(const PageId page_number) { 00205 return sizeof(FileHeader) + ((page_number - 1) * Page::SIZE); 00206 } 00207 00222 File(const std::string& name, const bool create_new); 00223 00235 void openIfNeeded(const bool create_new); 00236 00242 void close(); 00243 00257 Page readPage(const PageId page_number, const bool allow_free) const; 00258 00267 void writePage(const PageId page_number, const Page& new_page); 00268 00278 void writePage(const PageId page_number, const PageHeader& header, 00279 const Page& new_page); 00280 00286 FileHeader readHeader() const; 00287 00293 void writeHeader(const FileHeader& header); 00294 00302 PageHeader readPageHeader(const PageId page_number) const; 00303 00304 typedef std::map<std::string, 00305 std::shared_ptr<std::fstream> > StreamMap; 00306 typedef std::map<std::string, int> CountMap; 00307 00311 static StreamMap open_streams_; 00312 00316 static CountMap open_counts_; 00317 00321 std::string filename_; 00322 00326 std::shared_ptr<std::fstream> stream_; 00327 00328 friend class FileIterator; 00329 friend class FileTest; 00330 }; 00331 00332 }