Mercurial > hg > orthanc-databases
diff Framework/Plugins/StorageBackend.h @ 242:b97a537f4613
MySQL: Support of range reads for the storage area
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 13 Apr 2021 17:00:02 +0200 |
parents | 0a9b48d19643 |
children | 483af3f35a4b |
line wrap: on
line diff
--- a/Framework/Plugins/StorageBackend.h Tue Apr 13 12:07:30 2021 +0200 +++ b/Framework/Plugins/StorageBackend.h Tue Apr 13 17:00:02 2021 +0200 @@ -32,15 +32,6 @@ { class StorageBackend : public boost::noncopyable { - private: - boost::mutex mutex_; - std::unique_ptr<DatabaseManager> manager_; - - DatabaseManager& GetManager(); - - protected: - void SetDatabase(IDatabase* database); // Takes ownership - public: class IFileContentVisitor : public boost::noncopyable { @@ -54,44 +45,109 @@ virtual bool IsSuccess() const = 0; }; - class Accessor : public boost::noncopyable + class IAccessor : public boost::noncopyable + { + public: + virtual ~IAccessor() + { + } + + virtual void Create(const std::string& uuid, + const void* content, + size_t size, + OrthancPluginContentType type) = 0; + + virtual void ReadWhole(IFileContentVisitor& visitor, + const std::string& uuid, + OrthancPluginContentType type) = 0; + + virtual void ReadRange(IFileContentVisitor& visitor, + const std::string& uuid, + OrthancPluginContentType type, + uint64_t start, + uint64_t length) = 0; + + virtual void Remove(const std::string& uuid, + OrthancPluginContentType type) = 0; + }; + + private: + class StringVisitor; + + boost::mutex mutex_; + std::unique_ptr<DatabaseManager> manager_; + + DatabaseManager& GetManager(); + + protected: + class AccessorBase : public IAccessor { private: boost::mutex::scoped_lock lock_; DatabaseManager& manager_; public: - Accessor(StorageBackend& backend) : + AccessorBase(StorageBackend& backend) : lock_(backend.mutex_), manager_(backend.GetManager()) { } - - void Create(const std::string& uuid, - const void* content, - size_t size, - OrthancPluginContentType type); + + DatabaseManager& GetManager() const + { + return manager_; + } + + virtual void Create(const std::string& uuid, + const void* content, + size_t size, + OrthancPluginContentType type); - void Read(IFileContentVisitor& visitor, - const std::string& uuid, - OrthancPluginContentType type); + virtual void ReadWhole(IFileContentVisitor& visitor, + const std::string& uuid, + OrthancPluginContentType type); - void Remove(const std::string& uuid, - OrthancPluginContentType type); - - // For unit tests - void ReadToString(std::string& target, - const std::string& uuid, - OrthancPluginContentType type); + virtual void ReadRange(IFileContentVisitor& visitor, + const std::string& uuid, + OrthancPluginContentType type, + uint64_t start, + uint64_t length); + + virtual void Remove(const std::string& uuid, + OrthancPluginContentType type); }; + void SetDatabase(IDatabase* database); // Takes ownership + + virtual bool HasReadRange() const = 0; + + public: virtual ~StorageBackend() { } + virtual IAccessor* CreateAccessor() + { + return new AccessorBase(*this); + } + static void Register(OrthancPluginContext* context, StorageBackend* backend); // Takes ownership static void Finalize(); + + // For unit tests + static void ReadWholeToString(std::string& target, + IAccessor& accessor, + const std::string& uuid, + OrthancPluginContentType type); + + // For unit tests + static void ReadRangeToString(std::string& target, + IAccessor& accessor, + const std::string& uuid, + OrthancPluginContentType type, + uint64_t start, + uint64_t length); }; }