@@ -35,14 +35,14 @@ struct connection_config {
|
||||
std::vector<noto::pragma_setting> pragmas{};
|
||||
};
|
||||
|
||||
auto validate(noto::connection_config const& config) -> std::expected<void, modulus::error>;
|
||||
auto validate(noto::connection_config const &config) -> std::expected<void, modulus::error>;
|
||||
auto memory_connection_config(std::string name = {}) -> noto::connection_config;
|
||||
auto file_connection_config(std::string filename, std::string name = {}) -> noto::connection_config;
|
||||
auto parse_database_config(boost::json::value const& value) -> std::expected<noto::connection_config, modulus::error>;
|
||||
auto parse_database_configs(boost::json::value const& value) -> std::expected<std::vector<noto::connection_config>, modulus::error>;
|
||||
auto load_database_configs(std::string const& path) -> std::expected<std::vector<noto::connection_config>, modulus::error>;
|
||||
auto to_json(std::variant<std::bool_t, std::int64_t, std::string> const& value) -> boost::json::value;
|
||||
auto to_json(noto::connection_config const& config) -> boost::json::value;
|
||||
auto to_json(std::vector<noto::connection_config> const& configs) -> boost::json::value;
|
||||
auto parse_database_config(boost::json::value const &value) -> std::expected<noto::connection_config, modulus::error>;
|
||||
auto parse_database_configs(boost::json::value const &value) -> std::expected<std::vector<noto::connection_config>, modulus::error>;
|
||||
auto load_database_configs(std::string const &path) -> std::expected<std::vector<noto::connection_config>, modulus::error>;
|
||||
auto to_json(std::variant<std::bool_t, std::int64_t, std::string> const &value) -> boost::json::value;
|
||||
auto to_json(noto::connection_config const &config) -> boost::json::value;
|
||||
auto to_json(std::vector<noto::connection_config> const &configs) -> boost::json::value;
|
||||
|
||||
}
|
||||
|
||||
+11
-10
@@ -28,6 +28,7 @@ namespace noto {
|
||||
namespace detail {
|
||||
|
||||
struct statement_core;
|
||||
|
||||
struct connection_core;
|
||||
|
||||
}
|
||||
@@ -46,7 +47,7 @@ struct sqlite_value {
|
||||
sqlite_value(std::int32_t value);
|
||||
sqlite_value(std::int64_t value);
|
||||
sqlite_value(std::float64_t value);
|
||||
sqlite_value(std::char_t const* value);
|
||||
sqlite_value(std::char_t const *value);
|
||||
sqlite_value(std::string value);
|
||||
sqlite_value(std::string_view value);
|
||||
sqlite_value(std::vector<std::byte> value);
|
||||
@@ -84,11 +85,11 @@ class connection;
|
||||
class statement {
|
||||
public:
|
||||
statement() = default;
|
||||
statement(noto::statement const&) = delete;
|
||||
statement(noto::statement&& other) noexcept = default;
|
||||
statement(noto::statement const &) = delete;
|
||||
statement(noto::statement &&other) noexcept = default;
|
||||
~statement();
|
||||
auto operator=(noto::statement const&) -> noto::statement& = delete;
|
||||
auto operator=(noto::statement&& other) noexcept -> noto::statement& = default;
|
||||
auto operator=(noto::statement const &) -> noto::statement & = delete;
|
||||
auto operator=(noto::statement &&other) noexcept -> noto::statement & = default;
|
||||
auto valid() const -> std::bool_t;
|
||||
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>>;
|
||||
@@ -105,11 +106,11 @@ private:
|
||||
class connection {
|
||||
public:
|
||||
connection(boost::asio::any_io_executor executor, noto::connection_config config);
|
||||
connection(noto::connection const&) = delete;
|
||||
connection(noto::connection&&) noexcept = default;
|
||||
connection(noto::connection const &) = delete;
|
||||
connection(noto::connection &&) noexcept = default;
|
||||
~connection();
|
||||
auto operator=(noto::connection const&) -> noto::connection& = delete;
|
||||
auto operator=(noto::connection&&) noexcept -> noto::connection& = default;
|
||||
auto operator=(noto::connection const &) -> noto::connection & = delete;
|
||||
auto operator=(noto::connection &&) noexcept -> noto::connection & = default;
|
||||
auto config() const -> noto::connection_config;
|
||||
auto state() const -> noto::connection_state;
|
||||
auto async_connect() -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
@@ -168,7 +169,7 @@ auto noto::connection::async_with_transaction(noto::transaction_mode mode, CALLB
|
||||
auto exception_status = std::optional<modulus::error>{};
|
||||
try {
|
||||
callback_status = co_await callback(connection);
|
||||
} catch (std::exception const& error) {
|
||||
} catch (std::exception const &error) {
|
||||
exception_status = noto::detail::make_error(noto::detail::error_internal, std::string{"transaction callback threw: "} + error.what());
|
||||
} catch (...) {
|
||||
exception_status = noto::detail::make_error(noto::detail::error_internal, "transaction callback threw an unknown exception");
|
||||
|
||||
@@ -51,7 +51,7 @@ struct connection_core : std::enable_shared_from_this<noto::detail::connection_c
|
||||
boost::asio::strand<boost::asio::any_io_executor> strand;
|
||||
noto::connection_config config{};
|
||||
std::chrono::milliseconds busy_timeout{};
|
||||
sqlite3* database{};
|
||||
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{};
|
||||
@@ -59,14 +59,14 @@ struct connection_core : std::enable_shared_from_this<noto::detail::connection_c
|
||||
};
|
||||
|
||||
struct statement_core {
|
||||
statement_core(std::shared_ptr<noto::detail::connection_core> connection, sqlite3_stmt* statement);
|
||||
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{};
|
||||
sqlite3_stmt *statement{};
|
||||
std::atomic_bool finalized{};
|
||||
std::bool_t counted{};
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace noto::detail {
|
||||
|
||||
constexpr std::int32_t error_invalid_argument{1};
|
||||
@@ -29,13 +30,13 @@ constexpr std::int32_t error_internal{15};
|
||||
auto make_error(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> modulus::error;
|
||||
auto fail_void(modulus::error error) -> std::expected<void, modulus::error>;
|
||||
auto fail_void(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<void, modulus::error>;
|
||||
auto fail_void(std::expected<void, modulus::error> const& result) -> std::expected<void, modulus::error>;
|
||||
auto fail_void(std::expected<void, modulus::error> const &result) -> std::expected<void, modulus::error>;
|
||||
|
||||
template <typename VALUE>
|
||||
auto fail(modulus::error error) -> std::expected<VALUE, modulus::error>;
|
||||
|
||||
template <typename VALUE>
|
||||
auto fail(std::expected<void, modulus::error> const& result) -> std::expected<VALUE, modulus::error>;
|
||||
auto fail(std::expected<void, modulus::error> const &result) -> std::expected<VALUE, modulus::error>;
|
||||
|
||||
template <typename VALUE>
|
||||
auto fail(std::int32_t code, std::string message, modulus::source_location location = modulus::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION())) -> std::expected<VALUE, modulus::error>;
|
||||
@@ -48,7 +49,7 @@ auto noto::detail::fail(modulus::error error) -> std::expected<VALUE, modulus::e
|
||||
}
|
||||
|
||||
template <typename VALUE>
|
||||
auto noto::detail::fail(std::expected<void, modulus::error> const& result) -> std::expected<VALUE, modulus::error> {
|
||||
auto noto::detail::fail(std::expected<void, modulus::error> const &result) -> std::expected<VALUE, modulus::error> {
|
||||
assert(!result);
|
||||
return modulus::fail<VALUE>(result.error());
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace noto::detail {
|
||||
|
||||
auto quote_sql_literal(std::string_view value, std::string_view label, std::bool_t allow_empty = true) -> std::expected<std::string, modulus::error>;
|
||||
|
||||
@@ -6,11 +6,12 @@
|
||||
#include <modulus.hpp>
|
||||
#include <cstdint>
|
||||
|
||||
|
||||
struct sqlite3;
|
||||
|
||||
namespace noto {
|
||||
|
||||
auto error_from(std::int32_t code, sqlite3* database = nullptr, std::string_view operation = {}) -> modulus::error;
|
||||
auto result_from(std::int32_t code, sqlite3* database = nullptr, std::string_view operation = {}) -> std::expected<void, modulus::error>;
|
||||
auto error_from(std::int32_t code, sqlite3 *database = nullptr, std::string_view operation = {}) -> modulus::error;
|
||||
auto result_from(std::int32_t code, sqlite3 *database = nullptr, std::string_view operation = {}) -> std::expected<void, modulus::error>;
|
||||
|
||||
}
|
||||
|
||||
@@ -18,8 +18,8 @@ struct migration {
|
||||
std::string id{};
|
||||
std::string description{};
|
||||
std::string checksum{};
|
||||
std::function<boost::asio::awaitable<std::expected<void, modulus::error>>(noto::connection&)> up{};
|
||||
std::function<boost::asio::awaitable<std::expected<void, modulus::error>>(noto::connection&)> down{};
|
||||
std::function<boost::asio::awaitable<std::expected<void, modulus::error>>(noto::connection &)> up{};
|
||||
std::function<boost::asio::awaitable<std::expected<void, modulus::error>>(noto::connection &)> down{};
|
||||
};
|
||||
|
||||
struct migration_record {
|
||||
@@ -35,12 +35,12 @@ struct migration_options {
|
||||
|
||||
class migrator {
|
||||
public:
|
||||
migrator(noto::connection& connection, noto::migration_options options = {});
|
||||
migrator(noto::connection &connection, noto::migration_options options = {});
|
||||
auto async_applied_migrations() -> boost::asio::awaitable<std::expected<std::vector<noto::migration_record>, modulus::error>>;
|
||||
auto async_migrate(std::vector<noto::migration> migrations) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
auto async_rollback(std::vector<noto::migration> migrations, std::string target_id = {}) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
||||
private:
|
||||
noto::connection* connection_{};
|
||||
noto::connection *connection_{};
|
||||
noto::migration_options options_{};
|
||||
};
|
||||
|
||||
|
||||
@@ -9,13 +9,14 @@
|
||||
|
||||
#include <modulus.hpp>
|
||||
|
||||
|
||||
namespace noto {
|
||||
|
||||
class trusted_sql_fragment {
|
||||
public:
|
||||
trusted_sql_fragment() = default;
|
||||
static auto unsafe(std::string sql) -> std::expected<noto::trusted_sql_fragment, modulus::error>;
|
||||
auto value() const -> std::string const&;
|
||||
auto value() const -> std::string const &;
|
||||
auto empty() const -> std::bool_t;
|
||||
private:
|
||||
explicit trusted_sql_fragment(std::string sql);
|
||||
@@ -35,7 +36,7 @@ public:
|
||||
static auto timestamp() -> noto::column_type;
|
||||
static auto decimal(std::uint32_t precision, std::uint32_t scale) -> std::expected<noto::column_type, modulus::error>;
|
||||
static auto trusted(noto::trusted_sql_fragment fragment) -> noto::column_type;
|
||||
auto sql() const -> std::string const&;
|
||||
auto sql() const -> std::string const &;
|
||||
auto empty() const -> std::bool_t;
|
||||
private:
|
||||
explicit column_type(std::string sql);
|
||||
@@ -53,7 +54,7 @@ public:
|
||||
static auto boolean(std::bool_t value) -> noto::default_value;
|
||||
static auto current_timestamp() -> noto::default_value;
|
||||
static auto trusted_expression(noto::trusted_sql_fragment fragment) -> noto::default_value;
|
||||
auto sql() const -> std::string const&;
|
||||
auto sql() const -> std::string const &;
|
||||
auto empty() const -> std::bool_t;
|
||||
private:
|
||||
explicit default_value(std::string sql);
|
||||
@@ -137,10 +138,10 @@ struct index_definition {
|
||||
};
|
||||
|
||||
auto quote_identifier(std::string_view identifier) -> std::expected<std::string, modulus::error>;
|
||||
auto create_table_sql(noto::table_definition const& definition) -> std::expected<std::string, modulus::error>;
|
||||
auto drop_table_sql(noto::table_name const& table, std::bool_t if_exists = true) -> std::expected<std::string, modulus::error>;
|
||||
auto create_index_sql(noto::index_definition const& definition) -> std::expected<std::string, modulus::error>;
|
||||
auto drop_index_sql(noto::index_definition const& definition) -> std::expected<std::string, modulus::error>;
|
||||
auto create_table_sql(noto::table_definition const &definition) -> std::expected<std::string, modulus::error>;
|
||||
auto drop_table_sql(noto::table_name const &table, std::bool_t if_exists = true) -> std::expected<std::string, modulus::error>;
|
||||
auto create_index_sql(noto::index_definition const &definition) -> std::expected<std::string, modulus::error>;
|
||||
auto drop_index_sql(noto::index_definition const &definition) -> std::expected<std::string, modulus::error>;
|
||||
auto table_exists_sql() -> std::string;
|
||||
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace noto {
|
||||
namespace detail {
|
||||
|
||||
struct connection_core;
|
||||
|
||||
struct transaction_state;
|
||||
|
||||
}
|
||||
@@ -28,11 +29,11 @@ class connection;
|
||||
class transaction {
|
||||
public:
|
||||
transaction() = default;
|
||||
transaction(noto::transaction const&) = delete;
|
||||
transaction(noto::transaction&& other) noexcept;
|
||||
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 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>>;
|
||||
|
||||
Reference in New Issue
Block a user