Mercurial > hg > orthanc
annotate OrthancServer/Sources/ServerIndex.cpp @ 4577:a114a5db2afe db-changes
end of refactoring read-write transactions
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 09 Mar 2021 11:52:07 +0100 |
parents | f6cd49af7526 |
children | 710748828b6a |
rev | line source |
---|---|
0 | 1 /** |
62 | 2 * Orthanc - A Lightweight, RESTful DICOM Store |
1900 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
1288
6e7e5ed91c2d
upgrade to year 2015
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1286
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
4437
d9473bd5ed43
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4371
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU General Public License as | |
9 * published by the Free Software Foundation, either version 3 of the | |
10 * License, or (at your option) any later version. | |
136 | 11 * |
12 * In addition, as a special exception, the copyright holders of this | |
13 * program give permission to link the code of its release with the | |
14 * OpenSSL project's "OpenSSL" library (or with modified versions of it | |
15 * that use the same license as the "OpenSSL" library), and distribute | |
16 * the linked executables. You must obey the GNU General Public License | |
17 * in all respects for all of the code used other than "OpenSSL". If you | |
18 * modify file(s) with this exception, you may extend this exception to | |
19 * your version of the file(s), but you are not obligated to do so. If | |
20 * you do not wish to do so, delete this exception statement from your | |
21 * version. If you delete this exception statement from all source files | |
22 * in the program, then also delete it here. | |
0 | 23 * |
24 * This program is distributed in the hope that it will be useful, but | |
25 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
27 * General Public License for more details. | |
28 * | |
29 * You should have received a copy of the GNU General Public License | |
30 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
31 **/ | |
32 | |
33 | |
831
84513f2ee1f3
pch for unit tests and server
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
824
diff
changeset
|
34 #include "PrecompiledHeadersServer.h" |
0 | 35 #include "ServerIndex.h" |
36 | |
6 | 37 #ifndef NOMINMAX |
2 | 38 #define NOMINMAX |
6 | 39 #endif |
40 | |
4045 | 41 #include "../../OrthancFramework/Sources/DicomFormat/DicomArray.h" |
42 #include "../../OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.h" | |
43 #include "../../OrthancFramework/Sources/DicomParsing/ParsedDicomFile.h" | |
44 #include "../../OrthancFramework/Sources/Logging.h" | |
45 #include "../../OrthancFramework/Sources/Toolbox.h" | |
3094
61da3c9b4121
cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3093
diff
changeset
|
46 |
61da3c9b4121
cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3093
diff
changeset
|
47 #include "Database/ResourcesContent.h" |
2940
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
48 #include "OrthancConfiguration.h" |
3094
61da3c9b4121
cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3093
diff
changeset
|
49 #include "Search/DatabaseLookup.h" |
61da3c9b4121
cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3093
diff
changeset
|
50 #include "Search/DicomTagConstraint.h" |
61da3c9b4121
cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3093
diff
changeset
|
51 #include "ServerContext.h" |
61da3c9b4121
cont reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3093
diff
changeset
|
52 #include "ServerIndexChange.h" |
1668
de1413733c97
reconstructing main dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1555
diff
changeset
|
53 #include "ServerToolbox.h" |
0 | 54 |
55 #include <boost/lexical_cast.hpp> | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
56 #include <boost/tuple/tuple.hpp> |
0 | 57 #include <stdio.h> |
4488
50b3f4c8107e
fix missing include for Debian unstable
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4460
diff
changeset
|
58 #include <stack> |
0 | 59 |
440
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
60 static const uint64_t MEGA_BYTES = 1024 * 1024; |
23e5b35e3c5c
statistics for patient/studies/series/instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
438
diff
changeset
|
61 |
62 | 62 namespace Orthanc |
0 | 63 { |
3075
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
64 static void CopyListToVector(std::vector<std::string>& target, |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
65 const std::list<std::string>& source) |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
66 { |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
67 target.resize(source.size()); |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
68 |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
69 size_t pos = 0; |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
70 |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
71 for (std::list<std::string>::const_iterator |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
72 it = source.begin(); it != source.end(); ++it) |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
73 { |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
74 target[pos] = *it; |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
75 pos ++; |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
76 } |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
77 } |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
78 |
ead8576a02ef
IDatabaseWrapper::ApplyLookupResources now returns lists
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3073
diff
changeset
|
79 |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
80 class ServerIndex::Listener : public IDatabaseListener |
0 | 81 { |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
82 private: |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
83 struct FileToRemove |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
84 { |
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
85 private: |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
86 std::string uuid_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
87 FileContentType type_; |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
88 |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
89 public: |
4205 | 90 explicit FileToRemove(const FileInfo& info) : |
91 uuid_(info.GetUuid()), | |
92 type_(info.GetContentType()) | |
1191
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
93 { |
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
94 } |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
95 |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
96 const std::string& GetUuid() const |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
97 { |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
98 return uuid_; |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
99 } |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
100 |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
101 FileContentType GetContentType() const |
264
5b8e8b74bc8b
remove files only after the sqlite transaction has succeeded
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
240
diff
changeset
|
102 { |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
103 return type_; |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
104 } |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
105 }; |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
106 |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
107 ServerContext& context_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
108 bool hasRemainingLevel_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
109 ResourceType remainingType_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
110 std::string remainingPublicId_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
111 std::list<FileToRemove> pendingFilesToRemove_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
112 std::list<ServerIndexChange> pendingChanges_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
113 uint64_t sizeOfFilesToRemove_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
114 bool insideTransaction_; |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
115 uint64_t sizeOfAddedAttachments_; |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
116 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
117 void Reset() |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
118 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
119 sizeOfFilesToRemove_ = 0; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
120 hasRemainingLevel_ = false; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
121 pendingFilesToRemove_.clear(); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
122 pendingChanges_.clear(); |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
123 sizeOfAddedAttachments_ = 0; |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
124 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
125 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
126 public: |
4205 | 127 explicit Listener(ServerContext& context) : |
128 context_(context), | |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
129 insideTransaction_(false), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
130 sizeOfAddedAttachments_(0) |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
131 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
132 Reset(); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
133 assert(ResourceType_Patient < ResourceType_Study && |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
134 ResourceType_Study < ResourceType_Series && |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
135 ResourceType_Series < ResourceType_Instance); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
136 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
137 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
138 void StartTransaction() |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
139 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
140 Reset(); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
141 insideTransaction_ = true; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
142 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
143 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
144 void EndTransaction() |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
145 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
146 insideTransaction_ = false; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
147 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
148 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
149 uint64_t GetSizeOfFilesToRemove() |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
150 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
151 return sizeOfFilesToRemove_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
152 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
153 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
154 void CommitFilesToRemove() |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
155 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
156 for (std::list<FileToRemove>::const_iterator |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
157 it = pendingFilesToRemove_.begin(); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
158 it != pendingFilesToRemove_.end(); ++it) |
1189
6b9b02a16e99
NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1177
diff
changeset
|
159 { |
3702
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
160 try |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
161 { |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
162 context_.RemoveFile(it->GetUuid(), it->GetContentType()); |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
163 } |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
164 catch (OrthancException& e) |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
165 { |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
166 LOG(ERROR) << "Unable to remove an attachment from the storage area: " |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
167 << it->GetUuid() << " (type: " << EnumerationToString(it->GetContentType()) << ")"; |
643b5ee86f92
fix handling of errors of OrthancPluginStorageRemove()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3699
diff
changeset
|
168 } |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
169 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
170 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
171 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
172 void CommitChanges() |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
173 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
174 for (std::list<ServerIndexChange>::const_iterator |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
175 it = pendingChanges_.begin(); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
176 it != pendingChanges_.end(); ++it) |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
177 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
178 context_.SignalChange(*it); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
179 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
180 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
181 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
182 virtual void SignalRemainingAncestor(ResourceType parentType, |
4571
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
183 const std::string& publicId) ORTHANC_OVERRIDE |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
184 { |
4268
0ae2ca210077
new macro TLOG() to replace VLOG() for trace logs with a category
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4263
diff
changeset
|
185 LOG(TRACE) << "Remaining ancestor \"" << publicId << "\" (" << parentType << ")"; |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
186 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
187 if (hasRemainingLevel_) |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
188 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
189 if (parentType < remainingType_) |
1189
6b9b02a16e99
NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1177
diff
changeset
|
190 { |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
191 remainingType_ = parentType; |
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
192 remainingPublicId_ = publicId; |
1191
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
193 } |
1158 | 194 } |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
195 else |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
196 { |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
197 hasRemainingLevel_ = true; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
198 remainingType_ = parentType; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
199 remainingPublicId_ = publicId; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
200 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
201 } |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
202 |
4571
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
203 virtual void SignalAttachmentDeleted(const FileInfo& info) ORTHANC_OVERRIDE |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
204 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
205 assert(Toolbox::IsUuid(info.GetUuid())); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
206 pendingFilesToRemove_.push_back(FileToRemove(info)); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
207 sizeOfFilesToRemove_ += info.GetCompressedSize(); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
208 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
209 |
4571
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
210 virtual void SignalResourceDeleted(ResourceType type, |
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
211 const std::string& publicId) ORTHANC_OVERRIDE |
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
212 { |
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
213 SignalChange(ServerIndexChange(ChangeType_Deleted, type, publicId)); |
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
214 } |
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
215 |
9224e107d613
simplifying IDatabaseListener::SignalChange() as IDatabaseListener::SignalResourceDeleted()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4570
diff
changeset
|
216 void SignalChange(const ServerIndexChange& change) |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
217 { |
4268
0ae2ca210077
new macro TLOG() to replace VLOG() for trace logs with a category
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4263
diff
changeset
|
218 LOG(TRACE) << "Change related to resource " << change.GetPublicId() << " of type " |
0ae2ca210077
new macro TLOG() to replace VLOG() for trace logs with a category
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4263
diff
changeset
|
219 << EnumerationToString(change.GetResourceType()) << ": " |
0ae2ca210077
new macro TLOG() to replace VLOG() for trace logs with a category
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4263
diff
changeset
|
220 << EnumerationToString(change.GetChangeType()); |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
221 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
222 if (insideTransaction_) |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
223 { |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
224 pendingChanges_.push_back(change); |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
225 } |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
226 else |
201
bee20e978835
refactoring of delete
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
200
diff
changeset
|
227 { |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
228 context_.SignalChange(change); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
229 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
230 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
231 |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
232 void SignalAttachmentsAdded(uint64_t compressedSize) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
233 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
234 sizeOfAddedAttachments_ += compressedSize; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
235 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
236 |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
237 bool HasRemainingLevel() const |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
238 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
239 return hasRemainingLevel_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
240 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
241 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
242 ResourceType GetRemainingType() const |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
243 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
244 assert(HasRemainingLevel()); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
245 return remainingType_; |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
246 } |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
247 |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
248 const std::string& GetRemainingPublicId() const |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
249 { |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
250 assert(HasRemainingLevel()); |
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
251 return remainingPublicId_; |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
252 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
253 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
254 uint64_t GetSizeOfAddedAttachments() const |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
255 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
256 return sizeOfAddedAttachments_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
257 } |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
258 }; |
0 | 259 |
260 | |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
261 class ServerIndex::Transaction |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
262 { |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
263 private: |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
264 ServerIndex& index_; |
3712
2a170a8f1faf
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3702
diff
changeset
|
265 std::unique_ptr<IDatabaseWrapper::ITransaction> transaction_; |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
266 bool isCommitted_; |
4205 | 267 |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
268 public: |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
269 explicit Transaction(ServerIndex& index, |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
270 TransactionType type) : |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
271 index_(index), |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
272 isCommitted_(false) |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
273 { |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
274 transaction_.reset(index_.db_.StartTransaction(type)); |
1191
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
275 index_.listener_->StartTransaction(); |
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
276 } |
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
277 |
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
278 ~Transaction() |
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
279 { |
d49505e377e3
demo of OnChangeCallback in plugins
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1189
diff
changeset
|
280 index_.listener_->EndTransaction(); |
1310
61ce8147f30d
custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1306
diff
changeset
|
281 |
61ce8147f30d
custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1306
diff
changeset
|
282 if (!isCommitted_) |
61ce8147f30d
custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1306
diff
changeset
|
283 { |
61ce8147f30d
custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1306
diff
changeset
|
284 transaction_->Rollback(); |
61ce8147f30d
custom database back-end
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1306
diff
changeset
|
285 } |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
286 } |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
287 |
4576 | 288 void Commit() |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
289 { |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
290 if (!isCommitted_) |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
291 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
292 int64_t delta = (static_cast<int64_t>(index_.listener_->GetSizeOfAddedAttachments()) - |
3019
8336204d95dc
refactoring computation of disk size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3006
diff
changeset
|
293 static_cast<int64_t>(index_.listener_->GetSizeOfFilesToRemove())); |
8336204d95dc
refactoring computation of disk size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3006
diff
changeset
|
294 |
8336204d95dc
refactoring computation of disk size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3006
diff
changeset
|
295 transaction_->Commit(delta); |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
296 |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
297 // We can remove the files once the SQLite transaction has |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
298 // been successfully committed. Some files might have to be |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
299 // deleted because of recycling. |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
300 index_.listener_->CommitFilesToRemove(); |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
301 |
1189
6b9b02a16e99
NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1177
diff
changeset
|
302 // Send all the pending changes to the Orthanc plugins |
6b9b02a16e99
NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1177
diff
changeset
|
303 index_.listener_->CommitChanges(); |
6b9b02a16e99
NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1177
diff
changeset
|
304 |
278
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
305 isCommitted_ = true; |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
306 } |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
307 } |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
308 }; |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
309 |
771f12042be9
more efficient determination of storage size for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
273
diff
changeset
|
310 |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
311 class ServerIndex::UnstableResourcePayload |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
312 { |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
313 private: |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
314 ResourceType type_; |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
315 std::string publicId_; |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
316 boost::posix_time::ptime time_; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
317 |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
318 public: |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
319 UnstableResourcePayload() : type_(ResourceType_Instance) |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
320 { |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
321 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
322 |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
323 UnstableResourcePayload(Orthanc::ResourceType type, |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
324 const std::string& publicId) : |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
325 type_(type), |
4205 | 326 publicId_(publicId), |
327 time_(boost::posix_time::second_clock::local_time()) | |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
328 { |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
329 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
330 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
331 unsigned int GetAge() const |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
332 { |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
333 return (boost::posix_time::second_clock::local_time() - time_).total_seconds(); |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
334 } |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
335 |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
336 ResourceType GetResourceType() const |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
337 { |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
338 return type_; |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
339 } |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
340 |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
341 const std::string& GetPublicId() const |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
342 { |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
343 return publicId_; |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
344 } |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
345 }; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
346 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
347 |
3027 | 348 class ServerIndex::MainDicomTagsRegistry : public boost::noncopyable |
349 { | |
350 private: | |
351 class TagInfo | |
352 { | |
353 private: | |
354 ResourceType level_; | |
355 DicomTagType type_; | |
356 | |
357 public: | |
358 TagInfo() | |
359 { | |
360 } | |
361 | |
362 TagInfo(ResourceType level, | |
363 DicomTagType type) : | |
364 level_(level), | |
365 type_(type) | |
366 { | |
367 } | |
368 | |
369 ResourceType GetLevel() const | |
370 { | |
371 return level_; | |
372 } | |
373 | |
374 DicomTagType GetType() const | |
375 { | |
376 return type_; | |
377 } | |
378 }; | |
379 | |
380 typedef std::map<DicomTag, TagInfo> Registry; | |
381 | |
382 | |
383 Registry registry_; | |
384 | |
385 void LoadTags(ResourceType level) | |
386 { | |
3650
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
387 { |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
388 const DicomTag* tags = NULL; |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
389 size_t size; |
3027 | 390 |
3650
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
391 ServerToolbox::LoadIdentifiers(tags, size, level); |
3027 | 392 |
3650
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
393 for (size_t i = 0; i < size; i++) |
3027 | 394 { |
3650
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
395 if (registry_.find(tags[i]) == registry_.end()) |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
396 { |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
397 registry_[tags[i]] = TagInfo(level, DicomTagType_Identifier); |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
398 } |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
399 else |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
400 { |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
401 // These patient-level tags are copied in the study level |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
402 assert(level == ResourceType_Study && |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
403 (tags[i] == DICOM_TAG_PATIENT_ID || |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
404 tags[i] == DICOM_TAG_PATIENT_NAME || |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
405 tags[i] == DICOM_TAG_PATIENT_BIRTH_DATE)); |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
406 } |
3027 | 407 } |
408 } | |
3650
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
409 |
3027 | 410 { |
3650
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
411 std::set<DicomTag> tags; |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
412 DicomMap::GetMainDicomTags(tags, level); |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
413 |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
414 for (std::set<DicomTag>::const_iterator |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
415 tag = tags.begin(); tag != tags.end(); ++tag) |
3027 | 416 { |
3650
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
417 if (registry_.find(*tag) == registry_.end()) |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
418 { |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
419 registry_[*tag] = TagInfo(level, DicomTagType_Main); |
e5811a9f8df0
removing DicomMap::LoadMainDicomTags()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3640
diff
changeset
|
420 } |
3027 | 421 } |
422 } | |
423 } | |
424 | |
425 public: | |
426 MainDicomTagsRegistry() | |
427 { | |
428 LoadTags(ResourceType_Patient); | |
429 LoadTags(ResourceType_Study); | |
430 LoadTags(ResourceType_Series); | |
431 LoadTags(ResourceType_Instance); | |
432 } | |
433 | |
434 void LookupTag(ResourceType& level, | |
435 DicomTagType& type, | |
436 const DicomTag& tag) const | |
437 { | |
438 Registry::const_iterator it = registry_.find(tag); | |
439 | |
440 if (it == registry_.end()) | |
441 { | |
442 // Default values | |
443 level = ResourceType_Instance; | |
444 type = DicomTagType_Generic; | |
445 } | |
446 else | |
447 { | |
448 level = it->second.GetLevel(); | |
449 type = it->second.GetType(); | |
450 } | |
451 } | |
452 }; | |
453 | |
454 | |
2665
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
455 void ServerIndex::FlushThread(ServerIndex* that, |
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
456 unsigned int threadSleep) |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
457 { |
1102
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1006
diff
changeset
|
458 // By default, wait for 10 seconds before flushing |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1006
diff
changeset
|
459 unsigned int sleep = 10; |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
460 |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
461 // TODO - REMOVE THIS |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
462 try |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
463 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
464 boost::mutex::scoped_lock lock(that->monitoringMutex_); |
1239 | 465 std::string sleepString; |
1102
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1006
diff
changeset
|
466 |
1247 | 467 if (that->db_.LookupGlobalProperty(sleepString, GlobalProperty_FlushSleep) && |
1239 | 468 Toolbox::IsInteger(sleepString)) |
1102
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1006
diff
changeset
|
469 { |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1006
diff
changeset
|
470 sleep = boost::lexical_cast<unsigned int>(sleepString); |
ce6386b37afd
avoid unnecessary exceptions on Orthanc startup
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1006
diff
changeset
|
471 } |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
472 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
473 catch (boost::bad_lexical_cast&) |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
474 { |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
475 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
476 |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
477 LOG(INFO) << "Starting the database flushing thread (sleep = " << sleep << ")"; |
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
478 |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
479 unsigned int count = 0; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
480 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
481 while (!that->done_) |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
482 { |
2665
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
483 boost::this_thread::sleep(boost::posix_time::milliseconds(threadSleep)); |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
484 count++; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
485 if (count < sleep) |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
486 { |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
487 continue; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
488 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
489 |
2217 | 490 Logging::Flush(); |
491 | |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
492 boost::mutex::scoped_lock lock(that->monitoringMutex_); |
3698
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
493 |
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
494 try |
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
495 { |
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
496 that->db_.FlushToDisk(); |
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
497 } |
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
498 catch (OrthancException&) |
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
499 { |
3699
efa815dd2c20
additional logging
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3698
diff
changeset
|
500 LOG(ERROR) << "Cannot flush the SQLite database to the disk (is your filesystem full?)"; |
3698
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
501 } |
356ebef2cd95
prevent crash on full disk
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3650
diff
changeset
|
502 |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
503 count = 0; |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
504 } |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
505 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
506 LOG(INFO) << "Stopping the database flushing thread"; |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
507 } |
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
508 |
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
509 |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
510 static bool ComputeExpectedNumberOfInstances(int64_t& target, |
433 | 511 const DicomMap& dicomSummary) |
512 { | |
513 try | |
514 { | |
656 | 515 const DicomValue* value; |
516 const DicomValue* value2; | |
517 | |
433 | 518 if ((value = dicomSummary.TestAndGetValue(DICOM_TAG_IMAGES_IN_ACQUISITION)) != NULL && |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
519 !value->IsNull() && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
520 !value->IsBinary() && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
521 (value2 = dicomSummary.TestAndGetValue(DICOM_TAG_NUMBER_OF_TEMPORAL_POSITIONS)) != NULL && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
522 !value2->IsNull() && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
523 !value2->IsBinary()) |
433 | 524 { |
525 // Patch for series with temporal positions thanks to Will Ryder | |
1737
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
526 int64_t imagesInAcquisition = boost::lexical_cast<int64_t>(value->GetContent()); |
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
527 int64_t countTemporalPositions = boost::lexical_cast<int64_t>(value2->GetContent()); |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
528 target = imagesInAcquisition * countTemporalPositions; |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
529 return (target > 0); |
433 | 530 } |
531 | |
532 else if ((value = dicomSummary.TestAndGetValue(DICOM_TAG_NUMBER_OF_SLICES)) != NULL && | |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
533 !value->IsNull() && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
534 !value->IsBinary() && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
535 (value2 = dicomSummary.TestAndGetValue(DICOM_TAG_NUMBER_OF_TIME_SLICES)) != NULL && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
536 !value2->IsBinary() && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
537 !value2->IsNull()) |
433 | 538 { |
539 // Support of Cardio-PET images | |
1737
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
540 int64_t numberOfSlices = boost::lexical_cast<int64_t>(value->GetContent()); |
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
541 int64_t numberOfTimeSlices = boost::lexical_cast<int64_t>(value2->GetContent()); |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
542 target = numberOfSlices * numberOfTimeSlices; |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
543 return (target > 0); |
433 | 544 } |
545 | |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
546 else if ((value = dicomSummary.TestAndGetValue(DICOM_TAG_CARDIAC_NUMBER_OF_IMAGES)) != NULL && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
547 !value->IsNull() && |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
548 !value->IsBinary()) |
433 | 549 { |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
550 target = boost::lexical_cast<int64_t>(value->GetContent()); |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
551 return (target > 0); |
433 | 552 } |
553 } | |
1737
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
554 catch (OrthancException&) |
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
555 { |
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
556 } |
ec66a16aa398
removal of DicomStringValue and DicomNullValue
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1725
diff
changeset
|
557 catch (boost::bad_lexical_cast&) |
433 | 558 { |
559 } | |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
560 |
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
561 return false; |
433 | 562 } |
563 | |
564 | |
1237 | 565 |
566 | |
3187
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
567 static bool LookupStringMetadata(std::string& result, |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
568 const std::map<MetadataType, std::string>& metadata, |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
569 MetadataType type) |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
570 { |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
571 std::map<MetadataType, std::string>::const_iterator found = metadata.find(type); |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
572 |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
573 if (found == metadata.end()) |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
574 { |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
575 return false; |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
576 } |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
577 else |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
578 { |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
579 result = found->second; |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
580 return true; |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
581 } |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
582 } |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
583 |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
584 |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
585 static bool LookupIntegerMetadata(int64_t& result, |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
586 const std::map<MetadataType, std::string>& metadata, |
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
587 MetadataType type) |
1237 | 588 { |
1238 | 589 std::string s; |
3187
4bbadcd03966
refactoring retrieval of metadata from database
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3174
diff
changeset
|
590 if (!LookupStringMetadata(s, metadata, type)) |
1237 | 591 { |
592 return false; | |
593 } | |
594 | |
595 try | |
596 { | |
1238 | 597 result = boost::lexical_cast<int64_t>(s); |
1237 | 598 return true; |
599 } | |
600 catch (boost::bad_lexical_cast&) | |
601 { | |
602 return false; | |
603 } | |
604 } | |
605 | |
606 | |
1297 | 607 void ServerIndex::LogChange(int64_t internalId, |
608 ChangeType changeType, | |
609 ResourceType resourceType, | |
610 const std::string& publicId) | |
611 { | |
612 ServerIndexChange change(changeType, resourceType, publicId); | |
1300
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
613 |
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
614 if (changeType <= ChangeType_INTERNAL_LastLogged) |
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
615 { |
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
616 db_.LogChange(internalId, change); |
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
617 } |
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
618 |
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
619 assert(listener_.get() != NULL); |
919dfb2fb3fe
DANGEROUS refactoring
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1299
diff
changeset
|
620 listener_->SignalChange(change); |
1297 | 621 } |
622 | |
1237 | 623 |
4554 | 624 bool ServerIndex::IsUnstableResource(int64_t id) |
625 { | |
626 return unstableResources_.Contains(id); | |
627 } | |
628 | |
1237 | 629 |
226
8a26a8e85edf
refactoring to read files
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
224
diff
changeset
|
630 ServerIndex::ServerIndex(ServerContext& context, |
2665
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
631 IDatabaseWrapper& db, |
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
632 unsigned int threadSleep) : |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
633 done_(false), |
1247 | 634 db_(db), |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
635 maximumStorageSize_(0), |
2826
c277e0421200
unit testing of overwriting
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2825
diff
changeset
|
636 maximumPatients_(0), |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
637 mainDicomTagsRegistry_(new MainDicomTagsRegistry), |
4554 | 638 maxRetries_(10) |
186
f68c039b0571
preparing refactoring of ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
180
diff
changeset
|
639 { |
1432
0ac74fa21db8
rename IServerIndexListener as IDatabaseListener
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1368
diff
changeset
|
640 listener_.reset(new Listener(context)); |
1247 | 641 db_.SetListener(*listener_); |
180
626777d01dc4
use of hashes to index dicom objects
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
179
diff
changeset
|
642 |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
643 // Initial recycling if the parameters have changed since the last |
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
644 // execution of Orthanc |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
645 StandaloneRecycling(maximumStorageSize_, maximumPatients_); |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
646 |
1306
8cd5784a6d80
IDatabaseWrapper::HasFlushToDisk()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1305
diff
changeset
|
647 if (db.HasFlushToDisk()) |
8cd5784a6d80
IDatabaseWrapper::HasFlushToDisk()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1305
diff
changeset
|
648 { |
2665
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
649 flushThread_ = boost::thread(FlushThread, this, threadSleep); |
1306
8cd5784a6d80
IDatabaseWrapper::HasFlushToDisk()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1305
diff
changeset
|
650 } |
8cd5784a6d80
IDatabaseWrapper::HasFlushToDisk()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1305
diff
changeset
|
651 |
2665
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
652 unstableResourcesMonitorThread_ = boost::thread |
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
653 (UnstableResourcesMonitorThread, this, threadSleep); |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
654 } |
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
655 |
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
656 |
1453
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
657 |
206
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
658 ServerIndex::~ServerIndex() |
4453a010d0db
flush to disk thread
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
205
diff
changeset
|
659 { |
1453
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
660 if (!done_) |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
661 { |
1453
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
662 LOG(ERROR) << "INTERNAL ERROR: ServerIndex::Stop() should be invoked manually to avoid mess in the destruction order!"; |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
663 Stop(); |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
664 } |
0 | 665 } |
666 | |
667 | |
1453
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
668 |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
669 void ServerIndex::Stop() |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
670 { |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
671 if (!done_) |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
672 { |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
673 done_ = true; |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
674 |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
675 if (db_.HasFlushToDisk() && |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
676 flushThread_.joinable()) |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
677 { |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
678 flushThread_.join(); |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
679 } |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
680 |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
681 if (unstableResourcesMonitorThread_.joinable()) |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
682 { |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
683 unstableResourcesMonitorThread_.join(); |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
684 } |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
685 } |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
686 } |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
687 |
c0bdc47165ef
code to warn about possible threading problems
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1432
diff
changeset
|
688 |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
689 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
690 SeriesStatus ServerIndex::ReadOnlyTransaction::GetSeriesStatus(int64_t id, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
691 int64_t expectedNumberOfInstances) |
199 | 692 { |
3091
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
693 std::list<std::string> values; |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
694 db_.GetChildrenMetadata(values, id, MetadataType_Instance_IndexInSeries); |
199 | 695 |
1238 | 696 std::set<int64_t> instances; |
3091
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
697 |
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
698 for (std::list<std::string>::const_iterator |
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
699 it = values.begin(); it != values.end(); ++it) |
199 | 700 { |
1238 | 701 int64_t index; |
3091
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
702 |
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
703 try |
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
704 { |
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
705 index = boost::lexical_cast<int64_t>(*it); |
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
706 } |
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
707 catch (boost::bad_lexical_cast&) |
199 | 708 { |
709 return SeriesStatus_Unknown; | |
710 } | |
3091
476cba12c2b0
IDatabaseWrapper::GetChildrenMetadata()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3090
diff
changeset
|
711 |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
712 if (!(index > 0 && index <= expectedNumberOfInstances)) |
199 | 713 { |
714 // Out-of-range instance index | |
715 return SeriesStatus_Inconsistent; | |
716 } | |
717 | |
718 if (instances.find(index) != instances.end()) | |
719 { | |
720 // Twice the same instance index | |
721 return SeriesStatus_Inconsistent; | |
722 } | |
723 | |
724 instances.insert(index); | |
725 } | |
726 | |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
727 if (static_cast<int64_t>(instances.size()) == expectedNumberOfInstances) |
199 | 728 { |
729 return SeriesStatus_Complete; | |
730 } | |
731 else | |
732 { | |
733 return SeriesStatus_Missing; | |
734 } | |
735 } | |
736 | |
737 | |
202 | 738 void ServerIndex::MainDicomTagsToJson(Json::Value& target, |
4554 | 739 IDatabaseWrapper& db, |
1668
de1413733c97
reconstructing main dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1555
diff
changeset
|
740 int64_t resourceId, |
de1413733c97
reconstructing main dicom tags
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1555
diff
changeset
|
741 ResourceType resourceType) |
198
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
742 { |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
743 DicomMap tags; |
4554 | 744 db.GetMainDicomTags(tags, resourceId); |
1676
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
745 |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
746 if (resourceType == ResourceType_Study) |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
747 { |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
748 DicomMap t1, t2; |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
749 tags.ExtractStudyInformation(t1); |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
750 tags.ExtractPatientInformation(t2); |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
751 |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
752 target["MainDicomTags"] = Json::objectValue; |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
753 FromDcmtkBridge::ToJson(target["MainDicomTags"], t1, true); |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
754 |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
755 target["PatientMainDicomTags"] = Json::objectValue; |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
756 FromDcmtkBridge::ToJson(target["PatientMainDicomTags"], t2, true); |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
757 } |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
758 else |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
759 { |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
760 target["MainDicomTags"] = Json::objectValue; |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
761 FromDcmtkBridge::ToJson(target["MainDicomTags"], tags, true); |
f079f3efe33b
patient tags reported in studies
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1668
diff
changeset
|
762 } |
198
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
763 } |
663cc6c46d0a
before refactoring of ServerIndex::GetXXX
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
197
diff
changeset
|
764 |
3090
31244604f617
starting optimization of SeriesIndex::GetSeriesStatus()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3087
diff
changeset
|
765 |
1244 | 766 template <typename T> |
767 static void FormatLog(Json::Value& target, | |
768 const std::list<T>& log, | |
769 const std::string& name, | |
770 bool done, | |
3105
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
771 int64_t since, |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
772 bool hasLast, |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
773 int64_t last) |
1240 | 774 { |
775 Json::Value items = Json::arrayValue; | |
1244 | 776 for (typename std::list<T>::const_iterator |
1304 | 777 it = log.begin(); it != log.end(); ++it) |
1240 | 778 { |
779 Json::Value item; | |
780 it->Format(item); | |
781 items.append(item); | |
782 } | |
783 | |
784 target = Json::objectValue; | |
1244 | 785 target[name] = items; |
1240 | 786 target["Done"] = done; |
787 | |
3105
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
788 if (!hasLast) |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
789 { |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
790 // Best-effort guess of the last index in the sequence |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
791 if (log.empty()) |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
792 { |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
793 last = since; |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
794 } |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
795 else |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
796 { |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
797 last = log.back().GetSeq(); |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
798 } |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
799 } |
2e1711f80f74
More consistent handling of the "Last" field returned by the "/changes" URI
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3094
diff
changeset
|
800 |
1240 | 801 target["Last"] = static_cast<int>(last); |
802 } | |
803 | |
804 | |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
805 void ServerIndex::SetMaximumPatientCount(unsigned int count) |
268
4bc02e2254ec
preparing ServerIndex for recycling
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
264
diff
changeset
|
806 { |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
807 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
808 boost::mutex::scoped_lock lock(monitoringMutex_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
809 maximumPatients_ = count; |
3020
d207f6ac1f86
tracking disk size by the database engine to ensure consistency across transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3019
diff
changeset
|
810 |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
811 if (count == 0) |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
812 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
813 LOG(WARNING) << "No limit on the number of stored patients"; |
4575
e23bacd4fffc
clarifications in ServerIndex::Recycle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4574
diff
changeset
|
814 } |
e23bacd4fffc
clarifications in ServerIndex::Recycle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4574
diff
changeset
|
815 else |
e23bacd4fffc
clarifications in ServerIndex::Recycle()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4574
diff
changeset
|
816 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
817 LOG(WARNING) << "At most " << count << " patients will be stored"; |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
818 } |
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
819 } |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
820 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
821 StandaloneRecycling(maximumStorageSize_, maximumPatients_); |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
822 } |
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
823 |
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
824 void ServerIndex::SetMaximumStorageSize(uint64_t size) |
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
825 { |
270
e6a4c4329481
parameters for storage capacity
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
269
diff
changeset
|
826 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
827 boost::mutex::scoped_lock lock(monitoringMutex_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
828 maximumStorageSize_ = size; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
829 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
830 if (size == 0) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
831 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
832 LOG(WARNING) << "No limit on the size of the storage area"; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
833 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
834 else |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
835 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
836 LOG(WARNING) << "At most " << (size / MEGA_BYTES) << "MB will be used for the storage area"; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
837 } |
270
e6a4c4329481
parameters for storage capacity
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
269
diff
changeset
|
838 } |
e6a4c4329481
parameters for storage capacity
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
269
diff
changeset
|
839 |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
840 StandaloneRecycling(maximumStorageSize_, maximumPatients_); |
269
f6fdf5abe751
recycling up and running
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
268
diff
changeset
|
841 } |
272
337c506461d2
protection from rest api
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
270
diff
changeset
|
842 |
337c506461d2
protection from rest api
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
270
diff
changeset
|
843 |
2665
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
844 void ServerIndex::UnstableResourcesMonitorThread(ServerIndex* that, |
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
845 unsigned int threadSleep) |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
846 { |
2940
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
847 int stableAge; |
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
848 |
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
849 { |
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
850 OrthancConfiguration::ReaderLock lock; |
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
851 stableAge = lock.GetConfiguration().GetUnsignedIntegerParameter("StableAge", 60); |
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
852 } |
4767d36679ed
refactoring access to Orthanc configuration
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2898
diff
changeset
|
853 |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
854 if (stableAge <= 0) |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
855 { |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
856 stableAge = 60; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
857 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
858 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
859 LOG(INFO) << "Starting the monitor for stable resources (stable age = " << stableAge << ")"; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
860 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
861 while (!that->done_) |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
862 { |
2665
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
863 // Check for stable resources each few seconds |
389d050a2e66
fix deadlock, speed up unit tests
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2664
diff
changeset
|
864 boost::this_thread::sleep(boost::posix_time::milliseconds(threadSleep)); |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
865 |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
866 boost::mutex::scoped_lock lock(that->monitoringMutex_); |
513 | 867 |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
868 while (!that->unstableResources_.IsEmpty() && |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
869 that->unstableResources_.GetOldestPayload().GetAge() > static_cast<unsigned int>(stableAge)) |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
870 { |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
871 // This DICOM resource has not received any new instance for |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
872 // some time. It can be considered as stable. |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
873 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
874 UnstableResourcePayload payload; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
875 int64_t id = that->unstableResources_.RemoveOldest(payload); |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
876 |
513 | 877 // Ensure that the resource is still existing before logging the change |
1247 | 878 if (that->db_.IsExistingResource(id)) |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
879 { |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
880 switch (payload.GetResourceType()) |
513 | 881 { |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
882 case ResourceType_Patient: |
1237 | 883 that->LogChange(id, ChangeType_StablePatient, ResourceType_Patient, payload.GetPublicId()); |
513 | 884 break; |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
885 |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
886 case ResourceType_Study: |
1237 | 887 that->LogChange(id, ChangeType_StableStudy, ResourceType_Study, payload.GetPublicId()); |
513 | 888 break; |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
889 |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
890 case ResourceType_Series: |
1237 | 891 that->LogChange(id, ChangeType_StableSeries, ResourceType_Series, payload.GetPublicId()); |
513 | 892 break; |
893 | |
894 default: | |
895 throw OrthancException(ErrorCode_InternalError); | |
896 } | |
897 | |
898 //LOG(INFO) << "Stable resource: " << EnumerationToString(payload.type_) << " " << id; | |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
899 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
900 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
901 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
902 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
903 LOG(INFO) << "Closing the monitor thread for stable resources"; |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
904 } |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
905 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
906 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
907 void ServerIndex::MarkAsUnstable(int64_t id, |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
908 Orthanc::ResourceType type, |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
909 const std::string& publicId) |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
910 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
911 // WARNING: Before calling this method, "monitoringMutex_" must be locked. |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
912 |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
913 assert(type == Orthanc::ResourceType_Patient || |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
914 type == Orthanc::ResourceType_Study || |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
915 type == Orthanc::ResourceType_Series); |
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
916 |
1177
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
917 UnstableResourcePayload payload(type, publicId); |
5b2d8c280ac2
Plugins can monitor changes through callbacks
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1162
diff
changeset
|
918 unstableResources_.AddOrMakeMostRecent(id, payload); |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
919 //LOG(INFO) << "Unstable resource: " << EnumerationToString(type) << " " << id; |
1189
6b9b02a16e99
NewChildInstance change type
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1177
diff
changeset
|
920 |
1237 | 921 LogChange(id, ChangeType_NewChildInstance, type, publicId); |
511
3b735fdf320b
monitoring of stable patients/studies/series
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
440
diff
changeset
|
922 } |
521 | 923 |
924 | |
925 | |
3029
ea653ec47f31
new class: DatabaseConstraint
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3027
diff
changeset
|
926 void ServerIndex::NormalizeLookup(std::vector<DatabaseConstraint>& target, |
3027 | 927 const DatabaseLookup& source, |
928 ResourceType queryLevel) const | |
929 { | |
930 assert(mainDicomTagsRegistry_.get() != NULL); | |
3029
ea653ec47f31
new class: DatabaseConstraint
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3027
diff
changeset
|
931 |
ea653ec47f31
new class: DatabaseConstraint
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3027
diff
changeset
|
932 target.clear(); |
ea653ec47f31
new class: DatabaseConstraint
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3027
diff
changeset
|
933 target.reserve(source.GetConstraintsCount()); |
3031 | 934 |
3027 | 935 for (size_t i = 0; i < source.GetConstraintsCount(); i++) |
936 { | |
3031 | 937 ResourceType level; |
938 DicomTagType type; | |
3027 | 939 |
3031 | 940 mainDicomTagsRegistry_->LookupTag(level, type, source.GetConstraint(i).GetTag()); |
941 | |
942 if (type == DicomTagType_Identifier || | |
943 type == DicomTagType_Main) | |
3027 | 944 { |
3029
ea653ec47f31
new class: DatabaseConstraint
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3027
diff
changeset
|
945 // Use the fact that patient-level tags are copied at the study level |
3031 | 946 if (level == ResourceType_Patient && |
947 queryLevel != ResourceType_Patient) | |
3027 | 948 { |
3031 | 949 level = ResourceType_Study; |
3027 | 950 } |
3029
ea653ec47f31
new class: DatabaseConstraint
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3027
diff
changeset
|
951 |
3073
0e9d1731b1b0
refactoring to reuse DatabaseConstraint in separate projects
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
3061
diff
changeset
|
952 target.push_back(source.GetConstraint(i).ConvertToDatabaseConstraint(level, type)); |
3027 | 953 } |
954 } | |
955 } | |
956 | |
957 | |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
958 |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
959 |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
960 |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
961 /*** |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
962 ** PROTOTYPING FOR DB REFACTORING BELOW |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
963 ***/ |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
964 |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
965 namespace |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
966 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
967 /** |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
968 * Some handy templates to reduce the verbosity in the definitions |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
969 * of the internal classes. |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
970 **/ |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
971 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
972 template <typename Operations, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
973 typename Tuple> |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
974 class TupleOperationsWrapper : public ServerIndex::IReadOnlyOperations |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
975 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
976 protected: |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
977 Operations& operations_; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
978 const Tuple& tuple_; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
979 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
980 public: |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
981 TupleOperationsWrapper(Operations& operations, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
982 const Tuple& tuple) : |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
983 operations_(operations), |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
984 tuple_(tuple) |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
985 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
986 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
987 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
988 virtual void Apply(ServerIndex::ReadOnlyTransaction& transaction) ORTHANC_OVERRIDE |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
989 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
990 operations_.ApplyTuple(transaction, tuple_); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
991 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
992 }; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
993 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
994 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
995 template <typename T1> |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
996 class ReadOnlyOperationsT1 : public boost::noncopyable |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
997 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
998 public: |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
999 typedef typename boost::tuple<T1> Tuple; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1000 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1001 virtual ~ReadOnlyOperationsT1() |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1002 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1003 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1004 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1005 virtual void ApplyTuple(ServerIndex::ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1006 const Tuple& tuple) = 0; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1007 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1008 void Apply(ServerIndex& index, |
4566
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1009 T1 t1) |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1010 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1011 const Tuple tuple(t1); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1012 TupleOperationsWrapper<ReadOnlyOperationsT1, Tuple> wrapper(*this, tuple); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1013 index.Apply(wrapper); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1014 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1015 }; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1016 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1017 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1018 template <typename T1, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1019 typename T2> |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1020 class ReadOnlyOperationsT2 : public boost::noncopyable |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1021 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1022 public: |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1023 typedef typename boost::tuple<T1, T2> Tuple; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1024 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1025 virtual ~ReadOnlyOperationsT2() |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1026 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1027 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1028 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1029 virtual void ApplyTuple(ServerIndex::ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1030 const Tuple& tuple) = 0; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1031 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1032 void Apply(ServerIndex& index, |
4566
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1033 T1 t1, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1034 T2 t2) |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1035 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1036 const Tuple tuple(t1, t2); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1037 TupleOperationsWrapper<ReadOnlyOperationsT2, Tuple> wrapper(*this, tuple); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1038 index.Apply(wrapper); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1039 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1040 }; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1041 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1042 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1043 template <typename T1, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1044 typename T2, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1045 typename T3> |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1046 class ReadOnlyOperationsT3 : public boost::noncopyable |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1047 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1048 public: |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1049 typedef typename boost::tuple<T1, T2, T3> Tuple; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1050 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1051 virtual ~ReadOnlyOperationsT3() |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1052 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1053 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1054 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1055 virtual void ApplyTuple(ServerIndex::ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1056 const Tuple& tuple) = 0; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1057 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1058 void Apply(ServerIndex& index, |
4566
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1059 T1 t1, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1060 T2 t2, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1061 T3 t3) |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1062 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1063 const Tuple tuple(t1, t2, t3); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1064 TupleOperationsWrapper<ReadOnlyOperationsT3, Tuple> wrapper(*this, tuple); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1065 index.Apply(wrapper); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1066 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1067 }; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1068 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1069 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1070 template <typename T1, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1071 typename T2, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1072 typename T3, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1073 typename T4> |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1074 class ReadOnlyOperationsT4 : public boost::noncopyable |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1075 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1076 public: |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1077 typedef typename boost::tuple<T1, T2, T3, T4> Tuple; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1078 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1079 virtual ~ReadOnlyOperationsT4() |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1080 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1081 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1082 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1083 virtual void ApplyTuple(ServerIndex::ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1084 const Tuple& tuple) = 0; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1085 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1086 void Apply(ServerIndex& index, |
4566
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1087 T1 t1, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1088 T2 t2, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1089 T3 t3, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1090 T4 t4) |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1091 { |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1092 const Tuple tuple(t1, t2, t3, t4); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1093 TupleOperationsWrapper<ReadOnlyOperationsT4, Tuple> wrapper(*this, tuple); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1094 index.Apply(wrapper); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1095 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1096 }; |
4558 | 1097 |
1098 | |
1099 template <typename T1, | |
1100 typename T2, | |
1101 typename T3, | |
1102 typename T4, | |
1103 typename T5> | |
1104 class ReadOnlyOperationsT5 : public boost::noncopyable | |
1105 { | |
1106 public: | |
1107 typedef typename boost::tuple<T1, T2, T3, T4, T5> Tuple; | |
1108 | |
1109 virtual ~ReadOnlyOperationsT5() | |
1110 { | |
1111 } | |
1112 | |
1113 virtual void ApplyTuple(ServerIndex::ReadOnlyTransaction& transaction, | |
1114 const Tuple& tuple) = 0; | |
1115 | |
1116 void Apply(ServerIndex& index, | |
4566
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1117 T1 t1, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1118 T2 t2, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1119 T3 t3, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1120 T4 t4, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1121 T5 t5) |
4558 | 1122 { |
1123 const Tuple tuple(t1, t2, t3, t4, t5); | |
1124 TupleOperationsWrapper<ReadOnlyOperationsT5, Tuple> wrapper(*this, tuple); | |
1125 index.Apply(wrapper); | |
1126 } | |
1127 }; | |
1128 | |
1129 | |
1130 template <typename T1, | |
1131 typename T2, | |
1132 typename T3, | |
1133 typename T4, | |
1134 typename T5, | |
1135 typename T6> | |
1136 class ReadOnlyOperationsT6 : public boost::noncopyable | |
1137 { | |
1138 public: | |
1139 typedef typename boost::tuple<T1, T2, T3, T4, T5, T6> Tuple; | |
1140 | |
1141 virtual ~ReadOnlyOperationsT6() | |
1142 { | |
1143 } | |
1144 | |
1145 virtual void ApplyTuple(ServerIndex::ReadOnlyTransaction& transaction, | |
1146 const Tuple& tuple) = 0; | |
1147 | |
1148 void Apply(ServerIndex& index, | |
4566
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1149 T1 t1, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1150 T2 t2, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1151 T3 t3, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1152 T4 t4, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1153 T5 t5, |
f52d0bc19e07
fix build for msvc2008
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4565
diff
changeset
|
1154 T6 t6) |
4558 | 1155 { |
1156 const Tuple tuple(t1, t2, t3, t4, t5, t6); | |
1157 TupleOperationsWrapper<ReadOnlyOperationsT6, Tuple> wrapper(*this, tuple); | |
1158 index.Apply(wrapper); | |
1159 } | |
1160 }; | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1161 } |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1162 |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1163 |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1164 void ServerIndex::ApplyInternal(IReadOnlyOperations* readOperations, |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1165 IReadWriteOperations* writeOperations) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1166 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1167 if ((readOperations == NULL && writeOperations == NULL) || |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1168 (readOperations != NULL && writeOperations != NULL)) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1169 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1170 throw OrthancException(ErrorCode_InternalError); |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1171 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1172 |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1173 unsigned int count = 0; |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1174 |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1175 for (;;) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1176 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1177 try |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1178 { |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
1179 boost::mutex::scoped_lock lock(monitoringMutex_); // TODO - REMOVE |
4554 | 1180 |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1181 if (readOperations != NULL) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1182 { |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1183 /** |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1184 * IMPORTANT: In Orthanc <= 1.9.1, there was no transaction |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1185 * in this case. This was OK because of the presence of the |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1186 * global mutex protecting the database. |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1187 **/ |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1188 |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1189 Transaction transaction(*this, TransactionType_ReadOnly); // TODO - Only if not "TransactionType_Implicit" |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1190 { |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1191 ReadOnlyTransaction t(db_); |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1192 readOperations->Apply(t); |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1193 } |
4576 | 1194 transaction.Commit(); |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1195 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1196 else |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1197 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1198 assert(writeOperations != NULL); |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1199 |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1200 Transaction transaction(*this, TransactionType_ReadWrite); |
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1201 { |
4573 | 1202 assert(listener_.get() != NULL); |
1203 ReadWriteTransaction t(db_, *listener_, *this); | |
1204 writeOperations->Apply(t); | |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1205 } |
4576 | 1206 transaction.Commit(); |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1207 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1208 |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1209 return; // Success |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1210 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1211 catch (OrthancException& e) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1212 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1213 if (e.GetErrorCode() == ErrorCode_DatabaseCannotSerialize) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1214 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1215 if (count == maxRetries_) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1216 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1217 throw; |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1218 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1219 else |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1220 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1221 count++; |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1222 boost::this_thread::sleep(boost::posix_time::milliseconds(100 * count)); |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1223 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1224 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1225 else if (e.GetErrorCode() == ErrorCode_DatabaseUnavailable) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1226 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1227 if (count == maxRetries_) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1228 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1229 throw; |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1230 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1231 else |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1232 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1233 count++; |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1234 boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1235 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1236 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1237 else |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1238 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1239 throw; |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1240 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1241 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1242 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1243 } |
4561
02510325d869
removed function wrappers for transactions in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4560
diff
changeset
|
1244 |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1245 |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1246 void ServerIndex::Apply(IReadOnlyOperations& operations) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1247 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1248 ApplyInternal(&operations, NULL); |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1249 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1250 |
4561
02510325d869
removed function wrappers for transactions in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4560
diff
changeset
|
1251 |
4551
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1252 void ServerIndex::Apply(IReadWriteOperations& operations) |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1253 { |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1254 ApplyInternal(NULL, &operations); |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1255 } |
350a22c094f2
testing replay of transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4514
diff
changeset
|
1256 |
4554 | 1257 |
1258 bool ServerIndex::ExpandResource(Json::Value& target, | |
1259 const std::string& publicId, | |
1260 ResourceType level) | |
1261 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1262 class Operations : public ReadOnlyOperationsT4<bool&, Json::Value&, const std::string&, ResourceType> |
4554 | 1263 { |
1264 private: | |
4567 | 1265 ServerIndex& index_; // TODO - REMOVE |
4554 | 1266 |
1267 public: | |
4562 | 1268 explicit Operations(ServerIndex& index) : |
1269 index_(index) | |
4554 | 1270 { |
1271 } | |
1272 | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1273 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1274 const Tuple& tuple) ORTHANC_OVERRIDE |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1275 { |
4554 | 1276 // Lookup for the requested resource |
1277 int64_t internalId; // unused | |
1278 ResourceType type; | |
1279 std::string parent; | |
4562 | 1280 if (!transaction.LookupResourceAndParent(internalId, type, parent, tuple.get<2>()) || |
1281 type != tuple.get<3>()) | |
4554 | 1282 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1283 tuple.get<0>() = false; |
4554 | 1284 } |
1285 else | |
1286 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1287 Json::Value& target = tuple.get<1>(); |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1288 target = Json::objectValue; |
4554 | 1289 |
1290 // Set information about the parent resource (if it exists) | |
1291 if (type == ResourceType_Patient) | |
1292 { | |
1293 if (!parent.empty()) | |
1294 { | |
1295 throw OrthancException(ErrorCode_DatabasePlugin); | |
1296 } | |
1297 } | |
1298 else | |
1299 { | |
1300 if (parent.empty()) | |
1301 { | |
1302 throw OrthancException(ErrorCode_DatabasePlugin); | |
1303 } | |
1304 | |
1305 switch (type) | |
1306 { | |
1307 case ResourceType_Study: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1308 target["ParentPatient"] = parent; |
4554 | 1309 break; |
1310 | |
1311 case ResourceType_Series: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1312 target["ParentStudy"] = parent; |
4554 | 1313 break; |
1314 | |
1315 case ResourceType_Instance: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1316 target["ParentSeries"] = parent; |
4554 | 1317 break; |
1318 | |
1319 default: | |
1320 throw OrthancException(ErrorCode_InternalError); | |
1321 } | |
1322 } | |
1323 | |
1324 // List the children resources | |
1325 std::list<std::string> children; | |
1326 transaction.GetChildrenPublicId(children, internalId); | |
1327 | |
1328 if (type != ResourceType_Instance) | |
1329 { | |
1330 Json::Value c = Json::arrayValue; | |
1331 | |
1332 for (std::list<std::string>::const_iterator | |
1333 it = children.begin(); it != children.end(); ++it) | |
1334 { | |
1335 c.append(*it); | |
1336 } | |
1337 | |
1338 switch (type) | |
1339 { | |
1340 case ResourceType_Patient: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1341 target["Studies"] = c; |
4554 | 1342 break; |
1343 | |
1344 case ResourceType_Study: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1345 target["Series"] = c; |
4554 | 1346 break; |
1347 | |
1348 case ResourceType_Series: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1349 target["Instances"] = c; |
4554 | 1350 break; |
1351 | |
1352 default: | |
1353 throw OrthancException(ErrorCode_InternalError); | |
1354 } | |
1355 } | |
1356 | |
1357 // Extract the metadata | |
1358 std::map<MetadataType, std::string> metadata; | |
1359 transaction.GetAllMetadata(metadata, internalId); | |
1360 | |
1361 // Set the resource type | |
1362 switch (type) | |
1363 { | |
1364 case ResourceType_Patient: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1365 target["Type"] = "Patient"; |
4554 | 1366 break; |
1367 | |
1368 case ResourceType_Study: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1369 target["Type"] = "Study"; |
4554 | 1370 break; |
1371 | |
1372 case ResourceType_Series: | |
1373 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1374 target["Type"] = "Series"; |
4554 | 1375 |
1376 int64_t i; | |
1377 if (LookupIntegerMetadata(i, metadata, MetadataType_Series_ExpectedNumberOfInstances)) | |
1378 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1379 target["ExpectedNumberOfInstances"] = static_cast<int>(i); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1380 target["Status"] = EnumerationToString(transaction.GetSeriesStatus(internalId, i)); |
4554 | 1381 } |
1382 else | |
1383 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1384 target["ExpectedNumberOfInstances"] = Json::nullValue; |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1385 target["Status"] = EnumerationToString(SeriesStatus_Unknown); |
4554 | 1386 } |
1387 | |
1388 break; | |
1389 } | |
1390 | |
1391 case ResourceType_Instance: | |
1392 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1393 target["Type"] = "Instance"; |
4554 | 1394 |
1395 FileInfo attachment; | |
1396 if (!transaction.LookupAttachment(attachment, internalId, FileContentType_Dicom)) | |
1397 { | |
1398 throw OrthancException(ErrorCode_InternalError); | |
1399 } | |
1400 | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1401 target["FileSize"] = static_cast<unsigned int>(attachment.GetUncompressedSize()); |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1402 target["FileUuid"] = attachment.GetUuid(); |
4554 | 1403 |
1404 int64_t i; | |
1405 if (LookupIntegerMetadata(i, metadata, MetadataType_Instance_IndexInSeries)) | |
1406 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1407 target["IndexInSeries"] = static_cast<int>(i); |
4554 | 1408 } |
1409 else | |
1410 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1411 target["IndexInSeries"] = Json::nullValue; |
4554 | 1412 } |
1413 | |
1414 break; | |
1415 } | |
1416 | |
1417 default: | |
1418 throw OrthancException(ErrorCode_InternalError); | |
1419 } | |
1420 | |
1421 // Record the remaining information | |
4562 | 1422 target["ID"] = tuple.get<2>(); |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1423 transaction.MainDicomTagsToJson(target, internalId, type); |
4554 | 1424 |
1425 std::string tmp; | |
1426 | |
1427 if (LookupStringMetadata(tmp, metadata, MetadataType_AnonymizedFrom)) | |
1428 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1429 target["AnonymizedFrom"] = tmp; |
4554 | 1430 } |
1431 | |
1432 if (LookupStringMetadata(tmp, metadata, MetadataType_ModifiedFrom)) | |
1433 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1434 target["ModifiedFrom"] = tmp; |
4554 | 1435 } |
1436 | |
1437 if (type == ResourceType_Patient || | |
1438 type == ResourceType_Study || | |
1439 type == ResourceType_Series) | |
1440 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1441 target["IsStable"] = !index_.IsUnstableResource(internalId); |
4554 | 1442 |
1443 if (LookupStringMetadata(tmp, metadata, MetadataType_LastUpdate)) | |
1444 { | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1445 target["LastUpdate"] = tmp; |
4554 | 1446 } |
1447 } | |
1448 | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1449 tuple.get<0>() = true; |
4554 | 1450 } |
1451 } | |
1452 }; | |
1453 | |
4562 | 1454 bool found; |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1455 Operations operations(*this); |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1456 operations.Apply(*this, found, target, publicId, level); |
4562 | 1457 return found; |
4554 | 1458 } |
1459 | |
1460 | |
1461 void ServerIndex::GetAllMetadata(std::map<MetadataType, std::string>& target, | |
1462 const std::string& publicId, | |
1463 ResourceType level) | |
1464 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1465 class Operations : public ReadOnlyOperationsT3<std::map<MetadataType, std::string>&, const std::string&, ResourceType> |
4554 | 1466 { |
1467 public: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1468 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1469 const Tuple& tuple) ORTHANC_OVERRIDE |
4554 | 1470 { |
1471 ResourceType type; | |
1472 int64_t id; | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1473 if (!transaction.LookupResource(id, type, tuple.get<1>()) || |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1474 tuple.get<2>() != type) |
4554 | 1475 { |
1476 throw OrthancException(ErrorCode_UnknownResource); | |
1477 } | |
1478 else | |
1479 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1480 transaction.GetAllMetadata(tuple.get<0>(), id); |
4554 | 1481 } |
1482 } | |
1483 }; | |
1484 | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1485 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1486 operations.Apply(*this, target, publicId, level); |
4554 | 1487 } |
4555 | 1488 |
1489 | |
1490 bool ServerIndex::LookupAttachment(FileInfo& attachment, | |
1491 const std::string& instancePublicId, | |
1492 FileContentType contentType) | |
1493 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1494 class Operations : public ReadOnlyOperationsT4<bool&, FileInfo&, const std::string&, FileContentType> |
4555 | 1495 { |
1496 public: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1497 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1498 const Tuple& tuple) ORTHANC_OVERRIDE |
4555 | 1499 { |
1500 int64_t internalId; | |
1501 ResourceType type; | |
4562 | 1502 if (!transaction.LookupResource(internalId, type, tuple.get<2>())) |
4555 | 1503 { |
1504 throw OrthancException(ErrorCode_UnknownResource); | |
1505 } | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1506 else if (transaction.LookupAttachment(tuple.get<1>(), internalId, tuple.get<3>())) |
4555 | 1507 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1508 assert(tuple.get<1>().GetContentType() == tuple.get<3>()); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1509 tuple.get<0>() = true; |
4555 | 1510 } |
1511 else | |
1512 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1513 tuple.get<0>() = false; |
4555 | 1514 } |
1515 } | |
1516 }; | |
1517 | |
4562 | 1518 bool found; |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1519 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1520 operations.Apply(*this, found, attachment, instancePublicId, contentType); |
4562 | 1521 return found; |
4555 | 1522 } |
1523 | |
1524 | |
1525 void ServerIndex::GetAllUuids(std::list<std::string>& target, | |
1526 ResourceType resourceType) | |
1527 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1528 class Operations : public ReadOnlyOperationsT2<std::list<std::string>&, ResourceType> |
4555 | 1529 { |
1530 public: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1531 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1532 const Tuple& tuple) ORTHANC_OVERRIDE |
4555 | 1533 { |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1534 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1535 transaction.GetAllPublicIds(tuple.get<0>(), tuple.get<1>()); |
4555 | 1536 } |
1537 }; | |
1538 | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1539 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1540 operations.Apply(*this, target, resourceType); |
4555 | 1541 } |
1542 | |
1543 | |
1544 void ServerIndex::GetAllUuids(std::list<std::string>& target, | |
1545 ResourceType resourceType, | |
1546 size_t since, | |
1547 size_t limit) | |
1548 { | |
1549 if (limit == 0) | |
1550 { | |
1551 target.clear(); | |
1552 } | |
1553 else | |
1554 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1555 class Operations : public ReadOnlyOperationsT4<std::list<std::string>&, ResourceType, size_t, size_t> |
4555 | 1556 { |
1557 public: | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1558 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1559 const Tuple& tuple) ORTHANC_OVERRIDE |
4555 | 1560 { |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1561 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1562 transaction.GetAllPublicIds(tuple.get<0>(), tuple.get<1>(), tuple.get<2>(), tuple.get<3>()); |
4555 | 1563 } |
1564 }; | |
1565 | |
4557
b6d4b735eb4d
templates to reduce verbosity in ServerIndex implementation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4556
diff
changeset
|
1566 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1567 operations.Apply(*this, target, resourceType, since, limit); |
4555 | 1568 } |
1569 } | |
4558 | 1570 |
1571 | |
1572 void ServerIndex::GetGlobalStatistics(/* out */ uint64_t& diskSize, | |
1573 /* out */ uint64_t& uncompressedSize, | |
1574 /* out */ uint64_t& countPatients, | |
1575 /* out */ uint64_t& countStudies, | |
1576 /* out */ uint64_t& countSeries, | |
1577 /* out */ uint64_t& countInstances) | |
1578 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1579 class Operations : public ReadOnlyOperationsT6<uint64_t&, uint64_t&, uint64_t&, uint64_t&, uint64_t&, uint64_t&> |
4558 | 1580 { |
1581 public: | |
1582 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1583 const Tuple& tuple) ORTHANC_OVERRIDE | |
1584 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1585 tuple.get<0>() = transaction.GetTotalCompressedSize(); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1586 tuple.get<1>() = transaction.GetTotalUncompressedSize(); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1587 tuple.get<2>() = transaction.GetResourceCount(ResourceType_Patient); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1588 tuple.get<3>() = transaction.GetResourceCount(ResourceType_Study); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1589 tuple.get<4>() = transaction.GetResourceCount(ResourceType_Series); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1590 tuple.get<5>() = transaction.GetResourceCount(ResourceType_Instance); |
4558 | 1591 } |
1592 }; | |
1593 | |
1594 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1595 operations.Apply(*this, diskSize, uncompressedSize, countPatients, |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1596 countStudies, countSeries, countInstances); |
4558 | 1597 } |
1598 | |
1599 | |
1600 void ServerIndex::GetChanges(Json::Value& target, | |
1601 int64_t since, | |
1602 unsigned int maxResults) | |
1603 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1604 class Operations : public ReadOnlyOperationsT3<Json::Value&, int64_t, unsigned int> |
4558 | 1605 { |
1606 public: | |
1607 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1608 const Tuple& tuple) ORTHANC_OVERRIDE | |
1609 { | |
1610 // NB: In Orthanc <= 1.3.2, a transaction was missing, as | |
1611 // "GetLastChange()" involves calls to "GetPublicId()" | |
1612 | |
1613 std::list<ServerIndexChange> changes; | |
1614 bool done; | |
1615 bool hasLast = false; | |
1616 int64_t last = 0; | |
1617 | |
1618 transaction.GetChanges(changes, done, tuple.get<1>(), tuple.get<2>()); | |
1619 if (changes.empty()) | |
1620 { | |
1621 last = transaction.GetLastChangeIndex(); | |
1622 hasLast = true; | |
1623 } | |
1624 | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1625 FormatLog(tuple.get<0>(), changes, "Changes", done, tuple.get<1>(), hasLast, last); |
4558 | 1626 } |
1627 }; | |
1628 | |
1629 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1630 operations.Apply(*this, target, since, maxResults); |
4558 | 1631 } |
1632 | |
1633 | |
1634 void ServerIndex::GetLastChange(Json::Value& target) | |
1635 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1636 class Operations : public ReadOnlyOperationsT1<Json::Value&> |
4558 | 1637 { |
1638 public: | |
1639 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1640 const Tuple& tuple) ORTHANC_OVERRIDE | |
1641 { | |
1642 // NB: In Orthanc <= 1.3.2, a transaction was missing, as | |
1643 // "GetLastChange()" involves calls to "GetPublicId()" | |
1644 | |
1645 std::list<ServerIndexChange> changes; | |
1646 bool hasLast = false; | |
1647 int64_t last = 0; | |
1648 | |
1649 transaction.GetLastChange(changes); | |
1650 if (changes.empty()) | |
1651 { | |
1652 last = transaction.GetLastChangeIndex(); | |
1653 hasLast = true; | |
1654 } | |
1655 | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1656 FormatLog(tuple.get<0>(), changes, "Changes", true, 0, hasLast, last); |
4558 | 1657 } |
1658 }; | |
1659 | |
1660 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1661 operations.Apply(*this, target); |
4558 | 1662 } |
1663 | |
1664 | |
1665 void ServerIndex::GetExportedResources(Json::Value& target, | |
1666 int64_t since, | |
1667 unsigned int maxResults) | |
1668 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1669 class Operations : public ReadOnlyOperationsT3<Json::Value&, int64_t, unsigned int> |
4558 | 1670 { |
1671 public: | |
1672 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1673 const Tuple& tuple) ORTHANC_OVERRIDE | |
1674 { | |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1675 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4558 | 1676 |
1677 std::list<ExportedResource> exported; | |
1678 bool done; | |
1679 transaction.GetExportedResources(exported, done, tuple.get<1>(), tuple.get<2>()); | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1680 FormatLog(tuple.get<0>(), exported, "Exports", done, tuple.get<1>(), false, -1); |
4558 | 1681 } |
1682 }; | |
1683 | |
1684 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1685 operations.Apply(*this, target, since, maxResults); |
4558 | 1686 } |
1687 | |
1688 | |
1689 void ServerIndex::GetLastExportedResource(Json::Value& target) | |
1690 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1691 class Operations : public ReadOnlyOperationsT1<Json::Value&> |
4558 | 1692 { |
1693 public: | |
1694 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1695 const Tuple& tuple) ORTHANC_OVERRIDE | |
1696 { | |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
1697 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4558 | 1698 |
1699 std::list<ExportedResource> exported; | |
1700 transaction.GetLastExportedResource(exported); | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1701 FormatLog(tuple.get<0>(), exported, "Exports", true, 0, false, -1); |
4558 | 1702 } |
1703 }; | |
1704 | |
1705 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1706 operations.Apply(*this, target); |
4558 | 1707 } |
4559 | 1708 |
1709 | |
1710 bool ServerIndex::IsProtectedPatient(const std::string& publicId) | |
1711 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1712 class Operations : public ReadOnlyOperationsT2<bool&, const std::string&> |
4559 | 1713 { |
1714 public: | |
1715 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1716 const Tuple& tuple) ORTHANC_OVERRIDE | |
1717 { | |
1718 // Lookup for the requested resource | |
1719 int64_t id; | |
1720 ResourceType type; | |
4562 | 1721 if (!transaction.LookupResource(id, type, tuple.get<1>()) || |
4559 | 1722 type != ResourceType_Patient) |
1723 { | |
1724 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
1725 } | |
1726 else | |
1727 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1728 tuple.get<0>() = transaction.IsProtectedPatient(id); |
4559 | 1729 } |
1730 } | |
1731 }; | |
4562 | 1732 |
1733 bool isProtected; | |
4559 | 1734 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1735 operations.Apply(*this, isProtected, publicId); |
4562 | 1736 return isProtected; |
4559 | 1737 } |
1738 | |
1739 | |
1740 void ServerIndex::GetChildren(std::list<std::string>& result, | |
1741 const std::string& publicId) | |
1742 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1743 class Operations : public ReadOnlyOperationsT2<std::list<std::string>&, const std::string&> |
4559 | 1744 { |
1745 public: | |
1746 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1747 const Tuple& tuple) ORTHANC_OVERRIDE | |
1748 { | |
1749 ResourceType type; | |
1750 int64_t resource; | |
1751 if (!transaction.LookupResource(resource, type, tuple.get<1>())) | |
1752 { | |
1753 throw OrthancException(ErrorCode_UnknownResource); | |
1754 } | |
1755 else if (type == ResourceType_Instance) | |
1756 { | |
1757 // An instance cannot have a child | |
1758 throw OrthancException(ErrorCode_BadParameterType); | |
1759 } | |
1760 else | |
1761 { | |
1762 std::list<int64_t> tmp; | |
1763 transaction.GetChildrenInternalId(tmp, resource); | |
1764 | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1765 tuple.get<0>().clear(); |
4559 | 1766 |
1767 for (std::list<int64_t>::const_iterator | |
1768 it = tmp.begin(); it != tmp.end(); ++it) | |
1769 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1770 tuple.get<0>().push_back(transaction.GetPublicId(*it)); |
4559 | 1771 } |
1772 } | |
1773 } | |
1774 }; | |
1775 | |
1776 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1777 operations.Apply(*this, result, publicId); |
4559 | 1778 } |
1779 | |
1780 | |
1781 void ServerIndex::GetChildInstances(std::list<std::string>& result, | |
1782 const std::string& publicId) | |
1783 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1784 class Operations : public ReadOnlyOperationsT2<std::list<std::string>&, const std::string&> |
4559 | 1785 { |
1786 public: | |
1787 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1788 const Tuple& tuple) ORTHANC_OVERRIDE | |
1789 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1790 tuple.get<0>().clear(); |
4559 | 1791 |
1792 ResourceType type; | |
1793 int64_t top; | |
1794 if (!transaction.LookupResource(top, type, tuple.get<1>())) | |
1795 { | |
1796 throw OrthancException(ErrorCode_UnknownResource); | |
1797 } | |
1798 else if (type == ResourceType_Instance) | |
1799 { | |
1800 // The resource is already an instance: Do not go down the hierarchy | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1801 tuple.get<0>().push_back(tuple.get<1>()); |
4559 | 1802 } |
1803 else | |
1804 { | |
1805 std::stack<int64_t> toExplore; | |
1806 toExplore.push(top); | |
1807 | |
1808 std::list<int64_t> tmp; | |
1809 while (!toExplore.empty()) | |
1810 { | |
1811 // Get the internal ID of the current resource | |
1812 int64_t resource = toExplore.top(); | |
1813 toExplore.pop(); | |
1814 | |
1815 // TODO - This could be optimized by seeing how many | |
1816 // levels "type == transaction.GetResourceType(top)" is | |
1817 // above the "instances level" | |
1818 if (transaction.GetResourceType(resource) == ResourceType_Instance) | |
1819 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1820 tuple.get<0>().push_back(transaction.GetPublicId(resource)); |
4559 | 1821 } |
1822 else | |
1823 { | |
1824 // Tag all the children of this resource as to be explored | |
1825 transaction.GetChildrenInternalId(tmp, resource); | |
1826 for (std::list<int64_t>::const_iterator | |
1827 it = tmp.begin(); it != tmp.end(); ++it) | |
1828 { | |
1829 toExplore.push(*it); | |
1830 } | |
1831 } | |
1832 } | |
1833 } | |
1834 } | |
1835 }; | |
1836 | |
1837 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1838 operations.Apply(*this, result, publicId); |
4559 | 1839 } |
4560 | 1840 |
1841 | |
1842 bool ServerIndex::LookupMetadata(std::string& target, | |
1843 const std::string& publicId, | |
1844 ResourceType expectedType, | |
1845 MetadataType type) | |
1846 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1847 class Operations : public ReadOnlyOperationsT5<bool&, std::string&, const std::string&, ResourceType, MetadataType> |
4560 | 1848 { |
1849 public: | |
1850 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1851 const Tuple& tuple) ORTHANC_OVERRIDE | |
1852 { | |
1853 ResourceType rtype; | |
1854 int64_t id; | |
4562 | 1855 if (!transaction.LookupResource(id, rtype, tuple.get<2>()) || |
1856 rtype != tuple.get<3>()) | |
4560 | 1857 { |
1858 throw OrthancException(ErrorCode_UnknownResource); | |
1859 } | |
1860 else | |
1861 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1862 tuple.get<0>() = transaction.LookupMetadata(tuple.get<1>(), id, tuple.get<4>()); |
4560 | 1863 } |
1864 } | |
1865 }; | |
4562 | 1866 |
1867 bool found; | |
4560 | 1868 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1869 operations.Apply(*this, found, target, publicId, expectedType, type); |
4562 | 1870 return found; |
4560 | 1871 } |
1872 | |
1873 | |
1874 void ServerIndex::ListAvailableAttachments(std::set<FileContentType>& target, | |
1875 const std::string& publicId, | |
1876 ResourceType expectedType) | |
1877 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1878 class Operations : public ReadOnlyOperationsT3<std::set<FileContentType>&, const std::string&, ResourceType> |
4560 | 1879 { |
1880 public: | |
1881 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1882 const Tuple& tuple) ORTHANC_OVERRIDE | |
1883 { | |
1884 ResourceType type; | |
1885 int64_t id; | |
1886 if (!transaction.LookupResource(id, type, tuple.get<1>()) || | |
1887 tuple.get<2>() != type) | |
1888 { | |
1889 throw OrthancException(ErrorCode_UnknownResource); | |
1890 } | |
1891 else | |
1892 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1893 transaction.ListAvailableAttachments(tuple.get<0>(), id); |
4560 | 1894 } |
1895 } | |
1896 }; | |
1897 | |
1898 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1899 operations.Apply(*this, target, publicId, expectedType); |
4560 | 1900 } |
1901 | |
1902 | |
1903 bool ServerIndex::LookupParent(std::string& target, | |
1904 const std::string& publicId) | |
1905 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1906 class Operations : public ReadOnlyOperationsT3<bool&, std::string&, const std::string&> |
4560 | 1907 { |
1908 public: | |
1909 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
1910 const Tuple& tuple) ORTHANC_OVERRIDE | |
1911 { | |
1912 ResourceType type; | |
1913 int64_t id; | |
4562 | 1914 if (!transaction.LookupResource(id, type, tuple.get<2>())) |
4560 | 1915 { |
1916 throw OrthancException(ErrorCode_UnknownResource); | |
1917 } | |
1918 else | |
1919 { | |
1920 int64_t parentId; | |
1921 if (transaction.LookupParent(parentId, id)) | |
1922 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1923 tuple.get<1>() = transaction.GetPublicId(parentId); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1924 tuple.get<0>() = true; |
4562 | 1925 } |
1926 else | |
1927 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1928 tuple.get<0>() = false; |
4562 | 1929 } |
1930 } | |
1931 } | |
1932 }; | |
1933 | |
1934 bool found; | |
1935 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
1936 operations.Apply(*this, found, target, publicId); |
4562 | 1937 return found; |
1938 } | |
1939 | |
1940 | |
1941 void ServerIndex::GetResourceStatistics(/* out */ ResourceType& type, | |
1942 /* out */ uint64_t& diskSize, | |
1943 /* out */ uint64_t& uncompressedSize, | |
1944 /* out */ unsigned int& countStudies, | |
1945 /* out */ unsigned int& countSeries, | |
1946 /* out */ unsigned int& countInstances, | |
1947 /* out */ uint64_t& dicomDiskSize, | |
1948 /* out */ uint64_t& dicomUncompressedSize, | |
1949 const std::string& publicId) | |
1950 { | |
1951 class Operations : public ServerIndex::IReadOnlyOperations | |
1952 { | |
1953 private: | |
1954 ResourceType& type_; | |
1955 uint64_t& diskSize_; | |
1956 uint64_t& uncompressedSize_; | |
1957 unsigned int& countStudies_; | |
1958 unsigned int& countSeries_; | |
1959 unsigned int& countInstances_; | |
1960 uint64_t& dicomDiskSize_; | |
1961 uint64_t& dicomUncompressedSize_; | |
1962 const std::string& publicId_; | |
1963 | |
1964 public: | |
1965 explicit Operations(ResourceType& type, | |
1966 uint64_t& diskSize, | |
1967 uint64_t& uncompressedSize, | |
1968 unsigned int& countStudies, | |
1969 unsigned int& countSeries, | |
1970 unsigned int& countInstances, | |
1971 uint64_t& dicomDiskSize, | |
1972 uint64_t& dicomUncompressedSize, | |
1973 const std::string& publicId) : | |
1974 type_(type), | |
1975 diskSize_(diskSize), | |
1976 uncompressedSize_(uncompressedSize), | |
1977 countStudies_(countStudies), | |
1978 countSeries_(countSeries), | |
1979 countInstances_(countInstances), | |
1980 dicomDiskSize_(dicomDiskSize), | |
1981 dicomUncompressedSize_(dicomUncompressedSize), | |
1982 publicId_(publicId) | |
1983 { | |
1984 } | |
1985 | |
1986 virtual void Apply(ServerIndex::ReadOnlyTransaction& transaction) ORTHANC_OVERRIDE | |
1987 { | |
1988 int64_t top; | |
1989 if (!transaction.LookupResource(top, type_, publicId_)) | |
1990 { | |
1991 throw OrthancException(ErrorCode_UnknownResource); | |
1992 } | |
1993 else | |
1994 { | |
1995 countInstances_ = 0; | |
1996 countSeries_ = 0; | |
1997 countStudies_ = 0; | |
1998 diskSize_ = 0; | |
1999 uncompressedSize_ = 0; | |
2000 dicomDiskSize_ = 0; | |
2001 dicomUncompressedSize_ = 0; | |
2002 | |
2003 std::stack<int64_t> toExplore; | |
2004 toExplore.push(top); | |
2005 | |
2006 while (!toExplore.empty()) | |
2007 { | |
2008 // Get the internal ID of the current resource | |
2009 int64_t resource = toExplore.top(); | |
2010 toExplore.pop(); | |
2011 | |
2012 ResourceType thisType = transaction.GetResourceType(resource); | |
2013 | |
2014 std::set<FileContentType> f; | |
2015 transaction.ListAvailableAttachments(f, resource); | |
2016 | |
2017 for (std::set<FileContentType>::const_iterator | |
2018 it = f.begin(); it != f.end(); ++it) | |
2019 { | |
2020 FileInfo attachment; | |
2021 if (transaction.LookupAttachment(attachment, resource, *it)) | |
2022 { | |
2023 if (attachment.GetContentType() == FileContentType_Dicom) | |
2024 { | |
2025 dicomDiskSize_ += attachment.GetCompressedSize(); | |
2026 dicomUncompressedSize_ += attachment.GetUncompressedSize(); | |
2027 } | |
2028 | |
2029 diskSize_ += attachment.GetCompressedSize(); | |
2030 uncompressedSize_ += attachment.GetUncompressedSize(); | |
2031 } | |
2032 } | |
2033 | |
2034 if (thisType == ResourceType_Instance) | |
2035 { | |
2036 countInstances_++; | |
2037 } | |
2038 else | |
2039 { | |
2040 switch (thisType) | |
2041 { | |
2042 case ResourceType_Study: | |
2043 countStudies_++; | |
2044 break; | |
2045 | |
2046 case ResourceType_Series: | |
2047 countSeries_++; | |
2048 break; | |
2049 | |
2050 default: | |
2051 break; | |
2052 } | |
2053 | |
2054 // Tag all the children of this resource as to be explored | |
2055 std::list<int64_t> tmp; | |
2056 transaction.GetChildrenInternalId(tmp, resource); | |
2057 for (std::list<int64_t>::const_iterator | |
2058 it = tmp.begin(); it != tmp.end(); ++it) | |
2059 { | |
2060 toExplore.push(*it); | |
2061 } | |
2062 } | |
2063 } | |
2064 | |
2065 if (countStudies_ == 0) | |
2066 { | |
2067 countStudies_ = 1; | |
2068 } | |
2069 | |
2070 if (countSeries_ == 0) | |
2071 { | |
2072 countSeries_ = 1; | |
4560 | 2073 } |
2074 } | |
2075 } | |
2076 }; | |
4562 | 2077 |
2078 Operations operations(type, diskSize, uncompressedSize, countStudies, countSeries, | |
2079 countInstances, dicomDiskSize, dicomUncompressedSize, publicId); | |
2080 Apply(operations); | |
2081 } | |
2082 | |
2083 | |
2084 void ServerIndex::LookupIdentifierExact(std::vector<std::string>& result, | |
2085 ResourceType level, | |
2086 const DicomTag& tag, | |
2087 const std::string& value) | |
2088 { | |
2089 assert((level == ResourceType_Patient && tag == DICOM_TAG_PATIENT_ID) || | |
2090 (level == ResourceType_Study && tag == DICOM_TAG_STUDY_INSTANCE_UID) || | |
2091 (level == ResourceType_Study && tag == DICOM_TAG_ACCESSION_NUMBER) || | |
2092 (level == ResourceType_Series && tag == DICOM_TAG_SERIES_INSTANCE_UID) || | |
2093 (level == ResourceType_Instance && tag == DICOM_TAG_SOP_INSTANCE_UID)); | |
4560 | 2094 |
4562 | 2095 result.clear(); |
2096 | |
2097 DicomTagConstraint c(tag, ConstraintType_Equal, value, true, true); | |
2098 | |
2099 std::vector<DatabaseConstraint> query; | |
2100 query.push_back(c.ConvertToDatabaseConstraint(level, DicomTagType_Identifier)); | |
2101 | |
2102 | |
2103 class Operations : public ServerIndex::IReadOnlyOperations | |
2104 { | |
2105 private: | |
2106 std::vector<std::string>& result_; | |
2107 const std::vector<DatabaseConstraint>& query_; | |
2108 ResourceType level_; | |
2109 | |
2110 public: | |
2111 Operations(std::vector<std::string>& result, | |
2112 const std::vector<DatabaseConstraint>& query, | |
2113 ResourceType level) : | |
2114 result_(result), | |
2115 query_(query), | |
2116 level_(level) | |
2117 { | |
2118 } | |
2119 | |
2120 virtual void Apply(ReadOnlyTransaction& transaction) ORTHANC_OVERRIDE | |
2121 { | |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
2122 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4562 | 2123 std::list<std::string> tmp; |
2124 transaction.ApplyLookupResources(tmp, NULL, query_, level_, 0); | |
2125 CopyListToVector(result_, tmp); | |
2126 } | |
2127 }; | |
2128 | |
2129 Operations operations(result, query, level); | |
2130 Apply(operations); | |
2131 } | |
2132 | |
2133 | |
2134 bool ServerIndex::LookupGlobalProperty(std::string& value, | |
2135 GlobalProperty property) | |
2136 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2137 class Operations : public ReadOnlyOperationsT3<bool&, std::string&, GlobalProperty> |
4562 | 2138 { |
2139 public: | |
2140 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
2141 const Tuple& tuple) ORTHANC_OVERRIDE | |
2142 { | |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
2143 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2144 tuple.get<0>() = transaction.LookupGlobalProperty(tuple.get<1>(), tuple.get<2>()); |
4562 | 2145 } |
2146 }; | |
2147 | |
2148 bool found; | |
4560 | 2149 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2150 operations.Apply(*this, found, value, property); |
4562 | 2151 return found; |
2152 } | |
2153 | |
2154 | |
2155 std::string ServerIndex::GetGlobalProperty(GlobalProperty property, | |
2156 const std::string& defaultValue) | |
2157 { | |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2158 std::string s; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2159 if (LookupGlobalProperty(s, property)) |
4562 | 2160 { |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2161 return s; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2162 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2163 else |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2164 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2165 return defaultValue; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2166 } |
4562 | 2167 } |
2168 | |
2169 | |
2170 bool ServerIndex::GetMainDicomTags(DicomMap& result, | |
2171 const std::string& publicId, | |
2172 ResourceType expectedType, | |
2173 ResourceType levelOfInterest) | |
2174 { | |
2175 // Yes, the following test could be shortened, but we wish to make it as clear as possible | |
2176 if (!(expectedType == ResourceType_Patient && levelOfInterest == ResourceType_Patient) && | |
2177 !(expectedType == ResourceType_Study && levelOfInterest == ResourceType_Patient) && | |
2178 !(expectedType == ResourceType_Study && levelOfInterest == ResourceType_Study) && | |
2179 !(expectedType == ResourceType_Series && levelOfInterest == ResourceType_Series) && | |
2180 !(expectedType == ResourceType_Instance && levelOfInterest == ResourceType_Instance)) | |
2181 { | |
2182 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
2183 } | |
2184 | |
2185 | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2186 class Operations : public ReadOnlyOperationsT5<bool&, DicomMap&, const std::string&, ResourceType, ResourceType> |
4562 | 2187 { |
2188 public: | |
2189 virtual void ApplyTuple(ReadOnlyTransaction& transaction, | |
2190 const Tuple& tuple) ORTHANC_OVERRIDE | |
2191 { | |
2192 // Lookup for the requested resource | |
2193 int64_t id; | |
2194 ResourceType type; | |
2195 if (!transaction.LookupResource(id, type, tuple.get<2>()) || | |
2196 type != tuple.get<3>()) | |
2197 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2198 tuple.get<0>() = false; |
4562 | 2199 } |
2200 else if (type == ResourceType_Study) | |
2201 { | |
2202 DicomMap tmp; | |
2203 transaction.GetMainDicomTags(tmp, id); | |
2204 | |
2205 switch (tuple.get<4>()) | |
2206 { | |
2207 case ResourceType_Patient: | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2208 tmp.ExtractPatientInformation(tuple.get<1>()); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2209 tuple.get<0>() = true; |
4562 | 2210 break; |
2211 | |
2212 case ResourceType_Study: | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2213 tmp.ExtractStudyInformation(tuple.get<1>()); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2214 tuple.get<0>() = true; |
4562 | 2215 break; |
2216 | |
2217 default: | |
2218 throw OrthancException(ErrorCode_InternalError); | |
2219 } | |
2220 } | |
2221 else | |
2222 { | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2223 transaction.GetMainDicomTags(tuple.get<1>(), id); |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2224 tuple.get<0>() = true; |
4562 | 2225 } |
2226 } | |
2227 }; | |
2228 | |
2229 result.Clear(); | |
2230 | |
2231 bool found; | |
2232 Operations operations; | |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2233 operations.Apply(*this, found, result, publicId, expectedType, levelOfInterest); |
4562 | 2234 return found; |
4560 | 2235 } |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2236 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2237 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2238 bool ServerIndex::GetAllMainDicomTags(DicomMap& result, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2239 const std::string& instancePublicId) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2240 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2241 class Operations : public ReadOnlyOperationsT3<bool&, DicomMap&, const std::string&> |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2242 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2243 public: |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2244 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2245 const Tuple& tuple) ORTHANC_OVERRIDE |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2246 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2247 // Lookup for the requested resource |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2248 int64_t instance; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2249 ResourceType type; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2250 if (!transaction.LookupResource(instance, type, tuple.get<2>()) || |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2251 type != ResourceType_Instance) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2252 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2253 tuple.get<0>() = false; |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2254 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2255 else |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2256 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2257 DicomMap tmp; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2258 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2259 transaction.GetMainDicomTags(tmp, instance); |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2260 tuple.get<1>().Merge(tmp); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2261 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2262 int64_t series; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2263 if (!transaction.LookupParent(series, instance)) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2264 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2265 throw OrthancException(ErrorCode_InternalError); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2266 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2267 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2268 tmp.Clear(); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2269 transaction.GetMainDicomTags(tmp, series); |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2270 tuple.get<1>().Merge(tmp); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2271 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2272 int64_t study; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2273 if (!transaction.LookupParent(study, series)) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2274 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2275 throw OrthancException(ErrorCode_InternalError); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2276 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2277 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2278 tmp.Clear(); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2279 transaction.GetMainDicomTags(tmp, study); |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2280 tuple.get<1>().Merge(tmp); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2281 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2282 #ifndef NDEBUG |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2283 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2284 // Sanity test to check that all the main DICOM tags from the |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2285 // patient level are copied at the study level |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2286 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2287 int64_t patient; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2288 if (!transaction.LookupParent(patient, study)) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2289 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2290 throw OrthancException(ErrorCode_InternalError); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2291 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2292 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2293 tmp.Clear(); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2294 transaction.GetMainDicomTags(tmp, study); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2295 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2296 std::set<DicomTag> patientTags; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2297 tmp.GetTags(patientTags); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2298 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2299 for (std::set<DicomTag>::const_iterator |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2300 it = patientTags.begin(); it != patientTags.end(); ++it) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2301 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2302 assert(tuple.get<1>().HasTag(*it)); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2303 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2304 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2305 #endif |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2306 |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2307 tuple.get<0>() = true; |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2308 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2309 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2310 }; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2311 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2312 result.Clear(); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2313 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2314 bool found; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2315 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2316 operations.Apply(*this, found, result, instancePublicId); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2317 return found; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2318 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2319 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2320 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2321 bool ServerIndex::LookupResourceType(ResourceType& type, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2322 const std::string& publicId) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2323 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2324 class Operations : public ReadOnlyOperationsT3<bool&, ResourceType&, const std::string&> |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2325 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2326 public: |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2327 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2328 const Tuple& tuple) ORTHANC_OVERRIDE |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2329 { |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
2330 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2331 int64_t id; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2332 tuple.get<0>() = transaction.LookupResource(id, tuple.get<1>(), tuple.get<2>()); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2333 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2334 }; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2335 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2336 bool found; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2337 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2338 operations.Apply(*this, found, type, publicId); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2339 return found; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2340 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2341 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2342 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2343 unsigned int ServerIndex::GetDatabaseVersion() |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2344 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2345 class Operations : public ReadOnlyOperationsT1<unsigned int&> |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2346 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2347 public: |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2348 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2349 const Tuple& tuple) ORTHANC_OVERRIDE |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2350 { |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
2351 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2352 tuple.get<0>() = transaction.GetDatabaseVersion(); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2353 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2354 }; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2355 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2356 unsigned int version; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2357 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2358 operations.Apply(*this, version); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2359 return version; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2360 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2361 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2362 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2363 bool ServerIndex::LookupParent(std::string& target, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2364 const std::string& publicId, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2365 ResourceType parentType) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2366 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2367 class Operations : public ReadOnlyOperationsT4<bool&, std::string&, const std::string&, ResourceType> |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2368 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2369 public: |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2370 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2371 const Tuple& tuple) ORTHANC_OVERRIDE |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2372 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2373 ResourceType type; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2374 int64_t id; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2375 if (!transaction.LookupResource(id, type, tuple.get<2>())) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2376 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2377 throw OrthancException(ErrorCode_UnknownResource); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2378 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2379 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2380 while (type != tuple.get<3>()) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2381 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2382 int64_t parentId; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2383 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2384 if (type == ResourceType_Patient || // Cannot further go up in hierarchy |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2385 !transaction.LookupParent(parentId, id)) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2386 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2387 tuple.get<0>() = false; |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2388 return; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2389 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2390 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2391 id = parentId; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2392 type = GetParentResourceType(type); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2393 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2394 |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2395 tuple.get<0>() = true; |
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2396 tuple.get<1>() = transaction.GetPublicId(id); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2397 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2398 }; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2399 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2400 bool found; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2401 Operations operations; |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2402 operations.Apply(*this, found, target, publicId, parentType); |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2403 return found; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2404 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2405 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2406 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2407 void ServerIndex::ApplyLookupResources(std::vector<std::string>& resourcesId, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2408 std::vector<std::string>* instancesId, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2409 const DatabaseLookup& lookup, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2410 ResourceType queryLevel, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2411 size_t limit) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2412 { |
4564
5a0adc1c19a9
avoid copy of objects in ServerIndex
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4563
diff
changeset
|
2413 class Operations : public ReadOnlyOperationsT4<bool, const std::vector<DatabaseConstraint>&, ResourceType, size_t> |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2414 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2415 private: |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2416 std::list<std::string> resourcesList_; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2417 std::list<std::string> instancesList_; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2418 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2419 public: |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2420 const std::list<std::string>& GetResourcesList() const |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2421 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2422 return resourcesList_; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2423 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2424 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2425 const std::list<std::string>& GetInstancesList() const |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2426 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2427 return instancesList_; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2428 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2429 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2430 virtual void ApplyTuple(ReadOnlyTransaction& transaction, |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2431 const Tuple& tuple) ORTHANC_OVERRIDE |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2432 { |
4570
648defffc8cc
new enum: TransactionType
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4569
diff
changeset
|
2433 // TODO - CANDIDATE FOR "TransactionType_Implicit" |
4563
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2434 if (tuple.get<0>()) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2435 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2436 transaction.ApplyLookupResources(resourcesList_, &instancesList_, tuple.get<1>(), tuple.get<2>(), tuple.get<3>()); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2437 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2438 else |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2439 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2440 transaction.ApplyLookupResources(resourcesList_, NULL, tuple.get<1>(), tuple.get<2>(), tuple.get<3>()); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2441 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2442 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2443 }; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2444 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2445 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2446 std::vector<DatabaseConstraint> normalized; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2447 NormalizeLookup(normalized, lookup, queryLevel); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2448 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2449 Operations operations; |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2450 operations.Apply(*this, (instancesId != NULL), normalized, queryLevel, limit); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2451 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2452 CopyListToVector(resourcesId, operations.GetResourcesList()); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2453 |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2454 if (instancesId != NULL) |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2455 { |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2456 CopyListToVector(*instancesId, operations.GetInstancesList()); |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2457 } |
bb1c365f9e44
end of refactoring read-only transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4562
diff
changeset
|
2458 } |
4565
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2459 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2460 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2461 bool ServerIndex::DeleteResource(Json::Value& target, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2462 const std::string& uuid, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2463 ResourceType expectedType) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2464 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2465 class Operations : public IReadWriteOperations |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2466 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2467 private: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2468 bool found_; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2469 Json::Value& target_; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2470 const std::string& uuid_; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2471 ResourceType expectedType_; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2472 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2473 public: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2474 Operations(Json::Value& target, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2475 const std::string& uuid, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2476 ResourceType expectedType) : |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2477 found_(false), |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2478 target_(target), |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2479 uuid_(uuid), |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2480 expectedType_(expectedType) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2481 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2482 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2483 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2484 bool IsFound() const |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2485 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2486 return found_; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2487 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2488 |
4573 | 2489 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4565
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2490 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2491 int64_t id; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2492 ResourceType type; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2493 if (!transaction.LookupResource(id, type, uuid_) || |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2494 expectedType_ != type) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2495 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2496 found_ = false; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2497 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2498 else |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2499 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2500 found_ = true; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2501 transaction.DeleteResource(id); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2502 |
4573 | 2503 if (transaction.GetListener().HasRemainingLevel()) |
4565
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2504 { |
4573 | 2505 ResourceType remainingType = transaction.GetListener().GetRemainingType(); |
2506 const std::string& remainingUuid = transaction.GetListener().GetRemainingPublicId(); | |
4565
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2507 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2508 target_["RemainingAncestor"] = Json::Value(Json::objectValue); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2509 target_["RemainingAncestor"]["Path"] = GetBasePath(remainingType, remainingUuid); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2510 target_["RemainingAncestor"]["Type"] = EnumerationToString(remainingType); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2511 target_["RemainingAncestor"]["ID"] = remainingUuid; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2512 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2513 else |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2514 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2515 target_["RemainingAncestor"] = Json::nullValue; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2516 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2517 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2518 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2519 }; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2520 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2521 Operations operations(target, uuid, expectedType); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2522 Apply(operations); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2523 return operations.IsFound(); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2524 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2525 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2526 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2527 void ServerIndex::LogExportedResource(const std::string& publicId, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2528 const std::string& remoteModality) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2529 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2530 class Operations : public IReadWriteOperations |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2531 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2532 private: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2533 const std::string& publicId_; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2534 const std::string& remoteModality_; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2535 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2536 public: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2537 Operations(const std::string& publicId, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2538 const std::string& remoteModality) : |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2539 publicId_(publicId), |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2540 remoteModality_(remoteModality) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2541 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2542 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2543 |
4573 | 2544 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4565
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2545 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2546 int64_t id; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2547 ResourceType type; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2548 if (!transaction.LookupResource(id, type, publicId_)) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2549 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2550 throw OrthancException(ErrorCode_InexistentItem); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2551 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2552 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2553 std::string patientId; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2554 std::string studyInstanceUid; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2555 std::string seriesInstanceUid; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2556 std::string sopInstanceUid; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2557 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2558 int64_t currentId = id; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2559 ResourceType currentType = type; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2560 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2561 // Iteratively go up inside the patient/study/series/instance hierarchy |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2562 bool done = false; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2563 while (!done) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2564 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2565 DicomMap map; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2566 transaction.GetMainDicomTags(map, currentId); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2567 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2568 switch (currentType) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2569 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2570 case ResourceType_Patient: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2571 if (map.HasTag(DICOM_TAG_PATIENT_ID)) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2572 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2573 patientId = map.GetValue(DICOM_TAG_PATIENT_ID).GetContent(); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2574 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2575 done = true; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2576 break; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2577 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2578 case ResourceType_Study: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2579 if (map.HasTag(DICOM_TAG_STUDY_INSTANCE_UID)) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2580 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2581 studyInstanceUid = map.GetValue(DICOM_TAG_STUDY_INSTANCE_UID).GetContent(); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2582 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2583 currentType = ResourceType_Patient; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2584 break; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2585 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2586 case ResourceType_Series: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2587 if (map.HasTag(DICOM_TAG_SERIES_INSTANCE_UID)) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2588 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2589 seriesInstanceUid = map.GetValue(DICOM_TAG_SERIES_INSTANCE_UID).GetContent(); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2590 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2591 currentType = ResourceType_Study; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2592 break; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2593 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2594 case ResourceType_Instance: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2595 if (map.HasTag(DICOM_TAG_SOP_INSTANCE_UID)) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2596 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2597 sopInstanceUid = map.GetValue(DICOM_TAG_SOP_INSTANCE_UID).GetContent(); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2598 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2599 currentType = ResourceType_Series; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2600 break; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2601 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2602 default: |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2603 throw OrthancException(ErrorCode_InternalError); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2604 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2605 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2606 // If we have not reached the Patient level, find the parent of |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2607 // the current resource |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2608 if (!done) |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2609 { |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2610 bool ok = transaction.LookupParent(currentId, currentId); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2611 (void) ok; // Remove warning about unused variable in release builds |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2612 assert(ok); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2613 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2614 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2615 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2616 ExportedResource resource(-1, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2617 type, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2618 publicId_, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2619 remoteModality_, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2620 SystemToolbox::GetNowIsoString(true /* use UTC time (not local time) */), |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2621 patientId, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2622 studyInstanceUid, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2623 seriesInstanceUid, |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2624 sopInstanceUid); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2625 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2626 transaction.LogExportedResource(resource); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2627 } |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2628 }; |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2629 |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2630 Operations operations(publicId, remoteModality); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2631 Apply(operations); |
3495a3d97ab6
start of read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4564
diff
changeset
|
2632 } |
4567 | 2633 |
2634 | |
2635 void ServerIndex::SetProtectedPatient(const std::string& publicId, | |
2636 bool isProtected) | |
2637 { | |
2638 class Operations : public IReadWriteOperations | |
2639 { | |
2640 private: | |
2641 const std::string& publicId_; | |
2642 bool isProtected_; | |
2643 | |
2644 public: | |
2645 Operations(const std::string& publicId, | |
2646 bool isProtected) : | |
2647 publicId_(publicId), | |
2648 isProtected_(isProtected) | |
2649 { | |
2650 } | |
2651 | |
4573 | 2652 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4567 | 2653 { |
2654 // Lookup for the requested resource | |
2655 int64_t id; | |
2656 ResourceType type; | |
2657 if (!transaction.LookupResource(id, type, publicId_) || | |
2658 type != ResourceType_Patient) | |
2659 { | |
2660 throw OrthancException(ErrorCode_ParameterOutOfRange); | |
2661 } | |
2662 else | |
2663 { | |
2664 transaction.SetProtectedPatient(id, isProtected_); | |
2665 } | |
2666 } | |
2667 }; | |
2668 | |
2669 Operations operations(publicId, isProtected); | |
2670 Apply(operations); | |
2671 | |
2672 if (isProtected) | |
2673 { | |
2674 LOG(INFO) << "Patient " << publicId << " has been protected"; | |
2675 } | |
2676 else | |
2677 { | |
2678 LOG(INFO) << "Patient " << publicId << " has been unprotected"; | |
2679 } | |
2680 } | |
2681 | |
2682 | |
2683 void ServerIndex::SetMetadata(const std::string& publicId, | |
2684 MetadataType type, | |
2685 const std::string& value) | |
2686 { | |
2687 class Operations : public IReadWriteOperations | |
2688 { | |
2689 private: | |
2690 const std::string& publicId_; | |
2691 MetadataType type_; | |
2692 const std::string& value_; | |
2693 | |
2694 public: | |
2695 Operations(const std::string& publicId, | |
2696 MetadataType type, | |
2697 const std::string& value) : | |
2698 publicId_(publicId), | |
2699 type_(type), | |
2700 value_(value) | |
2701 { | |
2702 } | |
2703 | |
4573 | 2704 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4567 | 2705 { |
2706 ResourceType rtype; | |
2707 int64_t id; | |
2708 if (!transaction.LookupResource(id, rtype, publicId_)) | |
2709 { | |
2710 throw OrthancException(ErrorCode_UnknownResource); | |
2711 } | |
2712 else | |
2713 { | |
2714 transaction.SetMetadata(id, type_, value_); | |
2715 | |
2716 if (IsUserMetadata(type_)) | |
2717 { | |
2718 transaction.LogChange(id, ChangeType_UpdatedMetadata, rtype, publicId_); | |
2719 } | |
2720 } | |
2721 } | |
2722 }; | |
2723 | |
2724 Operations operations(publicId, type, value); | |
2725 Apply(operations); | |
2726 } | |
2727 | |
2728 | |
2729 void ServerIndex::DeleteMetadata(const std::string& publicId, | |
2730 MetadataType type) | |
2731 { | |
2732 class Operations : public IReadWriteOperations | |
2733 { | |
2734 private: | |
2735 const std::string& publicId_; | |
2736 MetadataType type_; | |
2737 | |
2738 public: | |
2739 Operations(const std::string& publicId, | |
2740 MetadataType type) : | |
2741 publicId_(publicId), | |
2742 type_(type) | |
2743 { | |
2744 } | |
2745 | |
4573 | 2746 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4567 | 2747 { |
2748 ResourceType rtype; | |
2749 int64_t id; | |
2750 if (!transaction.LookupResource(id, rtype, publicId_)) | |
2751 { | |
2752 throw OrthancException(ErrorCode_UnknownResource); | |
2753 } | |
2754 else | |
2755 { | |
2756 transaction.DeleteMetadata(id, type_); | |
2757 | |
2758 if (IsUserMetadata(type_)) | |
2759 { | |
2760 transaction.LogChange(id, ChangeType_UpdatedMetadata, rtype, publicId_); | |
2761 } | |
2762 } | |
2763 } | |
2764 }; | |
2765 | |
2766 Operations operations(publicId, type); | |
2767 Apply(operations); | |
2768 } | |
2769 | |
2770 | |
2771 uint64_t ServerIndex::IncrementGlobalSequence(GlobalProperty sequence) | |
2772 { | |
2773 class Operations : public IReadWriteOperations | |
2774 { | |
2775 private: | |
2776 uint64_t newValue_; | |
2777 GlobalProperty sequence_; | |
2778 | |
2779 public: | |
4569 | 2780 explicit Operations(GlobalProperty sequence) : |
2781 newValue_(0), // Dummy initialization | |
4567 | 2782 sequence_(sequence) |
2783 { | |
2784 } | |
2785 | |
2786 uint64_t GetNewValue() const | |
2787 { | |
2788 return newValue_; | |
2789 } | |
2790 | |
4573 | 2791 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4567 | 2792 { |
2793 std::string oldString; | |
2794 | |
2795 if (transaction.LookupGlobalProperty(oldString, sequence_)) | |
2796 { | |
2797 uint64_t oldValue; | |
2798 | |
2799 try | |
2800 { | |
2801 oldValue = boost::lexical_cast<uint64_t>(oldString); | |
2802 } | |
2803 catch (boost::bad_lexical_cast&) | |
2804 { | |
2805 LOG(ERROR) << "Cannot read the global sequence " | |
2806 << boost::lexical_cast<std::string>(sequence_) << ", resetting it"; | |
2807 oldValue = 0; | |
2808 } | |
2809 | |
2810 newValue_ = oldValue + 1; | |
2811 } | |
2812 else | |
2813 { | |
2814 // Initialize the sequence at "1" | |
2815 newValue_ = 1; | |
2816 } | |
2817 | |
2818 transaction.SetGlobalProperty(sequence_, boost::lexical_cast<std::string>(newValue_)); | |
2819 } | |
2820 }; | |
2821 | |
2822 Operations operations(sequence); | |
2823 Apply(operations); | |
4569 | 2824 assert(operations.GetNewValue() != 0); |
4567 | 2825 return operations.GetNewValue(); |
2826 } | |
2827 | |
2828 | |
2829 void ServerIndex::DeleteChanges() | |
2830 { | |
2831 class Operations : public IReadWriteOperations | |
2832 { | |
2833 public: | |
4573 | 2834 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4567 | 2835 { |
2836 transaction.ClearChanges(); | |
2837 } | |
2838 }; | |
2839 | |
2840 Operations operations; | |
2841 Apply(operations); | |
2842 } | |
2843 | |
2844 | |
2845 void ServerIndex::DeleteExportedResources() | |
2846 { | |
2847 class Operations : public IReadWriteOperations | |
2848 { | |
2849 public: | |
4573 | 2850 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4567 | 2851 { |
2852 transaction.ClearExportedResources(); | |
2853 } | |
2854 }; | |
2855 | |
2856 Operations operations; | |
2857 Apply(operations); | |
2858 } | |
2859 | |
2860 | |
2861 void ServerIndex::SetGlobalProperty(GlobalProperty property, | |
2862 const std::string& value) | |
2863 { | |
2864 class Operations : public IReadWriteOperations | |
2865 { | |
2866 private: | |
2867 GlobalProperty property_; | |
2868 const std::string& value_; | |
2869 | |
2870 public: | |
2871 Operations(GlobalProperty property, | |
2872 const std::string& value) : | |
2873 property_(property), | |
2874 value_(value) | |
2875 { | |
2876 } | |
2877 | |
4573 | 2878 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4567 | 2879 { |
2880 transaction.SetGlobalProperty(property_, value_); | |
2881 } | |
2882 }; | |
2883 | |
2884 Operations operations(property, value); | |
2885 Apply(operations); | |
2886 } | |
4568 | 2887 |
2888 | |
2889 void ServerIndex::DeleteAttachment(const std::string& publicId, | |
2890 FileContentType type) | |
2891 { | |
2892 class Operations : public IReadWriteOperations | |
2893 { | |
2894 private: | |
2895 const std::string& publicId_; | |
2896 FileContentType type_; | |
2897 | |
2898 public: | |
2899 Operations(const std::string& publicId, | |
2900 FileContentType type) : | |
2901 publicId_(publicId), | |
2902 type_(type) | |
2903 { | |
2904 } | |
2905 | |
4573 | 2906 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4568 | 2907 { |
2908 ResourceType rtype; | |
2909 int64_t id; | |
2910 if (!transaction.LookupResource(id, rtype, publicId_)) | |
2911 { | |
2912 throw OrthancException(ErrorCode_UnknownResource); | |
2913 } | |
2914 else | |
2915 { | |
2916 transaction.DeleteAttachment(id, type_); | |
2917 | |
2918 if (IsUserContentType(type_)) | |
2919 { | |
2920 transaction.LogChange(id, ChangeType_UpdatedAttachment, rtype, publicId_); | |
2921 } | |
2922 } | |
2923 } | |
2924 }; | |
2925 | |
2926 Operations operations(publicId, type); | |
2927 Apply(operations); | |
2928 } | |
2929 | |
2930 | |
2931 void ServerIndex::LogChange(ChangeType changeType, | |
2932 const std::string& publicId) | |
2933 { | |
2934 class Operations : public IReadWriteOperations | |
2935 { | |
2936 private: | |
2937 ChangeType changeType_; | |
2938 const std::string& publicId_; | |
2939 | |
2940 public: | |
2941 Operations(ChangeType changeType, | |
2942 const std::string& publicId) : | |
2943 changeType_(changeType), | |
2944 publicId_(publicId) | |
2945 { | |
2946 } | |
2947 | |
4573 | 2948 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
4568 | 2949 { |
2950 int64_t id; | |
2951 ResourceType type; | |
2952 if (!transaction.LookupResource(id, type, publicId_)) | |
2953 { | |
2954 throw OrthancException(ErrorCode_UnknownResource); | |
2955 } | |
2956 else | |
2957 { | |
2958 transaction.LogChange(id, changeType_, type, publicId_); | |
2959 } | |
2960 } | |
2961 }; | |
2962 | |
2963 Operations operations(changeType, publicId); | |
2964 Apply(operations); | |
2965 } | |
4574 | 2966 |
2967 | |
2968 void ServerIndex::ReconstructInstance(const ParsedDicomFile& dicom) | |
2969 { | |
2970 class Operations : public IReadWriteOperations | |
2971 { | |
2972 private: | |
2973 DicomMap summary_; | |
2974 std::unique_ptr<DicomInstanceHasher> hasher_; | |
2975 bool hasTransferSyntax_; | |
2976 DicomTransferSyntax transferSyntax_; | |
2977 | |
2978 public: | |
2979 Operations(const ParsedDicomFile& dicom) | |
2980 { | |
2981 OrthancConfiguration::DefaultExtractDicomSummary(summary_, dicom); | |
2982 hasher_.reset(new DicomInstanceHasher(summary_)); | |
2983 hasTransferSyntax_ = dicom.LookupTransferSyntax(transferSyntax_); | |
2984 } | |
2985 | |
2986 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE | |
2987 { | |
2988 int64_t patient = -1, study = -1, series = -1, instance = -1; | |
2989 | |
2990 ResourceType type1, type2, type3, type4; | |
2991 if (!transaction.LookupResource(patient, type1, hasher_->HashPatient()) || | |
2992 !transaction.LookupResource(study, type2, hasher_->HashStudy()) || | |
2993 !transaction.LookupResource(series, type3, hasher_->HashSeries()) || | |
2994 !transaction.LookupResource(instance, type4, hasher_->HashInstance()) || | |
2995 type1 != ResourceType_Patient || | |
2996 type2 != ResourceType_Study || | |
2997 type3 != ResourceType_Series || | |
2998 type4 != ResourceType_Instance || | |
2999 patient == -1 || | |
3000 study == -1 || | |
3001 series == -1 || | |
3002 instance == -1) | |
3003 { | |
3004 throw OrthancException(ErrorCode_InternalError); | |
3005 } | |
3006 | |
3007 transaction.ClearMainDicomTags(patient); | |
3008 transaction.ClearMainDicomTags(study); | |
3009 transaction.ClearMainDicomTags(series); | |
3010 transaction.ClearMainDicomTags(instance); | |
3011 | |
3012 { | |
3013 ResourcesContent content; | |
3014 content.AddResource(patient, ResourceType_Patient, summary_); | |
3015 content.AddResource(study, ResourceType_Study, summary_); | |
3016 content.AddResource(series, ResourceType_Series, summary_); | |
3017 content.AddResource(instance, ResourceType_Instance, summary_); | |
3018 transaction.SetResourcesContent(content); | |
3019 } | |
3020 | |
3021 if (hasTransferSyntax_) | |
3022 { | |
3023 transaction.SetMetadata(instance, MetadataType_Instance_TransferSyntax, GetTransferSyntaxUid(transferSyntax_)); | |
3024 } | |
3025 | |
3026 const DicomValue* value; | |
3027 if ((value = summary_.TestAndGetValue(DICOM_TAG_SOP_CLASS_UID)) != NULL && | |
3028 !value->IsNull() && | |
3029 !value->IsBinary()) | |
3030 { | |
3031 transaction.SetMetadata(instance, MetadataType_Instance_SopClassUid, value->GetContent()); | |
3032 } | |
3033 } | |
3034 }; | |
3035 | |
3036 Operations operations(dicom); | |
3037 Apply(operations); | |
3038 } | |
4577
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3039 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3040 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3041 static bool IsRecyclingNeeded(IDatabaseWrapper& db, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3042 uint64_t maximumStorageSize, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3043 unsigned int maximumPatients, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3044 uint64_t addedInstanceSize) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3045 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3046 if (maximumStorageSize != 0) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3047 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3048 if (maximumStorageSize < addedInstanceSize) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3049 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3050 throw OrthancException(ErrorCode_FullStorage, "Cannot store an instance of size " + |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3051 boost::lexical_cast<std::string>(addedInstanceSize) + |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3052 " bytes in a storage area limited to " + |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3053 boost::lexical_cast<std::string>(maximumStorageSize)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3054 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3055 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3056 if (db.IsDiskSizeAbove(maximumStorageSize - addedInstanceSize)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3057 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3058 return true; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3059 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3060 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3061 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3062 if (maximumPatients != 0) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3063 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3064 uint64_t patientCount = db.GetResourceCount(ResourceType_Patient); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3065 if (patientCount > maximumPatients) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3066 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3067 return true; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3068 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3069 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3070 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3071 return false; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3072 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3073 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3074 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3075 void ServerIndex::ReadWriteTransaction::Recycle(uint64_t maximumStorageSize, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3076 unsigned int maximumPatients, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3077 uint64_t addedInstanceSize, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3078 const std::string& newPatientId) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3079 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3080 // TODO - Performance: Avoid calls to "IsRecyclingNeeded()" |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3081 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3082 if (IsRecyclingNeeded(db_, maximumStorageSize, maximumPatients, addedInstanceSize)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3083 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3084 // Check whether other DICOM instances from this patient are |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3085 // already stored |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3086 int64_t patientToAvoid; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3087 bool hasPatientToAvoid; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3088 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3089 if (newPatientId.empty()) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3090 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3091 hasPatientToAvoid = false; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3092 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3093 else |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3094 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3095 ResourceType type; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3096 hasPatientToAvoid = db_.LookupResource(patientToAvoid, type, newPatientId); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3097 if (type != ResourceType_Patient) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3098 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3099 throw OrthancException(ErrorCode_InternalError); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3100 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3101 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3102 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3103 // Iteratively select patient to remove until there is enough |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3104 // space in the DICOM store |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3105 int64_t patientToRecycle; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3106 while (true) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3107 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3108 // If other instances of this patient are already in the store, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3109 // we must avoid to recycle them |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3110 bool ok = (hasPatientToAvoid ? |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3111 db_.SelectPatientToRecycle(patientToRecycle, patientToAvoid) : |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3112 db_.SelectPatientToRecycle(patientToRecycle)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3113 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3114 if (!ok) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3115 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3116 throw OrthancException(ErrorCode_FullStorage); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3117 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3118 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3119 LOG(TRACE) << "Recycling one patient"; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3120 db_.DeleteResource(patientToRecycle); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3121 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3122 if (!IsRecyclingNeeded(db_, maximumStorageSize, maximumPatients, addedInstanceSize)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3123 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3124 // OK, we're done |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3125 return; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3126 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3127 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3128 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3129 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3130 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3131 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3132 void ServerIndex::StandaloneRecycling(uint64_t maximumStorageSize, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3133 unsigned int maximumPatientCount) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3134 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3135 class Operations : public IReadWriteOperations |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3136 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3137 private: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3138 uint64_t maximumStorageSize_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3139 unsigned int maximumPatientCount_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3140 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3141 public: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3142 Operations(uint64_t maximumStorageSize, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3143 unsigned int maximumPatientCount) : |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3144 maximumStorageSize_(maximumStorageSize), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3145 maximumPatientCount_(maximumPatientCount) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3146 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3147 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3148 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3149 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3150 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3151 transaction.Recycle(maximumStorageSize_, maximumPatientCount_, 0, ""); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3152 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3153 }; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3154 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3155 Operations operations(maximumStorageSize, maximumPatientCount); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3156 Apply(operations); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3157 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3158 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3159 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3160 static void SetInstanceMetadata(ResourcesContent& content, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3161 std::map<MetadataType, std::string>& instanceMetadata, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3162 int64_t instance, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3163 MetadataType metadata, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3164 const std::string& value) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3165 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3166 content.AddMetadata(instance, metadata, value); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3167 instanceMetadata[metadata] = value; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3168 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3169 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3170 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3171 StoreStatus ServerIndex::Store(std::map<MetadataType, std::string>& instanceMetadata, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3172 const DicomMap& dicomSummary, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3173 const Attachments& attachments, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3174 const MetadataMap& metadata, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3175 const DicomInstanceOrigin& origin, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3176 bool overwrite, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3177 bool hasTransferSyntax, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3178 DicomTransferSyntax transferSyntax, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3179 bool hasPixelDataOffset, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3180 uint64_t pixelDataOffset) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3181 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3182 class Operations : public IReadWriteOperations |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3183 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3184 private: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3185 StoreStatus storeStatus_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3186 std::map<MetadataType, std::string>& instanceMetadata_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3187 ServerIndex& index_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3188 const DicomMap& dicomSummary_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3189 const Attachments& attachments_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3190 const MetadataMap& metadata_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3191 const DicomInstanceOrigin& origin_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3192 bool overwrite_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3193 bool hasTransferSyntax_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3194 DicomTransferSyntax transferSyntax_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3195 bool hasPixelDataOffset_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3196 uint64_t pixelDataOffset_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3197 uint64_t maximumStorageSize_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3198 unsigned int maximumPatientCount_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3199 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3200 // Auto-computed fields |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3201 bool hasExpectedInstances_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3202 int64_t expectedInstances_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3203 std::string hashPatient_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3204 std::string hashStudy_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3205 std::string hashSeries_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3206 std::string hashInstance_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3207 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3208 public: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3209 Operations(std::map<MetadataType, std::string>& instanceMetadata, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3210 ServerIndex& index, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3211 const DicomMap& dicomSummary, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3212 const Attachments& attachments, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3213 const MetadataMap& metadata, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3214 const DicomInstanceOrigin& origin, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3215 bool overwrite, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3216 bool hasTransferSyntax, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3217 DicomTransferSyntax transferSyntax, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3218 bool hasPixelDataOffset, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3219 uint64_t pixelDataOffset, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3220 uint64_t maximumStorageSize, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3221 unsigned int maximumPatientCount) : |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3222 storeStatus_(StoreStatus_Failure), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3223 instanceMetadata_(instanceMetadata), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3224 index_(index), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3225 dicomSummary_(dicomSummary), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3226 attachments_(attachments), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3227 metadata_(metadata), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3228 origin_(origin), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3229 overwrite_(overwrite), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3230 hasTransferSyntax_(hasTransferSyntax), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3231 transferSyntax_(transferSyntax), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3232 hasPixelDataOffset_(hasPixelDataOffset), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3233 pixelDataOffset_(pixelDataOffset), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3234 maximumStorageSize_(maximumStorageSize), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3235 maximumPatientCount_(maximumPatientCount) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3236 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3237 hasExpectedInstances_ = ComputeExpectedNumberOfInstances(expectedInstances_, dicomSummary); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3238 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3239 instanceMetadata_.clear(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3240 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3241 DicomInstanceHasher hasher(dicomSummary); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3242 hashPatient_ = hasher.HashPatient(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3243 hashStudy_ = hasher.HashStudy(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3244 hashSeries_ = hasher.HashSeries(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3245 hashInstance_ = hasher.HashInstance(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3246 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3247 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3248 StoreStatus GetStoreStatus() const |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3249 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3250 return storeStatus_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3251 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3252 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3253 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3254 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3255 try |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3256 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3257 IDatabaseWrapper::CreateInstanceResult status; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3258 int64_t instanceId; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3259 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3260 // Check whether this instance is already stored |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3261 if (!transaction.CreateInstance(status, instanceId, hashPatient_, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3262 hashStudy_, hashSeries_, hashInstance_)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3263 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3264 // The instance already exists |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3265 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3266 if (overwrite_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3267 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3268 // Overwrite the old instance |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3269 LOG(INFO) << "Overwriting instance: " << hashInstance_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3270 transaction.DeleteResource(instanceId); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3271 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3272 // Re-create the instance, now that the old one is removed |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3273 if (!transaction.CreateInstance(status, instanceId, hashPatient_, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3274 hashStudy_, hashSeries_, hashInstance_)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3275 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3276 throw OrthancException(ErrorCode_InternalError); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3277 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3278 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3279 else |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3280 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3281 // Do nothing if the instance already exists and overwriting is disabled |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3282 transaction.GetAllMetadata(instanceMetadata_, instanceId); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3283 storeStatus_ = StoreStatus_AlreadyStored; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3284 return; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3285 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3286 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3287 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3288 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3289 // Warn about the creation of new resources. The order must be |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3290 // from instance to patient. |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3291 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3292 // NB: In theory, could be sped up by grouping the underlying |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3293 // calls to "transaction.LogChange()". However, this would only have an |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3294 // impact when new patient/study/series get created, which |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3295 // occurs far less often that creating new instances. The |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3296 // positive impact looks marginal in practice. |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3297 transaction.LogChange(instanceId, ChangeType_NewInstance, ResourceType_Instance, hashInstance_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3298 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3299 if (status.isNewSeries_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3300 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3301 transaction.LogChange(status.seriesId_, ChangeType_NewSeries, ResourceType_Series, hashSeries_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3302 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3303 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3304 if (status.isNewStudy_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3305 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3306 transaction.LogChange(status.studyId_, ChangeType_NewStudy, ResourceType_Study, hashStudy_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3307 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3308 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3309 if (status.isNewPatient_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3310 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3311 transaction.LogChange(status.patientId_, ChangeType_NewPatient, ResourceType_Patient, hashPatient_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3312 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3313 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3314 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3315 // Ensure there is enough room in the storage for the new instance |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3316 uint64_t instanceSize = 0; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3317 for (Attachments::const_iterator it = attachments_.begin(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3318 it != attachments_.end(); ++it) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3319 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3320 instanceSize += it->GetCompressedSize(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3321 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3322 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3323 transaction.Recycle(maximumStorageSize_, maximumPatientCount_, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3324 instanceSize, hashPatient_ /* don't consider the current patient for recycling */); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3325 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3326 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3327 // Attach the files to the newly created instance |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3328 for (Attachments::const_iterator it = attachments_.begin(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3329 it != attachments_.end(); ++it) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3330 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3331 transaction.AddAttachment(instanceId, *it); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3332 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3333 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3334 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3335 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3336 ResourcesContent content; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3337 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3338 // Populate the tags of the newly-created resources |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3339 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3340 content.AddResource(instanceId, ResourceType_Instance, dicomSummary_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3341 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3342 if (status.isNewSeries_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3343 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3344 content.AddResource(status.seriesId_, ResourceType_Series, dicomSummary_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3345 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3346 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3347 if (status.isNewStudy_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3348 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3349 content.AddResource(status.studyId_, ResourceType_Study, dicomSummary_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3350 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3351 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3352 if (status.isNewPatient_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3353 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3354 content.AddResource(status.patientId_, ResourceType_Patient, dicomSummary_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3355 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3356 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3357 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3358 // Attach the user-specified metadata |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3359 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3360 for (MetadataMap::const_iterator |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3361 it = metadata_.begin(); it != metadata_.end(); ++it) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3362 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3363 switch (it->first.first) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3364 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3365 case ResourceType_Patient: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3366 content.AddMetadata(status.patientId_, it->first.second, it->second); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3367 break; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3368 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3369 case ResourceType_Study: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3370 content.AddMetadata(status.studyId_, it->first.second, it->second); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3371 break; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3372 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3373 case ResourceType_Series: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3374 content.AddMetadata(status.seriesId_, it->first.second, it->second); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3375 break; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3376 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3377 case ResourceType_Instance: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3378 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3379 it->first.second, it->second); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3380 break; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3381 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3382 default: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3383 throw OrthancException(ErrorCode_ParameterOutOfRange); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3384 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3385 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3386 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3387 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3388 // Attach the auto-computed metadata for the patient/study/series levels |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3389 std::string now = SystemToolbox::GetNowIsoString(true /* use UTC time (not local time) */); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3390 content.AddMetadata(status.seriesId_, MetadataType_LastUpdate, now); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3391 content.AddMetadata(status.studyId_, MetadataType_LastUpdate, now); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3392 content.AddMetadata(status.patientId_, MetadataType_LastUpdate, now); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3393 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3394 if (status.isNewSeries_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3395 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3396 if (hasExpectedInstances_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3397 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3398 content.AddMetadata(status.seriesId_, MetadataType_Series_ExpectedNumberOfInstances, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3399 boost::lexical_cast<std::string>(expectedInstances_)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3400 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3401 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3402 // New in Orthanc 1.9.0 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3403 content.AddMetadata(status.seriesId_, MetadataType_RemoteAet, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3404 origin_.GetRemoteAetC()); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3405 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3406 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3407 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3408 // Attach the auto-computed metadata for the instance level, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3409 // reflecting these additions into the input metadata map |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3410 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3411 MetadataType_Instance_ReceptionDate, now); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3412 SetInstanceMetadata(content, instanceMetadata_, instanceId, MetadataType_RemoteAet, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3413 origin_.GetRemoteAetC()); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3414 SetInstanceMetadata(content, instanceMetadata_, instanceId, MetadataType_Instance_Origin, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3415 EnumerationToString(origin_.GetRequestOrigin())); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3416 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3417 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3418 if (hasTransferSyntax_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3419 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3420 // New in Orthanc 1.2.0 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3421 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3422 MetadataType_Instance_TransferSyntax, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3423 GetTransferSyntaxUid(transferSyntax_)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3424 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3425 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3426 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3427 std::string s; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3428 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3429 if (origin_.LookupRemoteIp(s)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3430 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3431 // New in Orthanc 1.4.0 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3432 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3433 MetadataType_Instance_RemoteIp, s); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3434 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3435 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3436 if (origin_.LookupCalledAet(s)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3437 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3438 // New in Orthanc 1.4.0 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3439 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3440 MetadataType_Instance_CalledAet, s); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3441 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3442 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3443 if (origin_.LookupHttpUsername(s)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3444 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3445 // New in Orthanc 1.4.0 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3446 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3447 MetadataType_Instance_HttpUsername, s); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3448 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3449 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3450 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3451 if (hasPixelDataOffset_) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3452 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3453 // New in Orthanc 1.9.1 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3454 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3455 MetadataType_Instance_PixelDataOffset, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3456 boost::lexical_cast<std::string>(pixelDataOffset_)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3457 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3458 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3459 const DicomValue* value; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3460 if ((value = dicomSummary_.TestAndGetValue(DICOM_TAG_SOP_CLASS_UID)) != NULL && |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3461 !value->IsNull() && |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3462 !value->IsBinary()) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3463 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3464 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3465 MetadataType_Instance_SopClassUid, value->GetContent()); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3466 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3467 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3468 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3469 if ((value = dicomSummary_.TestAndGetValue(DICOM_TAG_INSTANCE_NUMBER)) != NULL || |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3470 (value = dicomSummary_.TestAndGetValue(DICOM_TAG_IMAGE_INDEX)) != NULL) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3471 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3472 if (!value->IsNull() && |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3473 !value->IsBinary()) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3474 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3475 SetInstanceMetadata(content, instanceMetadata_, instanceId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3476 MetadataType_Instance_IndexInSeries, Toolbox::StripSpaces(value->GetContent())); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3477 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3478 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3479 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3480 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3481 transaction.SetResourcesContent(content); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3482 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3483 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3484 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3485 // Check whether the series of this new instance is now completed |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3486 int64_t expectedNumberOfInstances; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3487 if (ComputeExpectedNumberOfInstances(expectedNumberOfInstances, dicomSummary_)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3488 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3489 SeriesStatus seriesStatus = transaction.GetSeriesStatus(status.seriesId_, expectedNumberOfInstances); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3490 if (seriesStatus == SeriesStatus_Complete) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3491 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3492 transaction.LogChange(status.seriesId_, ChangeType_CompletedSeries, ResourceType_Series, hashSeries_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3493 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3494 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3495 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3496 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3497 // Mark the parent resources of this instance as unstable |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3498 index_.MarkAsUnstable(status.seriesId_, ResourceType_Series, hashSeries_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3499 index_.MarkAsUnstable(status.studyId_, ResourceType_Study, hashStudy_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3500 index_.MarkAsUnstable(status.patientId_, ResourceType_Patient, hashPatient_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3501 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3502 transaction.GetListener().SignalAttachmentsAdded(instanceSize); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3503 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3504 storeStatus_ = StoreStatus_Success; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3505 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3506 catch (OrthancException& e) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3507 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3508 LOG(ERROR) << "EXCEPTION [" << e.What() << "]"; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3509 storeStatus_ = StoreStatus_Failure; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3510 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3511 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3512 }; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3513 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3514 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3515 std::unique_ptr<Operations> operations; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3516 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3517 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3518 boost::mutex::scoped_lock lock(monitoringMutex_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3519 operations.reset(new Operations(instanceMetadata, *this, dicomSummary, attachments, metadata, origin, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3520 overwrite, hasTransferSyntax, transferSyntax, hasPixelDataOffset, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3521 pixelDataOffset, maximumStorageSize_, maximumPatients_)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3522 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3523 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3524 Apply(*operations); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3525 return operations->GetStoreStatus(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3526 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3527 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3528 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3529 StoreStatus ServerIndex::AddAttachment(const FileInfo& attachment, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3530 const std::string& publicId) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3531 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3532 class Operations : public IReadWriteOperations |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3533 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3534 private: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3535 StoreStatus status_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3536 const FileInfo& attachment_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3537 const std::string& publicId_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3538 uint64_t maximumStorageSize_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3539 unsigned int maximumPatientCount_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3540 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3541 public: |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3542 Operations(const FileInfo& attachment, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3543 const std::string& publicId, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3544 uint64_t maximumStorageSize, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3545 unsigned int maximumPatientCount) : |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3546 status_(StoreStatus_Failure), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3547 attachment_(attachment), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3548 publicId_(publicId), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3549 maximumStorageSize_(maximumStorageSize), |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3550 maximumPatientCount_(maximumPatientCount) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3551 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3552 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3553 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3554 StoreStatus GetStatus() const |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3555 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3556 return status_; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3557 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3558 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3559 virtual void Apply(ReadWriteTransaction& transaction) ORTHANC_OVERRIDE |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3560 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3561 ResourceType resourceType; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3562 int64_t resourceId; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3563 if (!transaction.LookupResource(resourceId, resourceType, publicId_)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3564 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3565 status_ = StoreStatus_Failure; // Inexistent resource |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3566 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3567 else |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3568 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3569 // Remove possible previous attachment |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3570 transaction.DeleteAttachment(resourceId, attachment_.GetContentType()); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3571 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3572 // Locate the patient of the target resource |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3573 int64_t patientId = resourceId; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3574 for (;;) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3575 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3576 int64_t parent; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3577 if (transaction.LookupParent(parent, patientId)) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3578 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3579 // We have not reached the patient level yet |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3580 patientId = parent; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3581 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3582 else |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3583 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3584 // We have reached the patient level |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3585 break; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3586 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3587 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3588 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3589 // Possibly apply the recycling mechanism while preserving this patient |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3590 assert(transaction.GetResourceType(patientId) == ResourceType_Patient); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3591 transaction.Recycle(maximumStorageSize_, maximumPatientCount_, |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3592 attachment_.GetCompressedSize(), transaction.GetPublicId(patientId)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3593 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3594 transaction.AddAttachment(resourceId, attachment_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3595 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3596 if (IsUserContentType(attachment_.GetContentType())) |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3597 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3598 transaction.LogChange(resourceId, ChangeType_UpdatedAttachment, resourceType, publicId_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3599 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3600 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3601 transaction.GetListener().SignalAttachmentsAdded(attachment_.GetCompressedSize()); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3602 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3603 status_ = StoreStatus_Success; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3604 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3605 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3606 }; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3607 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3608 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3609 std::unique_ptr<Operations> operations; |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3610 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3611 { |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3612 boost::mutex::scoped_lock lock(monitoringMutex_); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3613 operations.reset(new Operations(attachment, publicId, maximumStorageSize_, maximumPatients_)); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3614 } |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3615 |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3616 Apply(*operations); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3617 return operations->GetStatus(); |
a114a5db2afe
end of refactoring read-write transactions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
4576
diff
changeset
|
3618 } |
0 | 3619 } |