26 std::string index_filename;
27 std::string data_filename;
28 std::vector<std::pair<std::string, uint64_t>> index;
29 bool indexLoaded =
false;
31 static constexpr size_t KEYS_PER_INDEX_ENTRY = 10;
38 std::optional<uint64_t> findStartOffset(
const std::string &key) {
43 if (key < index[0].first) {
44 return index[0].second;
47 size_t left = 0, right = index.size() - 1;
48 while (left < right) {
49 size_t mid = left + (right - left + 1) / 2;
50 if (index[mid].first <= key) {
57 return index[left].second;
74 SS_Table(
const std::string &index_filename,
const std::string &data_filename) : index_filename(index_filename), data_filename(data_filename) {
92 std::ofstream dataFile(filename +
DATA_EXTENSION, std::ios::binary);
93 if (!indexFile.is_open() || !dataFile.is_open()) {
97 std::vector<KeyValuePair> entries;
98 for (
auto it = memTable->begin(); it != memTable->end(); ++it) {
99 entries.push_back(*it);
102 uint64_t entries_count = entries.size();
103 uint64_t sparse_index_count = (entries_count + KEYS_PER_INDEX_ENTRY - 1) / KEYS_PER_INDEX_ENTRY;
104 indexFile.write(
reinterpret_cast<const char *
>(&sparse_index_count),
sizeof(sparse_index_count));
107 for (
size_t i = 0; i < entries.size(); i++) {
109 uint32_t key_size = entry.
getKey().size();
110 uint32_t value_size = entry.
getValue().size();
112 if (i % KEYS_PER_INDEX_ENTRY == 0) {
113 indexFile.write(
reinterpret_cast<const char *
>(&key_size),
sizeof(key_size));
114 indexFile.write(entry.
getKey().c_str(), key_size);
115 indexFile.write(
reinterpret_cast<const char *
>(&offset),
sizeof(offset));
118 dataFile.write(
reinterpret_cast<const char *
>(&key_size),
sizeof(key_size));
119 dataFile.write(entry.
getKey().c_str(), key_size);
120 dataFile.write(
reinterpret_cast<const char *
>(&value_size),
sizeof(value_size));
121 dataFile.write(entry.
getValue().c_str(), value_size);
123 offset +=
sizeof(key_size) + key_size +
sizeof(value_size) + value_size;
136 std::ifstream indexFile(index_filename, std::ios::binary);
137 if (!indexFile.is_open()) {
143 uint64_t entries_count;
144 indexFile.read(
reinterpret_cast<char *
>(&entries_count),
sizeof(entries_count));
146 index.reserve(entries_count);
147 for (uint64_t i = 0; i < entries_count; i++) {
149 indexFile.read(
reinterpret_cast<char *
>(&key_size),
sizeof(key_size));
150 std::string key(key_size,
'\0');
151 indexFile.read(&key[0], key_size);
153 indexFile.read(
reinterpret_cast<char *
>(&offset),
sizeof(offset));
154 index.push_back({std::move(key), offset});
165 std::pair<bool, std::string>
getValue(std::string key) {
169 std::optional<uint64_t> start_offset = findStartOffset(key);
170 if (!start_offset.has_value()) {
174 std::ifstream dataFile(data_filename, std::ios::binary);
175 if (!dataFile.is_open()) {
178 dataFile.seekg(start_offset.value());
180 while (!dataFile.eof()) {
182 dataFile.read(
reinterpret_cast<char *
>(&key_size),
sizeof(key_size));
183 if (dataFile.eof()) {
187 std::string stored_key(key_size, 0);
188 dataFile.read(&stored_key[0], key_size);
189 if (stored_key > key) {
194 dataFile.read(
reinterpret_cast<char *
>(&value_size),
sizeof(value_size));
195 std::string value(value_size, 0);
196 dataFile.read(&value[0], value_size);
198 if (stored_key == key) {
201 return {
false, value};
203 return {
true, value};
215 return index_filename;
223 return data_filename;
Key-Value Pair Class.
Definition key_value.hpp:19
const std::string & getValue() const
Get the Value object.
Definition key_value.hpp:58
const std::string & getKey() const
Get the Key object.
Definition key_value.hpp:51
MemTable Class.
Definition memtable.hpp:23
static bool createFromMemTable(const std::string &filename, MemTable *memTable)
Creates an SSTable from a given MemTable.
Definition sstable.hpp:84
SS_Table(const std::string &filename)
Constructs an SS_Table from a given filename (excluding extensions).
Definition sstable.hpp:65
bool loadIndex()
Loads the SSTable index from the index file.
Definition sstable.hpp:135
std::string getDataFilename() const
Gets the filename of the SSTable's data file.
Definition sstable.hpp:222
std::pair< bool, std::string > getValue(std::string key)
Retrieves the value associated with a key from the SSTable.
Definition sstable.hpp:165
std::string getIndexFile() const
Gets the filename of the SSTable's index file.
Definition sstable.hpp:214
SS_Table(const std::string &index_filename, const std::string &data_filename)
Constructs an SS_Table from existing index and data filenames.
Definition sstable.hpp:74
Constants for the database engine.
const std::string INDEX_EXTENSION
Index Extenstion Constant.
Definition constants.hpp:29
const std::string DATA_EXTENSION
Data Extension Constant.
Definition constants.hpp:37
#define TOMBSTONE
TOMOBSTONE constant.
Definition constants.hpp:22