mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-01 01:52:02 +00:00
99 lines
2.8 KiB
C++
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();
|
|
}
|
|
};
|