12#ifndef tutorial_Database_declared
13#define tutorial_Database_declared
50 extern const char * schema_string;
51 inline constexpr size_t schema_string_size = 99;
53 class container_of_city;
54 class container_of_person;
60 std::vector<std::string> field_value_of_name;
61 std::vector<std::map<std::string, id_of_city>::iterator> iterator_over_city_by_name;
65 size_t size()
const {
return freedom_keeper.
size();}
67 void resize(
size_t new_size)
69 field_value_of_name.resize(new_size);
70 iterator_over_city_by_name.resize(new_size);
71 freedom_keeper.
resize(new_size);
77 std::vector<std::string> field_value_of_first_name;
78 std::vector<std::string> field_value_of_last_name;
79 std::vector<id_of_city> field_value_of_home;
80 std::vector<std::multimap<std::tuple<std::string, std::string>, id_of_person>::iterator> iterator_over_person_by_name;
84 size_t size()
const {
return freedom_keeper.
size();}
86 void resize(
size_t new_size)
88 field_value_of_first_name.resize(new_size);
89 field_value_of_last_name.resize(new_size);
90 field_value_of_home.resize(new_size);
91 iterator_over_person_by_name.resize(new_size);
92 freedom_keeper.
resize(new_size);
97 class range_of_person_by_name;
110 template<
typename E = joedb::Exception>
113 throw E(
"tutorial: " + message);
136 auto &iterator =
storage_of_city.iterator_over_city_by_name[size_t(record_id) - 1];
147 std::map<std::string, id_of_city>::value_type
149 std::string(
storage_of_city.field_value_of_name[
size_t(record_id) - 1]),
155 std::ostringstream out;
156 out <<
"city_by_name unique index failure: (";
158 out <<
") at id = " << record_id <<
' ';
159 out <<
"was already at id = " << result.first->second.get_id();
162 storage_of_city.iterator_over_city_by_name[size_t(record_id) - 1] = result.first;
167 auto &iterator =
storage_of_person.iterator_over_person_by_name[size_t(record_id) - 1];
178 std::multimap<std::tuple<std::string, std::string>,
id_of_person>::value_type
180 std::tuple<std::string, std::string>(
storage_of_person.field_value_of_last_name[
size_t(record_id) - 1],
storage_of_person.field_value_of_first_name[
size_t(record_id) - 1]),
212 storage_of_city.freedom_keeper.use_vector(
size_t(record_id) + 1, size);
240 const std::string& field_value_of_name
244 storage_of_city.field_value_of_name[size_t(record_id) - 1] = field_value_of_name;
253 const std::string *value
256 for (
size_t i = 0; i < size; i++)
258 std::string *target = &
storage_of_city.field_value_of_name[size_t(record_id) - 1];
260 std::copy_n(value, size, target);
261 for (
size_t i = 0; i < size; i++)
263 for (
size_t i = 0; i < size; i++)
270 const std::string& field_value_of_first_name
274 storage_of_person.field_value_of_first_name[size_t(record_id) - 1] = field_value_of_first_name;
283 const std::string *value
286 for (
size_t i = 0; i < size; i++)
288 std::string *target = &
storage_of_person.field_value_of_first_name[size_t(record_id) - 1];
290 std::copy_n(value, size, target);
291 for (
size_t i = 0; i < size; i++)
293 for (
size_t i = 0; i < size; i++)
300 const std::string& field_value_of_last_name
304 storage_of_person.field_value_of_last_name[size_t(record_id) - 1] = field_value_of_last_name;
313 const std::string *value
316 for (
size_t i = 0; i < size; i++)
318 std::string *target = &
storage_of_person.field_value_of_last_name[size_t(record_id) - 1];
320 std::copy_n(value, size, target);
321 for (
size_t i = 0; i < size; i++)
323 for (
size_t i = 0; i < size; i++)
334 storage_of_person.field_value_of_home[size_t(record_id) - 1] = field_value_of_home;
344 for (
size_t i = 0; i < size; i++)
348 std::copy_n(value, size, target);
354 if (table_id == Table_Id(1))
356 else if (table_id == Table_Id(2))
364 if (table_id == Table_Id(1))
372 else if (table_id == Table_Id(2))
392 size_t(record_id) <= 0 ||
398 if (table_id == Table_Id(1))
404 else if (table_id == Table_Id(2))
417 const std::string& value
421 if (table_id == Table_Id(1))
423 if (field_id == Field_Id(1))
430 if (table_id == Table_Id(2))
432 if (field_id == Field_Id(1))
437 if (field_id == Field_Id(2))
455 if (table_id == Table_Id(2))
457 if (field_id == Field_Id(3))
472 const std::string *value
476 if (table_id == Table_Id(1))
478 if (field_id == Field_Id(1))
485 if (table_id == Table_Id(2))
487 if (field_id == Field_Id(1))
492 if (field_id == Field_Id(2))
511 if (table_id == Table_Id(2))
513 if (field_id == Field_Id(3))
531 if (table_id == Table_Id(1))
534 if (field_id == Field_Id(1))
536 return (
storage_of_city.field_value_of_name.data() +
size_t(record_id) - 1);
540 if (table_id == Table_Id(2))
543 if (field_id == Field_Id(1))
545 return (
storage_of_person.field_value_of_first_name.data() +
size_t(record_id) - 1);
547 if (field_id == Field_Id(2))
549 return (
storage_of_person.field_value_of_last_name.data() +
size_t(record_id) - 1);
565 if (table_id == Table_Id(2))
568 if (field_id == Field_Id(3))
570 return reinterpret_cast<Record_Id *
>(
storage_of_person.field_value_of_home.data() + size_t(record_id) - 1);
597 schema_file_size < pos ||
598 schema_file_size > detail::schema_string_size ||
602 detail::schema_string + pos,
603 schema_file_size - pos
627 const std::string &name
637 const std::string &name,
655 const std::string &name
662 void custom(
const std::string &name)
override
688 throw_exception<joedb::Out_Of_Date>(
"Schema is out of date. Can't upgrade a read-only database.");
697 Record_Id(
storage_of_city.freedom_keeper.get_next(
id.get_id() + 1) - 1)
705 Record_Id(
storage_of_city.freedom_keeper.get_previous(
id.get_id() + 1) - 1)
709 template<
class Comparator>
710 std::vector<id_of_city>
sorted_city(Comparator comparator)
const;
741 template<
class Comparator>
742 std::vector<id_of_person>
sorted_person(Comparator comparator)
const;
780 auto iterator =
storage_of_city.iterator_over_city_by_name[
id.get_id() - 1];
783 return iterator->second;
790 auto iterator =
storage_of_city.iterator_over_city_by_name[
id.get_id() - 1];
792 return (--iterator)->second;
822 iterator(
const detail::data_of_city &data): fk(&data.freedom_keeper), index(0) {}
855 template<
class Comparator>
858 std::vector<id_of_city> result;
860 result.emplace_back(x);
861 std::sort(result.begin(), result.end(), comparator);
880 iterator(
const detail::data_of_person &data): fk(&data.freedom_keeper), index(0) {}
913 template<
class Comparator>
916 std::vector<id_of_person> result;
918 result.emplace_back(x);
919 std::sort(result.begin(), result.end(), comparator);
927 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;
937 std::multimap<std::tuple<std::string, std::string>,
id_of_person>::const_iterator map_iterator;
938 iterator(std::multimap<std::tuple<std::string, std::string>,
id_of_person>::const_iterator map_iterator): map_iterator(map_iterator) {}
942 return map_iterator != i.map_iterator;
949 bool empty()
const {
return range.first == range.second;}
950 size_t size()
const {
return size_t(std::distance(range.first, range.second));}
size_t get_previous(size_t index) const
size_t get_next(size_t index) const
void replay_log(Writable &writable)
int64_t get_checkpoint_position() const
static constexpr int64_t header_size
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 default_checkpoint()
Store all the tables of the database.
void insert_into(Table_Id table_id, Record_Id record_id) final
void internal_update_vector_person__first_name(Record_Id record_id, size_t size, const std::string *value)
id_of_person previous(id_of_person id) const
bool is_valid(id_of_city id) const
const std::string & get_last_name(id_of_person record) const
void internal_update_vector_city__name(Record_Id record_id, size_t size, const std::string *value)
container_of_person get_person_table() const
friend class container_of_city
void delete_from(Table_Id table_id, Record_Id record_id) final
void internal_insert_person(Record_Id record_id)
const std::string & get_first_name(id_of_person record) const
void custom(const std::string &name) override
Table_Id current_table_id
const std::map< std::string, id_of_city > & get_index_of_city_by_name()
void update_vector_string(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const std::string *value) final
friend class container_of_person
void create_table(const std::string &name) override
void internal_update_vector_person__home(Record_Id record_id, size_t size, const id_of_city *value)
void add_index_of_person_by_name(Record_Id record_id)
void remove_index_of_person_by_name(Record_Id record_id)
friend class id_of_person
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
std::map< std::string, id_of_city > index_of_city_by_name
detail::data_of_city storage_of_city
void rename_field(Table_Id table_id, Field_Id field_id, const std::string &name) final
void set_max_record_id(size_t record_id)
void add_field(Table_Id table_id, const std::string &name, joedb::Type type) override
void add_index_of_city_by_name(Record_Id record_id)
id_of_city find_city_by_name(const std::string &field_value_of_name) const
friend class range_of_person_by_name
detail::data_of_person storage_of_person
void internal_update_vector_person__last_name(Record_Id record_id, size_t size, const std::string *value)
void comment(const std::string &comment) override
void timestamp(int64_t timestamp) override
int64_t get_schema_checkpoint() const
void drop_field(Table_Id table_id, Field_Id field_id) final
id_of_city get_home(id_of_person record) const
const std::string & get_name(id_of_city record) const
void internal_update_person__home(Record_Id record_id, id_of_city field_value_of_home)
bool is_valid_record_id_for_city(Record_Id record_id) const
joedb::Record_Id * get_own_reference_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) final
static void throw_exception(const std::string &message)
std::vector< id_of_city > sorted_city(Comparator comparator) const
joedb::Memory_File schema_file
void rename_table(Table_Id table_id, const std::string &name) final
bool is_valid_record_id_for_person(Record_Id record_id) const
static id_of_person null_person()
void insert_vector(Table_Id table_id, Record_Id record_id, size_t size) final
void internal_update_person__first_name(Record_Id record_id, const std::string &field_value_of_first_name)
void update_vector_reference(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const joedb::Record_Id *value) final
void internal_update_person__last_name(Record_Id record_id, const std::string &field_value_of_last_name)
void drop_table(Table_Id table_id) final
void internal_insert_city(Record_Id record_id)
container_of_city get_city_table() const
void internal_update_city__name(Record_Id record_id, const std::string &field_value_of_name)
bool is_valid(id_of_person id) const
void internal_delete_person(Record_Id record_id)
std::string * get_own_string_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) final
id_of_city next(id_of_city id) const
std::vector< id_of_person > sorted_person(Comparator comparator) const
void internal_delete_city(Record_Id record_id)
void initialize_with_readonly_journal(joedb::Readonly_Journal &journal)
void remove_index_of_city_by_name(Record_Id record_id)
joedb::Writable_Journal schema_journal
void internal_vector_insert_city(Record_Id record_id, size_t size)
bool requires_schema_upgrade() const
id_of_city previous(id_of_city id) const
void update_string(Table_Id table_id, Record_Id record_id, Field_Id field_id, const std::string &value) final
id_of_person next(id_of_person id) const
static id_of_city null_city()
void update_reference(Table_Id table_id, Record_Id record_id, Field_Id field_id, joedb::Record_Id value) final
id_of_city next_city_by_name(id_of_city id)
void internal_vector_insert_person(Record_Id record_id, size_t size)
id_of_city previous_city_by_name(id_of_city id)
std::multimap< std::tuple< std::string, std::string >, id_of_person > index_of_person_by_name
const std::multimap< std::tuple< std::string, std::string >, id_of_person > & get_index_of_person_by_name()
Implement the joedb::Readable interface for a compiled database.
bool operator==(const iterator &i) const
bool operator!=(const iterator &i) const
std::forward_iterator_tag iterator_category
id_of_city operator*() const
std::ptrdiff_t difference_type
returned by Database::get_city_table
bool is_valid_at(size_t i)
id_of_city get_end() const
static id_of_city get_at(size_t i)
bool operator==(const iterator &i) const
std::ptrdiff_t difference_type
id_of_person operator*() const
std::forward_iterator_tag iterator_category
bool operator!=(const iterator &i) const
returned by Database::get_person_table
id_of_person first() const
bool is_valid_at(size_t i)
id_of_person last() const
id_of_person get_end() const
static id_of_person get_at(size_t i)
Strongly-typed wrapper around an integer representing a row of the city table.
constexpr Record_Id get_record_id() const
constexpr size_t get_id() const
Strongly-typed wrapper around an integer representing a row of the person table.
constexpr Record_Id get_record_id() const
constexpr size_t get_id() const
bool operator!=(const iterator &i) const
id_of_person operator*() const
returned by Database::find_person_by_name
void write_string(std::ostream &out, const std::string &s, bool json)
constexpr const char * get_version()
Automatically generated by joedbc.