From cfb3d7bda4ad9875807f8e322cdbf14438e08f64 Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Fri, 9 Aug 2019 14:31:45 +0300 Subject: [PATCH] Support recusrive transactions in sqlite usage GitOrigin-RevId: 1afd836ebd0c8b1cc79c86c9ef548deeb3f5adaa --- tddb/td/db/SqliteDb.cpp | 12 ++++++++++-- tddb/td/db/detail/RawSqliteDb.h | 13 +++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) 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