Mercurial > hg > orthanc
diff OrthancServer/Sources/ServerIndex.h @ 4587:888868a5dc4e db-changes
ServerIndex now uses StatelessDatabaseOperations
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 10 Mar 2021 15:59:03 +0100 |
parents | f0bdd99f3d81 |
children | 4a0bf1019335 |
line wrap: on
line diff
--- a/OrthancServer/Sources/ServerIndex.h Tue Mar 09 18:24:59 2021 +0100 +++ b/OrthancServer/Sources/ServerIndex.h Wed Mar 10 15:59:03 2021 +0100 @@ -33,47 +33,32 @@ #pragma once +#include "Database/StatelessDatabaseOperations.h" #include "../../OrthancFramework/Sources/Cache/LeastRecentlyUsedIndex.h" -#include "../../OrthancFramework/Sources/DicomFormat/DicomMap.h" - -#include "Database/IDatabaseWrapper.h" -#include "DicomInstanceOrigin.h" #include <boost/thread.hpp> -#include <boost/noncopyable.hpp> namespace Orthanc { - class DatabaseLookup; - class ParsedDicomFile; class ServerContext; - - class ServerIndex : public boost::noncopyable + + class ServerIndex : public StatelessDatabaseOperations { - public: - typedef std::list<FileInfo> Attachments; - typedef std::map<std::pair<ResourceType, MetadataType>, std::string> MetadataMap; - private: class TransactionContextFactory; class Listener; - class Transaction; class UnstableResourcePayload; - class MainDicomTagsRegistry; bool done_; boost::mutex monitoringMutex_; - boost::mutex databaseMutex_; // TODO - REMOVE boost::thread flushThread_; boost::thread unstableResourcesMonitorThread_; std::unique_ptr<Listener> listener_; - IDatabaseWrapper& db_; LeastRecentlyUsedIndex<int64_t, UnstableResourcePayload> unstableResources_; uint64_t maximumStorageSize_; unsigned int maximumPatients_; - std::unique_ptr<MainDicomTagsRegistry> mainDicomTagsRegistry_; static void FlushThread(ServerIndex* that, unsigned int threadSleep); @@ -81,17 +66,10 @@ static void UnstableResourcesMonitorThread(ServerIndex* that, unsigned int threadSleep); - void StandaloneRecycling(uint64_t maximumStorageSize, - unsigned int maximumPatientCount); - void MarkAsUnstable(int64_t id, Orthanc::ResourceType type, const std::string& publicId); - void NormalizeLookup(std::vector<DatabaseConstraint>& target, - const DatabaseLookup& source, - ResourceType level) const; - bool IsUnstableResource(int64_t id); public: @@ -109,516 +87,6 @@ // "count == 0" means no limit on the number of patients void SetMaximumPatientCount(unsigned int count); - // It is assumed that "GetDatabaseVersion()" can run out of a - // database transaction - unsigned int GetDatabaseVersion() - { - return db_.GetDatabaseVersion(); - } - - - - /*** - ** PROTOTYPING FOR DB REFACTORING BELOW - ***/ - - public: - class ITransactionContext : public boost::noncopyable - { - public: - virtual ~ITransactionContext() - { - } - - virtual bool IsUnstableResource(int64_t id) = 0; - - virtual bool LookupRemainingLevel(std::string& remainingPublicId /* out */, - ResourceType& remainingLevel /* out */) = 0; - - virtual void MarkAsUnstable(int64_t id, - Orthanc::ResourceType type, - const std::string& publicId) = 0; - - virtual void SignalAttachmentsAdded(uint64_t compressedSize) = 0; - - virtual void SignalChange(const ServerIndexChange& change) = 0; - }; - - - class ITransactionContextFactory : public boost::noncopyable - { - public: - virtual ~ITransactionContextFactory() - { - } - - virtual ITransactionContext* Create() = 0; - }; - - - class ReadOnlyTransaction : public boost::noncopyable - { - private: - ITransactionContext& context_; - - protected: - IDatabaseWrapper& db_; - - public: - explicit ReadOnlyTransaction(IDatabaseWrapper& db, - ITransactionContext& context) : - context_(context), - db_(db) - { - } - - ITransactionContext& GetTransactionContext() - { - return context_; - } - - /** - * Higher-level constructions - **/ - - SeriesStatus GetSeriesStatus(int64_t id, - int64_t expectedNumberOfInstances); - - void MainDicomTagsToJson(Json::Value& result, - int64_t resourceId, - ResourceType resourceType); - - /** - * Read-only methods from "IDatabaseWrapper" - **/ - - void ApplyLookupResources(std::list<std::string>& resourcesId, - std::list<std::string>* instancesId, // Can be NULL if not needed - const std::vector<DatabaseConstraint>& lookup, - ResourceType queryLevel, - size_t limit) - { - return db_.ApplyLookupResources(resourcesId, instancesId, lookup, queryLevel, limit); - } - - void GetAllMetadata(std::map<MetadataType, std::string>& target, - int64_t id) - { - db_.GetAllMetadata(target, id); - } - - void GetAllPublicIds(std::list<std::string>& target, - ResourceType resourceType) - { - return db_.GetAllPublicIds(target, resourceType); - } - - void GetAllPublicIds(std::list<std::string>& target, - ResourceType resourceType, - size_t since, - size_t limit) - { - return db_.GetAllPublicIds(target, resourceType, since, limit); - } - - void GetChanges(std::list<ServerIndexChange>& target /*out*/, - bool& done /*out*/, - int64_t since, - uint32_t maxResults) - { - db_.GetChanges(target, done, since, maxResults); - } - - void GetChildrenInternalId(std::list<int64_t>& target, - int64_t id) - { - db_.GetChildrenInternalId(target, id); - } - - void GetChildrenPublicId(std::list<std::string>& target, - int64_t id) - { - db_.GetChildrenPublicId(target, id); - } - - void GetExportedResources(std::list<ExportedResource>& target /*out*/, - bool& done /*out*/, - int64_t since, - uint32_t maxResults) - { - return db_.GetExportedResources(target, done, since, maxResults); - } - - void GetLastChange(std::list<ServerIndexChange>& target /*out*/) - { - db_.GetLastChange(target); - } - - void GetLastExportedResource(std::list<ExportedResource>& target /*out*/) - { - return db_.GetLastExportedResource(target); - } - - int64_t GetLastChangeIndex() - { - return db_.GetLastChangeIndex(); - } - - void GetMainDicomTags(DicomMap& map, - int64_t id) - { - db_.GetMainDicomTags(map, id); - } - - std::string GetPublicId(int64_t resourceId) - { - return db_.GetPublicId(resourceId); - } - - uint64_t GetResourceCount(ResourceType resourceType) - { - return db_.GetResourceCount(resourceType); - } - - ResourceType GetResourceType(int64_t resourceId) - { - return db_.GetResourceType(resourceId); - } - - uint64_t GetTotalCompressedSize() - { - return db_.GetTotalCompressedSize(); - } - - uint64_t GetTotalUncompressedSize() - { - return db_.GetTotalUncompressedSize(); - } - - bool IsProtectedPatient(int64_t internalId) - { - return db_.IsProtectedPatient(internalId); - } - - void ListAvailableAttachments(std::set<FileContentType>& target, - int64_t id) - { - db_.ListAvailableAttachments(target, id); - } - - bool LookupAttachment(FileInfo& attachment, - int64_t id, - FileContentType contentType) - { - return db_.LookupAttachment(attachment, id, contentType); - } - - bool LookupGlobalProperty(std::string& target, - GlobalProperty property) - { - return db_.LookupGlobalProperty(target, property); - } - - bool LookupMetadata(std::string& target, - int64_t id, - MetadataType type) - { - return db_.LookupMetadata(target, id, type); - } - - bool LookupParent(int64_t& parentId, - int64_t resourceId) - { - return db_.LookupParent(parentId, resourceId); - } - - bool LookupResource(int64_t& id, - ResourceType& type, - const std::string& publicId) - { - return db_.LookupResource(id, type, publicId); - } - - bool LookupResourceAndParent(int64_t& id, - ResourceType& type, - std::string& parentPublicId, - const std::string& publicId) - { - return db_.LookupResourceAndParent(id, type, parentPublicId, publicId); - } - }; - - - class ReadWriteTransaction : public ReadOnlyTransaction - { - public: - ReadWriteTransaction(IDatabaseWrapper& db, - ITransactionContext& context) : - ReadOnlyTransaction(db, context) - { - } - - void AddAttachment(int64_t id, - const FileInfo& attachment) - { - db_.AddAttachment(id, attachment); - } - - void ClearChanges() - { - db_.ClearChanges(); - } - - void ClearExportedResources() - { - db_.ClearExportedResources(); - } - - void ClearMainDicomTags(int64_t id) - { - return db_.ClearMainDicomTags(id); - } - - bool CreateInstance(IDatabaseWrapper::CreateInstanceResult& result, /* out */ - int64_t& instanceId, /* out */ - const std::string& patient, - const std::string& study, - const std::string& series, - const std::string& instance) - { - return db_.CreateInstance(result, instanceId, patient, study, series, instance); - } - - void DeleteAttachment(int64_t id, - FileContentType attachment) - { - return db_.DeleteAttachment(id, attachment); - } - - void DeleteMetadata(int64_t id, - MetadataType type) - { - db_.DeleteMetadata(id, type); - } - - void DeleteResource(int64_t id) - { - db_.DeleteResource(id); - } - - void LogChange(int64_t internalId, - ChangeType changeType, - ResourceType resourceType, - const std::string& publicId); - - void LogExportedResource(const ExportedResource& resource) - { - db_.LogExportedResource(resource); - } - - void SetGlobalProperty(GlobalProperty property, - const std::string& value) - { - db_.SetGlobalProperty(property, value); - } - - void SetMetadata(int64_t id, - MetadataType type, - const std::string& value) - { - return db_.SetMetadata(id, type, value); - } - - void SetProtectedPatient(int64_t internalId, - bool isProtected) - { - db_.SetProtectedPatient(internalId, isProtected); - } - - void SetResourcesContent(const ResourcesContent& content) - { - db_.SetResourcesContent(content); - } - - void Recycle(uint64_t maximumStorageSize, - unsigned int maximumPatients, - uint64_t addedInstanceSize, - const std::string& newPatientId); - }; - - - class IReadOnlyOperations : public boost::noncopyable - { - public: - virtual ~IReadOnlyOperations() - { - } - - virtual void Apply(ReadOnlyTransaction& transaction) = 0; - }; - - - class IReadWriteOperations : public boost::noncopyable - { - public: - virtual ~IReadWriteOperations() - { - } - - virtual void Apply(ReadWriteTransaction& transaction) = 0; - }; - - private: - void ApplyInternal(IReadOnlyOperations* readOperations, - IReadWriteOperations* writeOperations); - - std::unique_ptr<ITransactionContextFactory> factory_; - unsigned int maxRetries_; - - public: - void SetTransactionContextFactory(ITransactionContextFactory* factory /* takes ownership */); - - void Apply(IReadOnlyOperations& operations); - - void Apply(IReadWriteOperations& operations); - - bool ExpandResource(Json::Value& target, - const std::string& publicId, - ResourceType level); - - void GetAllMetadata(std::map<MetadataType, std::string>& target, - const std::string& publicId, - ResourceType level); - - void GetAllUuids(std::list<std::string>& target, - ResourceType resourceType); - - void GetAllUuids(std::list<std::string>& target, - ResourceType resourceType, - size_t since, - size_t limit); - - void GetGlobalStatistics(/* out */ uint64_t& diskSize, - /* out */ uint64_t& uncompressedSize, - /* out */ uint64_t& countPatients, - /* out */ uint64_t& countStudies, - /* out */ uint64_t& countSeries, - /* out */ uint64_t& countInstances); - - bool LookupAttachment(FileInfo& attachment, - const std::string& instancePublicId, - FileContentType contentType); - - void GetChanges(Json::Value& target, - int64_t since, - unsigned int maxResults); - - void GetLastChange(Json::Value& target); - - void GetExportedResources(Json::Value& target, - int64_t since, - unsigned int maxResults); - - void GetLastExportedResource(Json::Value& target); - - bool IsProtectedPatient(const std::string& publicId); - - void GetChildren(std::list<std::string>& result, - const std::string& publicId); - - void GetChildInstances(std::list<std::string>& result, - const std::string& publicId); - - bool LookupMetadata(std::string& target, - const std::string& publicId, - ResourceType expectedType, - MetadataType type); - - void ListAvailableAttachments(std::set<FileContentType>& target, - const std::string& publicId, - ResourceType expectedType); - - bool LookupParent(std::string& target, - const std::string& publicId); - - void GetResourceStatistics(/* out */ ResourceType& type, - /* out */ uint64_t& diskSize, - /* out */ uint64_t& uncompressedSize, - /* out */ unsigned int& countStudies, - /* out */ unsigned int& countSeries, - /* out */ unsigned int& countInstances, - /* out */ uint64_t& dicomDiskSize, - /* out */ uint64_t& dicomUncompressedSize, - const std::string& publicId); - - void LookupIdentifierExact(std::vector<std::string>& result, - ResourceType level, - const DicomTag& tag, - const std::string& value); - - bool LookupGlobalProperty(std::string& value, - GlobalProperty property); - - std::string GetGlobalProperty(GlobalProperty property, - const std::string& defaultValue); - - bool GetMainDicomTags(DicomMap& result, - const std::string& publicId, - ResourceType expectedType, - ResourceType levelOfInterest); - - // Only applicable at the instance level - bool GetAllMainDicomTags(DicomMap& result, - const std::string& instancePublicId); - - bool LookupResourceType(ResourceType& type, - const std::string& publicId); - - bool LookupParent(std::string& target, - const std::string& publicId, - ResourceType parentType); - - void ApplyLookupResources(std::vector<std::string>& resourcesId, - std::vector<std::string>* instancesId, // Can be NULL if not needed - const DatabaseLookup& lookup, - ResourceType queryLevel, - size_t limit); - - bool DeleteResource(Json::Value& target /* out */, - const std::string& uuid, - ResourceType expectedType); - - void LogExportedResource(const std::string& publicId, - const std::string& remoteModality); - - void SetProtectedPatient(const std::string& publicId, - bool isProtected); - - void SetMetadata(const std::string& publicId, - MetadataType type, - const std::string& value); - - void DeleteMetadata(const std::string& publicId, - MetadataType type); - - uint64_t IncrementGlobalSequence(GlobalProperty sequence); - - void DeleteChanges(); - - void DeleteExportedResources(); - - void SetGlobalProperty(GlobalProperty property, - const std::string& value); - - void DeleteAttachment(const std::string& publicId, - FileContentType type); - - void LogChange(ChangeType changeType, - const std::string& publicId, - ResourceType level); - - void ReconstructInstance(const ParsedDicomFile& dicom); - StoreStatus Store(std::map<MetadataType, std::string>& instanceMetadata, const DicomMap& dicomSummary, const Attachments& attachments,