Joedb 9.1.4
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.insert(std::make_pair(current_field_id, Field(type, freedom.size())));
28 field_names[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 (!freedom.is_used(to_underlying(record_id) + 1))
47 throw Exception("delete_record: bad record_id");
48 freedom.free(to_underlying(record_id) + 1);
49 }
50
51 ////////////////////////////////////////////////////////////////////////////
53 ////////////////////////////////////////////////////////////////////////////
54 {
55 if (to_underlying(record_id) > freedom.size())
56 {
57 for (auto &field: fields)
58 field.second.resize(to_underlying(record_id));
59 while (freedom.size() < to_underlying(record_id))
60 freedom.push_back();
61 }
62 else if (!freedom.is_free(to_underlying(record_id) + 1))
63 throw Exception("insert: record_id already in use");
64
65 freedom.use(to_underlying(record_id) + 1);
66 }
67
68 ////////////////////////////////////////////////////////////////////////////
69 void Table::insert_vector(Record_Id record_id, size_t size)
70 ////////////////////////////////////////////////////////////////////////////
71 {
72 if (freedom.is_compact() && to_underlying(record_id) == freedom.size() + 1)
73 {
74 for (auto &field: fields)
75 field.second.resize(to_underlying(record_id) + size - 1);
76
77 freedom.append_vector(size);
78 }
79 else
80 {
81 for (size_t i = 0; i < size; i++)
82 insert_record(record_id + i);
83 }
84 }
85}
bool is_used(size_t index) const
bool is_free(size_t index) const
void delete_record(Record_Id record_id)
Definition Table.cpp:43
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:69
void add_field(const std::string &name, const Type &type)
Definition Table.cpp:18
void insert_record(Record_Id record_id)
Definition Table.cpp:52
Definition Blob.h:7
constexpr std::underlying_type< Table_Id >::type to_underlying(Table_Id id)
Definition index_types.h:15