Joedb 10.2.1
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: 10.2.1
8// joedbc compilation time: Sep 15 2025 20:22:33
9// Generation of this file: 2025-09-15 18:23:01 GMT
10//
11/////////////////////////////////////////////////////////////////////////////
12#ifndef tutorial_Database_declared
13#define tutorial_Database_declared
14
17#include "joedb/error/assert.h"
18#include "joedb/get_version.h"
19#include "ids.h"
20
21#include <string>
22#include <cstring>
23#include <vector>
24#include <algorithm>
25#include <string_view>
26
27#include "joedb/ui/type_io.h"
28#include <sstream>
29#include <map>
30
31static_assert(std::string_view(joedb::get_version()) == "10.2.1");
32
33namespace tutorial
34{
35 /// @namespace tutorial
36 ///
37 /// Automatically generated by joedbc
38
39 using joedb::Record_Id;
40 using joedb::Table_Id;
41 using joedb::Field_Id;
42
43 class container_of_city;
44 class container_of_person;
45
46 namespace detail
47 {
48 struct data_of_city
49 {
50 std::vector<std::string> field_value_of_name;
51 std::vector<std::map<std::string, id_of_city>::iterator> iterator_over_city_by_name;
52
53 joedb::Freedom_Keeper freedom_keeper;
54
55 size_t size() const {return freedom_keeper.size();}
56
57 void resize(size_t new_size)
58 {
59 field_value_of_name.resize(new_size);
60 iterator_over_city_by_name.resize(new_size);
61 freedom_keeper.resize(new_size);
62 }
63 };
64
65 struct data_of_person
66 {
67 std::vector<std::string> field_value_of_first_name;
68 std::vector<std::string> field_value_of_last_name;
69 std::vector<id_of_city> field_value_of_home;
70 std::vector<std::multimap<std::tuple<std::string, std::string>, id_of_person>::iterator> iterator_over_person_by_name;
71
72 joedb::Freedom_Keeper freedom_keeper;
73
74 size_t size() const {return freedom_keeper.size();}
75
76 void resize(size_t new_size)
77 {
78 field_value_of_first_name.resize(new_size);
79 field_value_of_last_name.resize(new_size);
80 field_value_of_home.resize(new_size);
81 iterator_over_person_by_name.resize(new_size);
82 freedom_keeper.resize(new_size);
83 }
84 };
85 }
86
87 class range_of_person_by_name;
88
89 /// Store all the tables of the database
91 {
92 friend class Readable;
93 friend class container_of_city;
94 friend class container_of_person;
96
97 public:
98 template<typename E = joedb::Exception>
99 static void throw_exception(const std::string &message)
100 {
101 throw E("tutorial: " + message);
102 }
103
104 bool is_valid(id_of_city id) const {return is_valid_record_id_for_city(id.get_record_id());}
105 bool is_valid(id_of_person id) const {return is_valid_record_id_for_person(id.get_record_id());}
106
107 protected:
108 detail::data_of_city storage_of_city;
109 bool is_valid_record_id_for_city(Record_Id record_id) const {return storage_of_city.freedom_keeper.is_used(record_id);}
110 detail::data_of_person storage_of_person;
111 bool is_valid_record_id_for_person(Record_Id record_id) const {return storage_of_person.freedom_keeper.is_used(record_id);}
112
113 std::map<std::string, id_of_city> index_of_city_by_name;
115 {
116 auto &iterator = storage_of_city.iterator_over_city_by_name[to_underlying(record_id)];
117 if (iterator != index_of_city_by_name.end())
118 {
119 index_of_city_by_name.erase(iterator);
120 iterator = index_of_city_by_name.end();
121 }
122 }
124 {
125 auto result = index_of_city_by_name.insert
126 (
127 std::map<std::string, id_of_city>::value_type
128 (
129 (storage_of_city.field_value_of_name[to_underlying(record_id)]),
130 id_of_city(record_id)
131 )
132 );
133 if (!result.second)
134 {
135 std::ostringstream out;
136 out << "city_by_name unique index failure: (";
137 joedb::write_string(out, storage_of_city.field_value_of_name[to_underlying(record_id)]);
138 out << ") at id = " << record_id << ' ';
139 out << "was already at id = " << result.first->second.get_id();
140 throw_exception(out.str());
141 }
142 storage_of_city.iterator_over_city_by_name[to_underlying(record_id)] = result.first;
143 }
144 std::multimap<std::tuple<std::string, std::string>, id_of_person> index_of_person_by_name;
146 {
147 auto &iterator = storage_of_person.iterator_over_person_by_name[to_underlying(record_id)];
148 if (iterator != index_of_person_by_name.end())
149 {
150 index_of_person_by_name.erase(iterator);
151 iterator = index_of_person_by_name.end();
152 }
153 }
155 {
156 auto result = index_of_person_by_name.insert
157 (
158 std::multimap<std::tuple<std::string, std::string>, id_of_person>::value_type
159 (
160 std::tuple<std::string, std::string>(storage_of_person.field_value_of_last_name[to_underlying(record_id)], storage_of_person.field_value_of_first_name[to_underlying(record_id)]),
161 id_of_person(record_id)
162 )
163 );
164 storage_of_person.iterator_over_person_by_name[to_underlying(record_id)] = result;
165 }
166
168 {
171 storage_of_city.field_value_of_name[to_underlying(record_id)].clear();
172 storage_of_city.freedom_keeper.free(record_id);
173 }
175 {
178 storage_of_person.field_value_of_first_name[to_underlying(record_id)].clear();
179 storage_of_person.field_value_of_last_name[to_underlying(record_id)].clear();
180 storage_of_person.field_value_of_home[to_underlying(record_id)] = id_of_city(joedb::Record_Id::null);
181 storage_of_person.freedom_keeper.free(record_id);
182 }
183
185 {
186 storage_of_city.iterator_over_city_by_name[to_underlying(record_id)] = index_of_city_by_name.end();
187 storage_of_city.freedom_keeper.use(record_id);
188 }
189
190 void internal_vector_insert_city(Record_Id record_id, size_t size)
191 {
192 JOEDB_RELEASE_ASSERT(storage_of_city.freedom_keeper.is_free_vector(record_id, size));
193 storage_of_city.freedom_keeper.use_vector(record_id, size);
194 std::fill_n
195 (
196 &storage_of_city.iterator_over_city_by_name[to_underlying(record_id)],
197 size,
199 );
200 }
202 {
203 storage_of_person.iterator_over_person_by_name[to_underlying(record_id)] = index_of_person_by_name.end();
204 storage_of_person.freedom_keeper.use(record_id);
205 }
206
207 void internal_vector_insert_person(Record_Id record_id, size_t size)
208 {
209 JOEDB_RELEASE_ASSERT(storage_of_person.freedom_keeper.is_free_vector(record_id, size));
210 storage_of_person.freedom_keeper.use_vector(record_id, size);
211 std::fill_n
212 (
213 &storage_of_person.iterator_over_person_by_name[to_underlying(record_id)],
214 size,
216 );
217 }
218
220 (
221 Record_Id record_id,
222 const std::string& field_value_of_name
223 )
224 {
226 storage_of_city.field_value_of_name[to_underlying(record_id)] = field_value_of_name;
228 add_index_of_city_by_name(record_id);
229 }
230
232 (
233 Record_Id record_id,
234 size_t size,
235 const std::string *value
236 )
237 {
238 JOEDB_RELEASE_ASSERT(storage_of_city.freedom_keeper.is_used_vector(record_id, size));
239 std::string *target = &storage_of_city.field_value_of_name.data()[to_underlying(record_id)];
240 if (target != value)
241 std::copy_n(value, size, target);
242 for (size_t i = 0; i < size; i++)
243 remove_index_of_city_by_name(record_id + i);
244 for (size_t i = 0; i < size; i++)
245 add_index_of_city_by_name(record_id + i);
246 }
247
249 (
250 Record_Id record_id,
251 const std::string& field_value_of_first_name
252 )
253 {
255 storage_of_person.field_value_of_first_name[to_underlying(record_id)] = field_value_of_first_name;
258 }
259
261 (
262 Record_Id record_id,
263 size_t size,
264 const std::string *value
265 )
266 {
267 JOEDB_RELEASE_ASSERT(storage_of_person.freedom_keeper.is_used_vector(record_id, size));
268 std::string *target = &storage_of_person.field_value_of_first_name.data()[to_underlying(record_id)];
269 if (target != value)
270 std::copy_n(value, size, target);
271 for (size_t i = 0; i < size; i++)
272 remove_index_of_person_by_name(record_id + i);
273 for (size_t i = 0; i < size; i++)
274 add_index_of_person_by_name(record_id + i);
275 }
276
278 (
279 Record_Id record_id,
280 const std::string& field_value_of_last_name
281 )
282 {
284 storage_of_person.field_value_of_last_name[to_underlying(record_id)] = field_value_of_last_name;
287 }
288
290 (
291 Record_Id record_id,
292 size_t size,
293 const std::string *value
294 )
295 {
296 JOEDB_RELEASE_ASSERT(storage_of_person.freedom_keeper.is_used_vector(record_id, size));
297 std::string *target = &storage_of_person.field_value_of_last_name.data()[to_underlying(record_id)];
298 if (target != value)
299 std::copy_n(value, size, target);
300 for (size_t i = 0; i < size; i++)
301 remove_index_of_person_by_name(record_id + i);
302 for (size_t i = 0; i < size; i++)
303 add_index_of_person_by_name(record_id + i);
304 }
305
307 (
308 Record_Id record_id,
309 id_of_city field_value_of_home
310 )
311 {
313 storage_of_person.field_value_of_home[to_underlying(record_id)] = field_value_of_home;
314 }
315
317 (
318 Record_Id record_id,
319 size_t size,
320 const id_of_city *value
321 )
322 {
323 JOEDB_RELEASE_ASSERT(storage_of_person.freedom_keeper.is_used_vector(record_id, size));
324 id_of_city *target = &storage_of_person.field_value_of_home.data()[to_underlying(record_id)];
325 if (target != value)
326 std::copy_n(value, size, target);
327 }
328
329 public:
331
333 {
334 return id_of_city
335 (
336 Record_Id(storage_of_city.freedom_keeper.get_next(id.get_record_id()))
337 );
338 }
339
341 {
342 return id_of_city
343 (
344 Record_Id(storage_of_city.freedom_keeper.get_previous(id.get_record_id()))
345 );
346 }
347
348 template<class Comparator>
349 std::vector<id_of_city> sorted_city(Comparator comparator) const;
350
352 {
353 return id_of_city();
354 }
355
356 const std::string& get_name(id_of_city record) const
357 {
359 return (const std::string&)(storage_of_city.field_value_of_name[record.get_id()]);
360 }
361
363
365 {
366 return id_of_person
367 (
368 Record_Id(storage_of_person.freedom_keeper.get_next(id.get_record_id()))
369 );
370 }
371
373 {
374 return id_of_person
375 (
376 Record_Id(storage_of_person.freedom_keeper.get_previous(id.get_record_id()))
377 );
378 }
379
380 template<class Comparator>
381 std::vector<id_of_person> sorted_person(Comparator comparator) const;
382
384 {
385 return id_of_person();
386 }
387
388 const std::string& get_first_name(id_of_person record) const
389 {
391 return (const std::string&)(storage_of_person.field_value_of_first_name[record.get_id()]);
392 }
393
394 const std::string& get_last_name(id_of_person record) const
395 {
397 return (const std::string&)(storage_of_person.field_value_of_last_name[record.get_id()]);
398 }
399
401 {
403 return (id_of_city)(storage_of_person.field_value_of_home[record.get_id()]);
404 }
405
406 const std::map<std::string, id_of_city> &get_index_of_city_by_name()
407 {
409 }
410
411 const std::multimap<std::tuple<std::string, std::string>, id_of_person> &get_index_of_person_by_name()
412 {
414 }
415
417 {
419 auto iterator = storage_of_city.iterator_over_city_by_name[id.get_id()];
420 ++iterator;
421 if (iterator != index_of_city_by_name.end())
422 return iterator->second;
423 else
424 return id_of_city();
425 }
427 {
429 auto iterator = storage_of_city.iterator_over_city_by_name[id.get_id()];
430 if (iterator != index_of_city_by_name.begin())
431 return (--iterator)->second;
432 else
433 return id_of_city();
434 }
435 id_of_city find_city_by_name(const std::string& field_value_of_name) const
436 {
437 const auto i = index_of_city_by_name.find((field_value_of_name));
438 if (i == index_of_city_by_name.end())
439 return id_of_city();
440 else
441 return i->second;
442 }
443 range_of_person_by_name find_person_by_name(const std::string& field_value_of_last_name, const std::string& field_value_of_first_name) const;
444 };
445 /// returned by @ref Database::get_city_table
447 {
448 friend class Database;
449
450 private:
451 const Database &db;
452 container_of_city(const Database &db): db(db) {}
453
454 public:
456 {
457 friend class container_of_city;
458 private:
459 const joedb::Freedom_Keeper *fk;
460 Record_Id index;
461 iterator(const detail::data_of_city &data): fk(&data.freedom_keeper), index(joedb::Freedom_Keeper_Constants::used_list) {}
462 public:
463 using iterator_category = std::forward_iterator_tag;
465 using difference_type = std::ptrdiff_t;
468
469 bool operator==(const iterator &i) const {return index == i.index;}
470 bool operator!=(const iterator &i) const {return index != i.index;}
471 iterator &operator++() {index = fk->get_next(index); return *this;}
472 iterator operator++(int) {auto copy = *this; index = fk->get_next(index); return copy;}
473 iterator &operator--() {index = fk->get_previous(index); return *this;}
474 iterator operator--(int) {auto copy = *this; index = fk->get_previous(index); return copy;}
475 id_of_city operator*() const {return id_of_city(Record_Id(index));}
476 };
477
478 iterator begin() const {return ++iterator(db.storage_of_city);}
479 iterator end() const {return iterator(db.storage_of_city);}
480 bool is_empty() const {return db.storage_of_city.freedom_keeper.get_used_count() == Record_Id{0};}
481 joedb::index_t get_size() const {return to_underlying(db.storage_of_city.freedom_keeper.get_used_count());}
482 static id_of_city get_at(size_t i) {return id_of_city(Record_Id(i));}
483 bool is_valid_at(size_t i) {return db.storage_of_city.freedom_keeper.is_used(Record_Id(i));}
484 id_of_city first() const {return *begin();}
485 id_of_city last() const {return *--end();}
486 id_of_city get_end() const {return *end();}
487 };
488
490 {
491 return container_of_city(*this);
492 }
493
494 template<class Comparator>
495 std::vector<id_of_city> Database::sorted_city(Comparator comparator) const
496 {
497 std::vector<id_of_city> result;
498 for (auto x: get_city_table())
499 result.emplace_back(x);
500 std::sort(result.begin(), result.end(), comparator);
501 return result;
502 }
503 /// returned by @ref Database::get_person_table
505 {
506 friend class Database;
507
508 private:
509 const Database &db;
510 container_of_person(const Database &db): db(db) {}
511
512 public:
514 {
516 private:
517 const joedb::Freedom_Keeper *fk;
518 Record_Id index;
519 iterator(const detail::data_of_person &data): fk(&data.freedom_keeper), index(joedb::Freedom_Keeper_Constants::used_list) {}
520 public:
521 using iterator_category = std::forward_iterator_tag;
523 using difference_type = std::ptrdiff_t;
526
527 bool operator==(const iterator &i) const {return index == i.index;}
528 bool operator!=(const iterator &i) const {return index != i.index;}
529 iterator &operator++() {index = fk->get_next(index); return *this;}
530 iterator operator++(int) {auto copy = *this; index = fk->get_next(index); return copy;}
531 iterator &operator--() {index = fk->get_previous(index); return *this;}
532 iterator operator--(int) {auto copy = *this; index = fk->get_previous(index); return copy;}
534 };
535
536 iterator begin() const {return ++iterator(db.storage_of_person);}
538 bool is_empty() const {return db.storage_of_person.freedom_keeper.get_used_count() == Record_Id{0};}
539 joedb::index_t get_size() const {return to_underlying(db.storage_of_person.freedom_keeper.get_used_count());}
540 static id_of_person get_at(size_t i) {return id_of_person(Record_Id(i));}
541 bool is_valid_at(size_t i) {return db.storage_of_person.freedom_keeper.is_used(Record_Id(i));}
542 id_of_person first() const {return *begin();}
543 id_of_person last() const {return *--end();}
544 id_of_person get_end() const {return *end();}
545 };
546
548 {
549 return container_of_person(*this);
550 }
551
552 template<class Comparator>
553 std::vector<id_of_person> Database::sorted_person(Comparator comparator) const
554 {
555 std::vector<id_of_person> result;
556 for (auto x: get_person_table())
557 result.emplace_back(x);
558 std::sort(result.begin(), result.end(), comparator);
559 return result;
560 }
561 /// returned by @ref Database::find_person_by_name
563 {
564 friend class Database;
565 private:
566 std::pair<std::multimap<std::tuple<std::string, std::string>, id_of_person>::const_iterator, std::multimap<std::tuple<std::string, std::string>, id_of_person>::const_iterator> range;
567 range_of_person_by_name(const Database &db, const std::string& last_name, const std::string& first_name)
568 {
569 range = db.index_of_person_by_name.equal_range(std::tuple<std::string, std::string>(last_name, first_name));
570 }
571 public:
573 {
575 private:
576 std::multimap<std::tuple<std::string, std::string>, id_of_person>::const_iterator map_iterator;
577 iterator(std::multimap<std::tuple<std::string, std::string>, id_of_person>::const_iterator map_iterator): map_iterator(map_iterator) {}
578 public:
579 bool operator !=(const iterator &i) const
580 {
581 return map_iterator != i.map_iterator;
582 }
583 iterator &operator++() {map_iterator++; return *this;}
584 id_of_person operator*() const {return map_iterator->second;}
585 };
586 iterator begin() const {return range.first;}
587 iterator end() const {return range.second;}
588 bool empty() const {return range.first == range.second;}
589 size_t size() const {return size_t(std::distance(range.first, range.second));}
590 };
591
592 inline range_of_person_by_name Database::find_person_by_name(const std::string& field_value_of_last_name, const std::string& field_value_of_first_name) const
593 {
594 return range_of_person_by_name(*this, field_value_of_last_name, field_value_of_first_name);
595 }
596}
597
598#endif
void resize(Record_Id new_size)
Record_Id get_previous(Record_Id index) const
Record_Id get_next(Record_Id index) const
static const Record_Id null
Definition index_types.h:44
Store all the tables of the database.
Definition Database.h:91
void internal_update_vector_person__first_name(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:261
id_of_person previous(id_of_person id) const
Definition Database.h:372
bool is_valid(id_of_city id) const
Definition Database.h:104
const std::string & get_last_name(id_of_person record) const
Definition Database.h:394
void internal_update_vector_city__name(Record_Id record_id, size_t size, const std::string *value)
Definition Database.h:232
container_of_person get_person_table() const
Definition Database.h:547
friend class container_of_city
Definition Database.h:93
void internal_insert_person(Record_Id record_id)
Definition Database.h:201
const std::string & get_first_name(id_of_person record) const
Definition Database.h:388
const std::map< std::string, id_of_city > & get_index_of_city_by_name()
Definition Database.h:406
friend class container_of_person
Definition Database.h:94
void internal_update_vector_person__home(Record_Id record_id, size_t size, const id_of_city *value)
Definition Database.h:317
void add_index_of_person_by_name(Record_Id record_id)
Definition Database.h:154
void remove_index_of_person_by_name(Record_Id record_id)
Definition Database.h:145
range_of_person_by_name find_person_by_name(const std::string &field_value_of_last_name, const std::string &field_value_of_first_name) const
Definition Database.h:592
std::map< std::string, id_of_city > index_of_city_by_name
Definition Database.h:113
detail::data_of_city storage_of_city
Definition Database.h:108
void add_index_of_city_by_name(Record_Id record_id)
Definition Database.h:123
id_of_city find_city_by_name(const std::string &field_value_of_name) const
Definition Database.h:435
friend class range_of_person_by_name
Definition Database.h:95
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
id_of_city get_home(id_of_person record) const
Definition Database.h:400
const std::string & get_name(id_of_city record) const
Definition Database.h:356
void internal_update_person__home(Record_Id record_id, id_of_city field_value_of_home)
Definition Database.h:307
bool is_valid_record_id_for_city(Record_Id record_id) const
Definition Database.h:109
static void throw_exception(const std::string &message)
Definition Database.h:99
std::vector< id_of_city > sorted_city(Comparator comparator) const
Definition Database.h:495
bool is_valid_record_id_for_person(Record_Id record_id) const
Definition Database.h:111
static id_of_person null_person()
Definition Database.h:383
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
container_of_city get_city_table() const
Definition Database.h:489
void internal_update_city__name(Record_Id record_id, const std::string &field_value_of_name)
Definition Database.h:220
bool is_valid(id_of_person id) const
Definition Database.h:105
void internal_delete_person(Record_Id record_id)
Definition Database.h:174
id_of_city next(id_of_city id) const
Definition Database.h:332
std::vector< id_of_person > sorted_person(Comparator comparator) const
Definition Database.h:553
void internal_delete_city(Record_Id record_id)
Definition Database.h:167
void remove_index_of_city_by_name(Record_Id record_id)
Definition Database.h:114
void internal_vector_insert_city(Record_Id record_id, size_t size)
Definition Database.h:190
id_of_city previous(id_of_city id) const
Definition Database.h:340
id_of_person next(id_of_person id) const
Definition Database.h:364
static id_of_city null_city()
Definition Database.h:351
id_of_city next_city_by_name(id_of_city id)
Definition Database.h:416
void internal_vector_insert_person(Record_Id record_id, size_t size)
Definition Database.h:207
id_of_city previous_city_by_name(id_of_city id)
Definition Database.h:426
std::multimap< std::tuple< std::string, std::string >, id_of_person > index_of_person_by_name
Definition Database.h:144
const std::multimap< std::tuple< std::string, std::string >, id_of_person > & get_index_of_person_by_name()
Definition Database.h:411
Implement the joedb::Readable interface for a compiled database.
Definition Readable.h:27
bool operator==(const iterator &i) const
Definition Database.h:469
bool operator!=(const iterator &i) const
Definition Database.h:470
std::forward_iterator_tag iterator_category
Definition Database.h:463
returned by Database::get_city_table
Definition Database.h:447
bool is_valid_at(size_t i)
Definition Database.h:483
iterator begin() const
Definition Database.h:478
iterator end() const
Definition Database.h:479
joedb::index_t get_size() const
Definition Database.h:481
id_of_city get_end() const
Definition Database.h:486
id_of_city first() const
Definition Database.h:484
id_of_city last() const
Definition Database.h:485
static id_of_city get_at(size_t i)
Definition Database.h:482
bool operator==(const iterator &i) const
Definition Database.h:527
bool operator!=(const iterator &i) const
Definition Database.h:528
std::forward_iterator_tag iterator_category
Definition Database.h:521
returned by Database::get_person_table
Definition Database.h:505
id_of_person first() const
Definition Database.h:542
id_of_person last() const
Definition Database.h:543
id_of_person get_end() const
Definition Database.h:544
joedb::index_t get_size() const
Definition Database.h:539
static id_of_person get_at(size_t i)
Definition Database.h:540
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
bool operator!=(const iterator &i) const
Definition Database.h:579
returned by Database::find_person_by_name
Definition Database.h:563
#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
constexpr const char * get_version()
Definition get_version.h:7
void write_string(std::ostream &out, const std::string &s, bool json)
Automatically generated by joedbc.
Definition Client.h:19