84 lines
3.9 KiB
C++
84 lines
3.9 KiB
C++
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <chrono>
|
|
#include <expected>
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <boost/asio/any_io_executor.hpp>
|
|
#include <boost/asio/awaitable.hpp>
|
|
#include <boost/asio/strand.hpp>
|
|
|
|
#include <sqlite3.h>
|
|
|
|
#include <modulus.hpp>
|
|
|
|
#include <noto/connection.hpp>
|
|
#include <noto/config.hpp>
|
|
#include <noto/transaction.hpp>
|
|
|
|
namespace noto::detail {
|
|
|
|
struct transaction_result {
|
|
std::expected<void, modulus::error> status{};
|
|
std::bool_t active{};
|
|
};
|
|
|
|
struct connection_core : std::enable_shared_from_this<noto::detail::connection_core> {
|
|
connection_core(boost::asio::any_io_executor executor, noto::connection_config config);
|
|
~connection_core();
|
|
auto current_state() const -> noto::connection_state;
|
|
auto set_state(noto::connection_state state) -> void;
|
|
auto mark_failed(std::string message) -> void;
|
|
auto abandon_transaction() -> void;
|
|
auto async_connect() -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_close() -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_execute(std::string sql, std::vector<noto::sqlite_value> params, noto::execute_options options) -> boost::asio::awaitable<std::expected<noto::query_result, modulus::error>>;
|
|
auto async_prepare(std::string sql) -> boost::asio::awaitable<std::expected<noto::statement, modulus::error>>;
|
|
auto async_begin_transaction(noto::transaction_mode mode) -> boost::asio::awaitable<std::expected<noto::transaction, modulus::error>>;
|
|
auto async_commit_transaction() -> boost::asio::awaitable<noto::detail::transaction_result>;
|
|
auto async_rollback_transaction() -> boost::asio::awaitable<noto::detail::transaction_result>;
|
|
auto async_backup_to_file(std::string path, noto::backup_options options) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_restore_from_file(std::string path, noto::backup_options options) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_export_sql(noto::export_options options) -> boost::asio::awaitable<std::expected<std::string, modulus::error>>;
|
|
auto async_export_sql_to_file(std::string path, noto::export_options options) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_set_busy_timeout(std::chrono::milliseconds timeout) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
boost::asio::any_io_executor executor{};
|
|
boost::asio::strand<boost::asio::any_io_executor> strand;
|
|
noto::connection_config config{};
|
|
std::chrono::milliseconds busy_timeout{};
|
|
sqlite3* database{};
|
|
std::shared_ptr<std::atomic<noto::connection_state>> state{std::make_shared<std::atomic<noto::connection_state>>(noto::connection_state::IDLE)};
|
|
std::bool_t busy{};
|
|
std::bool_t transaction_active{};
|
|
std::atomic_size_t live_statements{};
|
|
};
|
|
|
|
struct statement_core {
|
|
statement_core(std::shared_ptr<noto::detail::connection_core> connection, sqlite3_stmt* statement);
|
|
~statement_core();
|
|
auto async_reset(std::vector<noto::sqlite_value> params) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_step() -> boost::asio::awaitable<std::expected<std::optional<std::vector<noto::sqlite_value>>, modulus::error>>;
|
|
auto async_execute(std::vector<noto::sqlite_value> params, noto::execute_options options) -> boost::asio::awaitable<std::expected<noto::query_result, modulus::error>>;
|
|
auto async_finalize() -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
std::shared_ptr<noto::detail::connection_core> connection{};
|
|
sqlite3_stmt* statement{};
|
|
std::atomic_bool finalized{};
|
|
std::bool_t counted{};
|
|
};
|
|
|
|
struct transaction_state {
|
|
transaction_state(std::shared_ptr<noto::detail::connection_core> core, std::function<void()> on_finish = {});
|
|
auto finish() noexcept -> void;
|
|
std::shared_ptr<noto::detail::connection_core> core{};
|
|
std::function<void()> on_finish{};
|
|
std::atomic_bool active{false};
|
|
std::atomic_bool detached{false};
|
|
};
|
|
|
|
}
|