using System;
using System.Collections.Generic;
using System.Linq;
using NPoco;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Core.Scoping;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Cms.Infrastructure.Persistence.Factories;
using Umbraco.Extensions;
namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement
{
///
/// Represents the NPoco implementation of .
///
internal class CacheInstructionRepository : ICacheInstructionRepository
{
private readonly IScopeAccessor _scopeAccessor;
public CacheInstructionRepository(IScopeAccessor scopeAccessor) => _scopeAccessor = scopeAccessor;
///
private IScope AmbientScope => _scopeAccessor.AmbientScope;
///
public int CountAll()
{
Sql sql = AmbientScope.SqlContext.Sql().Select("COUNT(*)")
.From();
return AmbientScope.Database.ExecuteScalar(sql);
}
///
public int CountPendingInstructions(int lastId) =>
AmbientScope.Database.ExecuteScalar("SELECT SUM(instructionCount) FROM umbracoCacheInstruction WHERE id > @lastId", new { lastId });
///
public int GetMaxId() =>
AmbientScope.Database.ExecuteScalar("SELECT MAX(id) FROM umbracoCacheInstruction");
///
public bool Exists(int id) => AmbientScope.Database.Exists(id);
///
public void Add(CacheInstruction cacheInstruction)
{
CacheInstructionDto dto = CacheInstructionFactory.BuildDto(cacheInstruction);
AmbientScope.Database.Insert(dto);
}
///
public IEnumerable GetPendingInstructions(int lastId, int maxNumberToRetrieve)
{
Sql sql = AmbientScope.SqlContext.Sql().SelectAll()
.From()
.Where(dto => dto.Id > lastId)
.OrderBy(dto => dto.Id);
Sql topSql = sql.SelectTop(maxNumberToRetrieve);
return AmbientScope.Database.Fetch(topSql).Select(CacheInstructionFactory.BuildEntity);
}
///
public void DeleteInstructionsOlderThan(DateTime pruneDate)
{
// Using 2 queries is faster than convoluted joins.
var maxId = AmbientScope.Database.ExecuteScalar("SELECT MAX(id) FROM umbracoCacheInstruction;");
Sql deleteSql = new Sql().Append(@"DELETE FROM umbracoCacheInstruction WHERE utcStamp < @pruneDate AND id < @maxId", new { pruneDate, maxId });
AmbientScope.Database.Execute(deleteSql);
}
}
}