BadgerDB
 All Classes Namespaces Functions Variables Typedefs Enumerations Friends Pages
page.h
1 
8 #pragma once
9 
10 #include <cstddef>
11 #include <stdint.h>
12 #include <memory>
13 #include <string>
14 
15 //#include <gtest/gtest.h>
16 #include "types.h"
17 
18 namespace badgerdb {
19 
26 struct PageHeader {
31  std::uint16_t free_space_lower_bound;
32 
37  std::uint16_t free_space_upper_bound;
38 
45 
50 
55 
60 
67  bool operator==(const PageHeader& rhs) const {
68  return num_slots == rhs.num_slots &&
72  }
73 };
74 
78 struct PageSlot {
83  bool used;
84 
88  std::uint16_t item_offset;
89 
93  std::uint16_t item_length;
94 };
95 
96 class PageIterator;
97 
108 class Page {
109  public:
114  static const std::size_t SIZE = 8192;
115 
119  static const std::size_t DATA_SIZE = SIZE - sizeof(PageHeader);
120 
124  static const PageId INVALID_NUMBER = 0;
125 
129  static const SlotId INVALID_SLOT = 0;
130 
134  Page();
135 
142  RecordId insertRecord(const std::string& record_data);
143 
152  std::string getRecord(const RecordId& record_id) const;
153 
162  void updateRecord(const RecordId& record_id, const std::string& record_data);
163 
171  void deleteRecord(const RecordId& record_id);
172 
179  bool hasSpaceForRecord(const std::string& record_data) const;
180 
186  std::uint16_t getFreeSpace() const { return header_.free_space_upper_bound -
187  header_.free_space_lower_bound; }
188 
194  PageId page_number() const { return header_.current_page_number; }
195 
201  PageId next_page_number() const { return header_.next_page_number; }
202 
209 
216  PageIterator end();
217 
218  private:
222  void initialize();
223 
229  void set_page_number(const PageId new_page_number) {
230  header_.current_page_number = new_page_number;
231  }
232 
238  void set_next_page_number(const PageId new_next_page_number) {
239  header_.next_page_number = new_next_page_number;
240  }
241 
252  void deleteRecord(const RecordId& record_id,
253  const bool allow_slot_compaction);
254 
263  PageSlot* getSlot(const SlotId slot_number);
264 
273  const PageSlot& getSlot(const SlotId slot_number) const;
274 
289  SlotId getAvailableSlot();
290 
304  void insertRecordInSlot(const SlotId slot_number,
305  const std::string& record_data);
306 
315  void validateRecordId(const RecordId& record_id) const;
316 
322  bool isUsed() const { return page_number() != INVALID_NUMBER; }
323 
327  PageHeader header_;
328 
334  char data_[DATA_SIZE];
335 
336  friend class File;
337  friend class PageFile;
338  friend class BlobFile;
339  friend class PageIterator;
340 };
341 
342 static_assert(Page::SIZE > sizeof(PageHeader),
343  "Page size must be large enough to hold header and data.");
344 static_assert(Page::DATA_SIZE > 0,
345  "Page must have some space to hold data.");
346 
347 }
std::uint16_t item_offset
Definition: page.h:88
bool operator==(const PageHeader &rhs) const
Definition: page.h:67
PageId next_page_number() const
Definition: page.h:201
SlotId num_free_slots
Definition: page.h:49
SlotId num_slots
Definition: page.h:44
void updateRecord(const RecordId &record_id, const std::string &record_data)
Definition: page.cpp:54
std::string getRecord(const RecordId &record_id) const
Definition: page.cpp:46
PageId next_page_number
Definition: page.h:59
std::uint16_t free_space_upper_bound
Definition: page.h:37
Iterator for iterating over the records in a page.
Definition: page_iterator.h:23
static const std::size_t DATA_SIZE
Definition: page.h:119
std::uint32_t PageId
Identifier for a page in a file.
Definition: types.h:15
static const std::size_t SIZE
Definition: page.h:114
std::uint16_t free_space_lower_bound
Definition: page.h:31
Class which represents a fixed-size database page containing records.
Definition: page.h:108
std::uint16_t item_length
Definition: page.h:93
PageId page_number() const
Definition: page.h:194
PageIterator begin()
Definition: page.cpp:211
PageIterator end()
Definition: page.cpp:215
Slot metadata that tracks where a record is in the data space.
Definition: page.h:78
Identifier for a record in a page.
Definition: types.h:30
static const SlotId INVALID_SLOT
Definition: page.h:129
std::uint16_t getFreeSpace() const
Definition: page.h:186
static const PageId INVALID_NUMBER
Definition: page.h:124
std::uint16_t SlotId
Identifier for a slot in a page.
Definition: types.h:20
bool hasSpaceForRecord(const std::string &record_data) const
Definition: page.cpp:138
PageId current_page_number
Definition: page.h:54
Header metadata in a page.
Definition: page.h:26
void deleteRecord(const RecordId &record_id)
Definition: page.cpp:71
RecordId insertRecord(const std::string &record_data)
Definition: page.cpp:36