Files
noto/include/noto/detail/core.hpp
T
khodowany fc0bad81c4
publish / publish (push) Successful in 26m25s
Initial public khodo snapshot
2026-09-04 19:30:11 -05:00

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};
};
}