#include "dbtransaction.h" #include "ngldb_logger.h" #include thread_local int s_refCounter = 0; DBTransaction::DBTransaction(const QSqlDatabase &db) : m_db(db) , m_bCommitted(true) , mLogger(NGLDB::getLogger("DBTransaction")) { ++s_refCounter; if (s_refCounter == 1) begin(); } DBTransaction::~DBTransaction() { if (s_refCounter == 1) { if (!m_bCommitted) rollback(); } --s_refCounter; } bool DBTransaction::begin() { if (!m_bCommitted) return setState(false); if (!m_db.transaction()) { ERROR_LOG(mLogger) << "Error starting a transaction: " << m_db.lastError().driverText(); return setState(false); } m_bCommitted = false; return setState(true); } bool DBTransaction::commit() { if (s_refCounter == 1) { if (!m_db.commit()) { ERROR_LOG(mLogger) << "Error committing a transaction: " << m_db.lastError().driverText(); return setState(false); } m_bCommitted = true; return setState(true); } return true; } bool DBTransaction::rollback() { if (s_refCounter == 1) { if (!m_db.rollback()) { ERROR_LOG(mLogger) << "Error rolling back a transaction" << m_db.lastError().driverText(); return setState(false); } m_bCommitted = true; return setState(true); } return true; } bool DBTransaction::state() const { return m_lastState; } bool DBTransaction::setState(bool bState) { m_lastState = bState; return m_lastState; }