commit f09c568766486c8d33a87a3f750339fef783de0a
parent ddc5a55845720817977ca553915ce889dd363892
Author: cfillion <cfillion@users.noreply.github.com>
Date: Mon, 18 Jan 2016 15:20:30 -0500
prevent partial migrations
Diffstat:
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)