ocpp 0.24.1
A C++ implementation of the Open Charge Point Protocol
init_device_model_db.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright Pionix GmbH and Contributors to EVerest
3
33
34#pragma once
35
36#include <filesystem>
37
38#include <ocpp/common/database/database_handler_common.hpp>
39#include <ocpp/v2/device_model_storage_interface.hpp>
40
41namespace ocpp::v2 {
49 std::optional<uint64_t> db_id;
50 std::string name;
51 std::optional<std::string> instance;
52 std::optional<int32_t> evse_id;
53 std::optional<int32_t> connector_id;
54 std::vector<std::string> required;
55
62 friend bool operator<(const ComponentKey& l, const ComponentKey& r);
63};
64
69 std::optional<uint64_t> db_id;
70 std::optional<std::string> value_source;
72};
73
79 std::optional<uint64_t> db_id;
81 std::optional<uint64_t> variable_characteristics_db_id;
83 std::string name;
87 std::vector<DbVariableAttribute> attributes;
91 std::optional<std::string> instance;
93 std::optional<std::string> default_actual_value;
95 std::vector<VariableMonitoringMeta> monitors;
97 std::optional<std::string> source;
98};
99
102void from_json(const json& j, ComponentKey& c);
103
106void from_json(const json& j, DeviceModelVariable& c);
107
110void from_json(const json& j, VariableMonitoringMeta& c);
111
115class InitDeviceModelDbError : public std::exception {
116public:
117 [[nodiscard]] const char* what() const noexcept override {
118 return this->reason.c_str();
119 }
120 explicit InitDeviceModelDbError(std::string msg) {
121 this->reason = std::move(msg);
122 }
123 explicit InitDeviceModelDbError(const char* msg) {
124 this->reason = std::string(msg);
125 }
126
127private:
128 std::string reason;
129};
130
132private: // Members
134 const std::filesystem::path database_path;
136 bool database_exists;
137
138public:
144 InitDeviceModelDb(const std::filesystem::path& database_path, const std::filesystem::path& migration_files_path);
145
149 virtual ~InitDeviceModelDb();
150
165 void initialize_database(const std::filesystem::path& config_path, const bool delete_db_if_exists);
166
167private: // Functions
178 void execute_init_sql(const bool delete_db_if_exists);
179
185 std::vector<std::filesystem::path> get_component_config_from_directory(const std::filesystem::path& directory);
186
192 std::map<ComponentKey, std::vector<DeviceModelVariable>>
193 get_all_component_configs(const std::filesystem::path& directory);
194
202 void insert_components(const std::map<ComponentKey, std::vector<DeviceModelVariable>>& components,
203 const std::map<ComponentKey, std::vector<DeviceModelVariable>>& existing_components);
204
210 void insert_component(const ComponentKey& component_key,
211 const std::vector<DeviceModelVariable>& component_variables);
212
218 std::map<ComponentKey, std::vector<DeviceModelVariable>>
219 read_component_config(const std::vector<std::filesystem::path>& components_config_path);
220
227 std::vector<DeviceModelVariable> get_all_component_properties(const json& component_properties,
228 std::vector<std::string> required_properties);
229
237 void insert_variable_characteristics(const VariableCharacteristics& characteristics, const int64_t& variable_id);
238
247 void update_variable_characteristics(const VariableCharacteristics& characteristics,
248 const int64_t& characteristics_id, const int64_t& variable_id);
249
257 void insert_variable(const DeviceModelVariable& variable, const uint64_t& component_id);
258
267 void update_variable(const DeviceModelVariable& variable, const DeviceModelVariable& db_variable,
268 const uint64_t component_id);
269
276 void delete_variable(const DeviceModelVariable& variable);
277
286 void insert_attribute(const VariableAttribute& attribute, const uint64_t& variable_id,
287 const std::optional<std::string>& default_actual_value);
288
297 void insert_attributes(const std::vector<DbVariableAttribute>& attributes, const uint64_t& variable_id,
298 const std::optional<std::string>& default_actual_value);
299
313 void update_attributes(const std::vector<DbVariableAttribute>& new_attributes,
314 const std::vector<DbVariableAttribute>& db_attributes, const uint64_t& variable_id,
315 const std::optional<std::string>& default_actual_value);
316
325 void update_attribute(const VariableAttribute& attribute, const DbVariableAttribute& db_attribute,
326 const std::optional<std::string>& default_actual_value);
327
334 void delete_attribute(const DbVariableAttribute& attribute);
335
347 bool insert_variable_attribute_value(const int64_t& variable_attribute_id,
348 const std::string& variable_attribute_value,
349 const bool warn_source_not_default);
350
355 void insert_variable_monitor(const VariableMonitoringMeta& monitor, const int64_t& variable_id);
356
359 void insert_variable_monitors(const std::vector<VariableMonitoringMeta>& monitors, const int64_t& variable_id);
360
363 void update_variable_monitor(const VariableMonitoringMeta& new_monitor, const VariableMonitoringMeta& db_monitor,
364 const int64_t& variable_id);
365
369 void update_variable_monitors(const std::vector<VariableMonitoringMeta>& new_monitors,
370 const std::vector<VariableMonitoringMeta>& db_monitors, const int64_t& variable_id);
371
374 void delete_variable_monitor(const VariableMonitoringMeta& monitor, const int64_t& variable_id);
375
380 std::map<ComponentKey, std::vector<DeviceModelVariable>> get_all_components_from_db();
381
388 std::optional<std::pair<ComponentKey, std::vector<DeviceModelVariable>>>
389 component_exists_in_db(const std::map<ComponentKey, std::vector<DeviceModelVariable>>& db_components,
390 const ComponentKey& component);
391
398 bool component_exists_in_config(const std::map<ComponentKey, std::vector<DeviceModelVariable>>& component_config,
399 const ComponentKey& component);
400
408 void remove_not_existing_components_from_db(
409 const std::map<ComponentKey, std::vector<DeviceModelVariable>>& component_config,
410 const std::map<ComponentKey, std::vector<DeviceModelVariable>>& db_components);
411
419 bool remove_component_from_db(const ComponentKey& component);
420
427 void
428 update_component_variables(const std::pair<ComponentKey, std::vector<DeviceModelVariable>>& db_component_variables,
429 const std::vector<DeviceModelVariable>& variables);
430
438 std::vector<DbVariableAttribute> get_variable_attributes_from_db(const uint64_t& variable_id);
439
444 std::vector<VariableMonitoringMeta> get_variable_monitors_from_db(const uint64_t& variable_id);
445
446protected: // Functions
447 // DatabaseHandlerCommon interface
454 virtual void init_sql() override;
455};
456} // namespace ocpp::v2
Definition: database_handler_common.hpp:24
Error class to be able to throw a custom error within the class.
Definition: init_device_model_db.hpp:115
Class to initialize the device model db using the component config files.
Definition: init_device_model_db.hpp:131
InitDeviceModelDb(const std::filesystem::path &database_path, const std::filesystem::path &migration_files_path)
Constructor.
Definition: init_device_model_db.cpp:43
virtual ~InitDeviceModelDb()
Destructor.
Definition: init_device_model_db.cpp:51
virtual void init_sql() override
Init database: set foreign keys on (so when a component is removed or updated, all variables,...
Definition: init_device_model_db.cpp:1144
void initialize_database(const std::filesystem::path &config_path, const bool delete_db_if_exists)
Initialize the database schema and component config.
Definition: init_device_model_db.cpp:55
Class that holds a component.
Definition: init_device_model_db.hpp:48
std::optional< std::string > instance
Component instance.
Definition: init_device_model_db.hpp:51
std::vector< std::string > required
List of required variables.
Definition: init_device_model_db.hpp:54
std::optional< int32_t > evse_id
Component evse id.
Definition: init_device_model_db.hpp:52
std::string name
Component name.
Definition: init_device_model_db.hpp:50
friend bool operator<(const ComponentKey &l, const ComponentKey &r)
operator <, needed to add this class as key in a map.
Definition: init_device_model_db.cpp:1162
std::optional< int32_t > connector_id
Component connector id.
Definition: init_device_model_db.hpp:53
std::optional< uint64_t > db_id
Component id in the database.
Definition: init_device_model_db.hpp:49
Struct that holds a VariableAttribute struct and an database id.
Definition: init_device_model_db.hpp:68
std::optional< std::string > value_source
Source of the attribute value (who set the value).
Definition: init_device_model_db.hpp:70
VariableAttribute variable_attribute
The variable attribute.
Definition: init_device_model_db.hpp:71
std::optional< uint64_t > db_id
The id in the database, if the record is read from the db.
Definition: init_device_model_db.hpp:69
Struct holding the Variable of a device model.
Definition: init_device_model_db.hpp:77
std::optional< std::string > instance
Variable instance.
Definition: init_device_model_db.hpp:91
std::vector< VariableMonitoringMeta > monitors
Config monitors, if any.
Definition: init_device_model_db.hpp:95
VariableCharacteristics characteristics
Variable characteristics.
Definition: init_device_model_db.hpp:85
std::optional< uint64_t > variable_characteristics_db_id
Id from the characteristics in the database, if the records is read from db.
Definition: init_device_model_db.hpp:81
std::string name
Variable name.
Definition: init_device_model_db.hpp:83
std::optional< std::string > source
Source of the variable.
Definition: init_device_model_db.hpp:97
std::optional< std::string > default_actual_value
Default value, if this is set in the component config json.
Definition: init_device_model_db.hpp:93
std::vector< DbVariableAttribute > attributes
Variable attributes.
Definition: init_device_model_db.hpp:87
std::optional< uint64_t > db_id
The id in the database, if the record is read from the db.
Definition: init_device_model_db.hpp:79
bool required
True if variable is required.
Definition: init_device_model_db.hpp:89
Definition: ocpp_types.hpp:701
Definition: ocpp_types.hpp:719
Helper struct that holds database only values that don't have spec coverage.
Definition: device_model_storage_interface.hpp:19