Files
eqemu-server/common/repositories/offline_character_sessions_repository.h
T

99 lines
2.8 KiB
C++

#pragma once
#include "common/database.h"
#include "common/strings.h"
class OfflineCharacterSessionsRepository {
public:
struct OfflineCharacterSession {
uint64_t id{0};
uint32_t account_id{0};
uint32_t character_id{0};
std::string mode{};
uint32_t zone_id{0};
int32_t instance_id{0};
uint32_t entity_id{0};
time_t started_at{0};
};
static OfflineCharacterSession GetByAccountId(Database &db, uint32 account_id)
{
OfflineCharacterSession session{};
auto results = db.QueryDatabase(
fmt::format(
"SELECT id, account_id, character_id, mode, zone_id, instance_id, entity_id, UNIX_TIMESTAMP(started_at) "
"FROM offline_character_sessions WHERE account_id = {} LIMIT 1",
account_id
)
);
if (!results.Success() || results.RowCount() == 0) {
return session;
}
auto row = results.begin();
session.id = row[0] ? strtoull(row[0], nullptr, 10) : 0;
session.account_id = row[1] ? Strings::ToUnsignedInt(row[1]) : 0;
session.character_id = row[2] ? Strings::ToUnsignedInt(row[2]) : 0;
session.mode = row[3] ? row[3] : "";
session.zone_id = row[4] ? Strings::ToUnsignedInt(row[4]) : 0;
session.instance_id = row[5] ? Strings::ToInt(row[5]) : 0;
session.entity_id = row[6] ? Strings::ToUnsignedInt(row[6]) : 0;
session.started_at = row[7] ? Strings::ToUnsignedBigInt(row[7]) : 0;
return session;
}
static bool ExistsByAccountId(Database &db, uint32 account_id)
{
return GetByAccountId(db, account_id).id != 0;
}
static bool Upsert(
Database &db,
uint32 account_id,
uint32 character_id,
const std::string &mode,
uint32 zone_id,
int32 instance_id,
uint32 entity_id
)
{
auto results = db.QueryDatabase(
fmt::format(
"INSERT INTO offline_character_sessions (account_id, character_id, mode, zone_id, instance_id, entity_id, started_at) "
"VALUES ({}, {}, '{}', {}, {}, {}, NOW()) "
"ON DUPLICATE KEY UPDATE character_id = VALUES(character_id), mode = VALUES(mode), zone_id = VALUES(zone_id), "
"instance_id = VALUES(instance_id), entity_id = VALUES(entity_id), started_at = VALUES(started_at)",
account_id,
character_id,
Strings::Escape(mode),
zone_id,
instance_id,
entity_id
)
);
return results.Success();
}
static bool DeleteByAccountId(Database &db, uint32 account_id)
{
return db.QueryDatabase(
fmt::format("DELETE FROM offline_character_sessions WHERE account_id = {}", account_id)
).Success();
}
static bool DeleteByCharacterId(Database &db, uint32 character_id)
{
return db.QueryDatabase(
fmt::format("DELETE FROM offline_character_sessions WHERE character_id = {}", character_id)
).Success();
}
static bool Truncate(Database &db)
{
return db.QueryDatabase("TRUNCATE TABLE offline_character_sessions").Success();
}
};