annotate Orthanc/Core/SQLite/Transaction.cpp @ 69:fe8dab5c051f

sync
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 07 Aug 2015 21:23:42 +0200
parents 15acbf5e7545
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 *
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Copyright (C) 2012-2015 Sebastien Jodogne <s.jodogne@gmail.com>,
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 * Medical Physics Department, CHU of Liege, Belgium
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 *
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 * Copyright (c) 2012 The Chromium Authors. All rights reserved.
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 *
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * Redistribution and use in source and binary forms, with or without
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * modification, are permitted provided that the following conditions are
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * met:
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 *
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * * Redistributions of source code must retain the above copyright
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * notice, this list of conditions and the following disclaimer.
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * * Redistributions in binary form must reproduce the above
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * copyright notice, this list of conditions and the following disclaimer
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 * in the documentation and/or other materials provided with the
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * distribution.
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * * Neither the name of Google Inc., the name of the CHU of Liege,
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 * nor the names of its contributors may be used to endorse or promote
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21 * products derived from this software without specific prior written
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22 * permission.
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 *
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 **/
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 #if ORTHANC_SQLITE_STANDALONE != 1
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39 #include "../PrecompiledHeaders.h"
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
40 #endif
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
42 #include "Transaction.h"
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
43 #include "OrthancSQLiteException.h"
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
44
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
45 namespace Orthanc
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
46 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
47 namespace SQLite
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
48 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
49 Transaction::Transaction(Connection& connection) :
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
50 connection_(connection),
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
51 isOpen_(false)
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
52 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
53 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
54
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
55 Transaction::~Transaction()
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
56 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
57 if (isOpen_)
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
58 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
59 connection_.RollbackTransaction();
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
60 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
61 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
63 void Transaction::Begin()
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
65 if (isOpen_)
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
67 throw OrthancSQLiteException("SQLite: Beginning a transaction twice!");
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
68 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
69
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 isOpen_ = connection_.BeginTransaction();
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71 if (!isOpen_)
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
72 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
73 throw OrthancSQLiteException("SQLite: Unable to create a transaction");
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
74 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
75 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
77 void Transaction::Rollback()
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
78 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
79 if (!isOpen_)
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
80 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
81 throw OrthancSQLiteException("SQLite: Attempting to roll back a nonexistent transaction. "
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
82 "Did you remember to call Begin()?");
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
85 isOpen_ = false;
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
86
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
87 connection_.RollbackTransaction();
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
88 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
89
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
90 void Transaction::Commit()
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
91 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92 if (!isOpen_)
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
93 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
94 throw OrthancSQLiteException("SQLite: Attempting to roll back a nonexistent transaction. "
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
95 "Did you remember to call Begin()?");
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
96 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
97
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
98 isOpen_ = false;
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
99
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
100 if (!connection_.CommitTransaction())
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 {
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 throw OrthancSQLiteException("SQLite: Failure when committing the transaction");
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
104 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
105 }
15acbf5e7545 refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
106 }