Joedb 10.0.1
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Table.cpp
Go to the documentation of this file.
2
3#include <limits>
4
5namespace joedb
6{
7 ////////////////////////////////////////////////////////////////////////////
8 Field_Id Table::find_field(const std::string &name) const
9 ////////////////////////////////////////////////////////////////////////////
10 {
11 for (const auto &[fid, fname]: field_names)
12 if (fname == name)
13 return fid;
14 return Field_Id(0);
15 }
16
17 ////////////////////////////////////////////////////////////////////////////
18 void Table::add_field(const std::string &name, const Type &type)
19 ////////////////////////////////////////////////////////////////////////////
20 {
21 if (find_field(name) != Field_Id(0))
22 throw Exception("add_field: name already used");
23 if (current_field_id == Field_Id(std::numeric_limits<std::underlying_type<Field_Id>::type>::max()))
24 throw Exception("add_field: reached maximum field count");
25
26 ++current_field_id;
27 fields.try_emplace(current_field_id, type, freedom.size());
28 field_names.try_emplace(current_field_id, name);
29 }
30
31 ////////////////////////////////////////////////////////////////////////////
33 ////////////////////////////////////////////////////////////////////////////
34 {
35 const auto it = fields.find(field_id);
36 if (it == fields.end())
37 throw Exception("drop_field: invalid field_id");
38 field_names.erase(field_id);
39 fields.erase(it);
40 }
41
42 ////////////////////////////////////////////////////////////////////////////
44 ////////////////////////////////////////////////////////////////////////////
45 {
46 if (record_id >= freedom.get_size())
47 {
48 for (auto &field: fields)
49 field.second.resize(to_underlying(record_id) + 1);
50 while (freedom.get_size() <= record_id)
51 freedom.push_back();
52 }
53 else if (!freedom.is_free(record_id))
54 throw Exception("insert: record_id already in use");
55
56 freedom.use(record_id);
57 }
58
59 ////////////////////////////////////////////////////////////////////////////
61 ////////////////////////////////////////////////////////////////////////////
62 {
63 JOEDB_RELEASE_ASSERT(freedom.is_used(record_id));
64 freedom.free(record_id);
65 }
66
67 ////////////////////////////////////////////////////////////////////////////
68 void Table::insert_vector(Record_Id record_id, size_t size)
69 ////////////////////////////////////////////////////////////////////////////
70 {
71 JOEDB_RELEASE_ASSERT(freedom.is_free_vector(record_id, size));
72 if (record_id == freedom.get_size())
73 {
74 freedom.resize(freedom.size() + size);
75 for (auto &field: fields)
76 field.second.resize(freedom.size());
77 freedom.use_vector(record_id, size);
78 }
79 else
80 {
81 for (size_t i = 0; i < size; i++)
82 insert_record(record_id + i);
83 }
84 }
85
86 ////////////////////////////////////////////////////////////////////////////
87 void Table::delete_vector(Record_Id record_id, size_t size)
88 ////////////////////////////////////////////////////////////////////////////
89 {
90 JOEDB_RELEASE_ASSERT(freedom.is_used_vector(record_id, size));
91 freedom.free_vector(record_id, size);
92 }
93}
Record_Id get_size() const
void use(Record_Id index)
bool is_free_vector(Record_Id index, size_t size) const
void free_vector(Record_Id index, size_t size)
void use_vector(Record_Id index, size_t size)
bool is_used_vector(Record_Id index, size_t size) const
bool is_used(Record_Id index) const
bool is_free(Record_Id index) const
void resize(Record_Id new_size)
void free(Record_Id index)
void delete_record(Record_Id record_id)
Definition Table.cpp:60
void delete_vector(Record_Id record_id, size_t size)
Definition Table.cpp:87
void drop_field(Field_Id field_id)
Definition Table.cpp:32
Field_Id find_field(const std::string &name) const
Definition Table.cpp:8
void insert_vector(Record_Id record_id, size_t size)
Definition Table.cpp:68
void add_field(const std::string &name, const Type &type)
Definition Table.cpp:18
void insert_record(Record_Id record_id)
Definition Table.cpp:43
#define JOEDB_RELEASE_ASSERT(x)
always-tested assertion (release and debug mode)
Definition assert.h:24
Definition Blob.h:7
constexpr index_t to_underlying(Record_Id id)
Definition index_types.h:59