#include #include #include #include "log/LogUtils.h" #include "SqlQuery.h" using namespace std; using namespace std::chrono; namespace sql { result result::success = result("", 0, "success"); sql::command model::command() { return ::sql::command(*this); } sql::model model::copy() { return sql::model(this->_data); } model::model(const std::shared_ptr& data) : command_base(data->handle->copyCommandData(data)) {} /** * Command class itself */ threads::Future command::executeLater() { return this->_data->handle->pool->executeLater(*this); } AsyncSqlPool::AsyncSqlPool(size_t threads) : _threads(new threads::ThreadPool(threads, "AsyncSqlPool")) { debugMessage("Created a new async thread pool!"); } AsyncSqlPool::~AsyncSqlPool() { delete _threads; } threads::Future AsyncSqlPool::executeLater(const command& cmd) { threads::Future fut; this->_threads->execute([cmd, fut]{ //cmd for copy and stmt survive command copy = cmd; result res; while((res = copy.execute()).code() == SQLITE_BUSY){ cerr << "Execute busy!" << endl; usleep(1000); } fut.executionSucceed(res); }); return fut; } SqlManager::SqlManager(SqlType type) : type(type) { this->pool = new AsyncSqlPool(1); } SqlManager::~SqlManager() { if(this->pool) this->pool->threads()->wait_for(); delete this->pool; this->pool = nullptr; } }