#pragma once #include #include #include #include #include #include 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 topEntries; int32_t myRank; uint64_t myValue; }; boost::asio::awaitable LoadUser(std::string nickname); boost::asio::awaitable SaveUser(std::string nickname, uint64_t gold, uint32_t swordLevel); boost::asio::awaitable GetRanking(int type, std::string nickname); // 내부용 객체 class PooledConnection { public: PooledConnection(DatabaseManager &manager, std::unique_ptr conn); ~PooledConnection(); boost::mysql::tcp_ssl_connection &Get(); boost::mysql::tcp_ssl_connection *operator->(); private: DatabaseManager &manager_; std::unique_ptr conn_; }; boost::asio::awaitable> GetConnection(); private: DatabaseManager() = default; void ReturnConnection(std::unique_ptr conn); // DB 접속 정보 저장용 (새로운 커넥션 생성 시 필요) std::string host_, user_, password_, db_; uint16_t port_; std::unique_ptr> strand_; // 풀 상태 관리 std::vector> available_conns_; std::queue> waiting_queue_; const uint16_t max_pool_size_ = 10; int16_t current_total_conns_ = 0; };