Joedb 9.1.4
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 public:
28 const Compact_Freedom_Keeper &get_freedom() const {return freedom;}
29
30 const std::map<Field_Id, Field> &get_fields() const {return fields;}
31 Field_Id find_field(const std::string &name) const;
32 void add_field(const std::string &name, const Type &type);
33 void drop_field(Field_Id field_id);
34
35 void delete_record(Record_Id record_id);
36 void insert_record(Record_Id record_id);
37 void insert_vector(Record_Id record_id, size_t size);
38
39 size_t get_storage_capacity() const {return freedom.size();}
40
41 #define TYPE_MACRO(type, return_type, type_id, R, W)\
42 return_type get_##type_id(Record_Id rid, Field_Id fid) const\
43 {\
44 return fields.find(fid)->second.get_##type_id(rid);\
45 }\
46 void update_##type_id(Record_Id record_id,\
47 Field_Id field_id,\
48 return_type value)\
49 {\
50 const auto it = fields.find(field_id);\
51 if (it == fields.end())\
52 throw Exception("update: invalid field_id");\
53 if (!freedom.is_used(to_underlying(record_id) + 1))\
54 throw Exception("update: invalid record_id");\
55 it->second.set_##type_id(record_id, value);\
56 }\
57 void update_vector_##type_id(Record_Id record_id,\
58 Field_Id field_id,\
59 size_t size,\
60 const type *value)\
61 {\
62 const auto it = fields.find(field_id);\
63 if (it == fields.end())\
64 throw Exception("update_vector: invalid field_id");\
65 if (!freedom.is_used(to_underlying(record_id) + 1) ||\
66 !freedom.is_used(to_underlying(record_id) + size))\
67 throw Exception("update_vector: invalid record_id range");\
68 it->second.set_vector_##type_id(record_id, size, value);\
69 }\
70 type *get_own_##type_id##_storage(Record_Id record_id, Field_Id field_id)\
71 {\
72 const auto it = fields.find(field_id);\
73 if (it == fields.end())\
74 throw Exception("get_own_storage: invalid field_id");\
75 if (!freedom.is_used(to_underlying(record_id) + 1))\
76 throw Exception("get_own_storage: invalid record_id");\
77 return it->second.get_own_##type_id##_storage(record_id);\
78 }\
79 const type *get_own_##type_id##_storage(Record_Id record_id, Field_Id field_id) const\
80 {\
81 const auto it = fields.find(field_id);\
82 if (it == fields.end())\
83 throw Exception("get_own_storage: invalid field_id");\
84 if (!freedom.is_used(to_underlying(record_id) + 1))\
85 throw Exception("get_own_storage: invalid record_id");\
86 return it->second.get_own_##type_id##_storage(record_id);\
87 }
88 #include "joedb/TYPE_MACRO.h"
89 };
90}
91
92#endif
void delete_record(Record_Id record_id)
Definition Table.cpp:43
const std::map< Field_Id, Field > & get_fields() const
Definition Table.h:30
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:28
size_t get_storage_capacity() const
Definition Table.h:39
Definition Blob.h:7