added new database
This commit is contained in:
@@ -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)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user