Joedb 10.0.1
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/compcmake/gcc_debug/joedbc
7// Version: 10.0.1
8// joedbc compilation time: Jun 13 2025 15:26:57
9// Generation of this file: 2025-06-13 13:27:14 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 "ids.h"
20
21#include <string>
22#include <cstring>
23#include <vector>
24#include <algorithm>
25#include <string_view>
26
27#include "joedb/Blob.h"
28
29static_assert(std::string_view(joedb::get_version()) == "10.0.1");
30
32{
33 /// @namespace joedb::db::encoded_file
34 ///
35 /// Automatically generated by joedbc
36
37 using joedb::Record_Id;
38 using joedb::Table_Id;
39 using joedb::Field_Id;
40
41 class container_of_buffer;
42
43 namespace detail
44 {
45 struct data_of_buffer
46 {
47 std::vector<joedb::Blob> field_value_of_data;
48 std::vector<int64_t> field_value_of_size;
49 std::vector<int64_t> field_value_of_offset;
50
51 joedb::Freedom_Keeper freedom_keeper;
52
53 size_t size() const {return freedom_keeper.size();}
54
55 void resize(size_t new_size)
56 {
57 field_value_of_data.resize(new_size);
58 field_value_of_size.resize(new_size);
59 field_value_of_offset.resize(new_size);
60 freedom_keeper.resize(new_size);
61 }
62 };
63 }
64
65
66 /// Store all the tables of the database
68 {
69 friend class Readable;
70 friend class id_of_buffer;
71 friend class container_of_buffer;
72
73 public:
74 template<typename E = joedb::Exception>
75 static void throw_exception(const std::string &message)
76 {
77 throw E("joedb::db::encoded_file: " + message);
78 }
79
80 bool is_valid(id_of_buffer id) const {return is_valid_record_id_for_buffer(id.get_record_id());}
81
82 protected:
83 detail::data_of_buffer storage_of_buffer;
84 bool is_valid_record_id_for_buffer(Record_Id record_id) const {return storage_of_buffer.freedom_keeper.is_used(record_id);}
85
87 {
89 storage_of_buffer.field_value_of_data[to_underlying(record_id)] = joedb::Blob();
90 storage_of_buffer.field_value_of_size[to_underlying(record_id)] = 0;
91 storage_of_buffer.field_value_of_offset[to_underlying(record_id)] = 0;
92 storage_of_buffer.freedom_keeper.free(record_id);
93 }
94
96 {
97 storage_of_buffer.freedom_keeper.use(record_id);
98 }
99
100 void internal_vector_insert_buffer(Record_Id record_id, size_t size)
101 {
102 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_free_vector(record_id, size));
103 storage_of_buffer.freedom_keeper.use_vector(record_id, size);
104 }
105
107 (
108 Record_Id record_id,
109 joedb::Blob field_value_of_data
110 )
111 {
113 storage_of_buffer.field_value_of_data[to_underlying(record_id)] = field_value_of_data;
114 }
115
117 (
118 Record_Id record_id,
119 size_t size,
120 const joedb::Blob *value
121 )
122 {
123 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_used_vector(record_id, size));
124 joedb::Blob *target = &storage_of_buffer.field_value_of_data.data()[to_underlying(record_id)];
125 if (target != value)
126 std::copy_n(value, size, target);
127 }
128
130 (
131 Record_Id record_id,
132 int64_t field_value_of_size
133 )
134 {
136 storage_of_buffer.field_value_of_size[to_underlying(record_id)] = field_value_of_size;
137 }
138
140 (
141 Record_Id record_id,
142 size_t size,
143 const int64_t *value
144 )
145 {
146 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_used_vector(record_id, size));
147 int64_t *target = &storage_of_buffer.field_value_of_size.data()[to_underlying(record_id)];
148 if (target != value)
149 std::copy_n(value, size, target);
150 }
151
153 (
154 Record_Id record_id,
155 int64_t field_value_of_offset
156 )
157 {
159 storage_of_buffer.field_value_of_offset[to_underlying(record_id)] = field_value_of_offset;
160 }
161
163 (
164 Record_Id record_id,
165 size_t size,
166 const int64_t *value
167 )
168 {
169 JOEDB_RELEASE_ASSERT(storage_of_buffer.freedom_keeper.is_used_vector(record_id, size));
170 int64_t *target = &storage_of_buffer.field_value_of_offset.data()[to_underlying(record_id)];
171 if (target != value)
172 std::copy_n(value, size, target);
173 }
174
175 public:
177
179 {
180 return id_of_buffer
181 (
182 Record_Id(storage_of_buffer.freedom_keeper.get_next(id.get_record_id()))
183 );
184 }
185
187 {
188 return id_of_buffer
189 (
190 Record_Id(storage_of_buffer.freedom_keeper.get_previous(id.get_record_id()))
191 );
192 }
193
194 template<class Comparator>
195 std::vector<id_of_buffer> sorted_buffer(Comparator comparator) const;
196
198 {
199 return id_of_buffer();
200 }
201
203 {
205 return (joedb::Blob)(storage_of_buffer.field_value_of_data[record.get_id()]);
206 }
207
208 int64_t get_size(id_of_buffer record) const
209 {
211 return (int64_t)(storage_of_buffer.field_value_of_size[record.get_id()]);
212 }
213
214 int64_t get_offset(id_of_buffer record) const
215 {
217 return (int64_t)(storage_of_buffer.field_value_of_offset[record.get_id()]);
218 }
219 };
220 /// returned by @ref Database::get_buffer_table
222 {
223 friend class Database;
224
225 private:
226 const Database &db;
227 container_of_buffer(const Database &db): db(db) {}
228
229 public:
231 {
233 private:
234 const joedb::Freedom_Keeper *fk;
235 Record_Id index;
236 iterator(const detail::data_of_buffer &data): fk(&data.freedom_keeper), index(joedb::Freedom_Keeper_Constants::used_list) {}
237 public:
238 typedef std::forward_iterator_tag iterator_category;
240 typedef std::ptrdiff_t difference_type;
243
244 bool operator==(const iterator &i) const {return index == i.index;}
245 bool operator!=(const iterator &i) const {return index != i.index;}
246 iterator &operator++() {index = fk->get_next(index); return *this;}
247 iterator operator++(int) {auto copy = *this; index = fk->get_next(index); return copy;}
248 iterator &operator--() {index = fk->get_previous(index); return *this;}
249 iterator operator--(int) {auto copy = *this; index = fk->get_previous(index); return copy;}
251 };
252
253 iterator begin() const {return ++iterator(db.storage_of_buffer);}
255 bool is_empty() const {return db.storage_of_buffer.freedom_keeper.get_used_count() == Record_Id{0};}
256 joedb::index_t get_size() const {return to_underlying(db.storage_of_buffer.freedom_keeper.get_used_count());}
257 static id_of_buffer get_at(size_t i) {return id_of_buffer(Record_Id(i));}
258 bool is_valid_at(size_t i) {return db.storage_of_buffer.freedom_keeper.is_used(Record_Id(i));}
259 id_of_buffer first() const {return *begin();}
260 id_of_buffer last() const {return *--end();}
261 id_of_buffer get_end() const {return *end();}
262 };
263
265 {
266 return container_of_buffer(*this);
267 }
268
269 template<class Comparator>
270 std::vector<id_of_buffer> Database::sorted_buffer(Comparator comparator) const
271 {
272 std::vector<id_of_buffer> result;
273 for (auto x: get_buffer_table())
274 result.emplace_back(x);
275 std::sort(result.begin(), result.end(), comparator);
276 return result;
277 }
278}
279
280#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:68
void internal_delete_buffer(Record_Id record_id)
Definition Database.h:86
container_of_buffer get_buffer_table() const
Definition Database.h:264
void internal_update_buffer__size(Record_Id record_id, int64_t field_value_of_size)
Definition Database.h:130
int64_t get_size(id_of_buffer record) const
Definition Database.h:208
bool is_valid(id_of_buffer id) const
Definition Database.h:80
static void throw_exception(const std::string &message)
Definition Database.h:75
joedb::Blob get_data(id_of_buffer record) const
Definition Database.h:202
void internal_update_vector_buffer__data(Record_Id record_id, size_t size, const joedb::Blob *value)
Definition Database.h:117
detail::data_of_buffer storage_of_buffer
Definition Database.h:83
id_of_buffer next(id_of_buffer id) const
Definition Database.h:178
void internal_insert_buffer(Record_Id record_id)
Definition Database.h:95
void internal_update_buffer__offset(Record_Id record_id, int64_t field_value_of_offset)
Definition Database.h:153
void internal_update_buffer__data(Record_Id record_id, joedb::Blob field_value_of_data)
Definition Database.h:107
static id_of_buffer null_buffer()
Definition Database.h:197
bool is_valid_record_id_for_buffer(Record_Id record_id) const
Definition Database.h:84
id_of_buffer previous(id_of_buffer id) const
Definition Database.h:186
std::vector< id_of_buffer > sorted_buffer(Comparator comparator) const
Definition Database.h:270
void internal_update_vector_buffer__offset(Record_Id record_id, size_t size, const int64_t *value)
Definition Database.h:163
void internal_vector_insert_buffer(Record_Id record_id, size_t size)
Definition Database.h:100
int64_t get_offset(id_of_buffer record) const
Definition Database.h:214
void internal_update_vector_buffer__size(Record_Id record_id, size_t size, const int64_t *value)
Definition Database.h:140
Implement the joedb::Readable interface for a compiled database.
Definition Readable.h:27
returned by Database::get_buffer_table
Definition Database.h:222
static id_of_buffer get_at(size_t i)
Definition Database.h:257
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
Definition Blob.h:7
constexpr index_t to_underlying(Record_Id id)
Definition index_types.h:59