Resolve all 46 low-severity architecture review findings
This commit is contained in:
@@ -649,7 +649,7 @@ VALUES
|
||||
DateTime threshold,
|
||||
int batchSize,
|
||||
TimeSpan? commandTimeout = null,
|
||||
CancellationToken ct = default)
|
||||
CancellationToken ct = default, int maxRows = 50_000)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(channel))
|
||||
{
|
||||
@@ -661,6 +661,9 @@ VALUES
|
||||
throw new ArgumentOutOfRangeException(nameof(batchSize), batchSize, "Batch size must be > 0.");
|
||||
}
|
||||
|
||||
if (maxRows <= 0)
|
||||
throw new ArgumentOutOfRangeException(nameof(maxRows), maxRows, "Row budget must be > 0.");
|
||||
|
||||
var thresholdUtc = DateTime.SpecifyKind(threshold.ToUniversalTime(), DateTimeKind.Utc);
|
||||
|
||||
// Maintenance timeout in whole seconds; null leaves the provider default (arch-review 04 S2).
|
||||
@@ -675,7 +678,7 @@ VALUES
|
||||
// targeting AuditLog still trips the guard.
|
||||
//
|
||||
// Bounded + idempotent: DELETE TOP (@batch) caps the log/lock footprint per
|
||||
// statement; the loop repeats until a batch deletes zero rows, so re-running
|
||||
// statement; the loop stops at its row budget or an empty batch, so re-running
|
||||
// after a crash mid-loop simply resumes. Category is the canonical
|
||||
// channel-name column (e.g. 'ApiOutbound'); Action holds "{channel}.{kind}" so
|
||||
// it is NOT the right column to match a bare channel name against.
|
||||
@@ -698,7 +701,7 @@ VALUES
|
||||
|
||||
try
|
||||
{
|
||||
while (true)
|
||||
while (totalDeleted < maxRows)
|
||||
{
|
||||
ct.ThrowIfCancellationRequested();
|
||||
|
||||
@@ -711,7 +714,7 @@ VALUES
|
||||
|
||||
var pBatch = cmd.CreateParameter();
|
||||
pBatch.ParameterName = "@batch";
|
||||
pBatch.Value = batchSize;
|
||||
pBatch.Value = (int)Math.Min(batchSize, maxRows - totalDeleted);
|
||||
cmd.Parameters.Add(pBatch);
|
||||
|
||||
var pChannel = cmd.CreateParameter();
|
||||
|
||||
+12
@@ -456,6 +456,18 @@ public class TemplateEngineRepository : ITemplateEngineRepository
|
||||
.ToListAsync(cancellationToken);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<IReadOnlyList<Instance>> GetTopologyInstancesAsync(int siteId, int? areaId, int skip, int take, CancellationToken cancellationToken = default)
|
||||
{
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(skip);
|
||||
ArgumentOutOfRangeException.ThrowIfLessThan(take, 1);
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThan(take, 50);
|
||||
return await _context.Instances.AsNoTracking()
|
||||
.Where(i => i.SiteId == siteId && i.AreaId == areaId)
|
||||
.OrderBy(i => i.UniqueName).ThenBy(i => i.Id)
|
||||
.Skip(skip).Take(take).ToListAsync(cancellationToken);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<Instance?> GetInstanceByUniqueNameAsync(string uniqueName, CancellationToken cancellationToken = default)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user