#include #include #include #include #include #include "database.hpp" class DatabasePool { public: // Construct pool with path + size DatabasePool(const std::string& path) : db_path(path) { // Enable multithreaded SQLite assert(sqlite3_config(SQLITE_CONFIG_MULTITHREAD) == SQLITE_OK); assert(sqlite3_initialize() == SQLITE_OK); } bool init(size_t size){ try{ // Pre-create the pool for (size_t i = 0; i < size; ++i) { auto db = std::make_shared(make_database(db_path)); db->sync_schema(); pool.push(db); } // init the database auto db = acquire(); release(db); return true; } catch (...) { return false; } } // Acquire a database connection from the pool std::shared_ptr acquire() { std::unique_lock lock(mutex); cv.wait(lock, [&]{ return !pool.empty(); }); auto db = pool.front(); pool.pop(); return db; } // Return a connection to the pool void release(std::shared_ptr db) { std::unique_lock lock(mutex); pool.push(db); lock.unlock(); cv.notify_one(); } private: std::queue> pool; std::mutex mutex; std::condition_variable cv; const std::string db_path; }; extern std::unique_ptr dbpool;