3#include "Import/WebFrameworkCore.h"
5#include "SQLiteDatabaseModel.h"
14 class WEB_FRAMEWORK_API Database
17 class WEB_FRAMEWORK_API ModelsData
20 std::vector<std::pair<std::shared_ptr<SQLiteDatabaseModel>,
size_t>> data;
23 ModelsData() =
default;
25 template<std::derived_from<SQLiteDatabaseModel> T,
typename... Args>
26 std::shared_ptr<T> add(std::shared_ptr<SQLiteDatabase> database, Args&&... args);
28 template<std::derived_from<SQLiteDatabaseModel> T>
29 std::shared_ptr<T> get()
const;
31 ~ModelsData() =
default;
35 std::shared_ptr<SQLiteDatabase> database;
36 std::unordered_map<std::string_view, ModelsData> models;
37 mutable std::shared_mutex mutex;
40 Database(
const std::string& databaseName);
42 template<std::derived_from<SQLiteDatabaseModel> T,
typename... Args>
43 std::shared_ptr<T> add(Args&&... args);
45 template<std::derived_from<SQLiteDatabaseModel> T>
46 std::shared_ptr<T> get()
const;
48 ~Database() =
default;
52 std::unordered_map<std::string_view, std::unique_ptr<Database>> databases;
53 mutable std::shared_mutex mutex;
58 template<std::derived_from<SQLiteDatabaseModel> T,
typename... Args>
59 std::shared_ptr<T> add(Args&&... args);
61 template<std::derived_from<SQLiteDatabaseModel> T>
62 std::shared_ptr<T> get()
const;
69 template<std::derived_from<SQLiteDatabaseModel> T,
typename... Args>
70 std::shared_ptr<T> SQLiteManager::Database::ModelsData::add(std::shared_ptr<SQLiteDatabase> database, Args&&... args)
72 size_t typeHash =
typeid(T).hash_code();
74 for (
const auto& [model, hash] : data)
78 return std::dynamic_pointer_cast<T>(model);
82 T* model =
static_cast<T*
>(malloc(
sizeof(T)));
86 throw std::bad_alloc();
89 memset(model, 0,
sizeof(T));
91 model->databaseConstructor = database;
93 model =
new (model)(T)(std::forward<Args>(args)...);
97 model->database = database;
100 return std::dynamic_pointer_cast<T>(data.emplace_back(std::shared_ptr<T>(model), typeHash).first);
103 template<std::derived_from<SQLiteDatabaseModel> T>
104 std::shared_ptr<T> SQLiteManager::Database::ModelsData::get()
const
106 size_t typeHash =
typeid(T).hash_code();
108 for (
const auto& [model, hash] : data)
110 if (typeHash == hash)
112 return std::dynamic_pointer_cast<T>(model);
119 template<std::derived_from<SQLiteDatabaseModel> T,
typename... Args>
120 std::shared_ptr<T> SQLiteManager::Database::add(Args&&... args)
122 std::unique_lock<std::shared_mutex> lock(mutex);
123 ModelsData* data =
nullptr;
125 if (
auto modelsData = models.find(T::tableName); modelsData != models.end())
127 data = &modelsData->second;
131 modelsData = models.try_emplace(T::tableName, ModelsData()).first;
133 data = &modelsData->second;
136 return data->add<T>(database, std::forward<Args>(args)...);
139 template<std::derived_from<SQLiteDatabaseModel> T>
140 std::shared_ptr<T> SQLiteManager::Database::get()
const
142 std::shared_lock<std::shared_mutex> lock(mutex);
144 if (
auto modelsData = models.find(T::tableName); modelsData != models.end())
146 const ModelsData& data = modelsData->second;
148 return data.get<T>();
154 template<std::derived_from<SQLiteDatabaseModel> T,
typename... Args>
155 std::shared_ptr<T> SQLiteManager::add(Args&&... args)
157 static_assert(T::databaseName.size(),
"SQLiteDatabaseModel::databaseName is empty");
158 static_assert(T::tableName.size(),
"SQLiteDatabaseModel::tableName is empty");
160 std::unique_lock<std::shared_mutex> lock(mutex);
161 std::unique_ptr<Database>* database =
nullptr;
163 if (
auto it = databases.find(T::databaseName); it != databases.end())
165 database = &it->second;
169 it = databases.try_emplace(T::databaseName, std::make_unique<Database>(std::string(T::databaseName))).first;
171 database = &it->second;
174 return (*database)->add<T>(std::forward<Args>(args)...);
177 template<std::derived_from<SQLiteDatabaseModel> T>
178 std::shared_ptr<T> SQLiteManager::get()
const
180 const Database* database =
nullptr;
183 std::shared_lock<std::shared_mutex> lock(mutex);
185 if (
auto it = databases.find(T::databaseName); it != databases.end())
187 database = &(*it->second);
191 return database ? database->get<T>() : nullptr;
Providing SELECT, INSERT, UPDATE, DELETE or raw queries for SQLiteDatabase.