diff --git a/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs b/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs index 1394e18..b03a29d 100644 --- a/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs +++ b/src/SQLInsight.Repository/InsightRepository.InstanceConfiguration.cs @@ -307,15 +307,27 @@ public sealed partial class InsightRepository return unknown; } - /// Queues a request for the agent (SQLInsight Web: INSERT only). + /// + /// Queues a request for the agent (SQLInsight Web: INSERT only). The same request still waiting for the agent is + /// returned instead of a new one, so pressing the button again (or a script in a loop) does not grow the queue. + /// public async Task AddAgentRequestAsync(string kind, int? configuredInstanceId, string? parameters, string? by, DateTimeOffset now, CancellationToken cancellationToken = default) { await using var connection = await OpenAsync(cancellationToken).ConfigureAwait(false); return await connection.ExecuteScalarAsync(""" - INSERT insight.AgentRequests (Kind, ConfiguredInstanceId, Parameters, Status, RequestedBy, RequestedAt) - OUTPUT INSERTED.RequestId - VALUES (@kind, @configuredInstanceId, @parameters, 'Pending', @by, @now); + DECLARE @id bigint = (SELECT TOP (1) RequestId FROM insight.AgentRequests + WHERE Status = 'Pending' AND Kind = @kind + AND (ConfiguredInstanceId = @configuredInstanceId OR (@configuredInstanceId IS NULL AND ConfiguredInstanceId IS NULL)) + AND ISNULL(Parameters, N'') = ISNULL(@parameters, N'') + ORDER BY RequestId DESC); + IF @id IS NULL + BEGIN + INSERT insight.AgentRequests (Kind, ConfiguredInstanceId, Parameters, Status, RequestedBy, RequestedAt) + VALUES (@kind, @configuredInstanceId, @parameters, 'Pending', @by, @now); + SET @id = SCOPE_IDENTITY(); + END + SELECT @id; """, new { kind, configuredInstanceId, parameters, by, now = Utc(now) }).ConfigureAwait(false); }