Mercurial > hg > orthanc-databases
diff Framework/Plugins/StorageBackend.cpp @ 1:d17b2631bb67
starting StorageBackend
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 04 Jul 2018 18:05:24 +0200 |
parents | |
children | 41543239072d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Framework/Plugins/StorageBackend.cpp Wed Jul 04 18:05:24 2018 +0200 @@ -0,0 +1,133 @@ +/** + * Orthanc - A Lightweight, RESTful DICOM Store + * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics + * Department, University Hospital of Liege, Belgium + * Copyright (C) 2017-2018 Osimis S.A., Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + **/ + + +#include "StorageBackend.h" + +#if HAS_ORTHANC_EXCEPTION != 1 +# error HAS_ORTHANC_EXCEPTION must be set to 1 +#endif + +#include <Core/OrthancException.h> + + +#define ORTHANC_PLUGINS_DATABASE_CATCH \ + catch (::Orthanc::OrthancException& e) \ + { \ + return static_cast<OrthancPluginErrorCode>(e.GetErrorCode()); \ + } \ + catch (::std::runtime_error& e) \ + { \ + std::string s = "Exception in storage area back-end: " + std::string(e.what()); \ + OrthancPluginLogError(context_, s.c_str()); \ + return OrthancPluginErrorCode_DatabasePlugin; \ + } \ + catch (...) \ + { \ + OrthancPluginLogError(context_, "Native exception"); \ + return OrthancPluginErrorCode_DatabasePlugin; \ + } + + +namespace OrthancDatabases +{ + StorageBackend::StorageBackend(IDatabaseFactory* factory) : + manager_(factory) + { + } + + + + static OrthancPluginContext* context_ = NULL; + static std::auto_ptr<StorageBackend> backend_; + + static OrthancPluginErrorCode StorageCreate(const char* uuid, + const void* content, + int64_t size, + OrthancPluginContentType type) + { + try + { + backend_->Create(uuid, content, static_cast<size_t>(size), type); + return OrthancPluginErrorCode_Success; + } + ORTHANC_PLUGINS_DATABASE_CATCH; + } + + + static OrthancPluginErrorCode StorageRead(void** content, + int64_t* size, + const char* uuid, + OrthancPluginContentType type) + { + try + { + size_t tmp; + backend_->Read(*content, tmp, uuid, type); + *size = static_cast<int64_t>(tmp); + return OrthancPluginErrorCode_Success; + } + ORTHANC_PLUGINS_DATABASE_CATCH; + } + + + static OrthancPluginErrorCode StorageRemove(const char* uuid, + OrthancPluginContentType type) + { + try + { + backend_->Remove(uuid, type); + return OrthancPluginErrorCode_Success; + } + ORTHANC_PLUGINS_DATABASE_CATCH; + } + + + void StorageBackend::Register(OrthancPluginContext* context, + StorageBackend* backend) + { + if (context == NULL || + backend == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); + } + + if (context_ != NULL || + backend_.get() != NULL) + { + // This function can only be invoked once in the plugin + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } + else + { + context_ = context; + backend_.reset(backend); + + OrthancPluginRegisterStorageArea(context_, StorageCreate, StorageRead, StorageRemove); + } + } + + + void StorageBackend::Finalize() + { + backend_.reset(NULL); + context_ = NULL; + } +}