Mercurial > hg > orthanc-databases
annotate Framework/Plugins/DatabaseBackendAdapterV4.cpp @ 377:02fe4606f5e4 db-protobuf
simplification
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 29 Mar 2023 07:57:49 +0200 |
parents | 59bba5fbb425 |
children | 9db9e0275ec0 |
rev | line source |
---|---|
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Orthanc - A Lightweight, RESTful DICOM Store |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2022 Osimis S.A., Belgium |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * Copyright (C) 2021-2022 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * This program is free software: you can redistribute it and/or |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Affero General Public License |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * the License, or (at your option) any later version. |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, but |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * Affero General Public License for more details. |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Affero General Public License |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 **/ |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 #include "DatabaseBackendAdapterV4.h" |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 #if defined(ORTHANC_PLUGINS_VERSION_IS_ABOVE) // Macro introduced in Orthanc 1.3.1 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
26 # if ORTHANC_PLUGINS_VERSION_IS_ABOVE(1, 12, 0) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
27 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
28 #include "IndexConnectionsPool.h" |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
29 |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
30 #include <OrthancDatabasePlugin.pb.h> // Include protobuf messages |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
31 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
32 #include <Logging.h> |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
33 #include <OrthancException.h> |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 #include <stdexcept> |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 #include <list> |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 #include <string> |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 #include <cassert> |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
41 #define ORTHANC_PLUGINS_DATABASE_CATCH(context) \ |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
42 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 namespace OrthancDatabases |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 static bool isBackendInUse_ = false; // Only for sanity checks |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
48 |
376 | 49 static Orthanc::DatabasePluginMessages::ResourceType Convert(OrthancPluginResourceType resourceType) |
50 { | |
51 switch (resourceType) | |
52 { | |
53 case OrthancPluginResourceType_Patient: | |
54 return Orthanc::DatabasePluginMessages::RESOURCE_PATIENT; | |
55 | |
56 case OrthancPluginResourceType_Study: | |
57 return Orthanc::DatabasePluginMessages::RESOURCE_STUDY; | |
58 | |
59 case OrthancPluginResourceType_Series: | |
60 return Orthanc::DatabasePluginMessages::RESOURCE_SERIES; | |
61 | |
62 case OrthancPluginResourceType_Instance: | |
63 return Orthanc::DatabasePluginMessages::RESOURCE_INSTANCE; | |
64 | |
65 default: | |
66 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
67 } | |
68 } | |
69 | |
70 | |
71 static OrthancPluginResourceType Convert(Orthanc::DatabasePluginMessages::ResourceType resourceType) | |
72 { | |
73 switch (resourceType) | |
74 { | |
75 case Orthanc::DatabasePluginMessages::RESOURCE_PATIENT: | |
76 return OrthancPluginResourceType_Patient; | |
77 | |
78 case Orthanc::DatabasePluginMessages::RESOURCE_STUDY: | |
79 return OrthancPluginResourceType_Study; | |
80 | |
81 case Orthanc::DatabasePluginMessages::RESOURCE_SERIES: | |
82 return OrthancPluginResourceType_Series; | |
83 | |
84 case Orthanc::DatabasePluginMessages::RESOURCE_INSTANCE: | |
85 return OrthancPluginResourceType_Instance; | |
86 | |
87 default: | |
88 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
89 } | |
90 } | |
91 | |
92 | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
93 class Output : public IDatabaseBackendOutput |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
94 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
95 private: |
377 | 96 Orthanc::DatabasePluginMessages::DeleteAttachment::Response* deleteAttachment_; |
97 Orthanc::DatabasePluginMessages::DeleteResource::Response* deleteResource_; | |
98 Orthanc::DatabasePluginMessages::GetChanges::Response* getChanges_; | |
99 Orthanc::DatabasePluginMessages::GetExportedResources::Response* getExportedResources_; | |
100 Orthanc::DatabasePluginMessages::GetLastChange::Response* getLastChange_; | |
101 Orthanc::DatabasePluginMessages::GetLastExportedResource::Response* getLastExportedResource_; | |
102 Orthanc::DatabasePluginMessages::GetMainDicomTags::Response* getMainDicomTags_; | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
103 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
104 void Clear() |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
105 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
106 deleteAttachment_ = NULL; |
376 | 107 deleteResource_ = NULL; |
108 getChanges_ = NULL; | |
109 getExportedResources_ = NULL; | |
110 getLastChange_ = NULL; | |
377 | 111 getLastExportedResource_ = NULL; |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
112 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
113 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
114 public: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
115 Output(Orthanc::DatabasePluginMessages::DeleteAttachment::Response& deleteAttachment) |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
116 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
117 Clear(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
118 deleteAttachment_ = &deleteAttachment; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
119 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
120 |
376 | 121 Output(Orthanc::DatabasePluginMessages::DeleteResource::Response& deleteResource) |
122 { | |
123 Clear(); | |
124 deleteResource_ = &deleteResource; | |
125 } | |
126 | |
127 Output(Orthanc::DatabasePluginMessages::GetChanges::Response& getChanges) | |
128 { | |
129 Clear(); | |
130 getChanges_ = &getChanges; | |
131 } | |
132 | |
133 Output(Orthanc::DatabasePluginMessages::GetExportedResources::Response& getExportedResources) | |
134 { | |
135 Clear(); | |
136 getExportedResources_ = &getExportedResources; | |
137 } | |
138 | |
139 Output(Orthanc::DatabasePluginMessages::GetLastChange::Response& getLastChange) | |
140 { | |
141 Clear(); | |
142 getLastChange_ = &getLastChange; | |
143 } | |
144 | |
377 | 145 Output(Orthanc::DatabasePluginMessages::GetLastExportedResource::Response& getLastExportedResource) |
146 { | |
147 Clear(); | |
148 getLastExportedResource_ = &getLastExportedResource; | |
149 } | |
150 | |
151 Output(Orthanc::DatabasePluginMessages::GetMainDicomTags::Response& getMainDicomTags) | |
152 { | |
153 Clear(); | |
154 getMainDicomTags_ = &getMainDicomTags; | |
155 } | |
156 | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
157 virtual void SignalDeletedAttachment(const std::string& uuid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
158 int32_t contentType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
159 uint64_t uncompressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
160 const std::string& uncompressedHash, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
161 int32_t compressionType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
162 uint64_t compressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
163 const std::string& compressedHash) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
164 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
165 Orthanc::DatabasePluginMessages::FileInfo* attachment; |
376 | 166 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
167 if (deleteAttachment_ != NULL) |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
168 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
169 if (deleteAttachment_->has_deleted_attachment()) |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
170 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
171 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
172 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
173 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
174 attachment = deleteAttachment_->mutable_deleted_attachment(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
175 } |
376 | 176 else if (deleteResource_ != NULL) |
177 { | |
178 attachment = deleteResource_->add_deleted_attachments(); | |
179 } | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
180 else |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
181 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
182 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
183 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
184 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
185 attachment->set_uuid(uuid); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
186 attachment->set_content_type(contentType); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
187 attachment->set_uncompressed_size(uncompressedSize); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
188 attachment->set_uncompressed_hash(uncompressedHash); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
189 attachment->set_compression_type(compressionType); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
190 attachment->set_compressed_size(compressedSize); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
191 attachment->set_compressed_hash(compressedHash); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
192 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
193 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
194 virtual void SignalDeletedResource(const std::string& publicId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
195 OrthancPluginResourceType resourceType) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
196 { |
376 | 197 if (deleteResource_ != NULL) |
198 { | |
199 Orthanc::DatabasePluginMessages::DeleteResource_Response_Resource* resource = deleteResource_->add_deleted_resources(); | |
200 resource->set_level(Convert(resourceType)); | |
201 resource->set_public_id(publicId); | |
202 } | |
203 else | |
204 { | |
205 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
206 } | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
207 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
208 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
209 virtual void SignalRemainingAncestor(const std::string& ancestorId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
210 OrthancPluginResourceType ancestorType) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
211 { |
376 | 212 if (deleteResource_ != NULL) |
213 { | |
214 if (deleteResource_->is_remaining_ancestor()) | |
215 { | |
216 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
217 } | |
218 else | |
219 { | |
220 deleteResource_->set_is_remaining_ancestor(true); | |
221 deleteResource_->mutable_remaining_ancestor()->set_level(Convert(ancestorType)); | |
222 deleteResource_->mutable_remaining_ancestor()->set_public_id(ancestorId); | |
223 } | |
224 } | |
225 else | |
226 { | |
227 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
228 } | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
229 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
230 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
231 virtual void AnswerAttachment(const std::string& uuid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
232 int32_t contentType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
233 uint64_t uncompressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
234 const std::string& uncompressedHash, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
235 int32_t compressionType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
236 uint64_t compressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
237 const std::string& compressedHash) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
238 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
239 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
240 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
241 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
242 virtual void AnswerChange(int64_t seq, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
243 int32_t changeType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
244 OrthancPluginResourceType resourceType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
245 const std::string& publicId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
246 const std::string& date) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
247 { |
376 | 248 Orthanc::DatabasePluginMessages::ServerIndexChange* change; |
249 | |
250 if (getChanges_ != NULL) | |
251 { | |
252 change = getChanges_->add_changes(); | |
253 } | |
254 else if (getLastChange_ != NULL) | |
255 { | |
256 if (getLastChange_->exists()) | |
257 { | |
258 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
259 } | |
260 | |
261 getLastChange_->set_exists(true); | |
262 change = getLastChange_->mutable_change(); | |
263 } | |
264 else | |
265 { | |
266 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
267 } | |
268 | |
269 change->set_seq(seq); | |
270 change->set_change_type(changeType); | |
271 change->set_resource_type(Convert(resourceType)); | |
272 change->set_public_id(publicId); | |
273 change->set_date(date); | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
274 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
275 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
276 virtual void AnswerDicomTag(uint16_t group, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
277 uint16_t element, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
278 const std::string& value) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
279 { |
377 | 280 if (getMainDicomTags_ != NULL) |
281 { | |
282 Orthanc::DatabasePluginMessages::GetMainDicomTags_Response_Tag* tag = getMainDicomTags_->add_tags(); | |
283 tag->set_key((static_cast<uint32_t>(group) << 16) + static_cast<uint32_t>(element)); | |
284 tag->set_value(value); | |
285 } | |
286 else | |
287 { | |
288 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
289 } | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
290 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
291 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
292 virtual void AnswerExportedResource(int64_t seq, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
293 OrthancPluginResourceType resourceType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
294 const std::string& publicId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
295 const std::string& modality, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
296 const std::string& date, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
297 const std::string& patientId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
298 const std::string& studyInstanceUid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
299 const std::string& seriesInstanceUid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
300 const std::string& sopInstanceUid) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
301 { |
377 | 302 Orthanc::DatabasePluginMessages::ExportedResource* resource; |
303 | |
376 | 304 if (getExportedResources_ != NULL) |
305 { | |
377 | 306 resource = getExportedResources_->add_resources(); |
307 } | |
308 else if (getLastExportedResource_ != NULL) | |
309 { | |
310 if (getLastExportedResource_->exists()) | |
311 { | |
312 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
313 } | |
314 | |
315 getLastExportedResource_->set_exists(true); | |
316 resource = getLastExportedResource_->mutable_resource(); | |
376 | 317 } |
318 else | |
319 { | |
320 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
321 } | |
377 | 322 |
323 resource->set_seq(seq); | |
324 resource->set_resource_type(Convert(resourceType)); | |
325 resource->set_public_id(publicId); | |
326 resource->set_modality(modality); | |
327 resource->set_date(date); | |
328 resource->set_patient_id(patientId); | |
329 resource->set_study_instance_uid(studyInstanceUid); | |
330 resource->set_series_instance_uid(seriesInstanceUid); | |
331 resource->set_sop_instance_uid(sopInstanceUid); | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
332 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
333 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
334 virtual void AnswerMatchingResource(const std::string& resourceId) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
335 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
336 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
337 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
338 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
339 virtual void AnswerMatchingResource(const std::string& resourceId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
340 const std::string& someInstanceId) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
341 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
342 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
343 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
344 }; |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
345 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
346 |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
347 static void ProcessDatabaseOperation(Orthanc::DatabasePluginMessages::DatabaseResponse& response, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
348 const Orthanc::DatabasePluginMessages::DatabaseRequest& request, |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
349 IndexConnectionsPool& pool) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
350 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
351 switch (request.operation()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
352 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
353 case Orthanc::DatabasePluginMessages::OPERATION_GET_SYSTEM_INFORMATION: |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
354 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
355 IndexConnectionsPool::Accessor accessor(pool); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
356 response.mutable_get_system_information()->set_database_version(accessor.GetBackend().GetDatabaseVersion(accessor.GetManager())); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
357 response.mutable_get_system_information()->set_supports_flush_to_disk(false); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
358 response.mutable_get_system_information()->set_supports_revisions(accessor.GetBackend().HasRevisionsSupport()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
359 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
360 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
361 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
362 case Orthanc::DatabasePluginMessages::OPERATION_OPEN: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
363 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
364 pool.OpenConnections(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
365 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
366 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
367 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
368 case Orthanc::DatabasePluginMessages::OPERATION_CLOSE: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
369 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
370 pool.CloseConnections(); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
371 break; |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
372 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
373 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
374 case Orthanc::DatabasePluginMessages::OPERATION_FLUSH_TO_DISK: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
375 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
376 // Raise an exception since "set_supports_flush_to_disk(false)" |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
377 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
378 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
379 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
380 case Orthanc::DatabasePluginMessages::OPERATION_START_TRANSACTION: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
381 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
382 std::unique_ptr<IndexConnectionsPool::Accessor> transaction(new IndexConnectionsPool::Accessor(pool)); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
383 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
384 switch (request.start_transaction().type()) |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
385 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
386 case Orthanc::DatabasePluginMessages::TRANSACTION_READ_ONLY: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
387 transaction->GetManager().StartTransaction(TransactionType_ReadOnly); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
388 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
389 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
390 case Orthanc::DatabasePluginMessages::TRANSACTION_READ_WRITE: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
391 transaction->GetManager().StartTransaction(TransactionType_ReadWrite); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
392 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
393 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
394 default: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
395 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
396 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
397 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
398 response.mutable_start_transaction()->set_transaction(reinterpret_cast<intptr_t>(transaction.release())); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
399 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
400 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
401 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
402 case Orthanc::DatabasePluginMessages::OPERATION_UPGRADE: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
403 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
404 IndexConnectionsPool::Accessor accessor(pool); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
405 OrthancPluginStorageArea* storageArea = reinterpret_cast<OrthancPluginStorageArea*>(request.upgrade().storage_area()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
406 accessor.GetBackend().UpgradeDatabase(accessor.GetManager(), request.upgrade().target_version(), storageArea); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
407 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
408 } |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
409 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
410 default: |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
411 LOG(ERROR) << "Not implemented database operation from protobuf: " << request.operation(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
412 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
413 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
414 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
415 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
416 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
417 static void ProcessTransactionOperation(Orthanc::DatabasePluginMessages::TransactionResponse& response, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
418 const Orthanc::DatabasePluginMessages::TransactionRequest& request, |
377 | 419 IndexBackend& backend, |
420 DatabaseManager& manager) | |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
421 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
422 switch (request.operation()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
423 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
424 case Orthanc::DatabasePluginMessages::OPERATION_ROLLBACK: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
425 { |
377 | 426 manager.RollbackTransaction(); |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
427 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
428 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
429 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
430 case Orthanc::DatabasePluginMessages::OPERATION_COMMIT: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
431 { |
377 | 432 manager.CommitTransaction(); |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
433 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
434 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
435 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
436 case Orthanc::DatabasePluginMessages::OPERATION_ADD_ATTACHMENT: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
437 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
438 OrthancPluginAttachment attachment; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
439 attachment.uuid = request.add_attachment().attachment().uuid().c_str(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
440 attachment.contentType = request.add_attachment().attachment().content_type(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
441 attachment.uncompressedSize = request.add_attachment().attachment().uncompressed_size(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
442 attachment.uncompressedHash = request.add_attachment().attachment().uncompressed_hash().c_str(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
443 attachment.compressionType = request.add_attachment().attachment().compression_type(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
444 attachment.compressedSize = request.add_attachment().attachment().compressed_size(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
445 attachment.compressedHash = request.add_attachment().attachment().compressed_hash().c_str(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
446 |
377 | 447 backend.AddAttachment(manager, request.add_attachment().id(), attachment, request.add_attachment().revision()); |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
448 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
449 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
450 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
451 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_CHANGES: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
452 { |
377 | 453 backend.ClearChanges(manager); |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
454 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
455 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
456 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
457 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_EXPORTED_RESOURCES: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
458 { |
377 | 459 backend.ClearExportedResources(manager); |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
460 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
461 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
462 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
463 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_ATTACHMENT: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
464 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
465 Output output(*response.mutable_delete_attachment()); |
377 | 466 backend.DeleteAttachment(output, manager, request.delete_attachment().id(), request.delete_attachment().type()); |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
467 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
468 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
469 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
470 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_METADATA: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
471 { |
377 | 472 backend.DeleteMetadata(manager, request.delete_metadata().id(), request.delete_metadata().type()); |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
473 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
474 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
475 |
376 | 476 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_RESOURCE: |
477 { | |
478 response.mutable_delete_resource()->set_is_remaining_ancestor(false); | |
479 | |
480 Output output(*response.mutable_delete_resource()); | |
377 | 481 backend.DeleteResource(output, manager, request.delete_resource().id()); |
376 | 482 break; |
483 } | |
484 | |
485 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_METADATA: | |
486 { | |
487 typedef std::map<int32_t, std::string> Values; | |
488 | |
489 Values values; | |
377 | 490 backend.GetAllMetadata(values, manager, request.get_all_metadata().id()); |
376 | 491 |
492 for (Values::const_iterator it = values.begin(); it != values.end(); ++it) | |
493 { | |
377 | 494 Orthanc::DatabasePluginMessages::GetAllMetadata_Response_Metadata* metadata = |
495 response.mutable_get_all_metadata()->add_metadata(); | |
376 | 496 metadata->set_type(it->first); |
497 metadata->set_value(it->second); | |
498 } | |
499 | |
500 break; | |
501 } | |
502 | |
503 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS: | |
504 { | |
505 std::list<std::string> values; | |
377 | 506 backend.GetAllPublicIds(values, manager, Convert(request.get_all_public_ids().resource_type())); |
376 | 507 |
508 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) | |
509 { | |
510 response.mutable_get_all_public_ids()->add_ids(*it); | |
511 } | |
512 | |
513 break; | |
514 } | |
515 | |
516 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS_WITH_LIMITS: | |
517 { | |
518 std::list<std::string> values; | |
377 | 519 backend.GetAllPublicIds(values, manager, Convert(request.get_all_public_ids_with_limits().resource_type()), |
520 request.get_all_public_ids_with_limits().since(), | |
521 request.get_all_public_ids_with_limits().limit()); | |
376 | 522 |
523 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) | |
524 { | |
525 response.mutable_get_all_public_ids_with_limits()->add_ids(*it); | |
526 } | |
527 | |
528 break; | |
529 } | |
530 | |
531 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHANGES: | |
532 { | |
533 Output output(*response.mutable_get_changes()); | |
534 | |
535 bool done; | |
377 | 536 backend.GetChanges(output, done, manager, request.get_changes().since(), request.get_changes().limit()); |
376 | 537 |
538 response.mutable_get_changes()->set_done(done); | |
539 break; | |
540 } | |
541 | |
542 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_INTERNAL_ID: | |
543 { | |
544 std::list<int64_t> values; | |
377 | 545 backend.GetChildrenInternalId(values, manager, request.get_children_internal_id().id()); |
376 | 546 |
547 for (std::list<int64_t>::const_iterator it = values.begin(); it != values.end(); ++it) | |
548 { | |
549 response.mutable_get_children_internal_id()->add_ids(*it); | |
550 } | |
551 | |
552 break; | |
553 } | |
554 | |
555 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_PUBLIC_ID: | |
556 { | |
557 std::list<std::string> values; | |
377 | 558 backend.GetChildrenPublicId(values, manager, request.get_children_public_id().id()); |
376 | 559 |
560 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) | |
561 { | |
562 response.mutable_get_children_public_id()->add_ids(*it); | |
563 } | |
564 | |
565 break; | |
566 } | |
567 | |
568 case Orthanc::DatabasePluginMessages::OPERATION_GET_EXPORTED_RESOURCES: | |
569 { | |
570 Output output(*response.mutable_get_exported_resources()); | |
571 | |
572 bool done; | |
377 | 573 backend.GetExportedResources(output, done, manager, request.get_exported_resources().since(), |
574 request.get_exported_resources().limit()); | |
376 | 575 |
576 response.mutable_get_exported_resources()->set_done(done); | |
577 break; | |
578 } | |
579 | |
580 case Orthanc::DatabasePluginMessages::OPERATION_GET_LAST_CHANGE: | |
581 { | |
582 response.mutable_get_last_change()->set_exists(false); | |
583 | |
584 Output output(*response.mutable_get_last_change()); | |
377 | 585 backend.GetLastChange(output, manager); |
586 break; | |
587 } | |
588 | |
589 case Orthanc::DatabasePluginMessages::OPERATION_GET_LAST_EXPORTED_RESOURCE: | |
590 { | |
591 response.mutable_get_last_exported_resource()->set_exists(false); | |
592 | |
593 Output output(*response.mutable_get_last_exported_resource()); | |
594 backend.GetLastExportedResource(output, manager); | |
595 break; | |
596 } | |
597 | |
598 case Orthanc::DatabasePluginMessages::OPERATION_GET_MAIN_DICOM_TAGS: | |
599 { | |
600 Output output(*response.mutable_get_main_dicom_tags()); | |
601 backend.GetMainDicomTags(output, manager, request.get_main_dicom_tags().id()); | |
376 | 602 break; |
603 } | |
604 | |
377 | 605 case Orthanc::DatabasePluginMessages::OPERATION_GET_PUBLIC_ID: |
606 { | |
607 const std::string id = backend.GetPublicId(manager, request.get_public_id().id()); | |
608 response.mutable_get_public_id()->set_id(id); | |
609 break; | |
610 } | |
611 | |
612 case Orthanc::DatabasePluginMessages::OPERATION_GET_RESOURCES_COUNT: | |
613 { | |
614 OrthancPluginResourceType type = Convert(request.get_resources_count().type()); | |
615 uint64_t count = backend.GetResourcesCount(manager, type); | |
616 response.mutable_get_resources_count()->set_count(count); | |
617 break; | |
618 } | |
619 | |
620 case Orthanc::DatabasePluginMessages::OPERATION_GET_RESOURCE_TYPE: | |
621 { | |
622 OrthancPluginResourceType type = backend.GetResourceType(manager, request.get_public_id().id()); | |
623 response.mutable_get_resource_type()->set_type(Convert(type)); | |
624 break; | |
625 } | |
626 | |
627 case Orthanc::DatabasePluginMessages::OPERATION_GET_TOTAL_COMPRESSED_SIZE: | |
628 { | |
629 response.mutable_get_total_compressed_size()->set_size(backend.GetTotalCompressedSize(manager)); | |
630 break; | |
631 } | |
632 | |
633 case Orthanc::DatabasePluginMessages::OPERATION_GET_TOTAL_UNCOMPRESSED_SIZE: | |
634 { | |
635 response.mutable_get_total_uncompressed_size()->set_size(backend.GetTotalUncompressedSize(manager)); | |
636 break; | |
637 } | |
638 | |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
639 default: |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
640 LOG(ERROR) << "Not implemented transaction operation from protobuf: " << request.operation(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
641 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
642 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
643 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
644 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
645 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
646 static OrthancPluginErrorCode CallBackend(OrthancPluginMemoryBuffer64* serializedResponse, |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
647 void* rawPool, |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
648 const void* requestData, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
649 uint64_t requestSize) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
650 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
651 Orthanc::DatabasePluginMessages::Request request; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
652 if (!request.ParseFromArray(requestData, requestSize)) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
653 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
654 LOG(ERROR) << "Cannot parse message from the Orthanc core using protobuf"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
655 return OrthancPluginErrorCode_InternalError; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
656 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
657 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
658 if (rawPool == NULL) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
659 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
660 LOG(ERROR) << "Received a NULL pointer from the database"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
661 return OrthancPluginErrorCode_InternalError; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
662 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
663 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
664 IndexConnectionsPool& pool = *reinterpret_cast<IndexConnectionsPool*>(rawPool); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
665 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
666 try |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
667 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
668 Orthanc::DatabasePluginMessages::Response response; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
669 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
670 switch (request.type()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
671 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
672 case Orthanc::DatabasePluginMessages::REQUEST_DATABASE: |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
673 ProcessDatabaseOperation(*response.mutable_database_response(), request.database_request(), pool); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
674 break; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
675 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
676 case Orthanc::DatabasePluginMessages::REQUEST_TRANSACTION: |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
677 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
678 IndexConnectionsPool::Accessor& transaction = *reinterpret_cast<IndexConnectionsPool::Accessor*>(request.transaction_request().transaction()); |
377 | 679 ProcessTransactionOperation(*response.mutable_transaction_response(), request.transaction_request(), |
680 transaction.GetBackend(), transaction.GetManager()); | |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
681 break; |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
682 } |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
683 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
684 default: |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
685 LOG(ERROR) << "Not implemented request type from protobuf: " << request.type(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
686 break; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
687 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
688 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
689 std::string s; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
690 if (!response.SerializeToString(&s)) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
691 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
692 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Cannot serialize to protobuf"); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
693 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
694 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
695 if (OrthancPluginCreateMemoryBuffer64(pool.GetContext(), serializedResponse, s.size()) != OrthancPluginErrorCode_Success) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
696 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
697 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory, "Cannot allocate a memory buffer"); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
698 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
699 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
700 if (!s.empty()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
701 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
702 assert(serializedResponse->size == s.size()); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
703 memcpy(serializedResponse->data, s.c_str(), s.size()); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
704 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
705 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
706 return OrthancPluginErrorCode_Success; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
707 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
708 catch (::Orthanc::OrthancException& e) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
709 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
710 LOG(ERROR) << "Exception in database back-end: " << e.What(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
711 return static_cast<OrthancPluginErrorCode>(e.GetErrorCode()); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
712 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
713 catch (::std::runtime_error& e) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
714 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
715 LOG(ERROR) << "Exception in database back-end: " << e.what(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
716 return OrthancPluginErrorCode_DatabasePlugin; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
717 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
718 catch (...) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
719 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
720 LOG(ERROR) << "Native exception"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
721 return OrthancPluginErrorCode_DatabasePlugin; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
722 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
723 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
724 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
725 static void FinalizeBackend(void* rawPool) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
726 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
727 if (rawPool != NULL) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
728 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
729 IndexConnectionsPool* pool = reinterpret_cast<IndexConnectionsPool*>(rawPool); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
730 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
731 if (isBackendInUse_) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
732 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
733 isBackendInUse_ = false; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
734 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
735 else |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
736 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
737 LOG(ERROR) << "More than one index backend was registered, internal error"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
738 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
739 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
740 delete pool; |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
741 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
742 else |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
743 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
744 LOG(ERROR) << "Received a null pointer from the Orthanc core, internal error"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
745 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
746 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
747 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
748 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
749 void DatabaseBackendAdapterV4::Register(IndexBackend* backend, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
750 size_t countConnections, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
751 unsigned int maxDatabaseRetries) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
752 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
753 std::unique_ptr<IndexConnectionsPool> pool(new IndexConnectionsPool(backend, countConnections)); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
754 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
755 if (isBackendInUse_) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
756 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
757 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
758 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
759 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
760 OrthancPluginContext* context = backend->GetContext(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
761 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
762 if (OrthancPluginRegisterDatabaseBackendV4(context, pool.release(), maxDatabaseRetries, |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
763 CallBackend, FinalizeBackend) != OrthancPluginErrorCode_Success) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
764 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
765 delete backend; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
766 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Unable to register the database backend"); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
767 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
768 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
769 isBackendInUse_ = true; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
770 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
771 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
772 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
773 void DatabaseBackendAdapterV4::Finalize() |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
774 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
775 if (isBackendInUse_) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
776 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
777 LOG(ERROR) << "The Orthanc core has not destructed the index backend, internal error"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
778 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
779 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
780 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
781 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
782 # endif |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
783 #endif |