12#ifndef joedb_db_multi_server_Database_declared
13#define joedb_db_multi_server_Database_declared
50 extern const char * schema_string;
51 inline constexpr size_t schema_string_size = 81;
53 class container_of_server;
59 std::vector<std::string> field_value_of_file_name;
60 std::vector<int32_t> field_value_of_port;
61 std::vector<int32_t> field_value_of_timeout;
62 std::vector<std::map<int32_t, id_of_server>::iterator> iterator_over_server_by_port;
66 size_t size()
const {
return freedom_keeper.
size();}
68 void resize(
size_t new_size)
70 field_value_of_file_name.resize(new_size);
71 field_value_of_port.resize(new_size);
72 field_value_of_timeout.resize(new_size);
73 iterator_over_server_by_port.resize(new_size);
74 freedom_keeper.
resize(new_size);
88 template<
typename E = joedb::Exception>
91 throw E(
"joedb::db::multi_server: " + message);
111 auto &iterator =
storage_of_server.iterator_over_server_by_port[size_t(record_id) - 1];
122 std::map<int32_t, id_of_server>::value_type
130 std::ostringstream out;
131 out <<
"server_by_port unique index failure: (";
133 out <<
") at id = " << record_id <<
' ';
134 out <<
"was already at id = " << result.first->second.get_id();
137 storage_of_server.iterator_over_server_by_port[size_t(record_id) - 1] = result.first;
170 const std::string& field_value_of_file_name
174 storage_of_server.field_value_of_file_name[size_t(record_id) - 1] = field_value_of_file_name;
181 const std::string *value
184 for (
size_t i = 0; i < size; i++)
186 std::string *target = &
storage_of_server.field_value_of_file_name[size_t(record_id) - 1];
188 std::copy_n(value, size, target);
194 int32_t field_value_of_port
198 storage_of_server.field_value_of_port[size_t(record_id) - 1] = field_value_of_port;
210 for (
size_t i = 0; i < size; i++)
214 std::copy_n(value, size, target);
215 for (
size_t i = 0; i < size; i++)
217 for (
size_t i = 0; i < size; i++)
224 int32_t field_value_of_timeout
228 storage_of_server.field_value_of_timeout[size_t(record_id) - 1] = field_value_of_timeout;
238 for (
size_t i = 0; i < size; i++)
240 int32_t *target = &
storage_of_server.field_value_of_timeout[size_t(record_id) - 1];
242 std::copy_n(value, size, target);
276 size_t(record_id) <= 0 ||
295 const std::string& value
341 const std::string *value
396 return (
storage_of_server.field_value_of_file_name.data() +
size_t(record_id) - 1);
421 return (
storage_of_server.field_value_of_timeout.data() +
size_t(record_id) - 1);
448 schema_file_size < pos ||
449 schema_file_size > detail::schema_string_size ||
453 detail::schema_string + pos,
454 schema_file_size - pos
478 const std::string &name
488 const std::string &name,
506 const std::string &name
513 void custom(
const std::string &name)
override
539 throw_exception<joedb::Out_Of_Date>(
"Schema is out of date. Can't upgrade a read-only database.");
560 template<
class Comparator>
561 std::vector<id_of_server>
sorted_server(Comparator comparator)
const;
597 return iterator->second;
606 return (--iterator)->second;
635 iterator(
const detail::data_of_server &data): fk(&data.freedom_keeper), index(0) {}
668 template<
class Comparator>
671 std::vector<id_of_server> result;
673 result.emplace_back(x);
674 std::sort(result.begin(), result.end(), comparator);
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 comment(const std::string &comment) override
void create_table(const std::string &name) override
void delete_from(Table_Id table_id, Record_Id record_id) final
void set_max_record_id(size_t record_id)
void update_vector_int32(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const int32_t *value) final
void insert_vector(Table_Id table_id, Record_Id record_id, size_t size) final
void internal_update_vector_server__timeout(Record_Id record_id, size_t size, const int32_t *value)
const std::map< int32_t, id_of_server > & get_index_of_server_by_port()
static id_of_server null_server()
void drop_table(Table_Id table_id) final
bool requires_schema_upgrade() const
bool is_valid(id_of_server id) const
void rename_field(Table_Id table_id, Field_Id field_id, const std::string &name) final
joedb::Memory_File schema_file
int64_t get_schema_checkpoint() const
void internal_update_server__port(Record_Id record_id, int32_t field_value_of_port)
std::string * get_own_string_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) final
void update_string(Table_Id table_id, Record_Id record_id, Field_Id field_id, const std::string &value) final
void remove_index_of_server_by_port(Record_Id record_id)
void internal_update_server__timeout(Record_Id record_id, int32_t field_value_of_timeout)
std::vector< id_of_server > sorted_server(Comparator comparator) const
Table_Id current_table_id
void drop_field(Table_Id table_id, Field_Id field_id) final
container_of_server get_server_table() const
int32_t * get_own_int32_storage(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t &capacity) final
void custom(const std::string &name) override
void insert_into(Table_Id table_id, Record_Id record_id) final
friend class id_of_server
int32_t get_timeout(id_of_server record) const
void add_index_of_server_by_port(Record_Id record_id)
friend class container_of_server
void internal_insert_server(Record_Id record_id)
void internal_delete_server(Record_Id record_id)
int32_t get_port(id_of_server record) const
const std::string & get_file_name(id_of_server record) const
void timestamp(int64_t timestamp) override
void update_vector_string(Table_Id table_id, Record_Id record_id, Field_Id field_id, size_t size, const std::string *value) final
void update_int32(Table_Id table_id, Record_Id record_id, Field_Id field_id, int32_t value) final
void internal_update_server__file_name(Record_Id record_id, const std::string &field_value_of_file_name)
id_of_server find_server_by_port(int32_t field_value_of_port) const
void rename_table(Table_Id table_id, const std::string &name) final
void add_field(Table_Id table_id, const std::string &name, joedb::Type type) override
joedb::Writable_Journal schema_journal
id_of_server next_server_by_port(id_of_server id)
id_of_server previous_server_by_port(id_of_server id)
void internal_update_vector_server__port(Record_Id record_id, size_t size, const int32_t *value)
id_of_server next(id_of_server id) const
void initialize_with_readonly_journal(joedb::Readonly_Journal &journal)
detail::data_of_server storage_of_server
void internal_vector_insert_server(Record_Id record_id, size_t size)
std::map< int32_t, id_of_server > index_of_server_by_port
bool is_valid_record_id_for_server(Record_Id record_id) const
void internal_update_vector_server__file_name(Record_Id record_id, size_t size, const std::string *value)
id_of_server previous(id_of_server id) const
static void throw_exception(const std::string &message)
Implement the joedb::Readable interface for a compiled database.
bool operator==(const iterator &i) const
id_of_server operator*() const
bool operator!=(const iterator &i) const
std::forward_iterator_tag iterator_category
std::ptrdiff_t difference_type
returned by Database::get_server_table
id_of_server get_end() const
id_of_server first() const
static id_of_server get_at(size_t i)
id_of_server last() const
bool is_valid_at(size_t i)
Strongly-typed wrapper around an integer representing a row of the server table.
constexpr Record_Id get_record_id() const
constexpr size_t get_id() const
void write_int32(std::ostream &out, int32_t value)
Automatically generated by joedbc.
constexpr const char * get_version()