BadgerDB
/afs/cs.wisc.edu/p/course/cs564-jignesh/public/html/projects/BadgerDB/bufmgr/src/file.h
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 }
 All Classes Namespaces Functions Variables Typedefs Friends