Joedb 9.5.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Table.h
Go to the documentation of this file.
1#ifndef joedb_Table_declared
2#define joedb_Table_declared
3
4#include <map>
5
7#include "joedb/Type.h"
10
11namespace joedb
12{
13 class Database;
14
15 /// @ingroup interpreted
16 class Table
17 {
18 friend class Database_Schema;
19
20 private:
21 std::map<Field_Id, Field> fields;
22 std::map<Field_Id, std::string> field_names;
23 Field_Id current_field_id = Field_Id(0);
24
26
27 auto find_field_from_id(Field_Id field_id)
28 {
29 const auto it = fields.find(field_id);
30 if (it == fields.end())
31 throw Exception("invalid field_id");
32 return it;
33 }
34
35 auto find_field_from_id(Field_Id field_id) const
36 {
37 return const_cast<Table *>(this)->find_field_from_id(field_id);
38 }
39
40 void check_record_id(Record_Id record_id)
41 {
42 if (!freedom.is_used(to_underlying(record_id) + 1))
43 throw Exception("update: invalid record_id");
44 }
45
46 public:
47 const Compact_Freedom_Keeper &get_freedom() const {return freedom;}
48
49 const std::map<Field_Id, Field> &get_fields() const {return fields;}
50 Field_Id find_field(const std::string &name) const;
51 void add_field(const std::string &name, const Type &type);
52 void drop_field(Field_Id field_id);
53
54 void delete_record(Record_Id record_id);
55 void insert_record(Record_Id record_id);
56 void insert_vector(Record_Id record_id, size_t size);
57
58 size_t get_storage_capacity() const {return freedom.size();}
59
60 #define TYPE_MACRO(type, return_type, type_id, R, W)\
61 return_type get_##type_id(Record_Id rid, Field_Id fid) const\
62 {\
63 return find_field_from_id(fid)->second.get_##type_id(rid);\
64 }\
65 void update_##type_id(Record_Id record_id,\
66 Field_Id field_id,\
67 return_type value)\
68 {\
69 const auto it = find_field_from_id(field_id);\
70 check_record_id(record_id);\
71 it->second.set_##type_id(record_id, value);\
72 }\
73 void update_vector_##type_id(Record_Id record_id,\
74 Field_Id field_id,\
75 size_t size,\
76 const type *value)\
77 {\
78 const auto it = find_field_from_id(field_id);\
79 check_record_id(record_id);\
80 check_record_id(record_id + ptrdiff_t(size) - 1);\
81 it->second.set_vector_##type_id(record_id, size, value);\
82 }\
83 type *get_own_##type_id##_storage(Record_Id record_id, Field_Id field_id)\
84 {\
85 const auto it = find_field_from_id(field_id);\
86 check_record_id(record_id);\
87 return it->second.get_own_##type_id##_storage(record_id);\
88 }\
89 const type *get_own_##type_id##_storage(Record_Id record_id, Field_Id field_id) const\
90 {\
91 return const_cast<Table *>(this)->get_own_##type_id##_storage(record_id, field_id);\
92 }
93 #include "joedb/TYPE_MACRO.h"
94 };
95}
96
97#endif
bool is_used(ptrdiff_t index) const override
ptrdiff_t size() const override
void delete_record(Record_Id record_id)
Definition Table.cpp:43
const std::map< Field_Id, Field > & get_fields() const
Definition Table.h:49
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
const Compact_Freedom_Keeper & get_freedom() const
Definition Table.h:47
size_t get_storage_capacity() const
Definition Table.h:58
Definition Blob.h:7
constexpr std::underlying_type< Table_Id >::type to_underlying(Table_Id id)
Definition index_types.h:21