From 973aec43ea54bbf95b64fbcb636403401d1ca60e Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Fri, 28 Aug 2026 18:03:05 +0200 Subject: Import from e4b104792206ee7ea64bf39c6b7d2c0c230f9d14 --- server/src/database.cppm | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 server/src/database.cppm (limited to 'server/src/database.cppm') diff --git a/server/src/database.cppm b/server/src/database.cppm new file mode 100644 index 0000000..0312dda --- /dev/null +++ b/server/src/database.cppm @@ -0,0 +1,37 @@ +export module routemon:database; + +import std; +import :sqlite3; + +namespace routemon::database { + + static constexpr std::int64_t expected_database_version = 1; + + export class connection { + sqlite3::connection dbc_; + + explicit connection(sqlite3::connection dbc) : dbc_{std::move(dbc)} {} + + friend auto open(std::string const& filename) -> std::shared_ptr; + + public: + // Nothing here yet + }; + + export auto open(std::string const& filename) -> std::shared_ptr { + auto dbc = sqlite3::open(filename); + try { + auto version = std::optional{}; + dbc.query("SELECT version FROM migration;").scan_single(version); + if (!version) + throw std::runtime_error{"failed to fetch database migration version"}; + if (version != expected_database_version) { + throw std::runtime_error{std::format("database migration version ({}) does not match expected version ({}), consider running migrations", *version, expected_database_version)}; + } + } catch (std::exception const& e) { + throw std::runtime_error{std::format("failed to query database version: {}", e.what())}; + } + return std::shared_ptr{new connection{std::move(dbc)}}; + } + +} // namespace routemon::database -- cgit v1.3