BadgerDB
 All Classes Namespaces Functions Variables Typedefs Enumerations Friends Pages
file.h
1 
8 #pragma once
9 
10 #include <fstream>
11 #include <string>
12 #include <map>
13 #include <memory>
14 
15 #include "page.h"
16 
17 namespace badgerdb {
18 
19 class FileIterator;
20 
24 struct FileHeader {
29 
34 
39 
44 
51  bool operator==(const FileHeader& rhs) const {
52  return num_pages == rhs.num_pages &&
56  }
57 };
58 
75 class File {
76  public:
77 
88  File(const std::string& name, const bool create_new);
89 
97  static void remove(const std::string& filename);
98 
104  static bool isOpen(const std::string& filename);
105 
106 
112  static bool exists(const std::string& filename);
113 
118  virtual ~File();
119 
125  virtual Page allocatePage(PageId &new_page_number) = 0;
126 
135  virtual Page readPage(const PageId page_number) const = 0;
136 
144  virtual void writePage(const PageId page_number, const Page& new_page) = 0;
145 
151  virtual void deletePage(const PageId page_number) = 0;
152 
158  const std::string& filename() const { return filename_; }
159 
166 
167  protected:
175  static std::streampos pagePosition(const PageId page_number) {
176  return sizeof(FileHeader) + ((page_number - 1) * Page::SIZE);
177  }
178 
190  void openIfNeeded(const bool create_new);
191 
197  void close();
198 
204  FileHeader readHeader() const;
205 
211  void writeHeader(const FileHeader& header);
212 
213  typedef std::map<std::string, std::shared_ptr<std::fstream> > StreamMap;
214  typedef std::map<std::string, int> CountMap;
215 
219  static StreamMap open_streams_;
220 
224  static CountMap open_counts_;
225 
229  std::string filename_;
230 
234  std::shared_ptr<std::fstream> stream_;
235 
236  friend class FileIterator;
237 };
238 
239 class PageFile : public File {
240  public:
241 
248  static PageFile create(const std::string& filename);
249 
260  static PageFile open(const std::string& filename);
261 
272  PageFile(const std::string& name, const bool create_new);
273 
280  PageFile(const PageFile& other);
281 
288  PageFile& operator=(const PageFile& rhs);
289 
294  ~PageFile();
295 
301  Page allocatePage(PageId &new_page_number);
302 
311  Page readPage(const PageId page_number) const;
312 
320  void writePage(const PageId page_number, const Page& new_page);
321 
327  void deletePage(const PageId page_number);
328 
335 
342  FileIterator end();
343 
344  private:
345 
359  Page readPage(const PageId page_number, const bool allow_free) const;
360 
370  void writePage(const PageId page_number, const PageHeader& header,
371  const Page& new_page);
372 
380  PageHeader readPageHeader(const PageId page_number) const;
381 
382  friend class FileIterator;
383 };
384 
385 class BlobFile : public File {
386  public:
387 
394  static BlobFile create(const std::string& filename);
395 
406  static BlobFile open(const std::string& filename);
407 
420  BlobFile(const std::string& name, const bool create_new);
421 
428  BlobFile(const BlobFile& other);
429 
436  BlobFile& operator=(const BlobFile& rhs);
437 
442  ~BlobFile();
443 
449  Page allocatePage(PageId &new_page_number);
450 
459  Page readPage(const PageId page_number) const;
460 
468  void writePage(const PageId page_number, const Page& new_page);
469 
475  void deletePage(const PageId page_number);
476 };
477 
478 }
static std::streampos pagePosition(const PageId page_number)
Definition: file.h:175
static bool isOpen(const std::string &filename)
Definition: file.cpp:39
PageId first_free_page
Definition: file.h:43
static CountMap open_counts_
Definition: file.h:224
void deletePage(const PageId page_number)
Definition: file.cpp:276
std::string filename_
Definition: file.h:229
std::shared_ptr< std::fstream > stream_
Definition: file.h:234
virtual void writePage(const PageId page_number, const Page &new_page)=0
const std::string & filename() const
Definition: file.h:158
File(const std::string &name, const bool create_new)
Definition: file.cpp:67
Header metadata for files on disk which contain pages.
Definition: file.h:24
Page allocatePage(PageId &new_page_number)
Definition: file.cpp:364
void writePage(const PageId page_number, const Page &new_page)
Definition: file.cpp:390
void deletePage(const PageId page_number)
Definition: file.cpp:397
static PageFile open(const std::string &filename)
Definition: file.cpp:139
BlobFile(const std::string &name, const bool create_new)
Definition: file.cpp:343
Class which represents a file in the filesystem containing database pages.
Definition: file.h:75
virtual void deletePage(const PageId page_number)=0
virtual ~File()
Definition: file.cpp:57
void writeHeader(const FileHeader &header)
Definition: file.cpp:125
Page readPage(const PageId page_number) const
Definition: file.cpp:383
std::uint32_t PageId
Identifier for a page in a file.
Definition: types.h:15
PageId num_pages
Definition: file.h:28
static const std::size_t SIZE
Definition: page.h:114
Class which represents a fixed-size database page containing records.
Definition: page.h:108
bool operator==(const FileHeader &rhs) const
Definition: file.h:51
void writePage(const PageId page_number, const Page &new_page)
Definition: file.cpp:260
void openIfNeeded(const bool create_new)
Definition: file.cpp:78
Page readPage(const PageId page_number) const
Definition: file.cpp:238
BlobFile & operator=(const BlobFile &rhs)
Definition: file.cpp:355
FileIterator end()
Definition: file.cpp:312
PageId getFirstPageNo()
Definition: file.cpp:62
Iterator for iterating over the pages in a file.
Definition: file_iterator.h:23
PageFile(const std::string &name, const bool create_new)
Definition: file.cpp:143
static PageFile create(const std::string &filename)
Definition: file.cpp:135
void close()
Definition: file.cpp:105
virtual Page readPage(const PageId page_number) const =0
PageId num_free_pages
Definition: file.h:38
PageId first_used_page
Definition: file.h:33
static BlobFile open(const std::string &filename)
Definition: file.cpp:339
virtual Page allocatePage(PageId &new_page_number)=0
Page allocatePage(PageId &new_page_number)
Definition: file.cpp:165
static BlobFile create(const std::string &filename)
Definition: file.cpp:335
PageFile & operator=(const PageFile &rhs)
Definition: file.cpp:156
static StreamMap open_streams_
Definition: file.h:219
FileIterator begin()
Definition: file.cpp:307
FileHeader readHeader() const
Definition: file.cpp:118
Header metadata in a page.
Definition: page.h:26
static bool exists(const std::string &filename)
Definition: file.cpp:46