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