Mercurial > hg > orthanc
annotate OrthancServer/Resources/Graveyard/DatabasePluginSample/Database.cpp @ 4831:7053502fbf97
added copyright UCLouvain
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 25 Nov 2021 19:01:11 +0100 |
parents | d9473bd5ed43 |
children | 2e71a08eea15 43e613a7756b |
rev | line source |
---|---|
1671 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1671 | 4 * Department, University Hospital of Liege, Belgium |
4437
d9473bd5ed43
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4050
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
4831
7053502fbf97
added copyright UCLouvain
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4437
diff
changeset
|
6 * Copyright (C) 2021-2021 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
1671 | 7 * |
8 * This program is free software: you can redistribute it and/or | |
9 * modify it under the terms of the GNU General Public License as | |
10 * published by the Free Software Foundation, either version 3 of the | |
11 * License, or (at your option) any later version. | |
12 * | |
13 * In addition, as a special exception, the copyright holders of this | |
14 * program give permission to link the code of its release with the | |
15 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
16 * that use the same license as the "OpenSSL" library), and distribute | |
17 * the linked executables. You must obey the GNU General Public License | |
18 * in all respects for all of the code used other than "OpenSSL". If you | |
19 * modify file(s) with this exception, you may extend this exception to | |
20 * your version of the file(s), but you are not obligated to do so. If | |
21 * you do not wish to do so, delete this exception statement from your | |
22 * version. If you delete this exception statement from all source files | |
23 * in the program, then also delete it here. | |
24 * | |
25 * This program is distributed in the hope that it will be useful, but | |
26 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
28 * General Public License for more details. | |
29 * | |
30 * You should have received a copy of the GNU General Public License | |
31 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
32 **/ | |
33 | |
34 | |
35 #include "Database.h" | |
36 | |
4050 | 37 #include "../../../../OrthancFramework/Sources/DicomFormat/DicomArray.h" |
1671 | 38 |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
39 #include <EmbeddedResources.h> |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
40 #include <boost/lexical_cast.hpp> |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
41 |
1671 | 42 |
43 namespace Internals | |
44 { | |
45 class SignalFileDeleted : public Orthanc::SQLite::IScalarFunction | |
46 { | |
47 private: | |
48 OrthancPlugins::DatabaseBackendOutput& output_; | |
49 | |
50 public: | |
51 SignalFileDeleted(OrthancPlugins::DatabaseBackendOutput& output) : output_(output) | |
52 { | |
53 } | |
54 | |
55 virtual const char* GetName() const | |
56 { | |
57 return "SignalFileDeleted"; | |
58 } | |
59 | |
60 virtual unsigned int GetCardinality() const | |
61 { | |
62 return 7; | |
63 } | |
64 | |
65 virtual void Compute(Orthanc::SQLite::FunctionContext& context) | |
66 { | |
67 std::string uncompressedMD5, compressedMD5; | |
68 | |
69 if (!context.IsNullValue(5)) | |
70 { | |
71 uncompressedMD5 = context.GetStringValue(5); | |
72 } | |
73 | |
74 if (!context.IsNullValue(6)) | |
75 { | |
76 compressedMD5 = context.GetStringValue(6); | |
77 } | |
78 | |
79 output_.SignalDeletedAttachment(context.GetStringValue(0), | |
80 context.GetIntValue(1), | |
81 context.GetInt64Value(2), | |
82 uncompressedMD5, | |
83 context.GetIntValue(3), | |
84 context.GetInt64Value(4), | |
85 compressedMD5); | |
86 } | |
87 }; | |
88 | |
89 | |
90 class SignalResourceDeleted : public Orthanc::SQLite::IScalarFunction | |
91 { | |
92 private: | |
93 OrthancPlugins::DatabaseBackendOutput& output_; | |
94 | |
95 public: | |
96 SignalResourceDeleted(OrthancPlugins::DatabaseBackendOutput& output) : output_(output) | |
97 { | |
98 } | |
99 | |
100 virtual const char* GetName() const | |
101 { | |
102 return "SignalResourceDeleted"; | |
103 } | |
104 | |
105 virtual unsigned int GetCardinality() const | |
106 { | |
107 return 2; | |
108 } | |
109 | |
110 virtual void Compute(Orthanc::SQLite::FunctionContext& context) | |
111 { | |
112 output_.SignalDeletedResource(context.GetStringValue(0), | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
113 Orthanc::Plugins::Convert(static_cast<Orthanc::ResourceType>(context.GetIntValue(1)))); |
1671 | 114 } |
115 }; | |
116 } | |
117 | |
118 | |
119 class Database::SignalRemainingAncestor : public Orthanc::SQLite::IScalarFunction | |
120 { | |
121 private: | |
122 bool hasRemainingAncestor_; | |
123 std::string remainingPublicId_; | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
124 OrthancPluginResourceType remainingType_; |
1671 | 125 |
126 public: | |
127 SignalRemainingAncestor() : | |
1847 | 128 hasRemainingAncestor_(false), |
129 remainingType_(OrthancPluginResourceType_Instance) // Some dummy value | |
1671 | 130 { |
131 } | |
132 | |
133 void Reset() | |
134 { | |
135 hasRemainingAncestor_ = false; | |
136 } | |
137 | |
138 virtual const char* GetName() const | |
139 { | |
140 return "SignalRemainingAncestor"; | |
141 } | |
142 | |
143 virtual unsigned int GetCardinality() const | |
144 { | |
145 return 2; | |
146 } | |
147 | |
148 virtual void Compute(Orthanc::SQLite::FunctionContext& context) | |
149 { | |
150 if (!hasRemainingAncestor_ || | |
151 remainingType_ >= context.GetIntValue(1)) | |
152 { | |
153 hasRemainingAncestor_ = true; | |
154 remainingPublicId_ = context.GetStringValue(0); | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
155 remainingType_ = Orthanc::Plugins::Convert(static_cast<Orthanc::ResourceType>(context.GetIntValue(1))); |
1671 | 156 } |
157 } | |
158 | |
159 bool HasRemainingAncestor() const | |
160 { | |
161 return hasRemainingAncestor_; | |
162 } | |
163 | |
164 const std::string& GetRemainingAncestorId() const | |
165 { | |
166 assert(hasRemainingAncestor_); | |
167 return remainingPublicId_; | |
168 } | |
169 | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
170 OrthancPluginResourceType GetRemainingAncestorType() const |
1671 | 171 { |
172 assert(hasRemainingAncestor_); | |
173 return remainingType_; | |
174 } | |
175 }; | |
176 | |
177 | |
178 | |
179 Database::Database(const std::string& path) : | |
180 path_(path), | |
1847 | 181 base_(db_), |
182 signalRemainingAncestor_(NULL) | |
1671 | 183 { |
184 } | |
185 | |
186 | |
187 void Database::Open() | |
188 { | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
189 db_.Open(path_); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
190 |
1717
3926e6317a43
SetIdentifierTagInternal
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1673
diff
changeset
|
191 db_.Execute("PRAGMA ENCODING=\"UTF-8\";"); |
3926e6317a43
SetIdentifierTagInternal
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1673
diff
changeset
|
192 |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
193 // http://www.sqlite.org/pragma.html |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
194 db_.Execute("PRAGMA SYNCHRONOUS=NORMAL;"); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
195 db_.Execute("PRAGMA JOURNAL_MODE=WAL;"); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
196 db_.Execute("PRAGMA LOCKING_MODE=EXCLUSIVE;"); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
197 db_.Execute("PRAGMA WAL_AUTOCHECKPOINT=1000;"); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
198 //db_.Execute("PRAGMA TEMP_STORE=memory"); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
199 |
1671 | 200 if (!db_.DoesTableExist("GlobalProperties")) |
201 { | |
202 std::string query; | |
203 Orthanc::EmbeddedResources::GetFileResource(query, Orthanc::EmbeddedResources::PREPARE_DATABASE); | |
204 db_.Execute(query); | |
205 } | |
206 | |
207 signalRemainingAncestor_ = new SignalRemainingAncestor; | |
208 db_.Register(signalRemainingAncestor_); | |
209 db_.Register(new Internals::SignalFileDeleted(GetOutput())); | |
210 db_.Register(new Internals::SignalResourceDeleted(GetOutput())); | |
211 } | |
212 | |
213 | |
214 void Database::Close() | |
215 { | |
216 db_.Close(); | |
217 } | |
218 | |
219 | |
220 void Database::AddAttachment(int64_t id, | |
221 const OrthancPluginAttachment& attachment) | |
222 { | |
223 Orthanc::FileInfo info(attachment.uuid, | |
224 static_cast<Orthanc::FileContentType>(attachment.contentType), | |
225 attachment.uncompressedSize, | |
226 attachment.uncompressedHash, | |
227 static_cast<Orthanc::CompressionType>(attachment.compressionType), | |
228 attachment.compressedSize, | |
229 attachment.compressedHash); | |
230 base_.AddAttachment(id, info); | |
231 } | |
232 | |
233 | |
234 void Database::DeleteResource(int64_t id) | |
235 { | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
236 signalRemainingAncestor_->Reset(); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
237 |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
238 Orthanc::SQLite::Statement s(db_, SQLITE_FROM_HERE, "DELETE FROM Resources WHERE internalId=?"); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
239 s.BindInt64(0, id); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
240 s.Run(); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
241 |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
242 if (signalRemainingAncestor_->HasRemainingAncestor()) |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
243 { |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
244 GetOutput().SignalRemainingAncestor(signalRemainingAncestor_->GetRemainingAncestorId(), |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
245 signalRemainingAncestor_->GetRemainingAncestorType()); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
246 } |
1671 | 247 } |
248 | |
249 | |
250 static void Answer(OrthancPlugins::DatabaseBackendOutput& output, | |
251 const Orthanc::ServerIndexChange& change) | |
252 { | |
253 output.AnswerChange(change.GetSeq(), | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
254 change.GetChangeType(), |
1671 | 255 Orthanc::Plugins::Convert(change.GetResourceType()), |
256 change.GetPublicId(), | |
257 change.GetDate()); | |
258 } | |
259 | |
260 | |
261 static void Answer(OrthancPlugins::DatabaseBackendOutput& output, | |
262 const Orthanc::ExportedResource& resource) | |
263 { | |
264 output.AnswerExportedResource(resource.GetSeq(), | |
265 Orthanc::Plugins::Convert(resource.GetResourceType()), | |
266 resource.GetPublicId(), | |
267 resource.GetModality(), | |
268 resource.GetDate(), | |
269 resource.GetPatientId(), | |
270 resource.GetStudyInstanceUid(), | |
271 resource.GetSeriesInstanceUid(), | |
272 resource.GetSopInstanceUid()); | |
273 } | |
274 | |
275 | |
276 void Database::GetChanges(bool& done /*out*/, | |
277 int64_t since, | |
278 uint32_t maxResults) | |
279 { | |
280 typedef std::list<Orthanc::ServerIndexChange> Changes; | |
281 | |
282 Changes changes; | |
283 base_.GetChanges(changes, done, since, maxResults); | |
284 | |
285 for (Changes::const_iterator it = changes.begin(); it != changes.end(); ++it) | |
286 { | |
287 Answer(GetOutput(), *it); | |
288 } | |
289 } | |
290 | |
291 | |
292 void Database::GetExportedResources(bool& done /*out*/, | |
293 int64_t since, | |
294 uint32_t maxResults) | |
295 { | |
296 typedef std::list<Orthanc::ExportedResource> Resources; | |
297 | |
298 Resources resources; | |
299 base_.GetExportedResources(resources, done, since, maxResults); | |
300 | |
301 for (Resources::const_iterator it = resources.begin(); it != resources.end(); ++it) | |
302 { | |
303 Answer(GetOutput(), *it); | |
304 } | |
305 } | |
306 | |
307 | |
308 void Database::GetLastChange() | |
309 { | |
310 std::list<Orthanc::ServerIndexChange> change; | |
311 Orthanc::ErrorCode code = base_.GetLastChange(change); | |
312 | |
313 if (code != Orthanc::ErrorCode_Success) | |
314 { | |
315 throw OrthancPlugins::DatabaseException(static_cast<OrthancPluginErrorCode>(code)); | |
316 } | |
317 | |
318 if (!change.empty()) | |
319 { | |
320 Answer(GetOutput(), change.front()); | |
321 } | |
322 } | |
323 | |
324 | |
325 void Database::GetLastExportedResource() | |
326 { | |
327 std::list<Orthanc::ExportedResource> resource; | |
328 base_.GetLastExportedResource(resource); | |
329 | |
330 if (!resource.empty()) | |
331 { | |
332 Answer(GetOutput(), resource.front()); | |
333 } | |
334 } | |
335 | |
336 | |
337 void Database::GetMainDicomTags(int64_t id) | |
338 { | |
339 Orthanc::DicomMap tags; | |
340 base_.GetMainDicomTags(tags, id); | |
341 | |
342 Orthanc::DicomArray arr(tags); | |
343 for (size_t i = 0; i < arr.GetSize(); i++) | |
344 { | |
345 GetOutput().AnswerDicomTag(arr.GetElement(i).GetTag().GetGroup(), | |
346 arr.GetElement(i).GetTag().GetElement(), | |
1761
f4286d99ee0a
fix sample database plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1717
diff
changeset
|
347 arr.GetElement(i).GetValue().GetContent()); |
1671 | 348 } |
349 } | |
350 | |
351 | |
352 std::string Database::GetPublicId(int64_t resourceId) | |
353 { | |
354 std::string id; | |
355 if (base_.GetPublicId(id, resourceId)) | |
356 { | |
357 return id; | |
358 } | |
359 else | |
360 { | |
361 throw OrthancPlugins::DatabaseException(OrthancPluginErrorCode_UnknownResource); | |
362 } | |
363 } | |
364 | |
365 | |
366 OrthancPluginResourceType Database::GetResourceType(int64_t resourceId) | |
367 { | |
368 Orthanc::ResourceType result; | |
369 Orthanc::ErrorCode code = base_.GetResourceType(result, resourceId); | |
370 | |
371 if (code == Orthanc::ErrorCode_Success) | |
372 { | |
373 return Orthanc::Plugins::Convert(result); | |
374 } | |
375 else | |
376 { | |
377 throw OrthancPlugins::DatabaseException(static_cast<OrthancPluginErrorCode>(code)); | |
378 } | |
379 } | |
380 | |
381 | |
382 | |
383 template <typename I> | |
384 static void ConvertList(std::list<int32_t>& target, | |
385 const std::list<I>& source) | |
386 { | |
387 for (typename std::list<I>::const_iterator | |
1847 | 388 it = source.begin(); it != source.end(); ++it) |
1671 | 389 { |
390 target.push_back(*it); | |
391 } | |
392 } | |
393 | |
394 | |
395 void Database::ListAvailableMetadata(std::list<int32_t>& target /*out*/, | |
396 int64_t id) | |
397 { | |
398 std::list<Orthanc::MetadataType> tmp; | |
399 base_.ListAvailableMetadata(tmp, id); | |
400 ConvertList(target, tmp); | |
401 } | |
402 | |
403 | |
404 void Database::ListAvailableAttachments(std::list<int32_t>& target /*out*/, | |
405 int64_t id) | |
406 { | |
407 std::list<Orthanc::FileContentType> tmp; | |
408 base_.ListAvailableAttachments(tmp, id); | |
409 ConvertList(target, tmp); | |
410 } | |
411 | |
412 | |
413 void Database::LogChange(const OrthancPluginChange& change) | |
414 { | |
415 int64_t id; | |
416 OrthancPluginResourceType type; | |
417 if (!LookupResource(id, type, change.publicId) || | |
418 type != change.resourceType) | |
419 { | |
420 throw OrthancPlugins::DatabaseException(OrthancPluginErrorCode_DatabasePlugin); | |
421 } | |
422 | |
423 Orthanc::ServerIndexChange tmp(change.seq, | |
424 static_cast<Orthanc::ChangeType>(change.changeType), | |
425 Orthanc::Plugins::Convert(change.resourceType), | |
426 change.publicId, | |
427 change.date); | |
428 | |
429 base_.LogChange(id, tmp); | |
430 } | |
431 | |
432 | |
433 void Database::LogExportedResource(const OrthancPluginExportedResource& resource) | |
434 { | |
435 Orthanc::ExportedResource tmp(resource.seq, | |
436 Orthanc::Plugins::Convert(resource.resourceType), | |
437 resource.publicId, | |
438 resource.modality, | |
439 resource.date, | |
440 resource.patientId, | |
441 resource.studyInstanceUid, | |
442 resource.seriesInstanceUid, | |
443 resource.sopInstanceUid); | |
444 | |
445 base_.LogExportedResource(tmp); | |
446 } | |
447 | |
448 | |
449 bool Database::LookupAttachment(int64_t id, | |
450 int32_t contentType) | |
451 { | |
452 Orthanc::FileInfo attachment; | |
453 if (base_.LookupAttachment(attachment, id, static_cast<Orthanc::FileContentType>(contentType))) | |
454 { | |
455 GetOutput().AnswerAttachment(attachment.GetUuid(), | |
456 attachment.GetContentType(), | |
457 attachment.GetUncompressedSize(), | |
458 attachment.GetUncompressedMD5(), | |
459 attachment.GetCompressionType(), | |
460 attachment.GetCompressedSize(), | |
461 attachment.GetCompressedMD5()); | |
462 return true; | |
463 } | |
464 else | |
465 { | |
466 return false; | |
467 } | |
468 } | |
469 | |
470 | |
471 bool Database::LookupParent(int64_t& parentId /*out*/, | |
472 int64_t resourceId) | |
473 { | |
474 bool found; | |
475 Orthanc::ErrorCode code = base_.LookupParent(found, parentId, resourceId); | |
476 | |
477 if (code == Orthanc::ErrorCode_Success) | |
478 { | |
479 return found; | |
480 } | |
481 else | |
482 { | |
483 throw OrthancPlugins::DatabaseException(static_cast<OrthancPluginErrorCode>(code)); | |
484 } | |
485 } | |
486 | |
487 | |
488 bool Database::LookupResource(int64_t& id /*out*/, | |
489 OrthancPluginResourceType& type /*out*/, | |
490 const char* publicId) | |
491 { | |
492 Orthanc::ResourceType tmp; | |
493 if (base_.LookupResource(id, tmp, publicId)) | |
494 { | |
495 type = Orthanc::Plugins::Convert(tmp); | |
496 return true; | |
497 } | |
498 else | |
499 { | |
500 return false; | |
501 } | |
502 } | |
503 | |
504 | |
505 void Database::StartTransaction() | |
506 { | |
507 transaction_.reset(new Orthanc::SQLite::Transaction(db_)); | |
508 transaction_->Begin(); | |
509 } | |
510 | |
511 | |
512 void Database::RollbackTransaction() | |
513 { | |
514 transaction_->Rollback(); | |
515 transaction_.reset(NULL); | |
516 } | |
517 | |
518 | |
519 void Database::CommitTransaction() | |
520 { | |
521 transaction_->Commit(); | |
522 transaction_.reset(NULL); | |
523 } | |
524 | |
525 | |
526 uint32_t Database::GetDatabaseVersion() | |
527 { | |
1672
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
528 std::string version; |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
529 |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
530 if (!LookupGlobalProperty(version, Orthanc::GlobalProperty_DatabaseSchemaVersion)) |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
531 { |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
532 throw OrthancPlugins::DatabaseException(OrthancPluginErrorCode_InternalError); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
533 } |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
534 |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
535 try |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
536 { |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
537 return boost::lexical_cast<uint32_t>(version); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
538 } |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
539 catch (boost::bad_lexical_cast&) |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
540 { |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
541 throw OrthancPlugins::DatabaseException(OrthancPluginErrorCode_InternalError); |
4c5a85c3ff43
sample database plugin now working
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1671
diff
changeset
|
542 } |
1671 | 543 } |
544 | |
545 | |
546 void Database::UpgradeDatabase(uint32_t targetVersion, | |
547 OrthancPluginStorageArea* storageArea) | |
548 { | |
1673
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
549 if (targetVersion == 6) |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
550 { |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
551 OrthancPluginErrorCode code = OrthancPluginReconstructMainDicomTags(GetOutput().GetContext(), storageArea, |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
552 OrthancPluginResourceType_Study); |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
553 if (code == OrthancPluginErrorCode_Success) |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
554 { |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
555 code = OrthancPluginReconstructMainDicomTags(GetOutput().GetContext(), storageArea, |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
556 OrthancPluginResourceType_Series); |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
557 } |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
558 |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
559 if (code != OrthancPluginErrorCode_Success) |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
560 { |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
561 throw OrthancPlugins::DatabaseException(code); |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
562 } |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
563 |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
564 base_.SetGlobalProperty(Orthanc::GlobalProperty_DatabaseSchemaVersion, "6"); |
0bbcfd9695e5
UpgradeDatabase in the sample plugin
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1672
diff
changeset
|
565 } |
1671 | 566 } |