File: TransactionScope.cpp

package info (click to toggle)
audacity 3.2.4%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 106,704 kB
  • sloc: cpp: 277,038; ansic: 73,623; lisp: 7,761; python: 3,305; sh: 2,715; perl: 821; xml: 275; makefile: 119
file content (61 lines) | stat: -rw-r--r-- 1,574 bytes parent folder | download | duplicates (3)
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;
}