# HG changeset patch # User Alain Mazy # Date 1748435858 -7200 # Node ID f0b43129cc086bbf68e1c72f607c25f91ebc7dbb # Parent 88d016b2a1170fe7aaee84a7d3265d204124a5f8 make DequeuValue more atomic diff -r 88d016b2a117 -r f0b43129cc08 Framework/Plugins/IndexBackend.cpp --- a/Framework/Plugins/IndexBackend.cpp Mon May 26 10:18:08 2025 +0200 +++ b/Framework/Plugins/IndexBackend.cpp Wed May 28 14:37:38 2025 +0200 @@ -4526,13 +4526,15 @@ { statement.reset(new DatabaseManager::CachedStatement( STATEMENT_FROM_HERE, manager, - "SELECT id, value FROM Queues WHERE queueId= " + queueIdParameter + " ORDER BY id ASC " + formatter.FormatLimits(0, 1))); + "WITH poppedRows AS (DELETE FROM Queues WHERE id = (SELECT MIN(id) FROM Queues WHERE queueId=" + queueIdParameter + ") RETURNING value) " + "SELECT value FROM poppedRows")); } else { statement.reset(new DatabaseManager::CachedStatement( STATEMENT_FROM_HERE, manager, - "SELECT id, value FROM Queues WHERE queueId= " + queueIdParameter + " ORDER BY id DESC " + formatter.FormatLimits(0, 1))); + "WITH poppedRows AS (DELETE FROM Queues WHERE id = (SELECT MAX(id) FROM Queues WHERE queueId=" + queueIdParameter + ") RETURNING value) " + "SELECT value FROM poppedRows")); } statement->Execute(formatter.GetDictionary()); @@ -4543,27 +4545,8 @@ } else { - if (statement->GetResultFieldsCount() != 2) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } - - statement->SetResultFieldType(0, ValueType_Integer64); - statement->SetResultFieldType(1, ValueType_Utf8String); - - int64_t id = statement->ReadInteger64(0); - value = statement->ReadString(1); - - DatabaseManager::CachedStatement statement2( - STATEMENT_FROM_HERE, manager, - "DELETE FROM Queues WHERE id = ${id}"); - - Dictionary args; - - statement2.SetParameterType("id", ValueType_Integer64); - args.SetIntegerValue("id", id); - - statement2.Execute(args); + statement->SetResultFieldType(0, ValueType_Utf8String); + value = statement->ReadString(0); return true; }