diff --git a/tddb/td/db/SqliteDb.cpp b/tddb/td/db/SqliteDb.cpp index 92a3621f..e3cb6a2c 100644 --- a/tddb/td/db/SqliteDb.cpp +++ b/tddb/td/db/SqliteDb.cpp @@ -136,10 +136,18 @@ Status SqliteDb::set_user_version(int32 version) { } Status SqliteDb::begin_transaction() { - return exec("BEGIN"); + if (raw_->on_begin()) { + return exec("BEGIN"); + } + return Status::OK(); } + Status SqliteDb::commit_transaction() { - return exec("COMMIT"); + TRY_RESULT(need_commit, raw_->on_commit()); + if (need_commit) { + return exec("COMMIT"); + } + return Status::OK(); } bool SqliteDb::is_encrypted() { diff --git a/tddb/td/db/detail/RawSqliteDb.h b/tddb/td/db/detail/RawSqliteDb.h index 401ebcf0..cee5da85 100644 --- a/tddb/td/db/detail/RawSqliteDb.h +++ b/tddb/td/db/detail/RawSqliteDb.h @@ -44,9 +44,22 @@ class RawSqliteDb { Status last_error(); static Status last_error(sqlite3 *db); + bool on_begin() { + begin_cnt_++; + return begin_cnt_ == 1; + } + Result on_commit() { + if (begin_cnt_ == 0) { + return Status::Error("No matching begin for commit"); + } + begin_cnt_--; + return begin_cnt_ == 0; + } + private: sqlite3 *db_; std::string path_; + size_t begin_cnt_{0}; }; } // namespace detail