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