# HG changeset patch # User Sebastien Jodogne # Date 1546609415 -3600 # Node ID 8dd29af7c844bf210c446715444e9c9a5909efc6 # Parent d40c5fecd16052b6f8564513a018109999a81308 new extension: FastTotalSize diff -r d40c5fecd160 -r 8dd29af7c844 PostgreSQL/CMakeLists.txt --- a/PostgreSQL/CMakeLists.txt Fri Jan 04 13:51:52 2019 +0100 +++ b/PostgreSQL/CMakeLists.txt Fri Jan 04 14:43:35 2019 +0100 @@ -54,6 +54,7 @@ EmbedResources( POSTGRESQL_PREPARE_INDEX ${CMAKE_SOURCE_DIR}/Plugins/PrepareIndex.sql POSTGRESQL_CREATE_INSTANCE ${CMAKE_SOURCE_DIR}/Plugins/CreateInstance.sql + POSTGRESQL_FAST_TOTAL_SIZE ${CMAKE_SOURCE_DIR}/Plugins/FastTotalSize.sql ) add_library(OrthancPostgreSQLIndex SHARED diff -r d40c5fecd160 -r 8dd29af7c844 PostgreSQL/Plugins/CreateInstance.sql --- a/PostgreSQL/Plugins/CreateInstance.sql Fri Jan 04 13:51:52 2019 +0100 +++ b/PostgreSQL/Plugins/CreateInstance.sql Fri Jan 04 14:43:35 2019 +0100 @@ -10,7 +10,8 @@ OUT patientKey BIGINT, OUT studyKey BIGINT, OUT seriesKey BIGINT, - OUT instanceKey BIGINT) AS $$ + OUT instanceKey BIGINT) AS $body$ + BEGIN SELECT internalId FROM Resources INTO instanceKey WHERE publicId = instance AND resourceType = 3; @@ -63,4 +64,5 @@ isNewInstance := 1; END IF; END; -$$ LANGUAGE plpgsql; + +$body$ LANGUAGE plpgsql; diff -r d40c5fecd160 -r 8dd29af7c844 PostgreSQL/Plugins/FastTotalSize.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PostgreSQL/Plugins/FastTotalSize.sql Fri Jan 04 14:43:35 2019 +0100 @@ -0,0 +1,41 @@ +CREATE TABLE GlobalIntegers( + key INTEGER PRIMARY KEY, + value BIGINT); + +INSERT INTO GlobalIntegers +SELECT 0, CAST(COALESCE(SUM(compressedSize), 0) AS BIGINT) FROM AttachedFiles; + +INSERT INTO GlobalIntegers +SELECT 1, CAST(COALESCE(SUM(uncompressedSize), 0) AS BIGINT) FROM AttachedFiles; + + + +CREATE FUNCTION AttachedFileIncrementSizeFunc() +RETURNS TRIGGER AS $body$ +BEGIN + UPDATE GlobalIntegers SET value = value + new.compressedSize WHERE key = 0; + UPDATE GlobalIntegers SET value = value + new.uncompressedSize WHERE key = 1; + RETURN NULL; +END; +$body$ LANGUAGE plpgsql; + +CREATE FUNCTION AttachedFileDecrementSizeFunc() +RETURNS TRIGGER AS $body$ +BEGIN + UPDATE GlobalIntegers SET value = value - old.compressedSize WHERE key = 0; + UPDATE GlobalIntegers SET value = value - old.uncompressedSize WHERE key = 1; + RETURN NULL; +END; +$body$ LANGUAGE plpgsql; + + + +CREATE TRIGGER AttachedFileIncrementSize +AFTER INSERT ON AttachedFiles +FOR EACH ROW +EXECUTE PROCEDURE AttachedFileIncrementSizeFunc(); + +CREATE TRIGGER AttachedFileDecrementSize +AFTER DELETE ON AttachedFiles +FOR EACH ROW +EXECUTE PROCEDURE AttachedFileDecrementSizeFunc(); diff -r d40c5fecd160 -r 8dd29af7c844 PostgreSQL/Plugins/PostgreSQLIndex.cpp --- a/PostgreSQL/Plugins/PostgreSQLIndex.cpp Fri Jan 04 13:51:52 2019 +0100 +++ b/PostgreSQL/Plugins/PostgreSQLIndex.cpp Fri Jan 04 14:43:35 2019 +0100 @@ -187,6 +187,27 @@ } } + { + PostgreSQLTransaction t(*db); + + int hasFastTotalSize = 0; + if (!LookupGlobalIntegerProperty(hasFastTotalSize, *db, t, + Orthanc::GlobalProperty_GetTotalSizeIsFast) || + hasFastTotalSize != 1) + { + LOG(INFO) << "Installing the FastTotalSize extension"; + + std::string query; + Orthanc::EmbeddedResources::GetFileResource + (query, Orthanc::EmbeddedResources::POSTGRESQL_FAST_TOTAL_SIZE); + db->Execute(query); + + SetGlobalIntegerProperty(*db, t, Orthanc::GlobalProperty_GetTotalSizeIsFast, 1); + + t.Commit(); + } + } + return db.release(); } @@ -220,6 +241,34 @@ } + uint64_t PostgreSQLIndex::GetTotalCompressedSize() + { + // Fast version if extension "./FastTotalSize.sql" is installed + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, GetManager(), + "SELECT value FROM GlobalIntegers WHERE key = 0"); + + statement.SetReadOnly(true); + statement.Execute(); + + return static_cast(ReadInteger64(statement, 0)); + } + + + uint64_t PostgreSQLIndex::GetTotalUncompressedSize() + { + // Fast version if extension "./FastTotalSize.sql" is installed + DatabaseManager::CachedStatement statement( + STATEMENT_FROM_HERE, GetManager(), + "SELECT value FROM GlobalIntegers WHERE key = 1"); + + statement.SetReadOnly(true); + statement.Execute(); + + return static_cast(ReadInteger64(statement, 0)); + } + + void PostgreSQLIndex::CreateInstance(OrthancPluginCreateInstanceResult& result, const char* hashPatient, const char* hashStudy, diff -r d40c5fecd160 -r 8dd29af7c844 PostgreSQL/Plugins/PostgreSQLIndex.h --- a/PostgreSQL/Plugins/PostgreSQLIndex.h Fri Jan 04 13:51:52 2019 +0100 +++ b/PostgreSQL/Plugins/PostgreSQLIndex.h Fri Jan 04 14:43:35 2019 +0100 @@ -71,9 +71,14 @@ } virtual int64_t CreateResource(const char* publicId, - OrthancPluginResourceType type); + OrthancPluginResourceType type) + ORTHANC_OVERRIDE; - virtual bool HasCreateInstance() const + virtual uint64_t GetTotalCompressedSize() ORTHANC_OVERRIDE; + + virtual uint64_t GetTotalUncompressedSize() ORTHANC_OVERRIDE; + + virtual bool HasCreateInstance() const ORTHANC_OVERRIDE { return true; } @@ -83,7 +88,8 @@ const char* hashPatient, const char* hashStudy, const char* hashSeries, - const char* hashInstance); + const char* hashInstance) + ORTHANC_OVERRIDE; #endif }; }