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