#pragma once #include #pragma warning(push) #pragma warning(disable: 4127) #pragma warning(disable: 4267) #pragma warning(disable: 4018) #pragma warning(disable: 4996) #pragma warning(disable: 4244) #include #include #pragma warning(pop) namespace sql = sqlpp::mysql; namespace mysql { constexpr auto max_connections = 100; constexpr auto connection_timeout = 200s; using database_mutex_t = std::recursive_mutex; using database_t = std::unique_ptr; utils::concurrency::container& get_config(); class connection { public: connection() = default; void check(); void cleanup(); database_t db; database_mutex_t mutex; private: std::chrono::high_resolution_clock::time_point start_; std::chrono::high_resolution_clock::time_point last_access_; }; connection* get_connection(std::unique_lock& lock); template T access(F&& accessor) { std::unique_lock lock; auto conn = get_connection(lock); if (conn == nullptr) { throw std::runtime_error("out of connections"); } conn->check(); return accessor(conn->db); } }