# HG changeset patch # User Sebastien Jodogne # Date 1617706206 -7200 # Node ID 4e15eace9b907d1daa96811f0e120b7d1ba9ce99 # Parent 0a9b48d19643d6262739dee19f9486265e725030 reorganization in DatabaseBackendAdapterV3 diff -r 0a9b48d19643 -r 4e15eace9b90 Framework/Plugins/DatabaseBackendAdapterV3.cpp --- a/Framework/Plugins/DatabaseBackendAdapterV3.cpp Tue Apr 06 11:59:31 2021 +0200 +++ b/Framework/Plugins/DatabaseBackendAdapterV3.cpp Tue Apr 06 12:50:06 2021 +0200 @@ -61,10 +61,23 @@ class DatabaseBackendAdapterV3::Adapter : public boost::noncopyable { private: - std::unique_ptr backend_; + std::unique_ptr backend_; + OrthancPluginContext* context_; boost::mutex managerMutex_; std::unique_ptr manager_; + DatabaseManager& GetManager() const + { + if (manager_.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + return *manager_; + } + } + public: Adapter(IndexBackend* backend) : backend_(backend) @@ -73,11 +86,28 @@ { throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); } + else + { + context_ = backend_->GetContext(); + } + } + + OrthancPluginContext* GetContext() const + { + return context_; } - IndexBackend& GetBackend() const + uint32_t GetDatabaseVersion() { - return *backend_; + boost::mutex::scoped_lock lock(managerMutex_); + return backend_->GetDatabaseVersion(GetManager()); + } + + void UpgradeDatabase(OrthancPluginStorageArea* storageArea, + uint32_t targetVersion) + { + boost::mutex::scoped_lock lock(managerMutex_); + backend_->UpgradeDatabase(GetManager(), targetVersion, storageArea); } void OpenConnection() @@ -113,23 +143,25 @@ { private: boost::mutex::scoped_lock lock_; - DatabaseManager* manager_; + IndexBackend& backend_; + DatabaseManager& manager_; public: DatabaseAccessor(Adapter& adapter) : lock_(adapter.managerMutex_), - manager_(adapter.manager_.get()) + backend_(*adapter.backend_), + manager_(adapter.GetManager()) { - if (manager_ == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); - } + } + + IndexBackend& GetBackend() const + { + return backend_; } DatabaseManager& GetManager() const { - assert(manager_ != NULL); - return *manager_; + return manager_; } }; }; @@ -698,7 +730,7 @@ Adapter& adapter_; std::unique_ptr accessor_; std::unique_ptr output_; - + public: Transaction(Adapter& adapter) : adapter_(adapter), @@ -713,7 +745,7 @@ IndexBackend& GetBackend() const { - return adapter_.GetBackend(); + return accessor_->GetBackend(); } Output& GetOutput() const @@ -861,7 +893,7 @@ adapter->OpenConnection(); return OrthancPluginErrorCode_Success; } - ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); + ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext()); } @@ -874,7 +906,7 @@ adapter->CloseConnection(); return OrthancPluginErrorCode_Success; } - ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); + ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext()); } @@ -894,7 +926,7 @@ } else { - OrthancPluginLogError(adapter->GetBackend().GetContext(), "More than one index backend was registered, internal error"); + OrthancPluginLogError(adapter->GetContext(), "More than one index backend was registered, internal error"); } delete adapter; @@ -911,11 +943,10 @@ try { - DatabaseBackendAdapterV3::Adapter::DatabaseAccessor accessor(*adapter); - *version = adapter->GetBackend().GetDatabaseVersion(accessor.GetManager()); + *version = adapter->GetDatabaseVersion(); return OrthancPluginErrorCode_Success; } - ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); + ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext()); } @@ -927,11 +958,10 @@ try { - DatabaseBackendAdapterV3::Adapter::DatabaseAccessor accessor(*adapter); - adapter->GetBackend().UpgradeDatabase(accessor.GetManager(), targetVersion, storageArea); + adapter->UpgradeDatabase(storageArea, targetVersion); return OrthancPluginErrorCode_Success; } - ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); + ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext()); } @@ -963,7 +993,7 @@ return OrthancPluginErrorCode_Success; } - ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetBackend().GetContext()); + ORTHANC_PLUGINS_DATABASE_CATCH(adapter->GetContext()); } diff -r 0a9b48d19643 -r 4e15eace9b90 Framework/Plugins/IDatabaseBackendOutput.h --- a/Framework/Plugins/IDatabaseBackendOutput.h Tue Apr 06 11:59:31 2021 +0200 +++ b/Framework/Plugins/IDatabaseBackendOutput.h Tue Apr 06 12:50:06 2021 +0200 @@ -28,6 +28,12 @@ class IDatabaseBackendOutput : public boost::noncopyable { public: + /** + * Contrarily to its parent "IDatabaseBackendOutput" class, the + * "IFactory" subclass *can* be invoked from multiple threads if + * used through "DatabaseBackendAdapterV3". Make sure to implement + * proper locking if need be. + **/ class IFactory : public boost::noncopyable { public: diff -r 0a9b48d19643 -r 4e15eace9b90 Framework/Plugins/IndexBackend.cpp --- a/Framework/Plugins/IndexBackend.cpp Tue Apr 06 11:59:31 2021 +0200 +++ b/Framework/Plugins/IndexBackend.cpp Tue Apr 06 12:50:06 2021 +0200 @@ -318,6 +318,8 @@ void IndexBackend::SetOutputFactory(IDatabaseBackendOutput::IFactory* factory) { + boost::unique_lock lock(outputFactoryMutex_); + if (factory == NULL) { throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); @@ -335,6 +337,8 @@ IDatabaseBackendOutput* IndexBackend::CreateOutput() { + boost::shared_lock lock(outputFactoryMutex_); + if (outputFactory_.get() == NULL) { throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); diff -r 0a9b48d19643 -r 4e15eace9b90 Framework/Plugins/IndexBackend.h --- a/Framework/Plugins/IndexBackend.h Tue Apr 06 11:59:31 2021 +0200 +++ b/Framework/Plugins/IndexBackend.h Tue Apr 06 12:50:06 2021 +0200 @@ -25,9 +25,15 @@ #include +#include + namespace OrthancDatabases { + /** + * WARNING: This class can be invoked concurrently by several + * threads if it is used from "DatabaseBackendAdapterV3". + **/ class IndexBackend : public IDatabaseBackend { private: @@ -35,6 +41,7 @@ OrthancPluginContext* context_; + boost::shared_mutex outputFactoryMutex_; std::unique_ptr outputFactory_; protected: