BadgerDB
 All Classes Namespaces Functions Variables Typedefs Friends Pages
Public Member Functions | Static Public Attributes | Friends | List of all members
badgerdb::Page Class Reference

Class which represents a fixed-size database page containing records. More...

#include <page.h>

Public Member Functions

 Page ()
 
RecordId insertRecord (const std::string &record_data)
 
std::string getRecord (const RecordId &record_id) const
 
void updateRecord (const RecordId &record_id, const std::string &record_data)
 
void deleteRecord (const RecordId &record_id)
 
bool hasSpaceForRecord (const std::string &record_data) const
 
std::uint16_t getFreeSpace () const
 
PageId page_number () const
 
PageId next_page_number () const
 
PageIterator begin ()
 
PageIterator end ()
 

Static Public Attributes

static const std::size_t SIZE = 8192
 
static const std::size_t DATA_SIZE = SIZE - sizeof(PageHeader)
 
static const PageId INVALID_NUMBER = 0
 
static const SlotId INVALID_SLOT = 0
 

Friends

class File
 
class PageIterator
 
class PageTest
 
class BufferTest
 

Detailed Description

Class which represents a fixed-size database page containing records.

A page is a fixed-size unit of data storage. Each page holds zero or more records, which consist of arbitrary binary data. Records are placed into slots and identified by a RecordId. Although a record's actual contents may be moved on the page, accessing a record by its slot is consistent.

Warning
This class is not threadsafe.

Definition at line 107 of file page.h.

Constructor & Destructor Documentation

badgerdb::Page::Page ( )

Constructs a new, uninitialized page.

Definition at line 19 of file page.cpp.

19  {
20  initialize();
21 }

Member Function Documentation

PageIterator badgerdb::Page::begin ( )

Returns an iterator at the first record in the page.

Returns
Iterator at first record of page.

Definition at line 196 of file page.cpp.

196  {
197  return PageIterator(this);
198 }
void badgerdb::Page::deleteRecord ( const RecordId record_id)

Deletes the record with the given ID. Page is compacted upon delete to ensure that data of all records is contiguous. Slot array is compacted if the slot deleted is at the end of the slot array.

Parameters
record_idID of the record to delete.

Definition at line 66 of file page.cpp.

66  {
67  deleteRecord(record_id, true /* allow_slot_compaction */);
68 }
void deleteRecord(const RecordId &record_id)
Definition: page.cpp:66
PageIterator badgerdb::Page::end ( )

Returns an iterator representing the record after the last record in the page. This iterator should not be dereferenced.

Returns
Iterator representing record after the last record in the page.

Definition at line 200 of file page.cpp.

200  {
201  const RecordId& end_record_id = {page_number(), Page::INVALID_SLOT};
202  return PageIterator(this, end_record_id);
203 }
PageId page_number() const
Definition: page.h:193
static const SlotId INVALID_SLOT
Definition: page.h:128
std::uint16_t badgerdb::Page::getFreeSpace ( ) const
inline

Returns this page's free space in bytes.

Returns
Free space in bytes.

Definition at line 185 of file page.h.

185  { return header_.free_space_upper_bound -
186  header_.free_space_lower_bound; }
std::uint16_t free_space_upper_bound
Definition: page.h:36
std::uint16_t free_space_lower_bound
Definition: page.h:30
std::string badgerdb::Page::getRecord ( const RecordId record_id) const

Returns the record with the given ID. Returned data is a copy of what is stored on the page; use updateRecord to change it.

See Also
updateRecord
Parameters
record_idID of the record to return.
Returns
The record.

Definition at line 43 of file page.cpp.

43  {
44  validateRecordId(record_id);
45  const PageSlot& slot = getSlot(record_id.slot_number);
46  return data_.substr(slot.item_offset, slot.item_length);
47 }
bool badgerdb::Page::hasSpaceForRecord ( const std::string &  record_data) const

Returns true if the page has enough free space to hold the given data.

Parameters
record_dataBytes that compose the record.
Returns
Whether the page can hold the data.

Definition at line 125 of file page.cpp.

125  {
126  std::size_t record_size = record_data.length();
127  if (header_.num_free_slots == 0) {
128  record_size += sizeof(PageSlot);
129  }
130  return record_size <= getFreeSpace();
131 }
SlotId num_free_slots
Definition: page.h:48
std::uint16_t getFreeSpace() const
Definition: page.h:185
RecordId badgerdb::Page::insertRecord ( const std::string &  record_data)

Inserts a new record into the page.

Parameters
record_dataBytes that compose the record.
Returns
ID of the newly inserted record.

Definition at line 33 of file page.cpp.

33  {
34  if (!hasSpaceForRecord(record_data)) {
35  throw InsufficientSpaceException(
36  page_number(), record_data.length(), getFreeSpace());
37  }
38  const SlotId slot_number = getAvailableSlot();
39  insertRecordInSlot(slot_number, record_data);
40  return {page_number(), slot_number};
41 }
PageId page_number() const
Definition: page.h:193
std::uint16_t getFreeSpace() const
Definition: page.h:185
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:125
PageId badgerdb::Page::next_page_number ( ) const
inline

Returns the number of the next used page this page in its file.

Returns
Page number of next used page in file.

Definition at line 200 of file page.h.

200 { return header_.next_page_number; }
PageId next_page_number
Definition: page.h:58
PageId badgerdb::Page::page_number ( ) const
inline

Returns this page's number in its file.

Returns
Page number.

Definition at line 193 of file page.h.

193 { return header_.current_page_number; }
PageId current_page_number
Definition: page.h:53
void badgerdb::Page::updateRecord ( const RecordId record_id,
const std::string &  record_data 
)

Updates the record with the given ID, replacing its data with a new version. This is equivalent to deleting the old record and inserting a new one, with the exception that the record ID will not change.

Parameters
record_idID of record to update.
record_dataUpdated bytes that compose the record.

Definition at line 49 of file page.cpp.

50  {
51  validateRecordId(record_id);
52  const PageSlot* slot = getSlot(record_id.slot_number);
53  const std::size_t free_space_after_delete =
54  getFreeSpace() + slot->item_length;
55  if (record_data.length() > free_space_after_delete) {
56  throw InsufficientSpaceException(
57  page_number(), record_data.length(), free_space_after_delete);
58  }
59  // We have to disallow slot compaction here because we're going to place the
60  // record data in the same slot, and compaction might delete the slot if we
61  // permit it.
62  deleteRecord(record_id, false /* allow_slot_compaction */);
63  insertRecordInSlot(record_id.slot_number, record_data);
64 }
PageId page_number() const
Definition: page.h:193
std::uint16_t getFreeSpace() const
Definition: page.h:185
void deleteRecord(const RecordId &record_id)
Definition: page.cpp:66

Member Data Documentation

const std::size_t badgerdb::Page::DATA_SIZE = SIZE - sizeof(PageHeader)
static

Size of page free space area in bytes.

Definition at line 118 of file page.h.

const PageId badgerdb::Page::INVALID_NUMBER = 0
static

Number of page indicating that it's invalid.

Definition at line 123 of file page.h.

const SlotId badgerdb::Page::INVALID_SLOT = 0
static

Number of slot indicating that it's invalid.

Definition at line 128 of file page.h.

const std::size_t badgerdb::Page::SIZE = 8192
static

Page size in bytes. If this is changed, database files created with a different page size value will be unreadable by the resulting binaries.

Definition at line 113 of file page.h.


The documentation for this class was generated from the following files: