-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMsSqlMissingEventRepository.cs
More file actions
110 lines (96 loc) · 4.09 KB
/
MsSqlMissingEventRepository.cs
File metadata and controls
110 lines (96 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using Dapper;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using PollingOutboxPublisher.ConfigOptions;
using PollingOutboxPublisher.Database.Providers.Interfaces;
using PollingOutboxPublisher.Database.Repositories.Interfaces;
using PollingOutboxPublisher.Exceptions;
using PollingOutboxPublisher.Extensions;
using PollingOutboxPublisher.Models;
namespace PollingOutboxPublisher.Database.Repositories.MsSql;
[ExcludeFromCodeCoverage]
public class MsSqlMissingEventRepository : IMissingEventRepository
{
private readonly string _tableName;
private readonly IMsSqlConnectionProvider _msSqlConnectionProvider;
private readonly ILogger<MsSqlMissingEventRepository> _logger;
public MsSqlMissingEventRepository(IMsSqlConnectionProvider msSqlConnectionProvider,
ILogger<MsSqlMissingEventRepository> logger, IOptions<DataStoreSettings> dataStoreSettings)
{
_msSqlConnectionProvider = msSqlConnectionProvider;
_logger = logger;
_tableName = dataStoreSettings.Value.MissingEvents ??
throw new MissingConfigurationException(nameof(dataStoreSettings.Value.MissingEvents));
}
public async Task InsertAsync(MissingEvent missingEvent)
{
using var connection = _msSqlConnectionProvider.CreateConnection();
await connection.ExecuteAsync(InsertStatement(), missingEvent);
}
public async Task UpdateRetryCountAndExceptionThrownAsync(MissingEvent missingEvent)
{
using var connection = _msSqlConnectionProvider.CreateConnection();
await connection.ExecuteAsync(UpdateRetryCountAndExceptionThrownAsyncStatement(), missingEvent);
}
public async Task<List<MissingEvent>> GetMissingEventsAsync(int batchCount)
{
using var connection = _msSqlConnectionProvider.CreateConnectionForReadOnly();
return (List<MissingEvent>)await connection.QueryAsync<MissingEvent>(
GetMissingEventsStatement(), new { BatchCount = batchCount });
}
public async Task IncrementRetryCountAsync(IEnumerable<long> ids)
{
using var connection = _msSqlConnectionProvider.CreateConnection();
await connection.ExecuteAsync(IncrementRetryCountOfListStatement(), new { IdList = ids });
}
public async Task DeleteMissingEventsAsync(IReadOnlyCollection<long> idList)
{
using var connection = _msSqlConnectionProvider.CreateConnection();
await connection.ExecuteAsyncWithRetry(DeleteMissingEventsStatement(), _logger, new { IdList = idList });
}
private string DeleteMissingEventsStatement()
{
return $"""
DELETE {_tableName}
WHERE Id IN @IdList
""";
}
private string IncrementRetryCountOfListStatement()
{
return $"""
UPDATE {_tableName}
SET RetryCount=RetryCount+1
WHERE Id IN @IdList
""";
}
private string GetMissingEventsStatement()
{
return $"""
SELECT TOP (@BatchCount)
Id,
MissedDate,
RetryCount,
ExceptionThrown
FROM {_tableName}
""";
}
private string UpdateRetryCountAndExceptionThrownAsyncStatement()
{
return $"""
UPDATE {_tableName}
SET RetryCount= @RetryCount, ExceptionThrown = @ExceptionThrown
WHERE Id = @Id
""";
}
private string InsertStatement()
{
return $"""
INSERT INTO {_tableName}
(Id, MissedDate, RetryCount, ExceptionThrown)
VALUES (@Id, @MissedDate, @RetryCount, @ExceptionThrown)
""";
}
}