Mercurial > hg > orthanc-databases
annotate Framework/Common/DatabaseManager.h @ 47:771b3c4bf5f8
integration OrthancPostgreSQL-2.2->mainline
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 18 Jul 2018 12:28:52 +0200 |
parents | 2fb9cd42af14 |
children | 714c5d2bee76 |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #pragma once | |
23 | |
24 #include "IDatabaseFactory.h" | |
25 #include "StatementLocation.h" | |
26 | |
27 #include <Core/Enumerations.h> | |
28 | |
29 #include <boost/thread/recursive_mutex.hpp> | |
30 #include <memory> | |
31 | |
32 namespace OrthancDatabases | |
33 { | |
34 class DatabaseManager : public boost::noncopyable | |
35 { | |
36 private: | |
37 typedef std::map<StatementLocation, IPrecompiledStatement*> CachedStatements; | |
38 | |
39 boost::recursive_mutex mutex_; | |
40 std::auto_ptr<IDatabaseFactory> factory_; | |
41 std::auto_ptr<IDatabase> database_; | |
42 std::auto_ptr<ITransaction> transaction_; | |
43 CachedStatements cachedStatements_; | |
44 Dialect dialect_; | |
45 | |
46 IDatabase& GetDatabase(); | |
47 | |
48 void CloseIfUnavailable(Orthanc::ErrorCode e); | |
49 | |
50 IPrecompiledStatement* LookupCachedStatement(const StatementLocation& location) const; | |
51 | |
52 IPrecompiledStatement& CacheStatement(const StatementLocation& location, | |
53 const Query& query); | |
54 | |
55 ITransaction& GetTransaction(); | |
14
9774802fd05f
PostgreSQLStorageArea working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
12
diff
changeset
|
56 |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
57 void ReleaseImplicitTransaction(); |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
58 |
0 | 59 public: |
29 | 60 explicit DatabaseManager(IDatabaseFactory* factory); // Takes ownership |
0 | 61 |
62 ~DatabaseManager() | |
63 { | |
64 Close(); | |
65 } | |
66 | |
67 Dialect GetDialect() const | |
68 { | |
69 return dialect_; | |
70 } | |
71 | |
72 void Open() | |
73 { | |
74 GetDatabase(); | |
75 } | |
76 | |
77 void Close(); | |
78 | |
79 void StartTransaction(); | |
80 | |
81 void CommitTransaction(); | |
82 | |
83 void RollbackTransaction(); | |
84 | |
12
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
85 |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
86 // This class is only used in the "StorageBackend" |
12
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
87 class Transaction : public boost::noncopyable |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
88 { |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
89 private: |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
90 boost::recursive_mutex::scoped_lock lock_; |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
91 DatabaseManager& manager_; |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
92 IDatabase& database_; |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
93 bool committed_; |
12
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
94 |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
95 public: |
29 | 96 explicit Transaction(DatabaseManager& manager); |
12
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
97 |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
98 ~Transaction(); |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
99 |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
100 void Commit(); |
12
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
101 |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
102 DatabaseManager& GetManager() |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
103 { |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
104 return manager_; |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
105 } |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
106 |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
107 IDatabase& GetDatabase() |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
108 { |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
109 return database_; |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
110 } |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
111 }; |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
112 |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
113 |
0 | 114 class CachedStatement : public boost::noncopyable |
115 { | |
116 private: | |
29 | 117 DatabaseManager& manager_; |
0 | 118 boost::recursive_mutex::scoped_lock lock_; |
18 | 119 IDatabase& database_; |
0 | 120 StatementLocation location_; |
121 ITransaction& transaction_; | |
122 IPrecompiledStatement* statement_; | |
123 std::auto_ptr<Query> query_; | |
124 std::auto_ptr<IResult> result_; | |
125 | |
12
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
126 void Setup(const char* sql); |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
127 |
0 | 128 IResult& GetResult() const; |
129 | |
130 public: | |
131 CachedStatement(const StatementLocation& location, | |
132 DatabaseManager& manager, | |
133 const char* sql); | |
134 | |
12
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
135 CachedStatement(const StatementLocation& location, |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
136 Transaction& transaction, |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
137 const char* sql); |
41543239072d
transactions for storage area
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
138 |
23
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
139 ~CachedStatement(); |
b2ff1cd2907a
handling of implicit transactions in DatabaseManager
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
18
diff
changeset
|
140 |
18 | 141 IDatabase& GetDatabase() |
142 { | |
143 return database_; | |
144 } | |
145 | |
0 | 146 void SetReadOnly(bool readOnly); |
147 | |
148 void SetParameterType(const std::string& parameter, | |
149 ValueType type); | |
150 | |
151 void Execute(); | |
152 | |
153 void Execute(const Dictionary& parameters); | |
154 | |
155 bool IsDone() const; | |
156 | |
157 void Next(); | |
158 | |
159 size_t GetResultFieldsCount() const; | |
160 | |
161 void SetResultFieldType(size_t field, | |
162 ValueType type); | |
163 | |
164 const IValue& GetResultField(size_t index) const; | |
165 }; | |
166 }; | |
167 } |