From d1c95d2b8b5863ea4b22581f6b6b49dbc38b7625 Mon Sep 17 00:00:00 2001 From: Lukas Forsberg Date: Sun, 16 Nov 2025 17:03:18 +0100 Subject: [PATCH] added new database --- CMakeLists.txt | 5 ++ src/database/database.cpp | 8 +++ src/database/database.hpp | 4 +- src/htmx/HtmxObject.h | 1 - src/login/login.cpp | 2 +- src/main.cpp | 2 - src/shadowrun/ShadowrunApi.cpp | 7 +- src/shadowrun/ShadowrunCharacterForm.hpp | 2 +- src/shadowrun/ShadowrunDb.cpp | 81 +++++++++++++++--------- src/shadowrun/ShadowrunDb.hpp | 8 +-- 10 files changed, 77 insertions(+), 43 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c712884..5b5b63f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.10) project(CrowHTMX) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + set(TARGET_NAME lf-server-admin-panel ) set(CMAKE_CXX_STANDARD 23) @@ -31,6 +33,9 @@ foreach(file IN LISTS TEMPLATE_FILES) configure_file("${file}" "${CMAKE_BINARY_DIR}/${rel_path}" COPYONLY) endforeach() +add_compile_options(-Wno-deprecated-declarations) +add_compile_options(-Wno-deprecated-literal-operator) + # Use Crow from system include (installed via yay -S crow + asio) include_directories(/usr/include src src/htmx src/shadowrun src/database src/login) diff --git a/src/database/database.cpp b/src/database/database.cpp index 6feba3b..7bd3a28 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -12,6 +12,14 @@ Database::~Database() { sqlite3_close(m_db); } +string Database::currentTime(){ + auto now = std::chrono::system_clock::now(); + std::time_t t = std::chrono::system_clock::to_time_t(now); + std::stringstream ss; + ss << std::put_time(std::gmtime(&t), "%Y-%m-%d %H:%M:%S"); + return ss.str(); +} + sqlite3_stmt* Database::prepareStmt(const string& sql){ sqlite3_stmt* stmt = nullptr; if (sqlite3_prepare_v2(m_db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { diff --git a/src/database/database.hpp b/src/database/database.hpp index 6d24a4f..fc48708 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -17,7 +17,7 @@ class Database { typedef std::vector> QueryData; public: - static constexpr std::string dbFile = "app.db"; + static constexpr std::string dbFile = "test.db"; Database(); ~Database(); @@ -30,6 +30,8 @@ public: std::set getStrSet(const std::string& sql); + static std::string currentTime(); + template std::optional getSqlData(sqlite3_stmt* stmt, int i) { diff --git a/src/htmx/HtmxObject.h b/src/htmx/HtmxObject.h index be1dd26..73be4e6 100644 --- a/src/htmx/HtmxObject.h +++ b/src/htmx/HtmxObject.h @@ -7,7 +7,6 @@ #include - class HtmxObject { public: diff --git a/src/login/login.cpp b/src/login/login.cpp index f2bb85c..bc9f29d 100644 --- a/src/login/login.cpp +++ b/src/login/login.cpp @@ -1,6 +1,6 @@ #include "login.hpp" #include "sodium.h" -#include "database.hpp" +#include "databasepool.h" #include "utils.hpp" #include namespace login diff --git a/src/main.cpp b/src/main.cpp index 56385f2..cf5e9b0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,5 @@ #include -#include #include -#include #include #include "json_settings.h" #include "htmx_helper.h" diff --git a/src/shadowrun/ShadowrunApi.cpp b/src/shadowrun/ShadowrunApi.cpp index f50de67..fa0e39e 100644 --- a/src/shadowrun/ShadowrunApi.cpp +++ b/src/shadowrun/ShadowrunApi.cpp @@ -5,6 +5,7 @@ #include "ShadowrunDb.hpp" #include "login.hpp" #include +#include #include using namespace std; @@ -83,7 +84,7 @@ void initApi(crow::SimpleApp& app) auto query = crow::query_string(req.url_params); std::string name = query.get("name") ? query.get("name") : ""; - auto data = getCharacterData(getKeyOfCharacter(name)); + auto data = getCharacterDataMap(getKeyOfCharacter(name)); return crow::response{ShadowrunCharacterForm(data).htmx()}; })); @@ -98,8 +99,8 @@ void initApi(crow::SimpleApp& app) << "" diff --git a/src/shadowrun/ShadowrunCharacterForm.hpp b/src/shadowrun/ShadowrunCharacterForm.hpp index 9445ca2..fdc4473 100644 --- a/src/shadowrun/ShadowrunCharacterForm.hpp +++ b/src/shadowrun/ShadowrunCharacterForm.hpp @@ -4,7 +4,7 @@ #include "htmx/HtmxObject.h" #include #include - +#include class ShadowrunCharacterForm : public HtmxObject { public: diff --git a/src/shadowrun/ShadowrunDb.cpp b/src/shadowrun/ShadowrunDb.cpp index fc08852..1a3270b 100644 --- a/src/shadowrun/ShadowrunDb.cpp +++ b/src/shadowrun/ShadowrunDb.cpp @@ -1,4 +1,8 @@ +#include "ShadowrunDb.hpp" #include +#include +#include +#include "database.hpp" #include "databasepool.h" #include "crow.h" #include "sqlite_orm.h" @@ -19,52 +23,69 @@ int64_t getKeyOfCharacter(const string& name){ if (!character.empty()) { return character[0].id; } else { - return db->insert(ShadowrunCharacter{-1, name, ""}); + return db->insert(ShadowrunCharacter{-1, name, Database::currentTime()}); } } bool storeCharacterData(int64_t characterKey, vector>& idValues){ - auto sql = format("SELECT name FROM shadowrun_data WHERE character_id = {};", characterKey); - auto db = Database(); - if (!db.open()) - return false; - - auto set = db.getStrSet(sql); + auto characterData = getCharacterData(characterKey); + std::map dataMap; + for(auto& data : characterData) { + dataMap[data.name] = &data; + } + auto db = dbpool.acquire(); for (auto& idValue : idValues) { + const string& name = idValue.first; + const string& value = idValue.second; + // update if already exist - if(set.contains(idValue.first)){ - auto sql = format("UPDATE shadowrun_data SET value = '{}', updated_at = CURRENT_TIMESTAMP WHERE name = '{}' AND character_id = {}", idValue.second, idValue.first, characterKey); - if (!db.exec(sql)){ - CROW_LOG_WARNING << "Failed to update " << idValue.first << " with " << idValue.second; - } + auto it = dataMap.find(name); + if(it != dataMap.end()){ + db->update_all( + sqlite_orm::set( + assign(&ShadowrunData::value, idValue.second), + assign(&ShadowrunData::updated_at, Database::currentTime()) + ), + where( + c(&ShadowrunData::name) == name and + c(&ShadowrunData::character_id) == characterKey + ) + ); } else { - auto sql = format("INSERT INTO shadowrun_data (character_id, name, value) " - "VALUES ({}, '{}', '{}')", characterKey, idValue.first, idValue.second); - if (!db.exec(sql)){ - CROW_LOG_WARNING << "Failed to insert " << idValue.first << " with " << idValue.second; - } + ShadowrunData entry { + .id = -1, + .character_id = static_cast(characterKey), + .name = name, + .value = value, + .created_at = Database::currentTime(), + .updated_at = "", + }; + db->insert(entry); } } return true; } -std::set getCharacters(){ - string sql = "SELECT name FROM shadowrun_characters;"; - auto db = Database(); - if (!db.open()) - return std::set(); - - return db.getStrSet(sql); +std::vector getCharacters(){ + auto db = dbpool.acquire(); + return db->get_all(); } -std::map getCharacterData(int64_t characterKey) { - std::string sql = "SELECT name, value FROM shadowrun_data WHERE character_id = ?;"; - auto db = Database(); - if (!db.open()) - return std::map(); +std::map getCharacterDataMap(int64_t characterKey){ + auto characterData = getCharacterData(characterKey); + std::map dataMap; + for(auto& data : characterData) { + dataMap[data.name] = data.value; + } + return dataMap; +} - return db.getStrMap(sql, {characterKey}); +vector getCharacterData(int64_t characterKey) { + auto db = dbpool.acquire(); + return db->get_all( + where(c(&ShadowrunData::character_id) == characterKey) + ); } } \ No newline at end of file diff --git a/src/shadowrun/ShadowrunDb.hpp b/src/shadowrun/ShadowrunDb.hpp index 7d3ac27..9bf0382 100644 --- a/src/shadowrun/ShadowrunDb.hpp +++ b/src/shadowrun/ShadowrunDb.hpp @@ -4,9 +4,8 @@ #include #include #include -#include #include - +#include namespace shadowrun { struct ShadowrunCharacter { int id; @@ -25,9 +24,10 @@ namespace shadowrun { int64_t getKeyOfCharacter(const std::string& name); bool storeCharacterData(int64_t characterKey, std::vector>& idValues); - std::set getCharacters(); + std::vector getCharacters(); - std::map getCharacterData(int64_t characterKey); + std::vector getCharacterData(int64_t characterKey); + std::map getCharacterDataMap(int64_t characterKey); } #endif // __SHADOWRUNDB_H__ \ No newline at end of file