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