From 49dc6c84f12ae8e9bdac5e5be7f0a71a68edb500 Mon Sep 17 00:00:00 2001 From: emeric Date: Fri, 17 May 2019 13:11:04 +0200 Subject: [PATCH] Added a database version check --- src/database/DatabaseHandler.cpp | 49 ++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/database/DatabaseHandler.cpp b/src/database/DatabaseHandler.cpp index 41675d33..a2302554 100644 --- a/src/database/DatabaseHandler.cpp +++ b/src/database/DatabaseHandler.cpp @@ -31,6 +31,7 @@ #include #include +#include "utils/Exception.hpp" #include "utils/Logger.hpp" #include "Artist.hpp" @@ -45,12 +46,42 @@ namespace Database { +#define LMS_DATABASE_VERSION 1 namespace { Wt::Auth::AuthService authService; Wt::Auth::PasswordService passwordService {authService}; } +using Version = std::size_t; + +class VersionInfo +{ + public: + using pointer = Wt::Dbo::ptr; + + static VersionInfo::pointer get(Wt::Dbo::Session& session) + { + pointer versionInfo {session.find()}; + if (!versionInfo) + versionInfo = session.add(std::make_unique()); + + return versionInfo; + } + + Version getVersion() const { return _version; } + void setVersion(Version version) { _version = static_cast(version); } + + template + void persist(Action& a) + { + Wt::Dbo::field(a, _version, "db_version"); + } + + private: + int _version {LMS_DATABASE_VERSION}; +}; + void Handler::configureAuth(void) @@ -100,6 +131,7 @@ Handler::Handler(Wt::Dbo::SqlConnectionPool& connectionPool) { _session.setConnectionPool(connectionPool); + _session.mapClass("version_info"); _session.mapClass("artist"); _session.mapClass("cluster"); _session.mapClass("cluster_type"); @@ -120,7 +152,7 @@ Handler::Handler(Wt::Dbo::SqlConnectionPool& connectionPool) _session.mapClass("user"); try { - Wt::Dbo::Transaction transaction(_session); + Wt::Dbo::Transaction transaction {_session}; _session.createTables(); @@ -131,8 +163,21 @@ Handler::Handler(Wt::Dbo::SqlConnectionPool& connectionPool) LMS_LOG(DB, ERROR) << "Cannot create tables: " << e.what(); } + try { - Wt::Dbo::Transaction transaction(_session); + Wt::Dbo::Transaction transaction {_session}; + + Version version {VersionInfo::get(_session)->getVersion()}; + if (version != LMS_DATABASE_VERSION) + throw LmsException {"Outdated database, please rebuild it (database migration not yet implemented)"}; + } + catch (std::exception& e) + { + throw LmsException {"Cannot get database version, please rebuild it (database migration not yet implemented)"}; + } + + { + Wt::Dbo::Transaction transaction {_session}; // Indexes _session.execute("CREATE INDEX IF NOT EXISTS track_path_idx ON track(file_path)");