WiscDB
 All Classes Functions Variables Friends
file.h
00001 
00006 #pragma once
00007 
00008 #include <fstream>
00009 #include <string>
00010 #include <map>
00011 #include <memory>
00012 
00013 #include "page.h"
00014 
00015 namespace wiscdb {
00016 
00017 class FileIterator;
00018 
00022 struct FileHeader {
00026   PageId num_pages;
00027 
00031   PageId first_used_page;
00032 
00036   PageId num_free_pages;
00037 
00041   PageId first_free_page;
00042 
00049   bool operator==(const FileHeader& rhs) const {
00050     return num_pages == rhs.num_pages &&
00051         num_free_pages == rhs.num_free_pages &&
00052         first_used_page == rhs.first_used_page &&
00053         first_free_page == rhs.first_free_page;
00054   }
00055 };
00056 
00071 class File {
00072  public:
00079   static File create(const std::string& filename);
00080 
00094   static File open(const std::string& filename);
00095 
00103   static void remove(const std::string& filename);
00104 
00110   static bool isOpen(const std::string& filename);
00111 
00112 
00118   static bool exists(const std::string& filename);
00119 
00126   File(const File& other);
00127 
00134   File& operator=(const File& rhs);
00135 
00140   ~File();
00141 
00147   Page allocatePage();
00148 
00157   Page readPage(const PageId page_number) const;
00158 
00166   void writePage(const Page& new_page);
00167 
00173   void deletePage(const PageId page_number);
00174 
00180   const std::string& filename() const { return filename_; }
00181 
00187   FileIterator begin();
00188 
00195   FileIterator end();
00196   
00202   void close();
00203 
00204  private:
00212   static std::streampos pagePosition(const PageId page_number) {
00213     return sizeof(FileHeader) + ((page_number - 1) * Page::SIZE);
00214   }
00215 
00230   File(const std::string& name, const bool create_new);
00231 
00243   void openIfNeeded(const bool create_new);
00244 
00258   Page readPage(const PageId page_number, const bool allow_free) const;
00259 
00268   void writePage(const PageId page_number, const Page& new_page);
00269 
00279   void writePage(const PageId page_number, const PageHeader& header,
00280                  const Page& new_page);
00281 
00287   FileHeader readHeader() const;
00288 
00294   void writeHeader(const FileHeader& header);
00295 
00303   PageHeader readPageHeader(const PageId page_number) const;
00304 
00305   typedef std::map<std::string,
00306                    std::shared_ptr<std::fstream> > StreamMap;
00307   typedef std::map<std::string, int> CountMap;
00308 
00312   static StreamMap open_streams_;
00313 
00317   static CountMap open_counts_;
00318 
00322   std::string filename_;
00323 
00327   std::shared_ptr<std::fstream> stream_;
00328 
00329   friend class FileIterator;
00330   friend class FileTest;
00331 };
00332 
00333 }
 All Classes Functions Variables Friends