Joedb 10.3.2
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/doc/source/tutorial/build/joedbc
7// Version: 10.3.2
8// joedbc compilation time: Apr 6 2026 15:09:17
9// Generation of this file: 2026-04-06 13:09:23 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
19namespace tutorial
20{
21 namespace detail
22 {
23 class Client_Data;
24 }
25
26 class Client;
27 class Multiplexer;
28 class Memory_Database;
29
30 /// A @ref Database that contains a @ref joedb::Writable_Journal and keeps them in sync
32 {
33 friend class detail::Client_Data;
34 friend class Client;
35 friend class Multiplexer;
36 friend class Memory_Database;
37
38 private:
40 bool ready_to_write;
41
42 void play_journal();
43 void auto_upgrade();
44 void check_single_row();
45 void initialize();
46
48 (
50 joedb::Recovery recovery,
51 bool perform_initialization
52 );
53
54 public:
56
58 (
60 joedb::Recovery recovery
61 );
62
63 const joedb::Readonly_Journal &get_journal() const {return journal;}
64
65 std::string read_blob(joedb::Blob blob) const
66 {
67 return journal.get_file().read_blob(blob);
68 }
69
70 joedb::Blob write_blob(std::string_view data) override
71 {
72 return journal.write_blob(data);
73 }
74
75 int64_t ahead_of_checkpoint() const
76 {
77 return journal.ahead_of_checkpoint();
78 }
79
80 void soft_checkpoint() override
81 {
82 journal.soft_checkpoint();
83 }
84
85 void hard_checkpoint() override
86 {
87 journal.hard_checkpoint();
88 }
89
90 void write_comment(const std::string &comment);
91 void write_timestamp();
92 void write_timestamp(int64_t timestamp);
93 void write_valid_data();
94 void flush() override {journal.flush();}
95
96 void clear_city_table();
97
99 {
100 id_of_city result(Record_Id(storage_of_city.freedom_keeper.get_free_record()));
101 storage_of_city.resize(storage_of_city.freedom_keeper.size());
103
104 journal.insert_into(Table_Id(1), result.get_record_id());
105 return result;
106 }
107
109 {
110 if (id.get_record_id() >= Record_Id(storage_of_city.size()))
111 storage_of_city.resize(id.get_id() + 1);
112 internal_insert_city(id.get_record_id());
113 journal.insert_into(Table_Id(1), id.get_record_id());
114 }
115
117 {
118 id_of_city result(Record_Id(storage_of_city.size()));
119 storage_of_city.resize(storage_of_city.size() + size);
121 journal.insert_vector(Table_Id(1), result.get_record_id(), size);
122 return result;
123 }
124
126 (
127 const std::string& field_value_of_name
128 )
129 {
130 auto result = new_city();
131 set_name(result, field_value_of_name);
132 return result;
133 }
134
136 {
138 journal.delete_from(Table_Id(1), record.get_record_id());
139 }
140
142 {
143 for (size_t i = size; i > 0;)
144 internal_delete_city(v[--i].get_record_id());
145 journal.delete_vector(Table_Id(1), v.get_record_id(), size);
146 }
147
148 void set_name(id_of_city record, const std::string& field_value_of_name)
149 {
150 internal_update_city__name(record.get_record_id(), field_value_of_name);
151 journal.update_string(Table_Id(1), record.get_record_id(), Field_Id(1), field_value_of_name);
152 }
153
154 template<typename F> void update_vector_of_name(id_of_city record, size_t size, F f)
155 {
156 joedb::Span<std::string> span(&storage_of_city.field_value_of_name.data()[record.get_id()], size);
157 f(span);
159 journal.update_vector_string(Table_Id(1), record.get_record_id(), Field_Id(1), size, (span.begin()));
160 }
161
162
163 void clear_person_table();
164
166 {
167 id_of_person result(Record_Id(storage_of_person.freedom_keeper.get_free_record()));
168 storage_of_person.resize(storage_of_person.freedom_keeper.size());
170
171 journal.insert_into(Table_Id(2), result.get_record_id());
172 return result;
173 }
174
176 {
177 if (id.get_record_id() >= Record_Id(storage_of_person.size()))
178 storage_of_person.resize(id.get_id() + 1);
179 internal_insert_person(id.get_record_id());
180 journal.insert_into(Table_Id(2), id.get_record_id());
181 }
182
184 {
186 storage_of_person.resize(storage_of_person.size() + size);
188 journal.insert_vector(Table_Id(2), result.get_record_id(), size);
189 return result;
190 }
191
193 (
194 const std::string& field_value_of_first_name,
195 const std::string& field_value_of_last_name,
196 id_of_city field_value_of_home
197 )
198 {
199 auto result = new_person();
200 set_first_name(result, field_value_of_first_name);
201 set_last_name(result, field_value_of_last_name);
202 set_home(result, field_value_of_home);
203 return result;
204 }
205
207 {
209 journal.delete_from(Table_Id(2), record.get_record_id());
210 }
211
213 {
214 for (size_t i = size; i > 0;)
215 internal_delete_person(v[--i].get_record_id());
216 journal.delete_vector(Table_Id(2), v.get_record_id(), size);
217 }
218
219 void set_first_name(id_of_person record, const std::string& field_value_of_first_name)
220 {
221 internal_update_person__first_name(record.get_record_id(), field_value_of_first_name);
222 journal.update_string(Table_Id(2), record.get_record_id(), Field_Id(1), field_value_of_first_name);
223 }
224
225 template<typename F> void update_vector_of_first_name(id_of_person record, size_t size, F f)
226 {
227 joedb::Span<std::string> span(&storage_of_person.field_value_of_first_name.data()[record.get_id()], size);
228 f(span);
230 journal.update_vector_string(Table_Id(2), record.get_record_id(), Field_Id(1), size, (span.begin()));
231 }
232
233 void set_last_name(id_of_person record, const std::string& field_value_of_last_name)
234 {
235 internal_update_person__last_name(record.get_record_id(), field_value_of_last_name);
236 journal.update_string(Table_Id(2), record.get_record_id(), Field_Id(2), field_value_of_last_name);
237 }
238
239 template<typename F> void update_vector_of_last_name(id_of_person record, size_t size, F f)
240 {
241 joedb::Span<std::string> span(&storage_of_person.field_value_of_last_name.data()[record.get_id()], size);
242 f(span);
244 journal.update_vector_string(Table_Id(2), record.get_record_id(), Field_Id(2), size, (span.begin()));
245 }
246
247 void set_home(id_of_person record, id_of_city field_value_of_home)
248 {
249 internal_update_person__home(record.get_record_id(), field_value_of_home);
250 journal.update_reference(Table_Id(2), record.get_record_id(), Field_Id(3), field_value_of_home.get_record_id());
251 }
252
253 template<typename F> void update_vector_of_home(id_of_person record, size_t size, F f)
254 {
255 joedb::Span<id_of_city> span(&storage_of_person.field_value_of_home.data()[record.get_id()], size);
256 f(span);
258 journal.update_vector_reference(Table_Id(2), record.get_record_id(), Field_Id(3), size, reinterpret_cast<Record_Id *>(span.begin()));
259 }
260
261
262 };}
263
264#endif
std::string read_blob(Blob blob) const
const Abstract_File & get_file() const
T * begin()
Definition Span.h:39
void delete_vector(Table_Id table_id, Record_Id record_id, size_t size) override
void delete_from(Table_Id table_id, Record_Id record_id) override
int64_t ahead_of_checkpoint() const noexcept
void insert_vector(Table_Id table_id, Record_Id record_id, size_t size) override
void insert_into(Table_Id table_id, Record_Id record_id) override
Blob write_blob(std::string_view data) override
Handle concurrent access to a joedb::Abstract_File using a joedb::Connection.
Definition Client.h:44
implement joedb::Writable in a Database
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:261
void internal_update_vector_city__name(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:232
void internal_insert_person(Record_Id record_id)
Definition Database.h:201
void internal_update_vector_person__home(Record_Id record_id, size_t size, const id_of_city *value)
Definition Database.h:317
detail::data_of_city storage_of_city
Definition Database.h:108
detail::data_of_person storage_of_person
Definition Database.h:110
void internal_update_vector_person__last_name(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:290
void internal_update_person__home(Record_Id record_id, id_of_city field_value_of_home)
Definition Database.h:307
void internal_update_person__first_name(Record_Id record_id, const std::string &field_value_of_first_name)
Definition Database.h:249
void internal_update_person__last_name(Record_Id record_id, const std::string &field_value_of_last_name)
Definition Database.h:278
void internal_insert_city(Record_Id record_id)
Definition Database.h:184
void internal_update_city__name(Record_Id record_id, const std::string &field_value_of_name)
Definition Database.h:220
void internal_delete_person(Record_Id record_id)
Definition Database.h:174
void internal_delete_city(Record_Id record_id)
Definition Database.h:167
void internal_vector_insert_city(Record_Id record_id, size_t size)
Definition Database.h:190
void internal_vector_insert_person(Record_Id record_id, size_t size)
Definition Database.h:207
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
A Database that contains a joedb::Writable_Journal and keeps them in sync.
void update_vector_of_last_name(id_of_person record, size_t size, F f)
id_of_person new_person(const std::string &field_value_of_first_name, const std::string &field_value_of_last_name, id_of_city field_value_of_home)
void set_name(id_of_city record, const std::string &field_value_of_name)
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)
void set_first_name(id_of_person record, const std::string &field_value_of_first_name)
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, const std::string &field_value_of_last_name)
void update_vector_of_first_name(id_of_person record, size_t size, F f)
id_of_city new_city(const 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)
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)
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
Automatically generated by joedbc.
Definition Client.h:19