1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
/*!********************************************************************
Audacity: A Digital Audio Editor
@file TransactionScope.cpp
Paul Licameli split from DBConnection.cpp
**********************************************************************/
#include "TransactionScope.h"
#include "InconsistencyException.h"
#include <wx/log.h>
TransactionScopeImpl::~TransactionScopeImpl() = default;
TransactionScope::TransactionScope(
AudacityProject &project, const char *name)
: mName(name)
{
mpImpl = Factory::Call(project);
if (!mpImpl)
return;
mInTrans = mpImpl->TransactionStart(mName);
if ( !mInTrans )
// To do, improve the message
throw SimpleMessageBoxException( ExceptionType::Internal,
XO("Database error. Sorry, but we don't have more details."),
XO("Warning"),
"Error:_Disk_full_or_not_writable"
);
}
TransactionScope::~TransactionScope()
{
if (mpImpl && mInTrans)
{
if (!mpImpl->TransactionRollback(mName))
{
// Do not throw from a destructor!
// This has to be a no-fail cleanup that does the best that it can.
wxLogMessage("Transaction active at scope destruction");
}
}
}
bool TransactionScope::Commit()
{
if (mpImpl && !mInTrans) {
wxLogMessage("No active transaction to commit");
// Misuse of this class
THROW_INCONSISTENCY_EXCEPTION;
}
// If commit is unsuccessful, consider us still in a commit, for the dtor
// later
mInTrans = !mpImpl->TransactionCommit(mName);
return !mInTrans;
}
|