-
-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathdatabase_manager.hpp
More file actions
218 lines (203 loc) · 13.7 KB
/
database_manager.hpp
File metadata and controls
218 lines (203 loc) · 13.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#pragma once
#include <memory>
#include <nlohmann/json_fwd.hpp>
#include <optional>
#include <spdlog/spdlog.h>
#include <sqlite3.h>
#include <sqlite_orm/sqlite_orm.h>
#include <string>
namespace database_manager {
// A setting as represented in the database
struct SettingHolder {
int id = 0;
std::string name;
std::string value;
};
// A setting as represented in the database
struct NSPanelSettingHolder {
int id = 0;
std::string name;
std::string value;
int nspanel_id = 0;
};
// An NSPanel as presented in the database
struct NSPanel {
int id = 0;
std::string mac_address;
std::string friendly_name;
int room_id = 0;
std::string version;
std::optional<uint64_t> button1_detached_mode_entity_id = 0;
int button1_mode = 0;
std::optional<uint64_t> button2_detached_mode_entity_id = 0;
int button2_mode = 0;
std::optional<uint64_t> button1_long_detached_mode_entity_id = 0;
int button1_long_mode = 0;
std::optional<uint64_t> button2_long_detached_mode_entity_id = 0;
int button2_long_mode = 0;
std::string md5_data_file;
std::string md5_firmware;
std::string md5_tft_file;
bool denied;
bool accepted;
};
struct NSPanelRelayGroupBinding {
int id = 0;
int relay_num = 0;
int nspanel_id = 0;
int relay_group_id = 0;
};
// A room as presented in the database
struct Room {
int id = 0;
std::string friendly_name;
std::string room_temp_provider;
std::string room_temp_sensor;
int display_order = 0;
};
struct Scene {
int id = 0;
std::unique_ptr<int> room_id = 0;
std::string friendly_name;
std::string scene_type;
std::string backend_name;
int room_view_position;
int entities_page_id;
};
struct SceneLightState {
int id = 0;
int light_level;
std::string color_mode;
int color_temperature;
int hue;
int saturation;
int light_id;
int scene_id;
};
// A Room Entities Page as presented in the database
struct RoomEntitiesPage {
int id = 0;
int display_order = 0;
int page_type = 0;
bool is_scenes_page = false;
// Reference to parent room that this page is attached to. Not set in case of global page.
std::optional<int> room_id = 0;
};
struct Entity {
int id = 0;
std::string entity_type;
std::string friendly_name;
int entities_page_id;
int room_view_position;
int room_id;
std::string entity_data;
nlohmann::json get_entity_data_json() const;
void set_entity_data_json(const nlohmann::json &json);
};
#if defined(TEST_MODE) && TEST_MODE == 1
static inline auto database = sqlite_orm::make_storage("/tmp/nspanelmanager_db_test.sqlite3",
#else
static inline auto database = sqlite_orm::make_storage("/data/nspanelmanager_db.sqlite3",
#endif
sqlite_orm::make_table("web_roomentitiespage",
sqlite_orm::make_column("id", &RoomEntitiesPage::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("display_order", &RoomEntitiesPage::display_order),
sqlite_orm::make_column("page_type", &RoomEntitiesPage::page_type),
sqlite_orm::make_column("is_scenes_page", &RoomEntitiesPage::is_scenes_page),
sqlite_orm::make_column("room_id", &RoomEntitiesPage::room_id)),
sqlite_orm::make_table("web_settings",
sqlite_orm::make_column("id", &SettingHolder::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("name", &SettingHolder::name),
sqlite_orm::make_column("value", &SettingHolder::value)),
sqlite_orm::make_table("web_nspanelsettings",
sqlite_orm::make_column("id", &NSPanelSettingHolder::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("name", &NSPanelSettingHolder::name),
sqlite_orm::make_column("value", &NSPanelSettingHolder::value),
sqlite_orm::make_column("nspanel_id", &NSPanelSettingHolder::nspanel_id)),
sqlite_orm::make_table("web_nspanel",
sqlite_orm::make_column("id", &NSPanel::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("friendly_name", &NSPanel::friendly_name),
sqlite_orm::make_column("mac_address", &NSPanel::mac_address),
sqlite_orm::make_column("room_id", &NSPanel::room_id),
sqlite_orm::make_column("version", &NSPanel::version),
sqlite_orm::make_column("button1_detached_mode_entity_id", &NSPanel::button1_detached_mode_entity_id),
sqlite_orm::make_column("button1_mode", &NSPanel::button1_mode),
sqlite_orm::make_column("button2_detached_mode_entity_id", &NSPanel::button2_detached_mode_entity_id),
sqlite_orm::make_column("button2_mode", &NSPanel::button2_mode),
sqlite_orm::make_column("button1_long_detached_mode_entity_id", &NSPanel::button1_long_detached_mode_entity_id),
sqlite_orm::make_column("button1_long_mode", &NSPanel::button1_long_mode),
sqlite_orm::make_column("button2_long_detached_mode_entity_id", &NSPanel::button2_long_detached_mode_entity_id),
sqlite_orm::make_column("button2_long_mode", &NSPanel::button2_long_mode),
sqlite_orm::make_column("md5_data_file", &NSPanel::md5_data_file),
sqlite_orm::make_column("md5_firmware", &NSPanel::md5_firmware),
sqlite_orm::make_column("md5_tft_file", &NSPanel::md5_tft_file),
sqlite_orm::make_column("denied", &NSPanel::denied),
sqlite_orm::make_column("accepted", &NSPanel::accepted)),
sqlite_orm::make_table("web_relaygroupbinding",
sqlite_orm::make_column("id", &NSPanelRelayGroupBinding::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("relay_num", &NSPanelRelayGroupBinding::relay_num),
sqlite_orm::make_column("nspanel_id", &NSPanelRelayGroupBinding::nspanel_id),
sqlite_orm::make_column("relay_group_id", &NSPanelRelayGroupBinding::relay_group_id)),
sqlite_orm::make_table("web_room",
sqlite_orm::make_column("id", &Room::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("friendly_name", &Room::friendly_name),
sqlite_orm::make_column("room_temp_provider", &Room::room_temp_provider),
sqlite_orm::make_column("room_temp_sensor", &Room::room_temp_sensor),
sqlite_orm::make_column("displayOrder", &Room::display_order)),
sqlite_orm::make_table("web_scene",
sqlite_orm::make_column("id", &Scene::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("room_id", &Scene::room_id),
sqlite_orm::make_column("friendly_name", &Scene::friendly_name),
sqlite_orm::make_column("scene_type", &Scene::scene_type),
sqlite_orm::make_column("backend_name", &Scene::backend_name),
sqlite_orm::make_column("entities_page_id", &Scene::entities_page_id),
sqlite_orm::make_column("room_view_position", &Scene::room_view_position)),
sqlite_orm::make_table("web_lightstate",
sqlite_orm::make_column("id", &SceneLightState::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("scene_id", &SceneLightState::scene_id),
sqlite_orm::make_column("light_id", &SceneLightState::light_id),
sqlite_orm::make_column("light_level", &SceneLightState::light_level),
sqlite_orm::make_column("color_mode", &SceneLightState::color_mode),
sqlite_orm::make_column("color_temperature", &SceneLightState::color_temperature),
sqlite_orm::make_column("hue", &SceneLightState::hue),
sqlite_orm::make_column("saturation", &SceneLightState::saturation)),
sqlite_orm::make_table("web_entity",
sqlite_orm::make_column("id", &Entity::id, sqlite_orm::primary_key().autoincrement()),
sqlite_orm::make_column("room_view_position", &Entity::room_view_position),
sqlite_orm::make_column("friendly_name", &Entity::friendly_name),
sqlite_orm::make_column("entity_type", &Entity::entity_type),
sqlite_orm::make_column("entities_page_id", &Entity::entities_page_id),
sqlite_orm::make_column("entity_data", &Entity::entity_data),
sqlite_orm::make_column("room_id", &Entity::room_id)));
static void init() {
#if defined(TEST_MODE) && TEST_MODE == 1
SPDLOG_INFO("Running database /tmp/nspanelmanager_db_test.sqlite3 as it's in TEST_MODE. Syncing schema...");
auto result = database_manager::database.sync_schema();
SPDLOG_INFO("Sync schema result:");
for (auto &n : result) {
switch (n.second) {
case sqlite_orm::sync_schema_result::new_table_created:
SPDLOG_INFO("Created table {}", n.first);
break;
case sqlite_orm::sync_schema_result::already_in_sync:
SPDLOG_INFO("Table {} already in sync", n.first);
break;
case sqlite_orm::sync_schema_result::old_columns_removed:
SPDLOG_INFO("Removed old columns from table {}", n.first);
break;
case sqlite_orm::sync_schema_result::new_columns_added:
SPDLOG_INFO("Added new columns to table {}", n.first);
break;
case sqlite_orm::sync_schema_result::new_columns_added_and_old_columns_removed:
SPDLOG_INFO("Added new columns and removed old columns from table {}", n.first);
break;
case sqlite_orm::sync_schema_result::dropped_and_recreated:
SPDLOG_INFO("Dropped and recreated table {}", n.first);
break;
}
}
#else
database_manager::database.open_forever();
#endif
}
}; // namespace database_manager