49 lines
1.2 KiB
C++
49 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <expected>
|
|
#include <functional>
|
|
#include <memory>
|
|
|
|
#include <boost/asio/awaitable.hpp>
|
|
|
|
#include <modulus.hpp>
|
|
|
|
namespace noto {
|
|
|
|
namespace detail {
|
|
|
|
struct connection_core;
|
|
|
|
struct transaction_state;
|
|
|
|
}
|
|
|
|
enum class transaction_mode {
|
|
DEFERRED,
|
|
IMMEDIATE,
|
|
EXCLUSIVE,
|
|
};
|
|
|
|
class connection;
|
|
|
|
class transaction {
|
|
public:
|
|
transaction() = default;
|
|
transaction(noto::transaction const &) = delete;
|
|
transaction(noto::transaction &&other) noexcept;
|
|
~transaction();
|
|
auto operator=(noto::transaction const &) -> noto::transaction & = delete;
|
|
auto operator=(noto::transaction &&other) noexcept -> noto::transaction & = delete;
|
|
auto active() const -> std::bool_t;
|
|
auto async_commit() -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_rollback() -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
private:
|
|
friend class noto::connection;
|
|
friend struct noto::detail::connection_core;
|
|
explicit transaction(std::shared_ptr<noto::detail::transaction_state> state);
|
|
explicit transaction(std::shared_ptr<noto::detail::connection_core> core, std::function<void()> on_finish = {});
|
|
std::shared_ptr<noto::detail::transaction_state> state_{};
|
|
};
|
|
|
|
}
|