Clang: Handle a busy database in the PCH plugin

This can be always happen for write statements. It fixes the wrong behavior
of the transaction that it tried to rollback if begin fails. If begin fails
the transaction never started so there is nothing to rollback.

Change-Id: I8a03162257fa22a0bb66ccb844f90c6afbc7db64
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2018-03-28 16:25:01 +02:00
parent 789379a8e3
commit 5870905db6
4 changed files with 162 additions and 5 deletions

View File

@@ -71,9 +71,11 @@ protected:
{
}
protected:
TransactionInterface &m_interface;
bool m_isAlreadyCommited = false;
bool m_rollback = false;
};
class AbstractThrowingTransaction : public AbstractTransaction
@@ -84,7 +86,7 @@ public:
~AbstractThrowingTransaction() noexcept(false)
{
try {
if (!m_isAlreadyCommited)
if (m_rollback)
m_interface.rollback();
} catch (...) {
if (!std::uncaught_exception())
@@ -107,7 +109,7 @@ public:
~AbstractNonThrowingDestructorTransaction()
{
try {
if (!m_isAlreadyCommited)
if (m_rollback)
m_interface.rollback();
} catch (...) {
}
@@ -129,6 +131,11 @@ public:
{
interface.deferredBegin();
}
~BasicDeferredTransaction()
{
BaseTransaction::m_rollback = !BaseTransaction::m_isAlreadyCommited;
}
};
using DeferredTransaction = BasicDeferredTransaction<AbstractThrowingTransaction>;
@@ -143,6 +150,11 @@ public:
{
interface.immediateBegin();
}
~BasicImmediateTransaction()
{
BaseTransaction::m_rollback = !BaseTransaction::m_isAlreadyCommited;
}
};
using ImmediateTransaction = BasicImmediateTransaction<AbstractThrowingTransaction>;
@@ -157,6 +169,11 @@ public:
{
interface.exclusiveBegin();
}
~BasicExclusiveTransaction()
{
BaseTransaction::m_rollback = !BaseTransaction::m_isAlreadyCommited;
}
};
using ExclusiveTransaction = BasicExclusiveTransaction<AbstractThrowingTransaction>;