Joedb 10.5.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Writable_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.5.0
8// joedbc compilation time: Oct 25 2026 16:06:59
9// Generation of this file: 2026-10-25 19:48:05 GMT
10//
11/////////////////////////////////////////////////////////////////////////////
12#ifndef tutorial_Writable_Database_declared
13#define tutorial_Writable_Database_declared
14
15#include "joedb/Span.h"
16
17#include "Database_Writable.h"
18
19#include <utility>
20
21namespace tutorial
22{
23 namespace detail
24 {
25 class Client_Data;
26 }
27
28 class Client;
29 class Multiplexer;
30 class Memory_Database;
31
32 /// A @ref Database that contains a @ref joedb::Writable_Journal and keeps them in sync
33 class Writable_Database: public Database_Writable
34 {
35 friend class detail::Client_Data;
36 friend class Client;
37 friend class Multiplexer;
38 friend class Memory_Database;
39
40 private:
42 bool ready_to_write;
43
44 void play_journal();
45 void auto_upgrade();
46 void check_single_row();
47 void initialize();
48
49 Writable_Database
50 (
52 joedb::Recovery recovery,
53 bool perform_initialization
54 );
55
56 public:
57 Writable_Database(joedb::Abstract_File &file);
58
59 Writable_Database
60 (
62 joedb::Recovery recovery
63 );
64
65 const joedb::Readonly_Journal &get_journal() const {return journal;}
66
67 std::string read_blob(joedb::Blob blob) const
68 {
69 return journal.get_file().read_blob(blob);
70 }
71
72 joedb::Blob write_blob(std::string_view data) override
73 {
74 return journal.write_blob(data);
75 }
76
77 int64_t ahead_of_checkpoint() const
78 {
79 return journal.ahead_of_checkpoint();
80 }
81
82 void soft_checkpoint() override
83 {
84 journal.soft_checkpoint();
85 }
86
87 void hard_checkpoint() override
88 {
89 journal.hard_checkpoint();
90 }
91
92 void write_comment(const std::string &comment);
93 void write_timestamp();
94 void write_timestamp(int64_t timestamp);
95 void write_valid_data();
96 void flush() override {journal.flush();}
97
98 void clear_city_table();
99
101 {
102 id_of_city result(Record_Id(storage_of_city.freedom_keeper.get_free_record()));
103 storage_of_city.resize(storage_of_city.freedom_keeper.size());
105
106 journal.insert_into(Table_Id(1), result.get_record_id());
107 return result;
108 }
109
111 {
112 if (id.get_record_id() >= Record_Id(storage_of_city.size()))
113 storage_of_city.resize(id.get_id() + 1);
114 internal_insert_city(id.get_record_id());
115 journal.insert_into(Table_Id(1), id.get_record_id());
116 }
117
119 {
120 id_of_city result(Record_Id(storage_of_city.size()));
121 storage_of_city.resize(storage_of_city.size() + size);
123 journal.insert_vector(Table_Id(1), result.get_record_id(), size);
124 return result;
125 }
126
128 (
129 std::string field_value_of_name
130 )
131 {
132 auto result = new_city();
133 set_name(result, std::move(field_value_of_name));
134 return result;
135 }
136
138 {
140 journal.delete_from(Table_Id(1), record.get_record_id());
141 }
142
144 {
145 for (size_t i = size; i > 0;)
146 internal_delete_city(v[--i].get_record_id());
147 journal.delete_vector(Table_Id(1), v.get_record_id(), size);
148 }
149
150 void set_name(id_of_city record, std::string field_value_of_name)
151 {
152 internal_update_city__name(record.get_record_id(), std::move(field_value_of_name));
153 journal.update_string(Table_Id(1), record.get_record_id(), Field_Id(1), get_name(record));
154 }
155
156 template<typename F> void update_vector_of_name(id_of_city record, size_t size, F f)
157 {
158 JOEDB_DEBUG_ASSERT(storage_of_city.freedom_keeper.is_used_vector(record.get_record_id(), size));
159 joedb::Span<std::string> span(&storage_of_city.field_value_of_name.data()[record.get_id()], size);
160 f(span);
162 journal.update_vector_string(Table_Id(1), record.get_record_id(), Field_Id(1), size, (span.begin()));
163 }
164
165
166 void clear_person_table();
167
169 {
170 id_of_person result(Record_Id(storage_of_person.freedom_keeper.get_free_record()));
171 storage_of_person.resize(storage_of_person.freedom_keeper.size());
173
174 journal.insert_into(Table_Id(2), result.get_record_id());
175 return result;
176 }
177
179 {
180 if (id.get_record_id() >= Record_Id(storage_of_person.size()))
181 storage_of_person.resize(id.get_id() + 1);
182 internal_insert_person(id.get_record_id());
183 journal.insert_into(Table_Id(2), id.get_record_id());
184 }
185
187 {
189 storage_of_person.resize(storage_of_person.size() + size);
191 journal.insert_vector(Table_Id(2), result.get_record_id(), size);
192 return result;
193 }
194
196 (
197 std::string field_value_of_first_name,
198 std::string field_value_of_last_name,
199 id_of_city field_value_of_home
200 )
201 {
202 auto result = new_person();
203 set_first_name(result, std::move(field_value_of_first_name));
204 set_last_name(result, std::move(field_value_of_last_name));
205 set_home(result, field_value_of_home);
206 return result;
207 }
208
210 {
212 journal.delete_from(Table_Id(2), record.get_record_id());
213 }
214
216 {
217 for (size_t i = size; i > 0;)
218 internal_delete_person(v[--i].get_record_id());
219 journal.delete_vector(Table_Id(2), v.get_record_id(), size);
220 }
221
222 void set_first_name(id_of_person record, std::string field_value_of_first_name)
223 {
224 internal_update_person__first_name(record.get_record_id(), std::move(field_value_of_first_name));
225 journal.update_string(Table_Id(2), record.get_record_id(), Field_Id(1), get_first_name(record));
226 }
227
228 template<typename F> void update_vector_of_first_name(id_of_person record, size_t size, F f)
229 {
230 JOEDB_DEBUG_ASSERT(storage_of_person.freedom_keeper.is_used_vector(record.get_record_id(), size));
231 joedb::Span<std::string> span(&storage_of_person.field_value_of_first_name.data()[record.get_id()], size);
232 f(span);
234 journal.update_vector_string(Table_Id(2), record.get_record_id(), Field_Id(1), size, (span.begin()));
235 }
236
237 void set_last_name(id_of_person record, std::string field_value_of_last_name)
238 {
239 internal_update_person__last_name(record.get_record_id(), std::move(field_value_of_last_name));
240 journal.update_string(Table_Id(2), record.get_record_id(), Field_Id(2), get_last_name(record));
241 }
242
243 template<typename F> void update_vector_of_last_name(id_of_person record, size_t size, F f)
244 {
245 JOEDB_DEBUG_ASSERT(storage_of_person.freedom_keeper.is_used_vector(record.get_record_id(), size));
246 joedb::Span<std::string> span(&storage_of_person.field_value_of_last_name.data()[record.get_id()], size);
247 f(span);
249 journal.update_vector_string(Table_Id(2), record.get_record_id(), Field_Id(2), size, (span.begin()));
250 }
251
252 void set_home(id_of_person record, id_of_city field_value_of_home)
253 {
254 internal_update_person__home(record.get_record_id(), field_value_of_home);
255 journal.update_reference(Table_Id(2), record.get_record_id(), Field_Id(3), field_value_of_home.get_record_id());
256 }
257
258 template<typename F> void update_vector_of_home(id_of_person record, size_t size, F f)
259 {
260 JOEDB_DEBUG_ASSERT(storage_of_person.freedom_keeper.is_used_vector(record.get_record_id(), size));
261 joedb::Span<id_of_city> span(&storage_of_person.field_value_of_home.data()[record.get_id()], size);
262 f(span);
264 journal.update_vector_reference(Table_Id(2), record.get_record_id(), Field_Id(3), size, reinterpret_cast<Record_Id *>(span.begin()));
265 }
266
267
268 };}
269
270#endif
T * begin()
Definition Span.h:39
Handle concurrent access to a joedb::Abstract_File using a joedb::Connection.
Definition Client.h:44
void timestamp(int64_t timestamp) override
void comment(const std::string &comment) override
void internal_update_vector_person__first_name(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:268
const std::string & get_last_name(id_of_person record) const
Definition Database.h:401
void internal_update_vector_city__name(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:239
void internal_insert_person(Record_Id record_id)
Definition Database.h:208
const std::string & get_first_name(id_of_person record) const
Definition Database.h:395
void internal_update_vector_person__home(Record_Id record_id, size_t size, const id_of_city *value)
Definition Database.h:324
detail::data_of_city storage_of_city
Definition Database.h:115
detail::data_of_person storage_of_person
Definition Database.h:117
void internal_update_vector_person__last_name(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:297
void internal_update_person__first_name(Record_Id record_id, std::string field_value_of_first_name)
Definition Database.h:256
void internal_update_person__last_name(Record_Id record_id, std::string field_value_of_last_name)
Definition Database.h:285
const std::string & get_name(id_of_city record) const
Definition Database.h:363
void internal_update_person__home(Record_Id record_id, id_of_city field_value_of_home)
Definition Database.h:314
void internal_insert_city(Record_Id record_id)
Definition Database.h:191
void internal_delete_person(Record_Id record_id)
Definition Database.h:181
void internal_delete_city(Record_Id record_id)
Definition Database.h:174
void internal_vector_insert_city(Record_Id record_id, size_t size)
Definition Database.h:197
void internal_vector_insert_person(Record_Id record_id, size_t size)
Definition Database.h:214
void internal_update_city__name(Record_Id record_id, std::string field_value_of_name)
Definition Database.h:227
Shortcut to directly build a Writable_Database with a Memory_File.
Write simultaneously to the database and the file (ignore schema changes).
Definition Multiplexer.h:40
void update_vector_of_last_name(id_of_person record, size_t size, F f)
joedb::Blob write_blob(std::string_view data) override
std::string read_blob(joedb::Blob blob) const
void insert_city(id_of_city id)
void delete_vector_of_city(id_of_city v, size_t size)
id_of_city new_vector_of_city(size_t size)
void insert_person(id_of_person id)
void update_vector_of_home(id_of_person record, size_t size, F f)
void set_last_name(id_of_person record, std::string field_value_of_last_name)
void update_vector_of_first_name(id_of_person record, size_t size, F f)
id_of_person new_person(std::string field_value_of_first_name, std::string field_value_of_last_name, id_of_city field_value_of_home)
id_of_city new_city(std::string field_value_of_name)
void set_home(id_of_person record, id_of_city field_value_of_home)
void write_comment(const std::string &comment)
void set_first_name(id_of_person record, std::string field_value_of_first_name)
const joedb::Readonly_Journal & get_journal() const
void delete_vector_of_person(id_of_person v, size_t size)
void update_vector_of_name(id_of_city record, size_t size, F f)
void delete_city(id_of_city record)
void set_name(id_of_city record, std::string field_value_of_name)
id_of_person new_vector_of_person(size_t size)
void delete_person(id_of_person record)
Strongly-typed wrapper around an integer representing a row of the city table.
Definition ids.h:25
constexpr auto get_id() const
Definition ids.h:35
constexpr Record_Id get_record_id() const
Definition ids.h:36
Strongly-typed wrapper around an integer representing a row of the person table.
Definition ids.h:48
constexpr Record_Id get_record_id() const
Definition ids.h:59
constexpr auto get_id() const
Definition ids.h:58
#define JOEDB_DEBUG_ASSERT(x)
assertion tested in debug mode
Definition assert.h:19
Automatically generated by joedbc.
Definition Client.h:19