Mercurial > hg > orthanc
annotate OrthancServer/DatabaseWrapper.cpp @ 606:ce5d2040c47b find-move-scp
integration mainline -> find-move-scp
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 17 Oct 2013 14:20:13 +0200 |
parents | c2be0a0e049e b2357f1f026f |
children | dbecea588ef5 |
rev | line source |
---|---|
183 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
399 | 3 * Copyright (C) 2012-2013 Medical Physics Department, CHU of Liege, |
183 | 4 * Belgium |
5 * | |
6 * This program is free software: you can redistribute it and/or | |
7 * modify it under the terms of the GNU General Public License as | |
8 * published by the Free Software Foundation, either version 3 of the | |
9 * License, or (at your option) any later version. | |
10 * | |
11 * In addition, as a special exception, the copyright holders of this | |
12 * program give permission to link the code of its release with the | |
13 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
14 * that use the same license as the "OpenSSL" library), and distribute | |
15 * the linked executables. You must obey the GNU General Public License | |
16 * in all respects for all of the code used other than "OpenSSL". If you | |
17 * modify file(s) with this exception, you may extend this exception to | |
18 * your version of the file(s), but you are not obligated to do so. If | |
19 * you do not wish to do so, delete this exception statement from your | |
20 * version. If you delete this exception statement from all source files | |
21 * in the program, then also delete it here. | |
22 * | |
23 * This program is distributed in the hope that it will be useful, but | |
24 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
26 * General Public License for more details. | |
27 * | |
28 * You should have received a copy of the GNU General Public License | |
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
30 **/ | |
31 | |
32 | |
33 #include "DatabaseWrapper.h" | |
34 | |
35 #include "../Core/DicomFormat/DicomArray.h" | |
273
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
36 #include "../Core/Uuid.h" |
183 | 37 #include "EmbeddedResources.h" |
38 | |
39 #include <glog/logging.h> | |
40 #include <stdio.h> | |
41 | |
42 namespace Orthanc | |
43 { | |
44 | |
45 namespace Internals | |
46 { | |
47 class SignalFileDeleted : public SQLite::IScalarFunction | |
48 { | |
49 private: | |
50 IServerIndexListener& listener_; | |
51 | |
52 public: | |
53 SignalFileDeleted(IServerIndexListener& listener) : | |
54 listener_(listener) | |
55 { | |
56 } | |
57 | |
58 virtual const char* GetName() const | |
59 { | |
60 return "SignalFileDeleted"; | |
61 } | |
62 | |
63 virtual unsigned int GetCardinality() const | |
64 { | |
273
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
65 return 5; |
183 | 66 } |
67 | |
68 virtual void Compute(SQLite::FunctionContext& context) | |
69 { | |
273
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
70 FileInfo info(context.GetStringValue(0), |
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
71 static_cast<FileContentType>(context.GetIntValue(1)), |
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
72 static_cast<uint64_t>(context.GetInt64Value(2)), |
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
73 static_cast<CompressionType>(context.GetIntValue(3)), |
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
74 static_cast<uint64_t>(context.GetInt64Value(4))); |
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
75 |
d384af918264
more detailed signal about deleted file
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
76 listener_.SignalFileDeleted(info); |
183 | 77 } |
78 }; | |
79 | |
80 class SignalRemainingAncestor : public SQLite::IScalarFunction | |
81 { | |
82 private: | |
83 bool hasRemainingAncestor_; | |
84 std::string remainingPublicId_; | |
85 ResourceType remainingType_; | |
86 | |
87 public: | |
88 void Reset() | |
89 { | |
90 hasRemainingAncestor_ = false; | |
91 } | |
92 | |
93 virtual const char* GetName() const | |
94 { | |
95 return "SignalRemainingAncestor"; | |
96 } | |
97 | |
98 virtual unsigned int GetCardinality() const | |
99 { | |
100 return 2; | |
101 } | |
102 | |
103 virtual void Compute(SQLite::FunctionContext& context) | |
104 { | |
105 VLOG(1) << "There exists a remaining ancestor with public ID \"" | |
106 << context.GetStringValue(0) | |
107 << "\" of type " | |
108 << context.GetIntValue(1); | |
109 | |
110 if (!hasRemainingAncestor_ || | |
111 remainingType_ >= context.GetIntValue(1)) | |
112 { | |
113 hasRemainingAncestor_ = true; | |
114 remainingPublicId_ = context.GetStringValue(0); | |
115 remainingType_ = static_cast<ResourceType>(context.GetIntValue(1)); | |
116 } | |
117 } | |
118 | |
119 bool HasRemainingAncestor() const | |
120 { | |
121 return hasRemainingAncestor_; | |
122 } | |
123 | |
124 const std::string& GetRemainingAncestorId() const | |
125 { | |
126 assert(hasRemainingAncestor_); | |
127 return remainingPublicId_; | |
128 } | |
129 | |
130 ResourceType GetRemainingAncestorType() const | |
131 { | |
132 assert(hasRemainingAncestor_); | |
133 return remainingType_; | |
134 } | |
135 }; | |
136 } | |
137 | |
138 | |
139 | |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
140 void DatabaseWrapper::SetGlobalProperty(GlobalProperty property, |
183 | 141 const std::string& value) |
142 { | |
143 SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT OR REPLACE INTO GlobalProperties VALUES(?, ?)"); | |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
144 s.BindInt(0, property); |
183 | 145 s.BindString(1, value); |
146 s.Run(); | |
147 } | |
148 | |
188
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
149 bool DatabaseWrapper::LookupGlobalProperty(std::string& target, |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
150 GlobalProperty property) |
183 | 151 { |
152 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
153 "SELECT value FROM GlobalProperties WHERE property=?"); |
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
154 s.BindInt(0, property); |
183 | 155 |
156 if (!s.Step()) | |
157 { | |
158 return false; | |
159 } | |
160 else | |
161 { | |
162 target = s.ColumnString(0); | |
163 return true; | |
164 } | |
165 } | |
166 | |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
167 std::string DatabaseWrapper::GetGlobalProperty(GlobalProperty property, |
183 | 168 const std::string& defaultValue) |
169 { | |
170 std::string s; | |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
171 if (LookupGlobalProperty(s, property)) |
183 | 172 { |
173 return s; | |
174 } | |
175 else | |
176 { | |
177 return defaultValue; | |
178 } | |
179 } | |
180 | |
181 int64_t DatabaseWrapper::CreateResource(const std::string& publicId, | |
182 ResourceType type) | |
183 { | |
184 SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO Resources VALUES(NULL, ?, ?, NULL)"); | |
185 s.BindInt(0, type); | |
186 s.BindString(1, publicId); | |
187 s.Run(); | |
189
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
188 int64_t id = db_.GetLastInsertRowId(); |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
189 |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
190 ChangeType changeType; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
191 switch (type) |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
192 { |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
193 case ResourceType_Patient: |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
194 changeType = ChangeType_NewPatient; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
195 break; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
196 |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
197 case ResourceType_Study: |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
198 changeType = ChangeType_NewStudy; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
199 break; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
200 |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
201 case ResourceType_Series: |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
202 changeType = ChangeType_NewSeries; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
203 break; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
204 |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
205 case ResourceType_Instance: |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
206 changeType = ChangeType_NewInstance; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
207 break; |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
208 |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
209 default: |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
210 throw OrthancException(ErrorCode_InternalError); |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
211 } |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
212 |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
213 LogChange(changeType, id, type); |
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
214 return id; |
183 | 215 } |
216 | |
188
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
217 bool DatabaseWrapper::LookupResource(const std::string& publicId, |
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
218 int64_t& id, |
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
219 ResourceType& type) |
183 | 220 { |
221 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
222 "SELECT internalId, resourceType FROM Resources WHERE publicId=?"); | |
223 s.BindString(0, publicId); | |
224 | |
225 if (!s.Step()) | |
226 { | |
227 return false; | |
228 } | |
229 else | |
230 { | |
231 id = s.ColumnInt(0); | |
232 type = static_cast<ResourceType>(s.ColumnInt(1)); | |
233 | |
234 // Check whether there is a single resource with this public id | |
235 assert(!s.Step()); | |
236 | |
237 return true; | |
238 } | |
239 } | |
240 | |
198
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
241 bool DatabaseWrapper::LookupParent(int64_t& parentId, |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
242 int64_t resourceId) |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
243 { |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
244 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
245 "SELECT parentId FROM Resources WHERE internalId=?"); |
585 | 246 s.BindInt64(0, resourceId); |
198
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
247 |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
248 if (!s.Step()) |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
249 { |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
250 throw OrthancException(ErrorCode_UnknownResource); |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
251 } |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
252 |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
253 if (s.ColumnIsNull(0)) |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
254 { |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
255 return false; |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
256 } |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
257 else |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
258 { |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
259 parentId = s.ColumnInt(0); |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
260 return true; |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
261 } |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
262 } |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
263 |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
264 std::string DatabaseWrapper::GetPublicId(int64_t resourceId) |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
265 { |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
266 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
267 "SELECT publicId FROM Resources WHERE internalId=?"); |
585 | 268 s.BindInt64(0, resourceId); |
198
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
269 |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
270 if (!s.Step()) |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
271 { |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
272 throw OrthancException(ErrorCode_UnknownResource); |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
273 } |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
274 |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
275 return s.ColumnString(0); |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
276 } |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
277 |
304 | 278 |
279 ResourceType DatabaseWrapper::GetResourceType(int64_t resourceId) | |
280 { | |
281 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
282 "SELECT resourceType FROM Resources WHERE internalId=?"); | |
585 | 283 s.BindInt64(0, resourceId); |
304 | 284 |
285 if (!s.Step()) | |
286 { | |
287 throw OrthancException(ErrorCode_UnknownResource); | |
288 } | |
289 | |
290 return static_cast<ResourceType>(s.ColumnInt(0)); | |
291 } | |
292 | |
293 | |
183 | 294 void DatabaseWrapper::AttachChild(int64_t parent, |
295 int64_t child) | |
296 { | |
297 SQLite::Statement s(db_, SQLITE_FROM_HERE, "UPDATE Resources SET parentId = ? WHERE internalId = ?"); | |
585 | 298 s.BindInt64(0, parent); |
299 s.BindInt64(1, child); | |
183 | 300 s.Run(); |
301 } | |
302 | |
193
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
303 void DatabaseWrapper::GetChildren(Json::Value& childrenPublicIds, |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
304 int64_t id) |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
305 { |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
306 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT publicId FROM Resources WHERE parentId=?"); |
585 | 307 s.BindInt64(0, id); |
193
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
308 |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
309 childrenPublicIds = Json::arrayValue; |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
310 while (s.Step()) |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
311 { |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
312 childrenPublicIds.append(s.ColumnString(0)); |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
313 } |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
314 } |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
315 |
a1b9d1e1497b
failed attempt to compile with linux standard base
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
192
diff
changeset
|
316 |
183 | 317 void DatabaseWrapper::DeleteResource(int64_t id) |
318 { | |
319 signalRemainingAncestor_->Reset(); | |
320 | |
321 SQLite::Statement s(db_, SQLITE_FROM_HERE, "DELETE FROM Resources WHERE internalId=?"); | |
585 | 322 s.BindInt64(0, id); |
183 | 323 s.Run(); |
324 | |
325 if (signalRemainingAncestor_->HasRemainingAncestor()) | |
326 { | |
327 listener_.SignalRemainingAncestor(signalRemainingAncestor_->GetRemainingAncestorType(), | |
328 signalRemainingAncestor_->GetRemainingAncestorId()); | |
329 } | |
330 } | |
331 | |
332 void DatabaseWrapper::SetMetadata(int64_t id, | |
333 MetadataType type, | |
334 const std::string& value) | |
335 { | |
336 SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT OR REPLACE INTO Metadata VALUES(?, ?, ?)"); | |
585 | 337 s.BindInt64(0, id); |
183 | 338 s.BindInt(1, type); |
339 s.BindString(2, value); | |
340 s.Run(); | |
341 } | |
342 | |
438 | 343 void DatabaseWrapper::DeleteMetadata(int64_t id, |
344 MetadataType type) | |
345 { | |
346 SQLite::Statement s(db_, SQLITE_FROM_HERE, "DELETE FROM Metadata WHERE id=? and type=?"); | |
585 | 347 s.BindInt64(0, id); |
438 | 348 s.BindInt(1, type); |
349 s.Run(); | |
350 } | |
351 | |
188
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
352 bool DatabaseWrapper::LookupMetadata(std::string& target, |
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
353 int64_t id, |
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
354 MetadataType type) |
183 | 355 { |
356 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
357 "SELECT value FROM Metadata WHERE id=? AND type=?"); | |
585 | 358 s.BindInt64(0, id); |
183 | 359 s.BindInt(1, type); |
360 | |
361 if (!s.Step()) | |
362 { | |
363 return false; | |
364 } | |
365 else | |
366 { | |
367 target = s.ColumnString(0); | |
368 return true; | |
369 } | |
370 } | |
371 | |
436
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
372 bool DatabaseWrapper::ListAvailableMetadata(std::list<MetadataType>& target, |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
373 int64_t id) |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
374 { |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
375 target.clear(); |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
376 |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
377 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT type FROM Metadata WHERE id=?"); |
585 | 378 s.BindInt64(0, id); |
436
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
379 |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
380 while (s.Step()) |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
381 { |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
382 target.push_back(static_cast<MetadataType>(s.ColumnInt(0))); |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
383 } |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
384 |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
385 return true; |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
386 } |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
387 |
d51186bf7602
read access to metadata
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
434
diff
changeset
|
388 |
183 | 389 std::string DatabaseWrapper::GetMetadata(int64_t id, |
390 MetadataType type, | |
391 const std::string& defaultValue) | |
392 { | |
393 std::string s; | |
188
090cefdab1d1
fix because of Windows macros
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
187
diff
changeset
|
394 if (LookupMetadata(s, id, type)) |
183 | 395 { |
396 return s; | |
397 } | |
398 else | |
399 { | |
400 return defaultValue; | |
401 } | |
402 } | |
403 | |
200
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
404 |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
405 bool DatabaseWrapper::GetMetadataAsInteger(int& result, |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
406 int64_t id, |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
407 MetadataType type) |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
408 { |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
409 std::string s = GetMetadata(id, type, ""); |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
410 if (s.size() == 0) |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
411 { |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
412 return false; |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
413 } |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
414 |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
415 try |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
416 { |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
417 result = boost::lexical_cast<int>(s); |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
418 return true; |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
419 } |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
420 catch (boost::bad_lexical_cast&) |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
421 { |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
422 return false; |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
423 } |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
424 } |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
425 |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
426 |
9c58b2b03cf0
refactoring of read operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
199
diff
changeset
|
427 |
232
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
428 void DatabaseWrapper::AddAttachment(int64_t id, |
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
429 const FileInfo& attachment) |
183 | 430 { |
431 SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO AttachedFiles VALUES(?, ?, ?, ?, ?, ?)"); | |
585 | 432 s.BindInt64(0, id); |
233 | 433 s.BindInt(1, attachment.GetContentType()); |
232
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
434 s.BindString(2, attachment.GetUuid()); |
585 | 435 s.BindInt64(3, attachment.GetCompressedSize()); |
436 s.BindInt64(4, attachment.GetUncompressedSize()); | |
232
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
437 s.BindInt(5, attachment.GetCompressionType()); |
183 | 438 s.Run(); |
439 } | |
440 | |
440
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
441 void DatabaseWrapper::ListAvailableAttachments(std::list<FileContentType>& result, |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
442 int64_t id) |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
443 { |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
444 result.clear(); |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
445 |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
446 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
447 "SELECT fileType FROM AttachedFiles WHERE id=?"); |
585 | 448 s.BindInt64(0, id); |
440
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
449 |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
450 while (s.Step()) |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
451 { |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
452 result.push_back(static_cast<FileContentType>(s.ColumnInt(0))); |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
453 } |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
454 } |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
455 |
232
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
456 bool DatabaseWrapper::LookupAttachment(FileInfo& attachment, |
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
457 int64_t id, |
233 | 458 FileContentType contentType) |
183 | 459 { |
460 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
232
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
461 "SELECT uuid, uncompressedSize, compressionType, compressedSize FROM AttachedFiles WHERE id=? AND fileType=?"); |
585 | 462 s.BindInt64(0, id); |
197
530a25320461
removal of text as ids in sqlite db
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
193
diff
changeset
|
463 s.BindInt(1, contentType); |
183 | 464 |
465 if (!s.Step()) | |
466 { | |
467 return false; | |
468 } | |
469 else | |
470 { | |
232
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
471 attachment = FileInfo(s.ColumnString(0), |
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
472 contentType, |
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
473 s.ColumnInt(1), |
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
474 static_cast<CompressionType>(s.ColumnInt(2)), |
5368bbe813cf
refactoring of attachments
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
231
diff
changeset
|
475 s.ColumnInt(3)); |
183 | 476 return true; |
477 } | |
478 } | |
479 | |
480 void DatabaseWrapper::SetMainDicomTags(int64_t id, | |
481 const DicomMap& tags) | |
482 { | |
483 DicomArray flattened(tags); | |
484 for (size_t i = 0; i < flattened.GetSize(); i++) | |
485 { | |
486 SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO MainDicomTags VALUES(?, ?, ?, ?)"); | |
585 | 487 s.BindInt64(0, id); |
183 | 488 s.BindInt(1, flattened.GetElement(i).GetTag().GetGroup()); |
489 s.BindInt(2, flattened.GetElement(i).GetTag().GetElement()); | |
490 s.BindString(3, flattened.GetElement(i).GetValue().AsString()); | |
491 s.Run(); | |
492 } | |
493 } | |
494 | |
495 void DatabaseWrapper::GetMainDicomTags(DicomMap& map, | |
496 int64_t id) | |
497 { | |
498 map.Clear(); | |
499 | |
500 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM MainDicomTags WHERE id=?"); | |
585 | 501 s.BindInt64(0, id); |
183 | 502 while (s.Step()) |
503 { | |
504 map.SetValue(s.ColumnInt(1), | |
505 s.ColumnInt(2), | |
506 s.ColumnString(3)); | |
507 } | |
508 } | |
509 | |
510 | |
511 bool DatabaseWrapper::GetParentPublicId(std::string& result, | |
512 int64_t id) | |
513 { | |
514 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT a.publicId FROM Resources AS a, Resources AS b " | |
515 "WHERE a.internalId = b.parentId AND b.internalId = ?"); | |
585 | 516 s.BindInt64(0, id); |
183 | 517 |
518 if (s.Step()) | |
519 { | |
520 result = s.ColumnString(0); | |
521 return true; | |
522 } | |
523 else | |
524 { | |
525 return false; | |
526 } | |
527 } | |
528 | |
529 | |
530 void DatabaseWrapper::GetChildrenPublicId(std::list<std::string>& result, | |
531 int64_t id) | |
532 { | |
533 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT a.publicId FROM Resources AS a, Resources AS b " | |
534 "WHERE a.parentId = b.internalId AND b.internalId = ?"); | |
585 | 535 s.BindInt64(0, id); |
183 | 536 |
537 result.clear(); | |
538 | |
539 while (s.Step()) | |
540 { | |
541 result.push_back(s.ColumnString(0)); | |
542 } | |
543 } | |
544 | |
545 | |
199 | 546 void DatabaseWrapper::GetChildrenInternalId(std::list<int64_t>& result, |
547 int64_t id) | |
548 { | |
549 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT a.internalId FROM Resources AS a, Resources AS b " | |
550 "WHERE a.parentId = b.internalId AND b.internalId = ?"); | |
585 | 551 s.BindInt64(0, id); |
199 | 552 |
553 result.clear(); | |
554 | |
555 while (s.Step()) | |
556 { | |
557 result.push_back(s.ColumnInt(0)); | |
558 } | |
559 } | |
560 | |
561 | |
183 | 562 void DatabaseWrapper::LogChange(ChangeType changeType, |
189
ccbc2cf64a0d
record main dicom tags and changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
188
diff
changeset
|
563 int64_t internalId, |
183 | 564 ResourceType resourceType, |
565 const boost::posix_time::ptime& date) | |
566 { | |
567 SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO Changes VALUES(NULL, ?, ?, ?, ?)"); | |
568 s.BindInt(0, changeType); | |
585 | 569 s.BindInt64(1, internalId); |
183 | 570 s.BindInt(2, resourceType); |
571 s.BindString(3, boost::posix_time::to_iso_string(date)); | |
572 s.Run(); | |
573 } | |
574 | |
575 | |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
576 void DatabaseWrapper::GetChangesInternal(Json::Value& target, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
577 SQLite::Statement& s, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
578 int64_t since, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
579 unsigned int maxResults) |
204 | 580 { |
581 Json::Value changes = Json::arrayValue; | |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
582 int64_t last = since; |
204 | 583 |
584 while (changes.size() < maxResults && s.Step()) | |
585 { | |
586 int64_t seq = s.ColumnInt(0); | |
587 ChangeType changeType = static_cast<ChangeType>(s.ColumnInt(1)); | |
588 int64_t internalId = s.ColumnInt(2); | |
589 ResourceType resourceType = static_cast<ResourceType>(s.ColumnInt(3)); | |
590 const std::string& date = s.ColumnString(4); | |
205
6ab754744446
logging of completed series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
204
diff
changeset
|
591 std::string publicId = GetPublicId(internalId); |
204 | 592 |
593 Json::Value item = Json::objectValue; | |
594 item["Seq"] = static_cast<int>(seq); | |
434
ccf3a0a43dac
EnumerationDictionary
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
413
diff
changeset
|
595 item["ChangeType"] = EnumerationToString(changeType); |
ccf3a0a43dac
EnumerationDictionary
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
413
diff
changeset
|
596 item["ResourceType"] = EnumerationToString(resourceType); |
205
6ab754744446
logging of completed series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
204
diff
changeset
|
597 item["ID"] = publicId; |
6ab754744446
logging of completed series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
204
diff
changeset
|
598 item["Path"] = GetBasePath(resourceType, publicId); |
204 | 599 item["Date"] = date; |
600 last = seq; | |
601 | |
602 changes.append(item); | |
603 } | |
604 | |
605 target = Json::objectValue; | |
606 target["Changes"] = changes; | |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
607 target["Done"] = !(changes.size() == maxResults && s.Step()); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
608 target["Last"] = static_cast<int>(last); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
609 } |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
610 |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
611 |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
612 void DatabaseWrapper::GetChanges(Json::Value& target, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
613 int64_t since, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
614 unsigned int maxResults) |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
615 { |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
616 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM Changes WHERE seq>? ORDER BY seq LIMIT ?"); |
585 | 617 s.BindInt64(0, since); |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
618 s.BindInt(1, maxResults + 1); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
619 GetChangesInternal(target, s, since, maxResults); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
620 } |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
621 |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
622 void DatabaseWrapper::GetLastChange(Json::Value& target) |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
623 { |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
624 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT * FROM Changes ORDER BY seq DESC LIMIT 1"); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
625 GetChangesInternal(target, s, 0, 1); |
204 | 626 } |
627 | |
628 | |
231 | 629 void DatabaseWrapper::LogExportedResource(ResourceType resourceType, |
630 const std::string& publicId, | |
631 const std::string& remoteModality, | |
632 const std::string& patientId, | |
633 const std::string& studyInstanceUid, | |
634 const std::string& seriesInstanceUid, | |
635 const std::string& sopInstanceUid, | |
183 | 636 const boost::posix_time::ptime& date) |
637 { | |
231 | 638 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
639 "INSERT INTO ExportedResources VALUES(NULL, ?, ?, ?, ?, ?, ?, ?, ?)"); | |
640 | |
641 s.BindInt(0, resourceType); | |
642 s.BindString(1, publicId); | |
643 s.BindString(2, remoteModality); | |
644 s.BindString(3, patientId); | |
645 s.BindString(4, studyInstanceUid); | |
646 s.BindString(5, seriesInstanceUid); | |
647 s.BindString(6, sopInstanceUid); | |
648 s.BindString(7, boost::posix_time::to_iso_string(date)); | |
649 | |
183 | 650 s.Run(); |
651 } | |
231 | 652 |
653 | |
654 void DatabaseWrapper::GetExportedResources(Json::Value& target, | |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
655 SQLite::Statement& s, |
231 | 656 int64_t since, |
657 unsigned int maxResults) | |
658 { | |
659 Json::Value changes = Json::arrayValue; | |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
660 int64_t last = since; |
231 | 661 |
662 while (changes.size() < maxResults && s.Step()) | |
663 { | |
664 int64_t seq = s.ColumnInt(0); | |
665 ResourceType resourceType = static_cast<ResourceType>(s.ColumnInt(1)); | |
666 std::string publicId = s.ColumnString(2); | |
667 | |
668 Json::Value item = Json::objectValue; | |
669 item["Seq"] = static_cast<int>(seq); | |
434
ccf3a0a43dac
EnumerationDictionary
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
413
diff
changeset
|
670 item["ResourceType"] = EnumerationToString(resourceType); |
231 | 671 item["ID"] = publicId; |
672 item["Path"] = GetBasePath(resourceType, publicId); | |
673 item["RemoteModality"] = s.ColumnString(3); | |
674 item["Date"] = s.ColumnString(8); | |
675 | |
676 // WARNING: Do not add "break" below and do not reorder the case items! | |
677 switch (resourceType) | |
678 { | |
679 case ResourceType_Instance: | |
680 item["SopInstanceUid"] = s.ColumnString(7); | |
681 | |
682 case ResourceType_Series: | |
683 item["SeriesInstanceUid"] = s.ColumnString(6); | |
684 | |
685 case ResourceType_Study: | |
686 item["StudyInstanceUid"] = s.ColumnString(5); | |
687 | |
688 case ResourceType_Patient: | |
689 item["PatientId"] = s.ColumnString(4); | |
690 break; | |
691 | |
692 default: | |
693 throw OrthancException(ErrorCode_InternalError); | |
694 } | |
695 | |
696 last = seq; | |
697 | |
698 changes.append(item); | |
699 } | |
700 | |
701 target = Json::objectValue; | |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
702 target["Exports"] = changes; |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
703 target["Done"] = !(changes.size() == maxResults && s.Step()); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
704 target["Last"] = static_cast<int>(last); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
705 } |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
706 |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
707 |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
708 void DatabaseWrapper::GetExportedResources(Json::Value& target, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
709 int64_t since, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
710 unsigned int maxResults) |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
711 { |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
712 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
713 "SELECT * FROM ExportedResources WHERE seq>? ORDER BY seq LIMIT ?"); |
585 | 714 s.BindInt64(0, since); |
237
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
715 s.BindInt(1, maxResults + 1); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
716 GetExportedResources(target, s, since, maxResults); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
717 } |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
718 |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
719 |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
720 void DatabaseWrapper::GetLastExportedResource(Json::Value& target) |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
721 { |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
722 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
723 "SELECT * FROM ExportedResources ORDER BY seq DESC LIMIT 1"); |
16a4ac70bd8a
last change and export
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
233
diff
changeset
|
724 GetExportedResources(target, s, 0, 1); |
231 | 725 } |
726 | |
727 | |
183 | 728 |
729 | |
730 int64_t DatabaseWrapper::GetTableRecordCount(const std::string& table) | |
731 { | |
732 char buf[128]; | |
733 sprintf(buf, "SELECT COUNT(*) FROM %s", table.c_str()); | |
734 SQLite::Statement s(db_, buf); | |
735 | |
218 | 736 if (!s.Step()) |
737 { | |
738 throw OrthancException(ErrorCode_InternalError); | |
739 } | |
740 | |
183 | 741 int64_t c = s.ColumnInt(0); |
742 assert(!s.Step()); | |
743 | |
744 return c; | |
745 } | |
746 | |
747 | |
748 uint64_t DatabaseWrapper::GetTotalCompressedSize() | |
749 { | |
750 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT SUM(compressedSize) FROM AttachedFiles"); | |
751 s.Run(); | |
752 return static_cast<uint64_t>(s.ColumnInt64(0)); | |
753 } | |
754 | |
755 | |
756 uint64_t DatabaseWrapper::GetTotalUncompressedSize() | |
757 { | |
758 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT SUM(uncompressedSize) FROM AttachedFiles"); | |
759 s.Run(); | |
760 return static_cast<uint64_t>(s.ColumnInt64(0)); | |
761 } | |
762 | |
190 | 763 void DatabaseWrapper::GetAllPublicIds(Json::Value& target, |
764 ResourceType resourceType) | |
765 { | |
766 SQLite::Statement s(db_, SQLITE_FROM_HERE, "SELECT publicId FROM Resources WHERE resourceType=?"); | |
767 s.BindInt(0, resourceType); | |
768 | |
769 target = Json::arrayValue; | |
770 while (s.Step()) | |
771 { | |
772 target.append(s.ColumnString(0)); | |
773 } | |
774 } | |
775 | |
183 | 776 |
777 DatabaseWrapper::DatabaseWrapper(const std::string& path, | |
778 IServerIndexListener& listener) : | |
779 listener_(listener) | |
780 { | |
781 db_.Open(path); | |
782 Open(); | |
783 } | |
784 | |
785 DatabaseWrapper::DatabaseWrapper(IServerIndexListener& listener) : | |
786 listener_(listener) | |
787 { | |
788 db_.OpenInMemory(); | |
789 Open(); | |
790 } | |
791 | |
792 void DatabaseWrapper::Open() | |
793 { | |
374 | 794 // Performance tuning of SQLite with PRAGMAs |
795 // http://www.sqlite.org/pragma.html | |
796 db_.Execute("PRAGMA SYNCHRONOUS=NORMAL;"); | |
797 db_.Execute("PRAGMA JOURNAL_MODE=WAL;"); | |
798 db_.Execute("PRAGMA LOCKING_MODE=EXCLUSIVE;"); | |
799 db_.Execute("PRAGMA WAL_AUTOCHECKPOINT=1000;"); | |
800 //db_.Execute("PRAGMA TEMP_STORE=memory"); | |
801 | |
183 | 802 if (!db_.DoesTableExist("GlobalProperties")) |
803 { | |
804 LOG(INFO) << "Creating the database"; | |
805 std::string query; | |
203
9283552c25df
db refactoring done
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
806 EmbeddedResources::GetFileResource(query, EmbeddedResources::PREPARE_DATABASE); |
183 | 807 db_.Execute(query); |
808 } | |
809 | |
567 | 810 // Check the version of the database |
252 | 811 std::string version = GetGlobalProperty(GlobalProperty_DatabaseSchemaVersion, "Unknown"); |
812 bool ok = false; | |
813 try | |
814 { | |
815 LOG(INFO) << "Version of the Orthanc database: " << version; | |
816 unsigned int v = boost::lexical_cast<unsigned int>(version); | |
817 | |
567 | 818 // This version of Orthanc is only compatible with versions 3 |
819 // (Orthanc 0.3.2 to 0.6.1) and 4 (since Orthanc 0.6.2) of the | |
820 // DB schema | |
821 ok = (v == 3 || v == 4); | |
822 | |
823 if (v == 3) | |
824 { | |
825 LOG(WARNING) << "Upgrading the database from version 3 to version 4 (reconstructing the index)"; | |
826 | |
827 // Reconstruct the index for case insensitive queries in C-FIND | |
828 db_.Execute("DROP INDEX IF EXISTS MainDicomTagsIndexValues;"); | |
829 db_.Execute("DROP TABLE IF EXISTS AvailableTags;"); | |
830 | |
831 std::string query; | |
832 EmbeddedResources::GetFileResource(query, EmbeddedResources::PREPARE_DATABASE_V4); | |
833 db_.Execute(query); | |
834 | |
835 db_.Execute("INSERT INTO AvailableTags SELECT DISTINCT tagGroup, tagElement FROM MainDicomTags;"); | |
836 | |
837 //SetGlobalProperty(GlobalProperty_DatabaseSchemaVersion, "4"); | |
838 } | |
252 | 839 } |
840 catch (boost::bad_lexical_cast&) | |
841 { | |
842 } | |
843 | |
844 if (!ok) | |
845 { | |
846 throw OrthancException(ErrorCode_IncompatibleDatabaseVersion); | |
847 } | |
848 | |
567 | 849 CompleteMainDicomTags(); |
850 | |
183 | 851 signalRemainingAncestor_ = new Internals::SignalRemainingAncestor; |
852 db_.Register(signalRemainingAncestor_); | |
853 db_.Register(new Internals::SignalFileDeleted(listener_)); | |
854 } | |
238 | 855 |
856 uint64_t DatabaseWrapper::GetResourceCount(ResourceType resourceType) | |
857 { | |
858 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
859 "SELECT COUNT(*) FROM Resources WHERE resourceType=?"); | |
860 s.BindInt(0, resourceType); | |
861 | |
862 if (!s.Step()) | |
863 { | |
864 throw OrthancException(ErrorCode_InternalError); | |
865 } | |
866 | |
867 int64_t c = s.ColumnInt(0); | |
868 assert(!s.Step()); | |
869 | |
870 return c; | |
871 } | |
262
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
872 |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
873 bool DatabaseWrapper::SelectPatientToRecycle(int64_t& internalId) |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
874 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
875 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
876 "SELECT patientId FROM PatientRecyclingOrder ORDER BY seq ASC LIMIT 1"); |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
877 |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
878 if (!s.Step()) |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
879 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
880 // No patient remaining or all the patients are protected |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
881 return false; |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
882 } |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
883 else |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
884 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
885 internalId = s.ColumnInt(0); |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
886 return true; |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
887 } |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
888 } |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
889 |
268
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
890 bool DatabaseWrapper::SelectPatientToRecycle(int64_t& internalId, |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
891 int64_t patientIdToAvoid) |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
892 { |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
893 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
894 "SELECT patientId FROM PatientRecyclingOrder " |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
895 "WHERE patientId != ? ORDER BY seq ASC LIMIT 1"); |
585 | 896 s.BindInt64(0, patientIdToAvoid); |
268
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
897 |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
898 if (!s.Step()) |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
899 { |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
900 // No patient remaining or all the patients are protected |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
901 return false; |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
902 } |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
903 else |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
904 { |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
905 internalId = s.ColumnInt(0); |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
906 return true; |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
907 } |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
908 } |
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
262
diff
changeset
|
909 |
262
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
910 bool DatabaseWrapper::IsProtectedPatient(int64_t internalId) |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
911 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
912 SQLite::Statement s(db_, SQLITE_FROM_HERE, |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
913 "SELECT * FROM PatientRecyclingOrder WHERE patientId = ?"); |
585 | 914 s.BindInt64(0, internalId); |
262
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
915 return !s.Step(); |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
916 } |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
917 |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
918 void DatabaseWrapper::SetProtectedPatient(int64_t internalId, |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
919 bool isProtected) |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
920 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
921 if (isProtected) |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
922 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
923 SQLite::Statement s(db_, SQLITE_FROM_HERE, "DELETE FROM PatientRecyclingOrder WHERE patientId=?"); |
585 | 924 s.BindInt64(0, internalId); |
262
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
925 s.Run(); |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
926 } |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
927 else if (IsProtectedPatient(internalId)) |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
928 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
929 SQLite::Statement s(db_, SQLITE_FROM_HERE, "INSERT INTO PatientRecyclingOrder VALUES(NULL, ?)"); |
585 | 930 s.BindInt64(0, internalId); |
262
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
931 s.Run(); |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
932 } |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
933 else |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
934 { |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
935 // Nothing to do: The patient is already unprotected |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
936 } |
2354560daf2f
primitives for recycling patients
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
252
diff
changeset
|
937 } |
310 | 938 |
939 | |
940 uint64_t DatabaseWrapper::IncrementGlobalSequence(GlobalProperty property) | |
941 { | |
942 std::string oldValue; | |
943 | |
944 if (LookupGlobalProperty(oldValue, property)) | |
945 { | |
946 uint64_t oldNumber; | |
947 | |
948 try | |
949 { | |
950 oldNumber = boost::lexical_cast<uint64_t>(oldValue); | |
951 SetGlobalProperty(property, boost::lexical_cast<std::string>(oldNumber + 1)); | |
952 return oldNumber + 1; | |
953 } | |
954 catch (boost::bad_lexical_cast&) | |
955 { | |
956 throw OrthancException(ErrorCode_InternalError); | |
957 } | |
958 } | |
959 else | |
960 { | |
961 // Initialize the sequence at "1" | |
962 SetGlobalProperty(property, "1"); | |
963 return 1; | |
964 } | |
965 } | |
413
47d63c941902
clearing /exports and /changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
966 |
47d63c941902
clearing /exports and /changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
967 |
47d63c941902
clearing /exports and /changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
968 void DatabaseWrapper::ClearTable(const std::string& tableName) |
47d63c941902
clearing /exports and /changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
969 { |
47d63c941902
clearing /exports and /changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
970 db_.Execute("DELETE FROM " + tableName); |
47d63c941902
clearing /exports and /changes
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
399
diff
changeset
|
971 } |
513 | 972 |
973 | |
974 bool DatabaseWrapper::IsExistingResource(int64_t internalId) | |
975 { | |
976 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
977 "SELECT * FROM Resources WHERE internalId=?"); | |
585 | 978 s.BindInt64(0, internalId); |
513 | 979 return s.Step(); |
980 } | |
521 | 981 |
982 | |
983 void DatabaseWrapper::LookupTagValue(std::list<int64_t>& result, | |
984 DicomTag tag, | |
985 const std::string& value) | |
986 { | |
987 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
988 "SELECT id FROM MainDicomTags WHERE tagGroup=? AND tagElement=? and value=?"); | |
989 | |
990 s.BindInt(0, tag.GetGroup()); | |
991 s.BindInt(1, tag.GetElement()); | |
992 s.BindString(2, value); | |
993 | |
994 result.clear(); | |
995 | |
996 while (s.Step()) | |
997 { | |
998 result.push_back(s.ColumnInt64(0)); | |
999 } | |
1000 } | |
1001 | |
1002 | |
1003 void DatabaseWrapper::LookupTagValue(std::list<int64_t>& result, | |
1004 const std::string& value) | |
1005 { | |
1006 SQLite::Statement s(db_, SQLITE_FROM_HERE, | |
1007 "SELECT id FROM MainDicomTags WHERE value=?"); | |
1008 | |
1009 s.BindString(0, value); | |
1010 | |
1011 result.clear(); | |
1012 | |
1013 while (s.Step()) | |
1014 { | |
1015 result.push_back(s.ColumnInt64(0)); | |
1016 } | |
1017 } | |
567 | 1018 |
1019 | |
1020 void DatabaseWrapper::CompleteMainDicomTags() | |
1021 { | |
1022 std::set<DicomTag> requiredTags; | |
1023 | |
1024 } | |
183 | 1025 } |