Mercurial > hg > orthanc-databases
annotate Framework/Plugins/DatabaseBackendAdapterV4.cpp @ 376:59bba5fbb425 db-protobuf
cont
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 28 Mar 2023 19:15:33 +0200 |
parents | 824d70ce85ff |
children | 02fe4606f5e4 |
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: |
376 | 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_; | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
101 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
102 void Clear() |
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 deleteAttachment_ = NULL; |
376 | 105 deleteResource_ = NULL; |
106 getChanges_ = NULL; | |
107 getExportedResources_ = NULL; | |
108 getLastChange_ = NULL; | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
109 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
110 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
111 public: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
112 Output(Orthanc::DatabasePluginMessages::DeleteAttachment::Response& deleteAttachment) |
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 Clear(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
115 deleteAttachment_ = &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 |
376 | 118 Output(Orthanc::DatabasePluginMessages::DeleteResource::Response& deleteResource) |
119 { | |
120 Clear(); | |
121 deleteResource_ = &deleteResource; | |
122 } | |
123 | |
124 Output(Orthanc::DatabasePluginMessages::GetChanges::Response& getChanges) | |
125 { | |
126 Clear(); | |
127 getChanges_ = &getChanges; | |
128 } | |
129 | |
130 Output(Orthanc::DatabasePluginMessages::GetExportedResources::Response& getExportedResources) | |
131 { | |
132 Clear(); | |
133 getExportedResources_ = &getExportedResources; | |
134 } | |
135 | |
136 Output(Orthanc::DatabasePluginMessages::GetLastChange::Response& getLastChange) | |
137 { | |
138 Clear(); | |
139 getLastChange_ = &getLastChange; | |
140 } | |
141 | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
142 virtual void SignalDeletedAttachment(const std::string& uuid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
143 int32_t contentType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
144 uint64_t uncompressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
145 const std::string& uncompressedHash, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
146 int32_t compressionType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
147 uint64_t compressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
148 const std::string& compressedHash) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
149 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
150 Orthanc::DatabasePluginMessages::FileInfo* attachment; |
376 | 151 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
152 if (deleteAttachment_ != NULL) |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
153 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
154 if (deleteAttachment_->has_deleted_attachment()) |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
155 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
156 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
157 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
158 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
159 attachment = deleteAttachment_->mutable_deleted_attachment(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
160 } |
376 | 161 else if (deleteResource_ != NULL) |
162 { | |
163 attachment = deleteResource_->add_deleted_attachments(); | |
164 } | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
165 else |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
166 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
167 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
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 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
170 attachment->set_uuid(uuid); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
171 attachment->set_content_type(contentType); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
172 attachment->set_uncompressed_size(uncompressedSize); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
173 attachment->set_uncompressed_hash(uncompressedHash); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
174 attachment->set_compression_type(compressionType); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
175 attachment->set_compressed_size(compressedSize); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
176 attachment->set_compressed_hash(compressedHash); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
177 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
178 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
179 virtual void SignalDeletedResource(const std::string& publicId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
180 OrthancPluginResourceType resourceType) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
181 { |
376 | 182 if (deleteResource_ != NULL) |
183 { | |
184 Orthanc::DatabasePluginMessages::DeleteResource_Response_Resource* resource = deleteResource_->add_deleted_resources(); | |
185 resource->set_level(Convert(resourceType)); | |
186 resource->set_public_id(publicId); | |
187 } | |
188 else | |
189 { | |
190 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
191 } | |
375
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 SignalRemainingAncestor(const std::string& ancestorId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
195 OrthancPluginResourceType ancestorType) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
196 { |
376 | 197 if (deleteResource_ != NULL) |
198 { | |
199 if (deleteResource_->is_remaining_ancestor()) | |
200 { | |
201 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
202 } | |
203 else | |
204 { | |
205 deleteResource_->set_is_remaining_ancestor(true); | |
206 deleteResource_->mutable_remaining_ancestor()->set_level(Convert(ancestorType)); | |
207 deleteResource_->mutable_remaining_ancestor()->set_public_id(ancestorId); | |
208 } | |
209 } | |
210 else | |
211 { | |
212 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
213 } | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
214 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
215 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
216 virtual void AnswerAttachment(const std::string& uuid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
217 int32_t contentType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
218 uint64_t uncompressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
219 const std::string& uncompressedHash, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
220 int32_t compressionType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
221 uint64_t compressedSize, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
222 const std::string& compressedHash) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
223 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
224 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
225 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
226 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
227 virtual void AnswerChange(int64_t seq, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
228 int32_t changeType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
229 OrthancPluginResourceType resourceType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
230 const std::string& publicId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
231 const std::string& date) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
232 { |
376 | 233 Orthanc::DatabasePluginMessages::ServerIndexChange* change; |
234 | |
235 if (getChanges_ != NULL) | |
236 { | |
237 change = getChanges_->add_changes(); | |
238 } | |
239 else if (getLastChange_ != NULL) | |
240 { | |
241 if (getLastChange_->exists()) | |
242 { | |
243 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
244 } | |
245 | |
246 getLastChange_->set_exists(true); | |
247 change = getLastChange_->mutable_change(); | |
248 } | |
249 else | |
250 { | |
251 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
252 } | |
253 | |
254 change->set_seq(seq); | |
255 change->set_change_type(changeType); | |
256 change->set_resource_type(Convert(resourceType)); | |
257 change->set_public_id(publicId); | |
258 change->set_date(date); | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
259 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
260 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
261 virtual void AnswerDicomTag(uint16_t group, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
262 uint16_t element, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
263 const std::string& value) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
264 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
265 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
266 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
267 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
268 virtual void AnswerExportedResource(int64_t seq, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
269 OrthancPluginResourceType resourceType, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
270 const std::string& publicId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
271 const std::string& modality, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
272 const std::string& date, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
273 const std::string& patientId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
274 const std::string& studyInstanceUid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
275 const std::string& seriesInstanceUid, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
276 const std::string& sopInstanceUid) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
277 { |
376 | 278 if (getExportedResources_ != NULL) |
279 { | |
280 Orthanc::DatabasePluginMessages::ExportedResource* resource = getExportedResources_->add_resources(); | |
281 resource->set_seq(seq); | |
282 resource->set_resource_type(Convert(resourceType)); | |
283 resource->set_public_id(publicId); | |
284 resource->set_modality(modality); | |
285 resource->set_date(date); | |
286 resource->set_patient_id(patientId); | |
287 resource->set_study_instance_uid(studyInstanceUid); | |
288 resource->set_series_instance_uid(seriesInstanceUid); | |
289 resource->set_sop_instance_uid(sopInstanceUid); | |
290 } | |
291 else | |
292 { | |
293 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
294 } | |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
295 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
296 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
297 virtual void AnswerMatchingResource(const std::string& resourceId) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
298 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
299 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
300 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
301 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
302 virtual void AnswerMatchingResource(const std::string& resourceId, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
303 const std::string& someInstanceId) ORTHANC_OVERRIDE |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
304 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
305 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
306 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
307 }; |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
308 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
309 |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
310 static void ProcessDatabaseOperation(Orthanc::DatabasePluginMessages::DatabaseResponse& response, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
311 const Orthanc::DatabasePluginMessages::DatabaseRequest& request, |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
312 IndexConnectionsPool& pool) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
313 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
314 switch (request.operation()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
315 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
316 case Orthanc::DatabasePluginMessages::OPERATION_GET_SYSTEM_INFORMATION: |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
317 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
318 IndexConnectionsPool::Accessor accessor(pool); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
319 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
|
320 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
|
321 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
|
322 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
323 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
324 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
325 case Orthanc::DatabasePluginMessages::OPERATION_OPEN: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
326 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
327 pool.OpenConnections(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
328 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
329 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
330 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
331 case Orthanc::DatabasePluginMessages::OPERATION_CLOSE: |
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 pool.CloseConnections(); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
334 break; |
375
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 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
337 case Orthanc::DatabasePluginMessages::OPERATION_FLUSH_TO_DISK: |
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 // Raise an exception since "set_supports_flush_to_disk(false)" |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
340 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
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 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
343 case Orthanc::DatabasePluginMessages::OPERATION_START_TRANSACTION: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
344 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
345 std::unique_ptr<IndexConnectionsPool::Accessor> transaction(new IndexConnectionsPool::Accessor(pool)); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
346 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
347 switch (request.start_transaction().type()) |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
348 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
349 case Orthanc::DatabasePluginMessages::TRANSACTION_READ_ONLY: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
350 transaction->GetManager().StartTransaction(TransactionType_ReadOnly); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
351 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
352 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
353 case Orthanc::DatabasePluginMessages::TRANSACTION_READ_WRITE: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
354 transaction->GetManager().StartTransaction(TransactionType_ReadWrite); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
355 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
356 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
357 default: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
358 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
359 } |
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 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
|
362 break; |
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 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
365 case Orthanc::DatabasePluginMessages::OPERATION_UPGRADE: |
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 IndexConnectionsPool::Accessor accessor(pool); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
368 OrthancPluginStorageArea* storageArea = reinterpret_cast<OrthancPluginStorageArea*>(request.upgrade().storage_area()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
369 accessor.GetBackend().UpgradeDatabase(accessor.GetManager(), request.upgrade().target_version(), storageArea); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
370 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
371 } |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
372 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
373 default: |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
374 LOG(ERROR) << "Not implemented database operation from protobuf: " << request.operation(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
375 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
376 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
377 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
378 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
379 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
380 static void ProcessTransactionOperation(Orthanc::DatabasePluginMessages::TransactionResponse& response, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
381 const Orthanc::DatabasePluginMessages::TransactionRequest& request, |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
382 IndexConnectionsPool::Accessor& transaction) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
383 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
384 switch (request.operation()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
385 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
386 case Orthanc::DatabasePluginMessages::OPERATION_ROLLBACK: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
387 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
388 transaction.GetManager().RollbackTransaction(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
389 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
390 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
391 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
392 case Orthanc::DatabasePluginMessages::OPERATION_COMMIT: |
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 transaction.GetManager().CommitTransaction(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
395 break; |
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 case Orthanc::DatabasePluginMessages::OPERATION_ADD_ATTACHMENT: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
399 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
400 OrthancPluginAttachment attachment; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
401 attachment.uuid = request.add_attachment().attachment().uuid().c_str(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
402 attachment.contentType = request.add_attachment().attachment().content_type(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
403 attachment.uncompressedSize = request.add_attachment().attachment().uncompressed_size(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
404 attachment.uncompressedHash = request.add_attachment().attachment().uncompressed_hash().c_str(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
405 attachment.compressionType = request.add_attachment().attachment().compression_type(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
406 attachment.compressedSize = request.add_attachment().attachment().compressed_size(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
407 attachment.compressedHash = request.add_attachment().attachment().compressed_hash().c_str(); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
408 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
409 transaction.GetBackend().AddAttachment(transaction.GetManager(), request.add_attachment().id(), attachment, |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
410 request.add_attachment().revision()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
411 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
412 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
413 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
414 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_CHANGES: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
415 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
416 transaction.GetBackend().ClearChanges(transaction.GetManager()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
417 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
418 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
419 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
420 case Orthanc::DatabasePluginMessages::OPERATION_CLEAR_EXPORTED_RESOURCES: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
421 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
422 transaction.GetBackend().ClearExportedResources(transaction.GetManager()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
423 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
424 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
425 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
426 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_ATTACHMENT: |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
427 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
428 Output output(*response.mutable_delete_attachment()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
429 transaction.GetBackend().DeleteAttachment( |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
430 output, transaction.GetManager(), request.delete_attachment().id(), request.delete_attachment().type()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
431 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
432 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
433 |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
434 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_METADATA: |
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 transaction.GetBackend().DeleteMetadata( |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
437 transaction.GetManager(), request.delete_metadata().id(), request.delete_metadata().type()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
438 break; |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
439 } |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
440 |
376 | 441 case Orthanc::DatabasePluginMessages::OPERATION_DELETE_RESOURCE: |
442 { | |
443 response.mutable_delete_resource()->set_is_remaining_ancestor(false); | |
444 | |
445 Output output(*response.mutable_delete_resource()); | |
446 transaction.GetBackend().DeleteResource(output, transaction.GetManager(), request.delete_resource().id()); | |
447 break; | |
448 } | |
449 | |
450 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_METADATA: | |
451 { | |
452 typedef std::map<int32_t, std::string> Values; | |
453 | |
454 Values values; | |
455 transaction.GetBackend().GetAllMetadata(values, transaction.GetManager(), request.get_all_metadata().id()); | |
456 | |
457 for (Values::const_iterator it = values.begin(); it != values.end(); ++it) | |
458 { | |
459 Orthanc::DatabasePluginMessages::GetAllMetadata_Response_Metadata* metadata = response.mutable_get_all_metadata()->add_metadata(); | |
460 metadata->set_type(it->first); | |
461 metadata->set_value(it->second); | |
462 } | |
463 | |
464 break; | |
465 } | |
466 | |
467 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS: | |
468 { | |
469 std::list<std::string> values; | |
470 transaction.GetBackend().GetAllPublicIds(values, transaction.GetManager(), Convert(request.get_all_public_ids().resource_type())); | |
471 | |
472 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) | |
473 { | |
474 response.mutable_get_all_public_ids()->add_ids(*it); | |
475 } | |
476 | |
477 break; | |
478 } | |
479 | |
480 case Orthanc::DatabasePluginMessages::OPERATION_GET_ALL_PUBLIC_IDS_WITH_LIMITS: | |
481 { | |
482 std::list<std::string> values; | |
483 transaction.GetBackend().GetAllPublicIds(values, transaction.GetManager(), | |
484 Convert(request.get_all_public_ids_with_limits().resource_type()), | |
485 request.get_all_public_ids_with_limits().since(), | |
486 request.get_all_public_ids_with_limits().limit()); | |
487 | |
488 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) | |
489 { | |
490 response.mutable_get_all_public_ids_with_limits()->add_ids(*it); | |
491 } | |
492 | |
493 break; | |
494 } | |
495 | |
496 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHANGES: | |
497 { | |
498 Output output(*response.mutable_get_changes()); | |
499 | |
500 bool done; | |
501 transaction.GetBackend().GetChanges(output, done, transaction.GetManager(), | |
502 request.get_changes().since(), | |
503 request.get_changes().limit()); | |
504 | |
505 response.mutable_get_changes()->set_done(done); | |
506 break; | |
507 } | |
508 | |
509 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_INTERNAL_ID: | |
510 { | |
511 std::list<int64_t> values; | |
512 transaction.GetBackend().GetChildrenInternalId(values, transaction.GetManager(), request.get_children_internal_id().id()); | |
513 | |
514 for (std::list<int64_t>::const_iterator it = values.begin(); it != values.end(); ++it) | |
515 { | |
516 response.mutable_get_children_internal_id()->add_ids(*it); | |
517 } | |
518 | |
519 break; | |
520 } | |
521 | |
522 case Orthanc::DatabasePluginMessages::OPERATION_GET_CHILDREN_PUBLIC_ID: | |
523 { | |
524 std::list<std::string> values; | |
525 transaction.GetBackend().GetChildrenPublicId(values, transaction.GetManager(), request.get_children_public_id().id()); | |
526 | |
527 for (std::list<std::string>::const_iterator it = values.begin(); it != values.end(); ++it) | |
528 { | |
529 response.mutable_get_children_public_id()->add_ids(*it); | |
530 } | |
531 | |
532 break; | |
533 } | |
534 | |
535 case Orthanc::DatabasePluginMessages::OPERATION_GET_EXPORTED_RESOURCES: | |
536 { | |
537 Output output(*response.mutable_get_exported_resources()); | |
538 | |
539 bool done; | |
540 transaction.GetBackend().GetExportedResources(output, done, transaction.GetManager(), | |
541 request.get_exported_resources().since(), | |
542 request.get_exported_resources().limit()); | |
543 | |
544 response.mutable_get_exported_resources()->set_done(done); | |
545 break; | |
546 } | |
547 | |
548 case Orthanc::DatabasePluginMessages::OPERATION_GET_LAST_CHANGE: | |
549 { | |
550 response.mutable_get_last_change()->set_exists(false); | |
551 | |
552 Output output(*response.mutable_get_last_change()); | |
553 transaction.GetBackend().GetLastChange(output, transaction.GetManager()); | |
554 break; | |
555 } | |
556 | |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
557 default: |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
558 LOG(ERROR) << "Not implemented transaction operation from protobuf: " << request.operation(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
559 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
560 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
561 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
562 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
563 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
564 static OrthancPluginErrorCode CallBackend(OrthancPluginMemoryBuffer64* serializedResponse, |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
565 void* rawPool, |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
566 const void* requestData, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
567 uint64_t requestSize) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
568 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
569 Orthanc::DatabasePluginMessages::Request request; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
570 if (!request.ParseFromArray(requestData, requestSize)) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
571 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
572 LOG(ERROR) << "Cannot parse message from the Orthanc core using protobuf"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
573 return OrthancPluginErrorCode_InternalError; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
574 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
575 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
576 if (rawPool == NULL) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
577 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
578 LOG(ERROR) << "Received a NULL pointer from the database"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
579 return OrthancPluginErrorCode_InternalError; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
580 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
581 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
582 IndexConnectionsPool& pool = *reinterpret_cast<IndexConnectionsPool*>(rawPool); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
583 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
584 try |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
585 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
586 Orthanc::DatabasePluginMessages::Response response; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
587 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
588 switch (request.type()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
589 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
590 case Orthanc::DatabasePluginMessages::REQUEST_DATABASE: |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
591 ProcessDatabaseOperation(*response.mutable_database_response(), request.database_request(), pool); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
592 break; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
593 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
594 case Orthanc::DatabasePluginMessages::REQUEST_TRANSACTION: |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
595 { |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
596 IndexConnectionsPool::Accessor& transaction = *reinterpret_cast<IndexConnectionsPool::Accessor*>(request.transaction_request().transaction()); |
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
597 ProcessTransactionOperation(*response.mutable_transaction_response(), request.transaction_request(), transaction); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
598 break; |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
599 } |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
600 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
601 default: |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
602 LOG(ERROR) << "Not implemented request type from protobuf: " << request.type(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
603 break; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
604 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
605 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
606 std::string s; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
607 if (!response.SerializeToString(&s)) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
608 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
609 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Cannot serialize to protobuf"); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
610 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
611 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
612 if (OrthancPluginCreateMemoryBuffer64(pool.GetContext(), serializedResponse, s.size()) != OrthancPluginErrorCode_Success) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
613 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
614 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory, "Cannot allocate a memory buffer"); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
615 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
616 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
617 if (!s.empty()) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
618 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
619 assert(serializedResponse->size == s.size()); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
620 memcpy(serializedResponse->data, s.c_str(), s.size()); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
621 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
622 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
623 return OrthancPluginErrorCode_Success; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
624 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
625 catch (::Orthanc::OrthancException& e) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
626 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
627 LOG(ERROR) << "Exception in database back-end: " << e.What(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
628 return static_cast<OrthancPluginErrorCode>(e.GetErrorCode()); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
629 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
630 catch (::std::runtime_error& e) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
631 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
632 LOG(ERROR) << "Exception in database back-end: " << e.what(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
633 return OrthancPluginErrorCode_DatabasePlugin; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
634 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
635 catch (...) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
636 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
637 LOG(ERROR) << "Native exception"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
638 return OrthancPluginErrorCode_DatabasePlugin; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
639 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
640 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
641 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
642 static void FinalizeBackend(void* rawPool) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
643 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
644 if (rawPool != NULL) |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
645 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
646 IndexConnectionsPool* pool = reinterpret_cast<IndexConnectionsPool*>(rawPool); |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
647 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
648 if (isBackendInUse_) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
649 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
650 isBackendInUse_ = false; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
651 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
652 else |
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) << "More than one index backend was registered, internal error"; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
655 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
656 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
657 delete pool; |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
658 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
659 else |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
660 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
661 LOG(ERROR) << "Received a null pointer from the Orthanc core, internal error"; |
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 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
664 |
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 void DatabaseBackendAdapterV4::Register(IndexBackend* backend, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
667 size_t countConnections, |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
668 unsigned int maxDatabaseRetries) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
669 { |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
670 std::unique_ptr<IndexConnectionsPool> pool(new IndexConnectionsPool(backend, countConnections)); |
373
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 if (isBackendInUse_) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
673 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
674 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
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 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
677 OrthancPluginContext* context = backend->GetContext(); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
678 |
375
824d70ce85ff
implemented database operations
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
373
diff
changeset
|
679 if (OrthancPluginRegisterDatabaseBackendV4(context, pool.release(), maxDatabaseRetries, |
373
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
680 CallBackend, FinalizeBackend) != OrthancPluginErrorCode_Success) |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
681 { |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
682 delete backend; |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
683 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Unable to register the database backend"); |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
684 } |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
685 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
686 isBackendInUse_ = true; |
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 |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
690 void DatabaseBackendAdapterV4::Finalize() |
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 if (isBackendInUse_) |
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 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
|
695 } |
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 } |
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 # endif |
be7de633695c
started DatabaseBackendAdapterV4
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
700 #endif |