sword_game/include/DatabaseManager.h
bumpsoo 4d60403adf feat: DB 커넥션 풀 기능 추가
TODO: 동시에 여러 DB 연결 확인해야함. 현재 기능만 확인 완료
2026-02-09 14:00:15 +00:00

76 lines
2.2 KiB
C++

#pragma once
#include <boost/asio.hpp>
#include <boost/asio/awaitable.hpp>
#include <boost/mysql.hpp>
#include <memory>
#include <queue>
#include <string>
class DatabaseManager {
public:
static DatabaseManager &GetInstance();
bool Init(boost::asio::io_context &io_context, const std::string &host,
uint16_t port, const std::string &user, const std::string &password,
const std::string &db);
struct UserData {
std::string nickname;
uint64_t gold;
uint32_t swordLevel;
uint32_t maxSwordLevel;
};
struct RankingResult {
struct Entry {
uint32_t rank;
std::string nickname;
uint64_t value;
};
std::vector<Entry> topEntries;
int32_t myRank;
uint64_t myValue;
};
boost::asio::awaitable<UserData> LoadUser(std::string nickname);
boost::asio::awaitable<void> SaveUser(std::string nickname, uint64_t gold,
uint32_t swordLevel);
boost::asio::awaitable<RankingResult> GetRanking(int type,
std::string nickname);
// 내부용 객체
class PooledConnection {
public:
PooledConnection(DatabaseManager &manager,
std::unique_ptr<boost::mysql::tcp_ssl_connection> conn);
~PooledConnection();
boost::mysql::tcp_ssl_connection &Get();
boost::mysql::tcp_ssl_connection *operator->();
private:
DatabaseManager &manager_;
std::unique_ptr<boost::mysql::tcp_ssl_connection> conn_;
};
boost::asio::awaitable<std::unique_ptr<PooledConnection>> GetConnection();
private:
DatabaseManager() = default;
void ReturnConnection(std::unique_ptr<boost::mysql::tcp_ssl_connection> conn);
// DB 접속 정보 저장용 (새로운 커넥션 생성 시 필요)
std::string host_, user_, password_, db_;
uint16_t port_;
std::unique_ptr<boost::asio::strand<boost::asio::io_context::executor_type>>
strand_;
// 풀 상태 관리
std::vector<std::unique_ptr<boost::mysql::tcp_ssl_connection>>
available_conns_;
std::queue<std::shared_ptr<boost::asio::steady_timer>> waiting_queue_;
const uint16_t max_pool_size_ = 10;
int16_t current_total_conns_ = 0;
};