Joedb 9.5.0
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: 9.5.0
8// joedbc compilation time: May 5 2025 19:51:43
9// Generation of this file: 2025-05-05 17:51:47 GMT
10//
11/////////////////////////////////////////////////////////////////////////////
12#ifndef settings_Database_declared
13#define settings_Database_declared
14
20#include "joedb/error/assert.h"
21#include "joedb/get_version.h"
22#include "ids.h"
23
24#include <string>
25#include <cstdint>
26#include <cstring>
27#include <vector>
28#include <algorithm>
29#include <string_view>
30
31static_assert(std::string_view(joedb::get_version()) == "9.5.0");
32
33namespace settings
34{
35 /// @namespace settings
36 ///
37 /// Automatically generated by joedbc
38
39 using joedb::Record_Id;
40 using joedb::Table_Id;
41 using joedb::Field_Id;
42
43 namespace detail
44 {
45 extern const char * schema_string;
46 inline constexpr size_t schema_string_size = 80;
47 }
48 class container_of_settings;
49
50 namespace detail
51 {
52 struct data_of_settings
53 {
54 Field_Id current_field_id = Field_Id(0);
55 std::vector<char> field_value_of_dark_mode;
56 std::vector<std::string> field_value_of_host;
57 std::vector<std::string> field_value_of_user;
58
59 joedb::Compact_Freedom_Keeper freedom_keeper;
60
61 size_t size() const {return freedom_keeper.size();}
62
63 void resize(size_t new_size)
64 {
65 field_value_of_dark_mode.resize(new_size);
66 field_value_of_host.resize(new_size);
67 field_value_of_user.resize(new_size);
68 freedom_keeper.resize(new_size);
69 }
70 };
71 }
72
73
74 /// Store all the tables of the database
76 {
77 friend class Readable;
78 friend class id_of_settings;
80
81 public:
82 template<typename E = joedb::Exception>
83 static void throw_exception(const std::string &message)
84 {
85 throw E("settings: " + message);
86 }
87
89 Table_Id current_table_id = Table_Id{0};
90
91 void set_max_record_id(size_t record_id)
92 {
93 max_record_id = record_id;
94 }
95
96 bool is_valid(id_of_settings id) const {return is_valid_record_id_for_settings(id.get_record_id());}
97
98 protected:
99 detail::data_of_settings storage_of_settings;
100 bool is_valid_record_id_for_settings(Record_Id record_id) const {return storage_of_settings.freedom_keeper.is_used(size_t(record_id) + 1);}
101
102 void internal_delete_settings(Record_Id record_id)
103 {
105 storage_of_settings.field_value_of_dark_mode[size_t(record_id) - 1] = 0;
106 storage_of_settings.field_value_of_host[size_t(record_id) - 1].clear();
107 storage_of_settings.field_value_of_user[size_t(record_id) - 1].clear();
108 storage_of_settings.freedom_keeper.free(size_t(record_id) + 1);
109 }
110
111 void internal_insert_settings(Record_Id record_id)
112 {
113 storage_of_settings.freedom_keeper.use(size_t(record_id) + 1);
114 }
115
116 void internal_vector_insert_settings(Record_Id record_id, size_t size)
117 {
118 storage_of_settings.freedom_keeper.use_vector(size_t(record_id) + 1, size);
119 }
120
122 (
123 Record_Id record_id,
124 bool field_value_of_dark_mode
125 )
126 {
128 storage_of_settings.field_value_of_dark_mode[size_t(record_id) - 1] = field_value_of_dark_mode;
129 }
130
132 (
133 Record_Id record_id,
134 size_t size,
135 const char *value
136 )
137 {
138 for (size_t i = 0; i < size; i++)
140 char *target = &storage_of_settings.field_value_of_dark_mode[size_t(record_id) - 1];
141 if (target != value)
142 std::copy_n(value, size, target);
143 }
144
146 (
147 Record_Id record_id,
148 const std::string& field_value_of_host
149 )
150 {
152 storage_of_settings.field_value_of_host[size_t(record_id) - 1] = field_value_of_host;
153 }
154
156 (
157 Record_Id record_id,
158 size_t size,
159 const std::string *value
160 )
161 {
162 for (size_t i = 0; i < size; i++)
164 std::string *target = &storage_of_settings.field_value_of_host[size_t(record_id) - 1];
165 if (target != value)
166 std::copy_n(value, size, target);
167 }
168
170 (
171 Record_Id record_id,
172 const std::string& field_value_of_user
173 )
174 {
176 storage_of_settings.field_value_of_user[size_t(record_id) - 1] = field_value_of_user;
177 }
178
180 (
181 Record_Id record_id,
182 size_t size,
183 const std::string *value
184 )
185 {
186 for (size_t i = 0; i < size; i++)
188 std::string *target = &storage_of_settings.field_value_of_user[size_t(record_id) - 1];
189 if (target != value)
190 std::copy_n(value, size, target);
191 }
192
193
194 void delete_from(Table_Id table_id, Record_Id record_id) final
195 {
196 if (table_id == Table_Id(1))
197 internal_delete_settings(record_id);
198 }
199
200 void insert_into(Table_Id table_id, Record_Id record_id) final
201 {
202 if (size_t(record_id) <= 0 || (max_record_id && size_t(record_id) > max_record_id))
203 throw_exception("insert_into: too big");
204 if (table_id == Table_Id(1))
205 {
206 if (is_valid_record_id_for_settings(record_id))
207 throw_exception("Duplicate insert into table settings");
208 if (storage_of_settings.size() < size_t(record_id))
209 storage_of_settings.resize(size_t(record_id));
210 internal_insert_settings(record_id);
211 }
212 }
213
214
216 (
217 Table_Id table_id,
218 Record_Id record_id,
219 size_t size
220 ) final
221 {
222 if
223 (
224 size_t(record_id) <= 0 ||
225 (max_record_id && (size_t(record_id) > max_record_id || size > max_record_id))
226 )
227 {
228 throw_exception("insert_vector: null record_id, or too big");
229 }
230 if (table_id == Table_Id(1))
231 {
232 if (storage_of_settings.size() < size_t(record_id) + size - 1)
233 storage_of_settings.resize(size_t(record_id) + size - 1);
234 internal_vector_insert_settings(record_id, size);
235 }
236 }
237
239 (
240 Table_Id table_id,
241 Record_Id record_id,
242 Field_Id field_id,
243 const std::string& value
244 )
245 final
246 {
247 if (table_id == Table_Id(1))
248 {
249 if (field_id == Field_Id(2))
250 {
251 internal_update_settings__host(record_id, value);
252 return;
253 }
254 if (field_id == Field_Id(3))
255 {
256 internal_update_settings__user(record_id, value);
257 return;
258 }
259 return;
260 }
261 }
262
264 (
265 Table_Id table_id,
266 Record_Id record_id,
267 Field_Id field_id,
268 bool value
269 )
270 final
271 {
272 if (table_id == Table_Id(1))
273 {
274 if (field_id == Field_Id(1))
275 {
276 internal_update_settings__dark_mode(record_id, value);
277 return;
278 }
279 return;
280 }
281 }
282
284 (
285 Table_Id table_id,
286 Record_Id record_id,
287 Field_Id field_id,
288 size_t size,
289 const std::string *value
290 )
291 final
292 {
293 if (table_id == Table_Id(1))
294 {
295 if (field_id == Field_Id(2))
296 {
297 internal_update_vector_settings__host(record_id, size, value);
298 return;
299 }
300 if (field_id == Field_Id(3))
301 {
302 internal_update_vector_settings__user(record_id, size, value);
303 return;
304 }
305 return;
306 }
307 }
308
310 (
311 Table_Id table_id,
312 Record_Id record_id,
313 Field_Id field_id,
314 size_t size,
315 const char *value
316 )
317 final
318 {
319 if (table_id == Table_Id(1))
320 {
321 if (field_id == Field_Id(1))
322 {
323 internal_update_vector_settings__dark_mode(record_id, size, value);
324 return;
325 }
326 return;
327 }
328 }
329
331 (
332 Table_Id table_id,
333 Record_Id record_id,
334 Field_Id field_id,
335 size_t &capacity
336 )
337 final
338 {
339 if (table_id == Table_Id(1))
340 {
341 capacity = size_t(storage_of_settings.freedom_keeper.size());
342 if (field_id == Field_Id(2))
343 {
344 return (storage_of_settings.field_value_of_host.data() + size_t(record_id) - 1);
345 }
346 if (field_id == Field_Id(3))
347 {
348 return (storage_of_settings.field_value_of_user.data() + size_t(record_id) - 1);
349 }
350 return nullptr;
351 }
352 return nullptr;
353 }
354
356 (
357 Table_Id table_id,
358 Record_Id record_id,
359 Field_Id field_id,
360 size_t &capacity
361 )
362 final
363 {
364 if (table_id == Table_Id(1))
365 {
366 capacity = size_t(storage_of_settings.freedom_keeper.size());
367 if (field_id == Field_Id(1))
368 {
369 return (storage_of_settings.field_value_of_dark_mode.data() + size_t(record_id) - 1);
370 }
371 return nullptr;
372 }
373 return nullptr;
374 }
375
376 void comment(const std::string &comment) override {}
377 void timestamp(int64_t timestamp) override {}
378 void valid_data() final {}
379
380 bool upgrading_schema = false;
383
385 {
386 return schema_file.get_data().size() < detail::schema_string_size;
387 }
388
390 {
391 constexpr size_t pos = joedb::Header::size;
392 const size_t schema_file_size = schema_file.get_data().size();
393
394 if
395 (
396 schema_file_size < pos ||
397 schema_file_size > detail::schema_string_size ||
398 std::memcmp
399 (
400 schema_file.get_data().data() + pos,
401 detail::schema_string + pos,
402 schema_file_size - pos
403 ) != 0
404 )
405 {
406 throw_exception("Trying to open a file with incompatible schema");
407 }
408 }
409
410 void create_table(const std::string &name) override
411 {
415 }
416
417 void drop_table(Table_Id table_id) final
418 {
419 schema_journal.drop_table(table_id);
421 }
422
424 (
425 Table_Id table_id,
426 const std::string &name
427 ) final
428 {
429 schema_journal.rename_table(table_id, name);
431 }
432
434 (
435 Table_Id table_id,
436 const std::string &name,
437 joedb::Type type
438 ) override
439 {
440 schema_journal.add_field(table_id, name, type);
442 }
443
444 void drop_field(Table_Id table_id, Field_Id field_id) final
445 {
446 schema_journal.drop_field(table_id, field_id);
448 }
449
451 (
452 Table_Id table_id,
453 Field_Id field_id,
454 const std::string &name
455 ) final
456 {
457 schema_journal.rename_field(table_id, field_id, name);
459 }
460
461 void custom(const std::string &name) override
462 {
465 }
466
467 public:
472
473 int64_t get_schema_checkpoint() const
474 {
476 }
477
479 {
480 max_record_id = size_t(journal.get_checkpoint());
481 journal.replay_log(*this);
482 max_record_id = 0;
483
484 check_schema();
485
487 throw_exception<joedb::Out_Of_Date>("Schema is out of date. Can't upgrade a read-only database.");
488 }
489
491
493 {
494 return id_of_settings
495 (
496 Record_Id(storage_of_settings.freedom_keeper.get_next(id.get_id() + 1) - 1)
497 );
498 }
499
501 {
502 return id_of_settings
503 (
504 Record_Id(storage_of_settings.freedom_keeper.get_previous(id.get_id() + 1) - 1)
505 );
506 }
507
508 template<class Comparator>
509 std::vector<id_of_settings> sorted_settings(Comparator comparator) const;
510
512 {
513 return id_of_settings();
514 }
515 static constexpr id_of_settings the_settings()
516 {
517 return id_of_settings{1};
518 }
519
521 {
523 return (bool)(storage_of_settings.field_value_of_dark_mode[record.get_id() - 1]);
524 }
525
526 const std::string& get_host(id_of_settings record= id_of_settings{1}) const
527 {
529 return (const std::string&)(storage_of_settings.field_value_of_host[record.get_id() - 1]);
530 }
531
532 const std::string& get_user(id_of_settings record= id_of_settings{1}) const
533 {
535 return (const std::string&)(storage_of_settings.field_value_of_user[record.get_id() - 1]);
536 }
537 };
538 /// returned by @ref Database::get_settings_table
540 {
541 friend class Database;
542
543 private:
544 const Database &db;
545 container_of_settings(const Database &db): db(db) {}
546
547 public:
549 {
551 private:
553 size_t index;
554 iterator(const detail::data_of_settings &data): fk(&data.freedom_keeper), index(0) {}
555 public:
556 typedef std::forward_iterator_tag iterator_category;
558 typedef std::ptrdiff_t difference_type;
561
562 bool operator==(const iterator &i) const {return index == i.index;}
563 bool operator!=(const iterator &i) const {return index != i.index;}
564 iterator &operator++() {index = fk->get_next(index); return *this;}
565 iterator operator++(int) {auto copy = *this; index = fk->get_next(index); return copy;}
566 iterator &operator--() {index = fk->get_previous(index); return *this;}
567 iterator operator--(int) {auto copy = *this; index = fk->get_previous(index); return copy;}
568 id_of_settings operator*() const {return id_of_settings(Record_Id(index - 1));}
569 };
570
573 bool is_empty() const {return db.storage_of_settings.freedom_keeper.is_empty();}
574 size_t get_size() const {return db.storage_of_settings.freedom_keeper.get_used_count();}
575 static id_of_settings get_at(size_t i) {return id_of_settings(Record_Id(i));}
576 bool is_valid_at(size_t i) {return db.storage_of_settings.freedom_keeper.is_used(i + 1);}
577 id_of_settings first() const {return *begin();}
578 id_of_settings last() const {return *--end();}
579 id_of_settings get_end() const {return *end();}
580 };
581
583 {
584 return container_of_settings(*this);
585 }
586
587 template<class Comparator>
588 std::vector<id_of_settings> Database::sorted_settings(Comparator comparator) const
589 {
590 std::vector<id_of_settings> result;
591 for (auto x: get_settings_table())
592 result.emplace_back(x);
593 std::sort(result.begin(), result.end(), comparator);
594 return result;
595 }
596}
597
598#endif
ptrdiff_t get_previous(ptrdiff_t index) const override
void resize(ptrdiff_t new_size) override
ptrdiff_t size() const override
ptrdiff_t get_next(ptrdiff_t index) const override
std::string & get_data()
Definition Memory_File.h:20
void replay_log(Writable &writable)
int64_t get_checkpoint() const
void rename_field(Table_Id table_id, Field_Id field_id, const std::string &name) final
void create_table(const std::string &name) final
void drop_field(Table_Id table_id, Field_Id field_id) final
void custom(const std::string &name) final
void rename_table(Table_Id table_id, const std::string &name) final
void add_field(Table_Id table_id, const std::string &name, Type type) final
void drop_table(Table_Id table_id) final
void soft_checkpoint()
Definition Writable.h:21
Store all the tables of the database.
Definition Database.h:76
bool is_valid_record_id_for_settings(Record_Id record_id) const
Definition Database.h:100
void rename_field(Table_Id table_id, Field_Id field_id, const std::string &name) final
Definition Database.h:451
void internal_update_vector_settings__dark_mode(Record_Id record_id, size_t size, const char *value)
Definition Database.h:132
void delete_from(Table_Id table_id, Record_Id record_id) final
Definition Database.h:194
size_t max_record_id
Definition Database.h:88
bool is_valid(id_of_settings id) const
Definition Database.h:96
static constexpr id_of_settings the_settings()
Definition Database.h:515
void internal_update_settings__dark_mode(Record_Id record_id, bool field_value_of_dark_mode)
Definition Database.h:122
void internal_insert_settings(Record_Id record_id)
Definition Database.h:111
friend class id_of_settings
Definition Database.h:78
void create_table(const std::string &name) override
Definition Database.h:410
std::vector< id_of_settings > sorted_settings(Comparator comparator) const
Definition Database.h:588
void insert_into(Table_Id table_id, Record_Id record_id) final
Definition Database.h:200
void update_string(Table_Id table_id, Record_Id record_id, Field_Id field_id, const std::string &value) final
Definition Database.h:239
void update_boolean(Table_Id table_id, Record_Id record_id, Field_Id field_id, bool value) final
Definition Database.h:264
const std::string & get_user(id_of_settings record=id_of_settings{1}) const
Definition Database.h:532
void drop_field(Table_Id table_id, Field_Id field_id) final
Definition Database.h:444
joedb::Writable_Journal schema_journal
Definition Database.h:382
friend class container_of_settings
Definition Database.h:79
void internal_vector_insert_settings(Record_Id record_id, size_t size)
Definition Database.h:116
void update_vector_string(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const std::string *value) final
Definition Database.h:284
void valid_data() final
Definition Database.h:378
void internal_delete_settings(Record_Id record_id)
Definition Database.h:102
static id_of_settings null_settings()
Definition Database.h:511
bool requires_schema_upgrade() const
Definition Database.h:384
int64_t get_schema_checkpoint() const
Definition Database.h:473
void custom(const std::string &name) override
Definition Database.h:461
void add_field(Table_Id table_id, const std::string &name, joedb::Type type) override
Definition Database.h:434
id_of_settings next(id_of_settings id) const
Definition Database.h:492
void update_vector_boolean(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const char *value) final
Definition Database.h:310
void internal_update_vector_settings__user(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:180
void insert_vector(Table_Id table_id, Record_Id record_id, size_t size) final
Definition Database.h:216
char * get_own_boolean_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) final
Definition Database.h:356
static void throw_exception(const std::string &message)
Definition Database.h:83
void drop_table(Table_Id table_id) final
Definition Database.h:417
void timestamp(int64_t timestamp) override
Definition Database.h:377
const std::string & get_host(id_of_settings record=id_of_settings{1}) const
Definition Database.h:526
bool get_dark_mode(id_of_settings record=id_of_settings{1}) const
Definition Database.h:520
joedb::Memory_File schema_file
Definition Database.h:381
id_of_settings previous(id_of_settings id) const
Definition Database.h:500
Table_Id current_table_id
Definition Database.h:89
void internal_update_settings__host(Record_Id record_id, const std::string &field_value_of_host)
Definition Database.h:146
void set_max_record_id(size_t record_id)
Definition Database.h:91
void internal_update_vector_settings__host(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:156
detail::data_of_settings storage_of_settings
Definition Database.h:99
void internal_update_settings__user(Record_Id record_id, const std::string &field_value_of_user)
Definition Database.h:170
std::string * get_own_string_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) final
Definition Database.h:331
void initialize_with_readonly_journal(joedb::Readonly_Journal &journal)
Definition Database.h:478
void comment(const std::string &comment) override
Definition Database.h:376
container_of_settings get_settings_table() const
Definition Database.h:582
void rename_table(Table_Id table_id, const std::string &name) final
Definition Database.h:424
Implement the joedb::Readable interface for a compiled database.
Definition Readable.h:27
std::forward_iterator_tag iterator_category
Definition Database.h:556
bool operator==(const iterator &i) const
Definition Database.h:562
bool operator!=(const iterator &i) const
Definition Database.h:563
returned by Database::get_settings_table
Definition Database.h:540
id_of_settings last() const
Definition Database.h:578
static id_of_settings get_at(size_t i)
Definition Database.h:575
id_of_settings get_end() const
Definition Database.h:579
id_of_settings first() const
Definition Database.h:577
Strongly-typed wrapper around an integer representing a row of the settings table.
Definition ids.h:25
#define JOEDB_DEBUG_ASSERT(x)
Definition assert.h:20
constexpr const char * get_version()
Definition get_version.h:7
Automatically generated by joedbc.
Definition Client.h:19
static constexpr size_t size
Definition Header.h:19