Mercurial > hg > orthanc-databases
comparison Framework/Plugins/StorageBackend.cpp @ 194:a51ce147dbe0
refactoring using new class StorageAreaBuffer
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 08 Jan 2021 14:40:03 +0100 |
parents | 3236894320d6 |
children | 53bd9022c58b |
comparison
equal
deleted
inserted
replaced
193:3236894320d6 | 194:a51ce147dbe0 |
---|---|
29 #include "../../Framework/Common/FileValue.h" | 29 #include "../../Framework/Common/FileValue.h" |
30 | 30 |
31 #include <Compatibility.h> // For std::unique_ptr<> | 31 #include <Compatibility.h> // For std::unique_ptr<> |
32 #include <OrthancException.h> | 32 #include <OrthancException.h> |
33 | 33 |
34 #include <limits> | |
35 | |
34 | 36 |
35 #define ORTHANC_PLUGINS_DATABASE_CATCH \ | 37 #define ORTHANC_PLUGINS_DATABASE_CATCH \ |
36 catch (::Orthanc::OrthancException& e) \ | 38 catch (::Orthanc::OrthancException& e) \ |
37 { \ | 39 { \ |
38 return static_cast<OrthancPluginErrorCode>(e.GetErrorCode()); \ | 40 return static_cast<OrthancPluginErrorCode>(e.GetErrorCode()); \ |
50 } | 52 } |
51 | 53 |
52 | 54 |
53 namespace OrthancDatabases | 55 namespace OrthancDatabases |
54 { | 56 { |
55 void StorageBackend::ReadFromString(void*& buffer, | |
56 size_t& size, | |
57 const std::string& content) | |
58 { | |
59 size = content.size(); | |
60 | |
61 if (content.empty()) | |
62 { | |
63 buffer = NULL; | |
64 } | |
65 else | |
66 { | |
67 buffer = malloc(size); | |
68 | |
69 if (buffer == NULL) | |
70 { | |
71 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); | |
72 } | |
73 | |
74 memcpy(buffer, content.c_str(), size); | |
75 } | |
76 } | |
77 | |
78 | |
79 StorageBackend::StorageBackend(IDatabaseFactory* factory) : | 57 StorageBackend::StorageBackend(IDatabaseFactory* factory) : |
80 manager_(factory) | 58 manager_(factory) |
81 { | 59 { |
82 } | |
83 | |
84 | |
85 void StorageBackend::ReadToString(std::string& content, | |
86 DatabaseManager::Transaction& transaction, | |
87 const std::string& uuid, | |
88 OrthancPluginContentType type) | |
89 { | |
90 void* buffer = NULL; | |
91 size_t size; | |
92 Read(buffer, size, transaction, uuid, type); | |
93 | |
94 try | |
95 { | |
96 content.resize(size); | |
97 } | |
98 catch (std::bad_alloc&) | |
99 { | |
100 if (size != 0) | |
101 { | |
102 free(buffer); | |
103 } | |
104 | |
105 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); | |
106 } | |
107 | |
108 if (size != 0) | |
109 { | |
110 assert(buffer != NULL); | |
111 memcpy(&content[0], buffer, size); | |
112 } | |
113 | |
114 free(buffer); | |
115 } | 60 } |
116 | 61 |
117 | 62 |
118 void StorageBackend::Create(DatabaseManager::Transaction& transaction, | 63 void StorageBackend::Create(DatabaseManager::Transaction& transaction, |
119 const std::string& uuid, | 64 const std::string& uuid, |
136 | 81 |
137 statement.Execute(args); | 82 statement.Execute(args); |
138 } | 83 } |
139 | 84 |
140 | 85 |
141 void StorageBackend::Read(void*& content, | 86 void StorageBackend::Read(StorageAreaBuffer& target, |
142 size_t& size, | |
143 DatabaseManager::Transaction& transaction, | 87 DatabaseManager::Transaction& transaction, |
144 const std::string& uuid, | 88 const std::string& uuid, |
145 OrthancPluginContentType type) | 89 OrthancPluginContentType type) |
146 { | 90 { |
147 DatabaseManager::CachedStatement statement( | 91 DatabaseManager::CachedStatement statement( |
170 const IValue& value = statement.GetResultField(0); | 114 const IValue& value = statement.GetResultField(0); |
171 | 115 |
172 switch (value.GetType()) | 116 switch (value.GetType()) |
173 { | 117 { |
174 case ValueType_File: | 118 case ValueType_File: |
175 ReadFromString(content, size, | 119 target.Assign(dynamic_cast<const FileValue&>(value).GetContent()); |
176 dynamic_cast<const FileValue&>(value).GetContent()); | |
177 break; | 120 break; |
178 | 121 |
179 case ValueType_BinaryString: | 122 case ValueType_BinaryString: |
180 ReadFromString(content, size, | 123 target.Assign(dynamic_cast<const BinaryStringValue&>(value).GetContent()); |
181 dynamic_cast<const BinaryStringValue&>(value).GetContent()); | |
182 break; | 124 break; |
183 | 125 |
184 default: | 126 default: |
185 throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); | 127 throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); |
186 } | 128 } |
233 const char* uuid, | 175 const char* uuid, |
234 OrthancPluginContentType type) | 176 OrthancPluginContentType type) |
235 { | 177 { |
236 try | 178 try |
237 { | 179 { |
238 DatabaseManager::Transaction transaction(backend_->GetManager()); | 180 StorageAreaBuffer buffer; |
239 size_t tmp; | 181 |
240 backend_->Read(*content, tmp, transaction, uuid, type); | 182 { |
241 *size = static_cast<int64_t>(tmp); | 183 DatabaseManager::Transaction transaction(backend_->GetManager()); |
242 transaction.Commit(); | 184 backend_->Read(buffer, transaction, uuid, type); |
185 transaction.Commit(); | |
186 } | |
187 | |
188 *size = buffer.GetSize(); | |
189 *content = buffer.ReleaseData(); | |
190 | |
243 return OrthancPluginErrorCode_Success; | 191 return OrthancPluginErrorCode_Success; |
244 } | 192 } |
245 ORTHANC_PLUGINS_DATABASE_CATCH; | 193 ORTHANC_PLUGINS_DATABASE_CATCH; |
246 } | 194 } |
247 | 195 |