# HG changeset patch # User Alain Mazy # Date 1727364269 -7200 # Node ID 6667bd31beaf1ecf329ed6d841ca77bb5c73ad00 # Parent 77c8544bbd7df2374ea0bf28eff374ade0351d28 ReadOnly mode continued diff -r 77c8544bbd7d -r 6667bd31beaf PostgreSQL/Plugins/PostgreSQLIndex.cpp --- a/PostgreSQL/Plugins/PostgreSQLIndex.cpp Mon Sep 23 16:06:53 2024 +0200 +++ b/PostgreSQL/Plugins/PostgreSQLIndex.cpp Thu Sep 26 17:24:29 2024 +0200 @@ -43,6 +43,7 @@ static const GlobalProperty GlobalProperty_HasCreateInstance = GlobalProperty_DatabaseInternal1; static const GlobalProperty GlobalProperty_HasFastCountResources = GlobalProperty_DatabaseInternal2; static const GlobalProperty GlobalProperty_GetLastChangeIndex = GlobalProperty_DatabaseInternal3; + static const GlobalProperty GlobalProperty_HasComputeStatisticsReadOnly = GlobalProperty_DatabaseInternal4; } @@ -206,6 +207,15 @@ // apply all idempotent changes that are in the PrepareIndexV2 ApplyPrepareIndex(t, manager); } + + if (!LookupGlobalIntegerProperty(property, manager, MISSING_SERVER_IDENTIFIER, + Orthanc::GlobalProperty_HasComputeStatisticsReadOnly) || + property != 1) + { + // apply all idempotent changes that are in the PrepareIndex. In this case, we are just interested by + // ComputeStatisticsReadOnly() that does not need to be uninstalled in case of downgrade. + ApplyPrepareIndex(t, manager); + } } t.Commit(); @@ -243,7 +253,7 @@ { DatabaseManager::CachedStatement statement( STATEMENT_FROM_HERE, manager, - "SELECT * FROM UpdateSingleStatistic(0)"); + "SELECT * FROM ComputeStatisticsReadOnly(0)"); statement.Execute(); @@ -264,7 +274,7 @@ { DatabaseManager::CachedStatement statement( STATEMENT_FROM_HERE, manager, - "SELECT * FROM UpdateSingleStatistic(1)"); + "SELECT * FROM ComputeStatisticsReadOnly(1)"); statement.Execute(); @@ -648,7 +658,7 @@ { DatabaseManager::StandaloneStatement statement( manager, - std::string("SELECT * FROM UpdateSingleStatistic(") + boost::lexical_cast(resourceType + 2) + ")"); // For an explanation of the "+ 2" below, check out "PrepareIndex.sql" + std::string("SELECT * FROM ComputeStatisticsReadOnly(") + boost::lexical_cast(resourceType + 2) + ")"); // For an explanation of the "+ 2" below, check out "PrepareIndex.sql" statement.Execute(); diff -r 77c8544bbd7d -r 6667bd31beaf PostgreSQL/Plugins/SQL/PrepareIndex.sql --- a/PostgreSQL/Plugins/SQL/PrepareIndex.sql Mon Sep 23 16:06:53 2024 +0200 +++ b/PostgreSQL/Plugins/SQL/PrepareIndex.sql Thu Sep 26 17:24:29 2024 +0200 @@ -545,7 +545,28 @@ PERFORM PatientAddedOrUpdated(patient_internal_id, 1); END IF; END; +$body$ LANGUAGE plpgsql; +-- function to compute a statistic in a ReadOnly transaction +CREATE OR REPLACE FUNCTION ComputeStatisticsReadOnly( + IN statistics_key INTEGER, + OUT accumulated_value BIGINT +) RETURNS BIGINT AS $body$ + +DECLARE + current_value BIGINT; + +BEGIN + + SELECT VALUE from GlobalIntegers + INTO current_value + WHERE key = statistics_key; + + SELECT sum(value) + current_value FROM GlobalIntegersChanges + INTO accumulated_value + WHERE key = statistics_key; + +END; $body$ LANGUAGE plpgsql; @@ -559,3 +580,4 @@ INSERT INTO GlobalProperties VALUES (11, 3); -- GlobalProperty_HasCreateInstance -- this is actually the 3rd version of HasCreateInstance INSERT INTO GlobalProperties VALUES (12, 1); -- GlobalProperty_HasFastCountResources INSERT INTO GlobalProperties VALUES (13, 1); -- GlobalProperty_GetLastChangeIndex +INSERT INTO GlobalProperties VALUES (14, 1); -- GlobalProperty_HasComputeStatisticsReadOnly