Mercurial > hg > orthanc-databases
diff 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 |
line wrap: on
line diff
--- a/Framework/Plugins/StorageBackend.cpp Wed Jan 06 17:40:27 2021 +0100 +++ b/Framework/Plugins/StorageBackend.cpp Fri Jan 08 14:40:03 2021 +0100 @@ -31,6 +31,8 @@ #include <Compatibility.h> // For std::unique_ptr<> #include <OrthancException.h> +#include <limits> + #define ORTHANC_PLUGINS_DATABASE_CATCH \ catch (::Orthanc::OrthancException& e) \ @@ -52,69 +54,12 @@ namespace OrthancDatabases { - void StorageBackend::ReadFromString(void*& buffer, - size_t& size, - const std::string& content) - { - size = content.size(); - - if (content.empty()) - { - buffer = NULL; - } - else - { - buffer = malloc(size); - - if (buffer == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); - } - - memcpy(buffer, content.c_str(), size); - } - } - - StorageBackend::StorageBackend(IDatabaseFactory* factory) : manager_(factory) { } - void StorageBackend::ReadToString(std::string& content, - DatabaseManager::Transaction& transaction, - const std::string& uuid, - OrthancPluginContentType type) - { - void* buffer = NULL; - size_t size; - Read(buffer, size, transaction, uuid, type); - - try - { - content.resize(size); - } - catch (std::bad_alloc&) - { - if (size != 0) - { - free(buffer); - } - - throw Orthanc::OrthancException(Orthanc::ErrorCode_NotEnoughMemory); - } - - if (size != 0) - { - assert(buffer != NULL); - memcpy(&content[0], buffer, size); - } - - free(buffer); - } - - void StorageBackend::Create(DatabaseManager::Transaction& transaction, const std::string& uuid, const void* content, @@ -138,8 +83,7 @@ } - void StorageBackend::Read(void*& content, - size_t& size, + void StorageBackend::Read(StorageAreaBuffer& target, DatabaseManager::Transaction& transaction, const std::string& uuid, OrthancPluginContentType type) @@ -172,13 +116,11 @@ switch (value.GetType()) { case ValueType_File: - ReadFromString(content, size, - dynamic_cast<const FileValue&>(value).GetContent()); + target.Assign(dynamic_cast<const FileValue&>(value).GetContent()); break; case ValueType_BinaryString: - ReadFromString(content, size, - dynamic_cast<const BinaryStringValue&>(value).GetContent()); + target.Assign(dynamic_cast<const BinaryStringValue&>(value).GetContent()); break; default: @@ -235,11 +177,17 @@ { try { - DatabaseManager::Transaction transaction(backend_->GetManager()); - size_t tmp; - backend_->Read(*content, tmp, transaction, uuid, type); - *size = static_cast<int64_t>(tmp); - transaction.Commit(); + StorageAreaBuffer buffer; + + { + DatabaseManager::Transaction transaction(backend_->GetManager()); + backend_->Read(buffer, transaction, uuid, type); + transaction.Commit(); + } + + *size = buffer.GetSize(); + *content = buffer.ReleaseData(); + return OrthancPluginErrorCode_Success; } ORTHANC_PLUGINS_DATABASE_CATCH;