Joedb 10.0.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Database_Writable.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.0
8// joedbc compilation time: May 27 2025 17:38:37
9// Generation of this file: 2025-05-27 15:38:56 GMT
10//
11/////////////////////////////////////////////////////////////////////////////
12#ifndef joedb_db_encoded_file_Database_Writable_declared
13#define joedb_db_encoded_file_Database_Writable_declared
14
18#include "Database.h"
19
20#include <string>
21#include <stdint.h>
22#include <cstring>
23#include <vector>
24
26{
27 namespace detail
28 {
29 extern const char * schema_string;
30 inline constexpr size_t schema_string_size = 75;
31 }
32
33 class container_of_buffer;
34
35 /// implement @ref joedb::Writable in a @ref Database
37 {
38 protected:
41
42 void delete_from(Table_Id table_id, Record_Id record_id) override
43 {
44 if (table_id == Table_Id(1))
45 internal_delete_buffer(record_id);
46 }
47
48 void insert_into(Table_Id table_id, Record_Id record_id) override
49 {
50 if (to_underlying(record_id) < 0 || (max_record_id && to_underlying(record_id) >= max_record_id))
51 throw_exception("insert_into: too big");
52 if (table_id == Table_Id(1))
53 {
54 if (is_valid_record_id_for_buffer(record_id))
55 throw_exception("Duplicate insert into table buffer");
56 if (storage_of_buffer.size() <= size_t(record_id))
57 storage_of_buffer.resize(to_underlying(record_id) + 1);
58 internal_insert_buffer(record_id);
59 }
60 }
61
63 (
64 Table_Id table_id,
65 Record_Id record_id,
66 size_t size
67 ) override
68 {
69 joedb::Freedom_Keeper *fk = nullptr;
70
71 if (table_id == Table_Id(1))
72 fk = &storage_of_buffer.freedom_keeper;
73
74 if (fk)
75 {
76 JOEDB_RELEASE_ASSERT(fk->is_used_vector(record_id, size));
77 joedb::Writable::delete_vector(table_id, record_id, size);
78 }
79 }
80
82 (
83 Table_Id table_id,
84 Record_Id record_id,
85 size_t size
86 ) override
87 {
88 if
89 (
90 to_underlying(record_id) < 0 ||
92 )
93 {
94 throw_exception("insert_vector: null record_id, or too big");
95 }
96 if (table_id == Table_Id(1))
97 {
98 if (storage_of_buffer.size() < size_t(record_id) + size)
99 storage_of_buffer.resize(to_underlying(record_id) + size);
100 internal_vector_insert_buffer(record_id, size);
101 }
102 }
103
105 (
106 Table_Id table_id,
107 Record_Id record_id,
108 Field_Id field_id,
109 int64_t value
110 )
111 override
112 {
113 if (table_id == Table_Id(1))
114 {
115 if (field_id == Field_Id(2))
116 {
117 internal_update_buffer__size(record_id, value);
118 return;
119 }
120 if (field_id == Field_Id(3))
121 {
122 internal_update_buffer__offset(record_id, value);
123 return;
124 }
125 return;
126 }
127 }
128
130 (
131 Table_Id table_id,
132 Record_Id record_id,
133 Field_Id field_id,
134 joedb::Blob value
135 )
136 override
137 {
138 if (table_id == Table_Id(1))
139 {
140 if (field_id == Field_Id(1))
141 {
142 internal_update_buffer__data(record_id, value);
143 return;
144 }
145 return;
146 }
147 }
148
150 (
151 Table_Id table_id,
152 Record_Id record_id,
153 Field_Id field_id,
154 size_t size,
155 const int64_t *value
156 )
157 override
158 {
159 if (table_id == Table_Id(1))
160 {
161 if (field_id == Field_Id(2))
162 {
163 internal_update_vector_buffer__size(record_id, size, value);
164 return;
165 }
166 if (field_id == Field_Id(3))
167 {
168 internal_update_vector_buffer__offset(record_id, size, value);
169 return;
170 }
171 return;
172 }
173 }
174
176 (
177 Table_Id table_id,
178 Record_Id record_id,
179 Field_Id field_id,
180 size_t size,
181 const joedb::Blob *value
182 )
183 override
184 {
185 if (table_id == Table_Id(1))
186 {
187 if (field_id == Field_Id(1))
188 {
189 internal_update_vector_buffer__data(record_id, size, value);
190 return;
191 }
192 return;
193 }
194 }
195
197 (
198 Table_Id table_id,
199 Record_Id record_id,
200 Field_Id field_id,
201 size_t &capacity
202 )
203 override
204 {
205 if (table_id == Table_Id(1))
206 {
207 capacity = size_t(storage_of_buffer.freedom_keeper.size());
208 if (field_id == Field_Id(2))
209 {
210 return (storage_of_buffer.field_value_of_size.data() + to_underlying(record_id));
211 }
212 if (field_id == Field_Id(3))
213 {
214 return (storage_of_buffer.field_value_of_offset.data() + to_underlying(record_id));
215 }
216 return nullptr;
217 }
218 return nullptr;
219 }
220
222 (
223 Table_Id table_id,
224 Record_Id record_id,
225 Field_Id field_id,
226 size_t &capacity
227 )
228 override
229 {
230 if (table_id == Table_Id(1))
231 {
232 capacity = size_t(storage_of_buffer.freedom_keeper.size());
233 if (field_id == Field_Id(1))
234 {
235 return (storage_of_buffer.field_value_of_data.data() + to_underlying(record_id));
236 }
237 return nullptr;
238 }
239 return nullptr;
240 }
241
242 void comment(const std::string &comment) override {}
243 void timestamp(int64_t timestamp) override {}
244 void valid_data() override {}
245
246 bool upgrading_schema = false;
249
251 {
252 return schema_file.get_data().size() < detail::schema_string_size;
253 }
254
256 {
257 constexpr size_t pos = joedb::Header::size;
258 const size_t schema_file_size = schema_file.get_data().size();
259
260 if
261 (
262 schema_file_size < pos ||
263 schema_file_size > detail::schema_string_size ||
264 std::memcmp
265 (
266 schema_file.get_data().data() + pos,
267 detail::schema_string + pos,
268 schema_file_size - pos
269 ) != 0
270 )
271 {
272 throw_exception("Trying to open a file with incompatible schema");
273 }
274 }
275
276 void create_table(const std::string &name) override
277 {
281 }
282
283 void drop_table(Table_Id table_id) override
284 {
285 schema_journal.drop_table(table_id);
287 }
288
290 (
291 Table_Id table_id,
292 const std::string &name
293 ) override
294 {
295 schema_journal.rename_table(table_id, name);
297 }
298
300 (
301 Table_Id table_id,
302 const std::string &name,
303 joedb::Type type
304 ) override
305 {
306 schema_journal.add_field(table_id, name, type);
308 }
309
310 void drop_field(Table_Id table_id, Field_Id field_id) override
311 {
312 schema_journal.drop_field(table_id, field_id);
314 }
315
317 (
318 Table_Id table_id,
319 Field_Id field_id,
320 const std::string &name
321 ) override
322 {
323 schema_journal.rename_field(table_id, field_id, name);
325 }
326
327 void custom(const std::string &name) override
328 {
331 }
332
333 public:
338
340 {
341 max_record_id = record_id;
342 }
343
344 int64_t get_schema_checkpoint() const
345 {
347 }
348
350 {
351 max_record_id = size_t(journal.get_checkpoint());
352 journal.replay_log(*this);
353 max_record_id = 0;
354
355 check_schema();
356
358 throw_exception<joedb::Out_Of_Date>("Schema is out of date. Can't upgrade a read-only database.");
359 }
360 };
361}
362
363#endif
bool is_used_vector(Record_Id index, size_t size) const
std::string & get_data()
Definition Memory_File.h:20
void replay_log(Writable &writable)
int64_t get_checkpoint() const
void add_field(Table_Id table_id, const std::string &name, Type type) override
void custom(const std::string &name) override
void create_table(const std::string &name) override
void rename_table(Table_Id table_id, const std::string &name) override
void drop_table(Table_Id table_id) override
void rename_field(Table_Id table_id, Field_Id field_id, const std::string &name) override
void drop_field(Table_Id table_id, Field_Id field_id) override
Superclass with all joedb journal event listeners as virtual functions.
Definition Writable.h:17
virtual void delete_vector(Table_Id table_id, Record_Id record_id, size_t size)=0
Definition Writable.cpp:44
implement joedb::Writable in a Database
void update_blob(Table_Id table_id, Record_Id record_id, Field_Id field_id, joedb::Blob value) override
void drop_table(Table_Id table_id) override
void insert_into(Table_Id table_id, Record_Id record_id) override
void update_vector_int64(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const int64_t *value) override
void comment(const std::string &comment) override
void timestamp(int64_t timestamp) override
void add_field(Table_Id table_id, const std::string &name, joedb::Type type) override
void update_int64(Table_Id table_id, Record_Id record_id, Field_Id field_id, int64_t value) override
joedb::Blob * get_own_blob_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) override
void set_max_record_id(joedb::index_t record_id)
void initialize_with_readonly_journal(joedb::Readonly_Journal &journal)
void rename_field(Table_Id table_id, Field_Id field_id, const std::string &name) override
int64_t * get_own_int64_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) override
void custom(const std::string &name) override
void rename_table(Table_Id table_id, const std::string &name) override
void delete_vector(Table_Id table_id, Record_Id record_id, size_t size) override
void create_table(const std::string &name) override
void drop_field(Table_Id table_id, Field_Id field_id) override
void delete_from(Table_Id table_id, Record_Id record_id) override
void update_vector_blob(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const joedb::Blob *value) override
void insert_vector(Table_Id table_id, Record_Id record_id, size_t size) override
Store all the tables of the database.
Definition Database.h:68
void internal_delete_buffer(Record_Id record_id)
Definition Database.h:86
void internal_update_buffer__size(Record_Id record_id, int64_t field_value_of_size)
Definition Database.h:130
static void throw_exception(const std::string &message)
Definition Database.h:75
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
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
bool is_valid_record_id_for_buffer(Record_Id record_id) const
Definition Database.h:84
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
void internal_update_vector_buffer__size(Record_Id record_id, size_t size, const int64_t *value)
Definition Database.h:140
#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
Automatically generated by joedbc.
Definition Client.h:19
constexpr index_t to_underlying(Record_Id id)
Definition index_types.h:59
static constexpr size_t size
Definition Header.h:19