Joedb 9.5.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Multiplexer.cpp
Go to the documentation of this file.
1#include "joedb/Multiplexer.h"
2
3namespace joedb
4{
5 ////////////////////////////////////////////////////////////////////////////
7 ////////////////////////////////////////////////////////////////////////////
8 (
9 std::initializer_list<std::reference_wrapper<Writable>> initializer_list
10 ):
11 writables(initializer_list),
12 start_index(0)
13 {
14 }
15
16 #define MULTIPLEX(x) do {for (size_t i = start_index; i < writables.size(); i++) writables[i].get().x;} while(0)
17
18 ////////////////////////////////////////////////////////////////////////////
19 void Multiplexer::create_table(const std::string &name)
20 ////////////////////////////////////////////////////////////////////////////
21 {
23 }
24
25 ////////////////////////////////////////////////////////////////////////////
27 ////////////////////////////////////////////////////////////////////////////
28 {
29 MULTIPLEX(drop_table(table_id));
30 }
31
32 ////////////////////////////////////////////////////////////////////////////
34 ////////////////////////////////////////////////////////////////////////////
35 (
36 Table_Id table_id,
37 const std::string &name
38 )
39 {
40 MULTIPLEX(rename_table(table_id, name));
41 }
42
43 ////////////////////////////////////////////////////////////////////////////
45 ////////////////////////////////////////////////////////////////////////////
46 (
47 Table_Id table_id,
48 const std::string &name,
49 Type type
50 )
51 {
52 MULTIPLEX(add_field(table_id, name, type));
53 }
54
55 ////////////////////////////////////////////////////////////////////////////
57 ////////////////////////////////////////////////////////////////////////////
58 (
59 Table_Id table_id,
60 Field_Id field_id
61 )
62 {
63 MULTIPLEX(drop_field(table_id, field_id));
64 }
65
66 ////////////////////////////////////////////////////////////////////////////
68 ////////////////////////////////////////////////////////////////////////////
69 (
70 Table_Id table_id,
71 Field_Id field_id,
72 const std::string &name
73 )
74 {
75 MULTIPLEX(rename_field(table_id, field_id, name));
76 }
77
78 ////////////////////////////////////////////////////////////////////////////
79 void Multiplexer::custom(const std::string &name)
80 ////////////////////////////////////////////////////////////////////////////
81 {
82 MULTIPLEX(custom(name));
83 }
84
85 ////////////////////////////////////////////////////////////////////////////
86 void Multiplexer::comment(const std::string &comment)
87 ////////////////////////////////////////////////////////////////////////////
88 {
90 }
91
92 ////////////////////////////////////////////////////////////////////////////
93 void Multiplexer::timestamp(int64_t timestamp)
94 ////////////////////////////////////////////////////////////////////////////
95 {
97 }
98
99 ////////////////////////////////////////////////////////////////////////////
101 ////////////////////////////////////////////////////////////////////////////
102 {
104 }
105
106 ////////////////////////////////////////////////////////////////////////////
108 ////////////////////////////////////////////////////////////////////////////
109 {
110 MULTIPLEX(flush());
111 }
112
113 ////////////////////////////////////////////////////////////////////////////
115 ////////////////////////////////////////////////////////////////////////////
116 {
117 int64_t result = 0;
118
119 for (auto w: writables)
120 {
121 result = w.get().get_position();
122 if (result > 0)
123 break;
124 }
125
126 return result;
127 }
128
129 ////////////////////////////////////////////////////////////////////////////
130 void Multiplexer::start_writing(int64_t position)
131 ////////////////////////////////////////////////////////////////////////////
132 {
133 MULTIPLEX(start_writing(position));
134 }
135
136 ////////////////////////////////////////////////////////////////////////////
137 void Multiplexer::soft_checkpoint_at(int64_t position)
138 ////////////////////////////////////////////////////////////////////////////
139 {
140 MULTIPLEX(soft_checkpoint_at(position));
141 }
142
143 ////////////////////////////////////////////////////////////////////////////
144 void Multiplexer::hard_checkpoint_at(int64_t position)
145 ////////////////////////////////////////////////////////////////////////////
146 {
147 MULTIPLEX(hard_checkpoint_at(position));
148 }
149
150 ////////////////////////////////////////////////////////////////////////////
152 ////////////////////////////////////////////////////////////////////////////
153 (
154 Table_Id table_id,
155 Record_Id record_id
156 )
157 {
158 MULTIPLEX(insert_into(table_id, record_id));
159 }
160
161 ////////////////////////////////////////////////////////////////////////////
163 ////////////////////////////////////////////////////////////////////////////
164 (
165 Table_Id table_id,
166 Record_Id record_id
167 )
168 {
169 MULTIPLEX(delete_from(table_id, record_id));
170 }
171
172 ////////////////////////////////////////////////////////////////////////////
174 ////////////////////////////////////////////////////////////////////////////
175 (
176 Table_Id table_id,
177 Record_Id record_id,
178 size_t size
179 )
180 {
181 MULTIPLEX(insert_vector(table_id, record_id, size));
182 }
183
184 ////////////////////////////////////////////////////////////////////////////
186 ////////////////////////////////////////////////////////////////////////////
187 (
188 Table_Id table_id,
189 Record_Id record_id,
190 size_t size
191 )
192 {
193 MULTIPLEX(delete_vector(table_id, record_id, size));
194 }
195
196 #define TYPE_MACRO(type, return_type, type_id, R, W)\
197 void Multiplexer::update_##type_id\
198 (\
199 Table_Id table_id,\
200 Record_Id record_id,\
201 Field_Id field_id,\
202 return_type value\
203 )\
204 {\
205 MULTIPLEX(update_##type_id(table_id, record_id, field_id, value));\
206 }\
207 void Multiplexer::update_vector_##type_id\
208 (\
209 Table_Id table_id,\
210 Record_Id record_id,\
211 Field_Id field_id,\
212 size_t size,\
213 const type *value\
214 )\
215 {\
216 MULTIPLEX\
217 (\
218 update_vector_##type_id(table_id, record_id, field_id, size, value)\
219 );\
220 }\
221 type *Multiplexer::get_own_##type_id##_storage\
222 (\
223 Table_Id table_id,\
224 Record_Id record_id,\
225 Field_Id field_id,\
226 size_t &capacity\
227 )\
228 {\
229 capacity = 0;\
230 type *result = nullptr;\
231 for (auto w: writables)\
232 {\
233 result = w.get().get_own_##type_id##_storage(table_id, record_id, field_id, capacity);\
234 if (result)\
235 break;\
236 }\
237 return result;\
238 }
239 #include "joedb/TYPE_MACRO.h"
240
241 ////////////////////////////////////////////////////////////////////////////
243 ////////////////////////////////////////////////////////////////////////////
244 {
245 MULTIPLEX(on_blob(blob));
246 }
247
248 #undef MULTIPLEX
249
250 ////////////////////////////////////////////////////////////////////////////
252 ////////////////////////////////////////////////////////////////////////////
253 {
254 for (auto w: writables)
255 {
256 if (w.get().wants_blob_data())
257 return true;
258 }
259
260 return false;
261 }
262
263 ////////////////////////////////////////////////////////////////////////////
264 Blob Multiplexer::write_blob(const std::string &data)
265 ////////////////////////////////////////////////////////////////////////////
266 {
267 Blob result;
268
269 for (auto w: writables)
270 {
271 if (w.get().wants_blob_data())
272 result = w.get().write_blob(data);
273 }
274
275 return result;
276 }
277
278 ////////////////////////////////////////////////////////////////////////////
279 Multiplexer::~Multiplexer() = default;
280 ////////////////////////////////////////////////////////////////////////////
281}
#define MULTIPLEX(x)
void rename_field(Table_Id table_id, Field_Id field_id, const std::string &name) final
int64_t get_position() const final
~Multiplexer() override
void custom(const std::string &name) final
void delete_from(Table_Id table_id, Record_Id record_id) final
void start_writing(int64_t position) final
void add_field(Table_Id table_id, const std::string &name, Type type) final
void delete_vector(Table_Id table_id, Record_Id record_id, size_t size) final
void insert_vector(Table_Id table_id, Record_Id record_id, size_t size) final
void comment(const std::string &comment) final
void create_table(const std::string &name) final
void insert_into(Table_Id table_id, Record_Id record_id) final
void hard_checkpoint_at(int64_t position) final
void on_blob(Blob blob) final
Blob write_blob(const std::string &data) final
bool wants_blob_data() const final
void drop_table(Table_Id table_id) final
void drop_field(Table_Id table_id, Field_Id field_id) final
void valid_data() final
void soft_checkpoint_at(int64_t position) final
Multiplexer(std::initializer_list< std::reference_wrapper< Writable > > initializer_list)
void rename_table(Table_Id table_id, const std::string &name) final
void timestamp(int64_t timestamp) final
Definition Blob.h:7