reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit f09c568766486c8d33a87a3f750339fef783de0a
parent ddc5a55845720817977ca553915ce889dd363892
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Mon, 18 Jan 2016 15:20:30 -0500

prevent partial migrations

Diffstat:
Msrc/database.cpp | 37++++++++++++++++++++++++-------------
Msrc/database.hpp | 4+++-
Msrc/registry.cpp | 6+++++-
3 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/src/database.cpp b/src/database.cpp @@ -46,19 +46,6 @@ Database::~Database() sqlite3_close(m_db); } -int Database::version() const -{ - int version = 0; - - Statement stmt("PRAGMA user_version", this); - stmt.exec([&] { - version = stmt.intColumn(0); - return false; - }); - - return version; -} - Statement *Database::prepare(const char *sql) { Statement *stmt = new Statement(sql, this); @@ -78,6 +65,30 @@ reapack_error Database::lastError() const return reapack_error(sqlite3_errmsg(m_db)); } +int Database::version() const +{ + int version = 0; + + Statement stmt("PRAGMA user_version", this); + stmt.exec([&] { + version = stmt.intColumn(0); + return false; + }); + + return version; +} + +void Database::begin() +{ + // EXCLUSIVE -> don't wait until the first query to aquire a lock + exec("BEGIN EXCLUSIVE TRANSACTION"); +} + +void Database::commit() +{ + exec("COMMIT"); +} + Statement::Statement(const char *sql, const Database *db) : m_db(db) { diff --git a/src/database.hpp b/src/database.hpp @@ -35,9 +35,11 @@ public: Database(const std::string &filename = std::string()); ~Database(); - int version() const; Statement *prepare(const char *sql); void exec(const char *sql); + int version() const; + void begin(); + void commit(); private: friend Statement; diff --git a/src/registry.cpp b/src/registry.cpp @@ -43,11 +43,13 @@ Registry::Registry(const Path &path) ); // lock the database - m_db.exec("BEGIN EXCLUSIVE TRANSACTION"); + m_db.begin(); } void Registry::migrate() { + m_db.begin(); + switch(m_db.version()) { case 0: // new database! @@ -69,6 +71,8 @@ void Registry::migrate() default: throw reapack_error("database was created with a newer version of ReaPack"); } + + m_db.commit(); } void Registry::push(Version *ver)