Mercurial > hg > orthanc-databases
diff Framework/Plugins/StorageBackend.cpp @ 230:675f8322eb7c
refactored StorageBackend by introducing an accessor class
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 06 Apr 2021 11:17:00 +0200 |
parents | a4918d57435c |
children | 0a9b48d19643 |
line wrap: on
line diff
--- a/Framework/Plugins/StorageBackend.cpp Sat Apr 03 18:56:14 2021 +0200 +++ b/Framework/Plugins/StorageBackend.cpp Tue Apr 06 11:17:00 2021 +0200 @@ -84,92 +84,112 @@ } - void StorageBackend::Create(DatabaseManager::Transaction& transaction, - const std::string& uuid, - const void* content, - size_t size, - OrthancPluginContentType type) + void StorageBackend::Accessor::Create(const std::string& uuid, + const void* content, + size_t size, + OrthancPluginContentType type) { - DatabaseManager::CachedStatement statement( - STATEMENT_FROM_HERE, GetManager(), - "INSERT INTO StorageArea VALUES (${uuid}, ${content}, ${type})"); + DatabaseManager::Transaction transaction(manager_, TransactionType_ReadWrite); + + { + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, manager_, + "INSERT INTO StorageArea VALUES (${uuid}, ${content}, ${type})"); - statement.SetParameterType("uuid", ValueType_Utf8String); - statement.SetParameterType("content", ValueType_File); - statement.SetParameterType("type", ValueType_Integer64); + statement.SetParameterType("uuid", ValueType_Utf8String); + statement.SetParameterType("content", ValueType_File); + statement.SetParameterType("type", ValueType_Integer64); - Dictionary args; - args.SetUtf8Value("uuid", uuid); - args.SetFileValue("content", content, size); - args.SetIntegerValue("type", type); + Dictionary args; + args.SetUtf8Value("uuid", uuid); + args.SetFileValue("content", content, size); + args.SetIntegerValue("type", type); - statement.Execute(args); + statement.Execute(args); + } + + transaction.Commit(); } - void StorageBackend::Read(StorageBackend::IFileContentVisitor& target, - DatabaseManager::Transaction& transaction, - const std::string& uuid, - OrthancPluginContentType type) + void StorageBackend::Accessor::Read(StorageBackend::IFileContentVisitor& visitor, + const std::string& uuid, + OrthancPluginContentType type) { - DatabaseManager::CachedStatement statement( - STATEMENT_FROM_HERE, GetManager(), - "SELECT content FROM StorageArea WHERE uuid=${uuid} AND type=${type}"); + DatabaseManager::Transaction transaction(manager_, TransactionType_ReadOnly); + + { + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, manager_, + "SELECT content FROM StorageArea WHERE uuid=${uuid} AND type=${type}"); + + statement.SetParameterType("uuid", ValueType_Utf8String); + statement.SetParameterType("type", ValueType_Integer64); + + Dictionary args; + args.SetUtf8Value("uuid", uuid); + args.SetIntegerValue("type", type); - statement.SetParameterType("uuid", ValueType_Utf8String); - statement.SetParameterType("type", ValueType_Integer64); + statement.Execute(args); - Dictionary args; - args.SetUtf8Value("uuid", uuid); - args.SetIntegerValue("type", type); - - statement.Execute(args); + if (statement.IsDone()) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); + } + else if (statement.GetResultFieldsCount() != 1) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); + } + else + { + const IValue& value = statement.GetResultField(0); + + switch (value.GetType()) + { + case ValueType_File: + visitor.Assign(dynamic_cast<const FileValue&>(value).GetContent()); + break; - if (statement.IsDone()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); + case ValueType_BinaryString: + visitor.Assign(dynamic_cast<const BinaryStringValue&>(value).GetContent()); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); + } + } } - else if (statement.GetResultFieldsCount() != 1) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); - } - else + + transaction.Commit(); + + if (!visitor.IsSuccess()) { - const IValue& value = statement.GetResultField(0); - - switch (value.GetType()) - { - case ValueType_File: - target.Assign(dynamic_cast<const FileValue&>(value).GetContent()); - break; - - case ValueType_BinaryString: - target.Assign(dynamic_cast<const BinaryStringValue&>(value).GetContent()); - break; - - default: - throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); - } + throw Orthanc::OrthancException(Orthanc::ErrorCode_Database, "Could not read attachment from the storage area"); } } - void StorageBackend::Remove(DatabaseManager::Transaction& transaction, - const std::string& uuid, - OrthancPluginContentType type) + void StorageBackend::Accessor::Remove(const std::string& uuid, + OrthancPluginContentType type) { - DatabaseManager::CachedStatement statement( - STATEMENT_FROM_HERE, GetManager(), - "DELETE FROM StorageArea WHERE uuid=${uuid} AND type=${type}"); + DatabaseManager::Transaction transaction(manager_, TransactionType_ReadWrite); + + { + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, manager_, + "DELETE FROM StorageArea WHERE uuid=${uuid} AND type=${type}"); - statement.SetParameterType("uuid", ValueType_Utf8String); - statement.SetParameterType("type", ValueType_Integer64); + statement.SetParameterType("uuid", ValueType_Utf8String); + statement.SetParameterType("type", ValueType_Integer64); - Dictionary args; - args.SetUtf8Value("uuid", uuid); - args.SetIntegerValue("type", type); + Dictionary args; + args.SetUtf8Value("uuid", uuid); + args.SetIntegerValue("type", type); - statement.Execute(args); + statement.Execute(args); + } + + transaction.Commit(); } @@ -189,11 +209,12 @@ { throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); } - - DatabaseManager::Transaction transaction(backend_->GetManager(), TransactionType_ReadWrite); - backend_->Create(transaction, uuid, content, static_cast<size_t>(size), type); - transaction.Commit(); - return OrthancPluginErrorCode_Success; + else + { + StorageBackend::Accessor accessor(*backend_); + accessor.Create(uuid, content, static_cast<size_t>(size), type); + return OrthancPluginErrorCode_Success; + } } ORTHANC_PLUGINS_DATABASE_CATCH; } @@ -217,7 +238,7 @@ { } - bool IsSuccess() const + virtual bool IsSuccess() const ORTHANC_OVERRIDE { return success_; } @@ -254,27 +275,21 @@ { throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); } - - if (target == NULL) + else if (target == NULL) { throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); } - - Visitor visitor(target); - + else { - DatabaseManager::Transaction transaction(backend_->GetManager(), TransactionType_ReadOnly); - backend_->Read(visitor, transaction, uuid, type); + Visitor visitor(target); - if (!visitor.IsSuccess()) { - throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); + StorageBackend::Accessor accessor(*backend_); + accessor.Read(visitor, uuid, type); } - - transaction.Commit(); + + return OrthancPluginErrorCode_Success; } - - return OrthancPluginErrorCode_Success; } ORTHANC_PLUGINS_DATABASE_CATCH; } @@ -302,7 +317,7 @@ { } - bool IsSuccess() const + virtual bool IsSuccess() const ORTHANC_OVERRIDE { return success_; } @@ -351,28 +366,22 @@ { throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); } - - if (data == NULL || - size == NULL) + else if (data == NULL || + size == NULL) { throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); } - - Visitor visitor(data, size); - + else { - DatabaseManager::Transaction transaction(backend_->GetManager(), TransactionType_ReadOnly); - backend_->Read(visitor, transaction, uuid, type); + Visitor visitor(data, size); - if (!visitor.IsSuccess()) { - throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); - } - - transaction.Commit(); + StorageBackend::Accessor accessor(*backend_); + accessor.Read(visitor, uuid, type); + } + + return OrthancPluginErrorCode_Success; } - - return OrthancPluginErrorCode_Success; } ORTHANC_PLUGINS_DATABASE_CATCH; } @@ -383,10 +392,16 @@ { try { - DatabaseManager::Transaction transaction(backend_->GetManager(), TransactionType_ReadWrite); - backend_->Remove(transaction, uuid, type); - transaction.Commit(); - return OrthancPluginErrorCode_Success; + if (backend_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + StorageBackend::Accessor accessor(*backend_); + accessor.Remove(uuid, type); + return OrthancPluginErrorCode_Success; + } } ORTHANC_PLUGINS_DATABASE_CATCH; } @@ -440,10 +455,9 @@ } - void StorageBackend::ReadToString(std::string& target, - DatabaseManager::Transaction& transaction, - const std::string& uuid, - OrthancPluginContentType type) + void StorageBackend::Accessor::ReadToString(std::string& target, + const std::string& uuid, + OrthancPluginContentType type) { class Visitor : public StorageBackend::IFileContentVisitor { @@ -458,7 +472,7 @@ { } - bool IsSuccess() const + virtual bool IsSuccess() const ORTHANC_OVERRIDE { return success_; } @@ -479,12 +493,6 @@ Visitor visitor(target); - - Read(visitor, transaction, uuid, type); - - if (!visitor.IsSuccess()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); - } + Read(visitor, uuid, type); } }