123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- CREATE PROCEDURE [dbo].[SelectNextFileToProcess]
- @serverId INT,
- @scriptInstanceId INT,
- @maxRetries INT,
- @mode NVARCHAR(50)
- AS
- BEGIN TRANSACTION
- -- Get the next row to process
- DECLARE @rowId INT = 0
- IF @mode = 'encrypt'
- BEGIN
- SELECT @rowId = Id
- FROM Files f
- WITH (TABLOCKX, HOLDLOCK)
- WHERE
- (f.[Status] = 1 OR f.[Status] = 4)
- AND f.[FileServerId] IN (SELECT [FileServerId] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
- AND (f.[AttemptCount] IS NULL OR f.[AttemptCount] < @maxRetries)
- ORDER BY f.[AttemptCount] DESC, f.[Id] ASC
- END
- IF @mode = 'decrypt'
- BEGIN
- SELECT @rowId = Id
- FROM Files f
- WITH (TABLOCKX, HOLDLOCK)
- WHERE
- (f.[Status] = 3 OR f.[Status] = 5)
- AND f.[FileServerId] IN (SELECT [FileServerId] FROM [ServersFileServers] sfs WHERE sfs.ServerId = @serverId)
- AND (f.[AttemptCount] IS NULL OR f.[AttemptCount] < @maxRetries)
- ORDER BY f.[AttemptCount] DESC, f.[Id] ASC
- END
- IF @rowId IS NOT NULL AND @rowId > 0
- BEGIN
- -- 'Lock' the row for processing by this script
- UPDATE Files
- SET [Status] = 2, [StartedWhen] = GETUTCDATE(), [InstanceId] = @scriptInstanceId
- WHERE [Id] = @rowId
- -- Get the row (with the label info + server status) to send back to the script
- SELECT f.*, l.[LabelGuid], l.[LabelName], s.IsActive, fs.FileServer, i.IsActive as InstanceActive
- FROM Files f
- LEFT JOIN Labels l on f.[LabelId] = l.Id
- LEFT JOIN Instances i on f.[InstanceId] = i.Id
- LEFT JOIN [Servers] s on i.ServerId = s.Id
- LEFT JOIN [FileServers] fs on fs.Id = f.FileServerId
- WHERE f.[Id] = @rowId
- END
- COMMIT
|