From ab721847ba7516f436debebe2975dbcb7bfe7153 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 17:12:50 +0100 Subject: [PATCH] feat(SmartTransaction): don't use soci::transaction, use soci::session methods to deal directly with transactions --- src/db/abstract/abstract-db-p.h | 4 ---- src/db/internal/db-exception-handler.h | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/db/abstract/abstract-db-p.h b/src/db/abstract/abstract-db-p.h index b74a82157..fa2d12c3f 100644 --- a/src/db/abstract/abstract-db-p.h +++ b/src/db/abstract/abstract-db-p.h @@ -20,8 +20,6 @@ #ifndef _L_ABSTRACT_DB_P_H_ #define _L_ABSTRACT_DB_P_H_ -#include - #include "abstract-db.h" #include "db/session/db-session.h" #include "object/object-p.h" @@ -36,8 +34,6 @@ public: DbSession dbSession; - const std::thread::id threadId = std::this_thread::get_id(); - private: AbstractDb::Backend backend; diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index 2993c58e0..74084a7ac 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -37,23 +37,31 @@ LINPHONE_BEGIN_NAMESPACE class SmartTransaction { public: SmartTransaction (soci::session *session, const char *name) : - mTransaction(*session), mName(name), mIsCommitted(false) { + mSession(session), mName(name), mIsCommitted(false) { lInfo() << "Start transaction " << this << " in MainDb::" << mName << "."; + mSession->begin(); } ~SmartTransaction () { - if (!mIsCommitted) + if (!mIsCommitted) { lInfo() << "Rollback transaction " << this << " in MainDb::" << mName << "."; + mSession->rollback(); + } } void commit () { - mTransaction.commit(); - mIsCommitted = true; + if (mIsCommitted) { + lError() << "Transaction " << this << " in MainDb::" << mName << " already committed!!!"; + return; + } + lInfo() << "Commit transaction " << this << " in MainDb::" << mName << "."; + mIsCommitted = true; + mSession->commit(); } private: - soci::transaction mTransaction; + soci::session *mSession; const char *mName; bool mIsCommitted; @@ -86,8 +94,6 @@ public: DbExceptionHandler (DbExceptionHandlerInfo &info, Function &&function) : mFunction(std::move(function)) { MainDb *mainDb = info.mainDb; - L_ASSERT(mainDb->getPrivate()->threadId == std::this_thread::get_id()); - const char *name = info.name; soci::session *session = mainDb->getPrivate()->dbSession.getBackendSession();