diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2018-06-07 15:05:32 +0200 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2018-06-12 17:41:16 +0200 |
commit | 4477dd41198ac827781a6bbf50aeb0b1d3a66a45 (patch) | |
tree | 0e24918a8bafa9acf982d5a28b3a01bbd50d14b7 /platform/default | |
parent | a50493ea511989d0b040f24780964d532f1f4ee3 (diff) | |
download | qtlocation-mapboxgl-4477dd41198ac827781a6bbf50aeb0b1d3a66a45.tar.gz |
[core] support moving Database object during a Transaction
Diffstat (limited to 'platform/default')
-rw-r--r-- | platform/default/sqlite3.cpp | 31 | ||||
-rw-r--r-- | platform/default/sqlite3.hpp | 4 |
2 files changed, 24 insertions, 11 deletions
diff --git a/platform/default/sqlite3.cpp b/platform/default/sqlite3.cpp index fb293b2b5b..2e76f6eec4 100644 --- a/platform/default/sqlite3.cpp +++ b/platform/default/sqlite3.cpp @@ -27,6 +27,9 @@ public: } } + void setBusyTimeout(std::chrono::milliseconds timeout); + void exec(const std::string& sql); + sqlite3* db; }; @@ -116,23 +119,31 @@ Database::~Database() = default; void Database::setBusyTimeout(std::chrono::milliseconds timeout) { assert(impl); - const int err = sqlite3_busy_timeout(impl->db, + impl->setBusyTimeout(timeout); +} + +void DatabaseImpl::setBusyTimeout(std::chrono::milliseconds timeout) { + const int err = sqlite3_busy_timeout(db, int(std::min<std::chrono::milliseconds::rep>(timeout.count(), std::numeric_limits<int>::max()))); if (err != SQLITE_OK) { - throw Exception { err, sqlite3_errmsg(impl->db) }; + throw Exception { err, sqlite3_errmsg(db) }; } } void Database::exec(const std::string &sql) { assert(impl); + impl->exec(sql); +} + +void DatabaseImpl::exec(const std::string& sql) { char *msg = nullptr; - const int err = sqlite3_exec(impl->db, sql.c_str(), nullptr, nullptr, &msg); + const int err = sqlite3_exec(db, sql.c_str(), nullptr, nullptr, &msg); if (msg) { const std::string message = msg; sqlite3_free(msg); throw Exception { err, message }; } else if (err != SQLITE_OK) { - throw Exception { err, sqlite3_errmsg(impl->db) }; + throw Exception { err, sqlite3_errmsg(db) }; } } @@ -405,16 +416,16 @@ uint64_t Query::changes() const { } Transaction::Transaction(Database& db_, Mode mode) - : db(db_) { + : dbImpl(*db_.impl) { switch (mode) { case Deferred: - db.exec("BEGIN DEFERRED TRANSACTION"); + dbImpl.exec("BEGIN DEFERRED TRANSACTION"); break; case Immediate: - db.exec("BEGIN IMMEDIATE TRANSACTION"); + dbImpl.exec("BEGIN IMMEDIATE TRANSACTION"); break; case Exclusive: - db.exec("BEGIN EXCLUSIVE TRANSACTION"); + dbImpl.exec("BEGIN EXCLUSIVE TRANSACTION"); break; } } @@ -431,12 +442,12 @@ Transaction::~Transaction() { void Transaction::commit() { needRollback = false; - db.exec("COMMIT TRANSACTION"); + dbImpl.exec("COMMIT TRANSACTION"); } void Transaction::rollback() { needRollback = false; - db.exec("ROLLBACK TRANSACTION"); + dbImpl.exec("ROLLBACK TRANSACTION"); } } // namespace sqlite diff --git a/platform/default/sqlite3.hpp b/platform/default/sqlite3.hpp index cdc94298fe..52cc3f8fc5 100644 --- a/platform/default/sqlite3.hpp +++ b/platform/default/sqlite3.hpp @@ -69,6 +69,7 @@ class DatabaseImpl; class Statement; class StatementImpl; class Query; +class Transaction; class Database { private: @@ -91,6 +92,7 @@ private: std::unique_ptr<DatabaseImpl> impl; friend class Statement; + friend class Transaction; }; // A Statement object represents a prepared statement that can be run repeatedly run with a Query object. @@ -173,7 +175,7 @@ public: void rollback(); private: - Database& db; + DatabaseImpl& dbImpl; bool needRollback = true; }; |