Joedb 10.4.3
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Database.h
Go to the documentation of this file.
1/////////////////////////////////////////////////////////////////////////////
2//
3// This code was automatically generated by the joedb compiler
4// https://www.joedb.org/
5//
6// Path to compiler: /home/rcoulom/repos/joedb/doc/source/tutorial/build/joedbc
7// Version: 10.4.3
8// joedbc compilation time: Jul 14 2026 13:07:22
9// Generation of this file: 2026-07-14 11:07:28 GMT
10//
11/////////////////////////////////////////////////////////////////////////////
12#ifndef joedb_db_encoded_file_Database_declared
13#define joedb_db_encoded_file_Database_declared
14
17#include "joedb/error/assert.h"
18#include "joedb/get_version.h"
19#include "joedb/hash_combine.h"
20#include "ids.h"
21
22#include <string>
23#include <cstring>
24#include <vector>
25#include <algorithm>
26#include <string_view>
27
28#include "joedb/Blob.h"
29
30static_assert(std::string_view(joedb::get_version()) == "10.4.3");
31
33{
34 /// @namespace joedb::db::encoded_file
35 ///
36 /// Automatically generated by joedbc
37
38 using joedb::Record_Id;
39 using joedb::Table_Id;
40 using joedb::Field_Id;
41
42 class container_of_buffer;
43
44
45 namespace detail
46 {
47 struct data_of_buffer
48 {
49 std::vector<joedb::Blob> field_value_of_data;
50 std::vector<int64_t> field_value_of_size;
51 std::vector<int64_t> field_value_of_offset;
52
53 joedb::Freedom_Keeper freedom_keeper;
54
55 size_t size() const {return freedom_keeper.size();}
56
57 void resize(size_t new_size)
58 {
59 field_value_of_data.resize(new_size);
60 field_value_of_size.resize(new_size);
61 field_value_of_offset.resize(new_size);
62 freedom_keeper.resize(new_size);
63 }
64 };
65 }
66
67
68 /// Store all the tables of the database
70 {
71 friend class Readable;
72 friend class container_of_buffer;
73
74 public:
75 template<typename E = joedb::Exception>
76 static void throw_exception(std::string_view message)
77 {
78 std::string s("joedb::db::encoded_file: ");
79 s += message;
80 throw E(s);
81 }
82
83 bool is_valid(id_of_buffer id) const {return is_valid_record_id_for_buffer(id.get_record_id());}
84
85 protected:
86 detail::data_of_buffer storage_of_buffer;
87 bool is_valid_record_id_for_buffer(Record_Id record_id) const {return storage_of_buffer.freedom_keeper.is_used(record_id);}
88
90 {
92 storage_of_buffer.field_value_of_data[to_underlying(record_id)] = joedb::Blob();
93 storage_of_buffer.field_value_of_size[to_underlying(record_id)] = 0;
94 storage_of_buffer.field_value_of_offset[to_underlying(record_id)] = 0;
95 storage_of_buffer.freedom_keeper.free(record_id);
96 }
97
99 {
100 storage_of_buffer.freedom_keeper.use(record_id);
101 }
102
103 void internal_vector_insert_buffer(Record_Id record_id, size_t size)
104 {
105 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_free_vector(record_id, size));
106 storage_of_buffer.freedom_keeper.use_vector(record_id, size);
107 }
108
110 (
111 Record_Id record_id,
112 joedb::Blob field_value_of_data
113 )
114 {
116 storage_of_buffer.field_value_of_data[to_underlying(record_id)] = field_value_of_data;
117 }
118
120 (
121 Record_Id record_id,
122 size_t size,
123 const joedb::Blob *value
124 )
125 {
126 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_used_vector(record_id, size));
127 joedb::Blob *target = &storage_of_buffer.field_value_of_data.data()[to_underlying(record_id)];
128 if (target != value)
129 std::copy_n(value, size, target);
130 }
131
133 (
134 Record_Id record_id,
135 int64_t field_value_of_size
136 )
137 {
139 storage_of_buffer.field_value_of_size[to_underlying(record_id)] = field_value_of_size;
140 }
141
143 (
144 Record_Id record_id,
145 size_t size,
146 const int64_t *value
147 )
148 {
149 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_used_vector(record_id, size));
150 int64_t *target = &storage_of_buffer.field_value_of_size.data()[to_underlying(record_id)];
151 if (target != value)
152 std::copy_n(value, size, target);
153 }
154
156 (
157 Record_Id record_id,
158 int64_t field_value_of_offset
159 )
160 {
162 storage_of_buffer.field_value_of_offset[to_underlying(record_id)] = field_value_of_offset;
163 }
164
166 (
167 Record_Id record_id,
168 size_t size,
169 const int64_t *value
170 )
171 {
172 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_used_vector(record_id, size));
173 int64_t *target = &storage_of_buffer.field_value_of_offset.data()[to_underlying(record_id)];
174 if (target != value)
175 std::copy_n(value, size, target);
176 }
177
178 public:
180
182 {
183 return id_of_buffer
184 (
185 Record_Id(storage_of_buffer.freedom_keeper.get_next(id.get_record_id()))
186 );
187 }
188
190 {
191 return id_of_buffer
192 (
193 Record_Id(storage_of_buffer.freedom_keeper.get_previous(id.get_record_id()))
194 );
195 }
196
197 template<class Comparator>
198 std::vector<id_of_buffer> sorted_buffer(Comparator comparator) const;
199
201 {
202 return id_of_buffer();
203 }
204
206 {
208 return (joedb::Blob)(storage_of_buffer.field_value_of_data[record.get_id()]);
209 }
210
211 int64_t get_size(id_of_buffer record) const
212 {
214 return (int64_t)(storage_of_buffer.field_value_of_size[record.get_id()]);
215 }
216
217 int64_t get_offset(id_of_buffer record) const
218 {
220 return (int64_t)(storage_of_buffer.field_value_of_offset[record.get_id()]);
221 }
222 };
223 /// returned by @ref Database::get_buffer_table
225 {
226 friend class Database;
227
228 private:
229 const Database &db;
230 container_of_buffer(const Database &db): db(db) {}
231
232 public:
234 {
236 private:
237 const joedb::Freedom_Keeper *fk;
238 Record_Id index;
239 iterator(const detail::data_of_buffer &data): fk(&data.freedom_keeper), index(joedb::Freedom_Keeper_Constants::used_list) {}
240 public:
241 using iterator_category = std::forward_iterator_tag;
243 using difference_type = std::ptrdiff_t;
246
247 bool operator==(const iterator &i) const {return index == i.index;}
248 bool operator!=(const iterator &i) const {return index != i.index;}
249 iterator &operator++() {index = fk->get_next(index); return *this;}
250 iterator operator++(int) {auto copy = *this; index = fk->get_next(index); return copy;}
251 iterator &operator--() {index = fk->get_previous(index); return *this;}
252 iterator operator--(int) {auto copy = *this; index = fk->get_previous(index); return copy;}
254 };
255
256 iterator begin() const {return ++iterator(db.storage_of_buffer);}
258 bool is_empty() const {return db.storage_of_buffer.freedom_keeper.get_used_count() == Record_Id{0};}
259 joedb::index_t get_size() const {return to_underlying(db.storage_of_buffer.freedom_keeper.get_used_count());}
260 static id_of_buffer get_at(size_t i) {return id_of_buffer(Record_Id(i));}
261 bool is_valid_at(size_t i) {return db.storage_of_buffer.freedom_keeper.is_used(Record_Id(i));}
262 id_of_buffer first() const {return *begin();}
263 id_of_buffer last() const {return *--end();}
264 id_of_buffer get_end() const {return *end();}
265 };
266
268 {
269 return container_of_buffer(*this);
270 }
271
272 template<class Comparator>
273 std::vector<id_of_buffer> Database::sorted_buffer(Comparator comparator) const
274 {
275 std::vector<id_of_buffer> result;
276 for (auto x: get_buffer_table())
277 result.emplace_back(x);
278 std::sort(result.begin(), result.end(), comparator);
279 return result;
280 }
281}
282
283#endif
void resize(Record_Id new_size)
Record_Id get_previous(Record_Id index) const
Record_Id get_next(Record_Id index) const
Store all the tables of the database.
Definition Database.h:70
static void throw_exception(std::string_view message)
Definition Database.h:76
void internal_delete_buffer(Record_Id record_id)
Definition Database.h:89
container_of_buffer get_buffer_table() const
Definition Database.h:267
void internal_update_buffer__size(Record_Id record_id, int64_t field_value_of_size)
Definition Database.h:133
int64_t get_size(id_of_buffer record) const
Definition Database.h:211
bool is_valid(id_of_buffer id) const
Definition Database.h:83
joedb::Blob get_data(id_of_buffer record) const
Definition Database.h:205
void internal_update_vector_buffer__data(Record_Id record_id, size_t size, const joedb::Blob *value)
Definition Database.h:120
detail::data_of_buffer storage_of_buffer
Definition Database.h:86
id_of_buffer next(id_of_buffer id) const
Definition Database.h:181
void internal_insert_buffer(Record_Id record_id)
Definition Database.h:98
void internal_update_buffer__offset(Record_Id record_id, int64_t field_value_of_offset)
Definition Database.h:156
void internal_update_buffer__data(Record_Id record_id, joedb::Blob field_value_of_data)
Definition Database.h:110
static id_of_buffer null_buffer()
Definition Database.h:200
bool is_valid_record_id_for_buffer(Record_Id record_id) const
Definition Database.h:87
id_of_buffer previous(id_of_buffer id) const
Definition Database.h:189
std::vector< id_of_buffer > sorted_buffer(Comparator comparator) const
Definition Database.h:273
void internal_update_vector_buffer__offset(Record_Id record_id, size_t size, const int64_t *value)
Definition Database.h:166
void internal_vector_insert_buffer(Record_Id record_id, size_t size)
Definition Database.h:103
int64_t get_offset(id_of_buffer record) const
Definition Database.h:217
void internal_update_vector_buffer__size(Record_Id record_id, size_t size, const int64_t *value)
Definition Database.h:143
Implement the joedb::Readable interface for a compiled database.
Definition Readable.h:27
returned by Database::get_buffer_table
Definition Database.h:225
static id_of_buffer get_at(size_t i)
Definition Database.h:260
Strongly-typed wrapper around an integer representing a row of the buffer table.
Definition ids.h:25
constexpr Record_Id get_record_id() const
Definition ids.h:36
constexpr auto get_id() const
Definition ids.h:35
#define JOEDB_RELEASE_ASSERT(x)
always-tested assertion (release and debug mode)
Definition assert.h:24
ptrdiff_t index_t
Definition index_types.h:18
constexpr const char * get_version()
Definition get_version.h:7
Automatically generated by joedbc.
Definition Client.h:19
constexpr index_t to_underlying(Record_Id id)
Definition index_types.h:59