added new database

This commit is contained in:
2025-11-16 17:03:18 +01:00
parent dd56a8d57e
commit d1c95d2b8b
10 changed files with 77 additions and 43 deletions

View File

@@ -1,4 +1,8 @@
#include "ShadowrunDb.hpp"
#include <format>
#include <functional>
#include <map>
#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<pair<const string, const string>>& 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<string, ShadowrunData*> 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<int>(characterKey),
.name = name,
.value = value,
.created_at = Database::currentTime(),
.updated_at = "",
};
db->insert(entry);
}
}
return true;
}
std::set<std::string> getCharacters(){
string sql = "SELECT name FROM shadowrun_characters;";
auto db = Database();
if (!db.open())
return std::set<std::string>();
return db.getStrSet(sql);
std::vector<ShadowrunCharacter> getCharacters(){
auto db = dbpool.acquire();
return db->get_all<ShadowrunCharacter>();
}
std::map<std::string, std::string> 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::string, std::string>();
std::map<string, string> getCharacterDataMap(int64_t characterKey){
auto characterData = getCharacterData(characterKey);
std::map<string, string> dataMap;
for(auto& data : characterData) {
dataMap[data.name] = data.value;
}
return dataMap;
}
return db.getStrMap(sql, {characterKey});
vector<ShadowrunData> getCharacterData(int64_t characterKey) {
auto db = dbpool.acquire();
return db->get_all<ShadowrunData>(
where(c(&ShadowrunData::character_id) == characterKey)
);
}
}