83 lines
1.4 KiB
C++
Executable File
83 lines
1.4 KiB
C++
Executable File
|
|
|
|
|
|
#include "dbtransaction.h"
|
|
#include "ngldb_logger.h"
|
|
#include <QtSql/QSqlError>
|
|
|
|
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;
|
|
}
|