using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Core.Scoping;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Extensions;
namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement
{
internal class DocumentVersionRepository : IDocumentVersionRepository
{
private readonly IScopeAccessor _scopeAccessor;
public DocumentVersionRepository(IScopeAccessor scopeAccessor)
{
_scopeAccessor = scopeAccessor ?? throw new ArgumentNullException(nameof(scopeAccessor));
}
///
///
/// Never includes current draft version.
/// Never includes current published version.
/// Never includes versions marked as "preventCleanup".
///
public IReadOnlyCollection GetDocumentVersionsEligibleForCleanup()
{
var query = _scopeAccessor.AmbientScope.SqlContext.Sql();
query.Select(@"umbracoDocument.nodeId as contentId,
umbracoContent.contentTypeId as contentTypeId,
umbracoContentVersion.id as versionId,
umbracoContentVersion.versionDate as versionDate")
.From()
.InnerJoin()
.On(left => left.NodeId, right => right.NodeId)
.InnerJoin()
.On(left => left.NodeId, right => right.NodeId)
.InnerJoin()
.On(left => left.Id, right => right.Id)
.Where(x => !x.Current) // Never delete current draft version
.Where(x => !x.PreventCleanup) // Never delete "pinned" versions
.Where(x => !x.Published); // Never delete published version
return _scopeAccessor.AmbientScope.Database.Fetch(query);
}
///
public IReadOnlyCollection GetCleanupPolicies()
{
var query = _scopeAccessor.AmbientScope.SqlContext.Sql();
query.Select()
.From();
return _scopeAccessor.AmbientScope.Database.Fetch(query);
}
///
///
/// Deletes in batches of
///
public void DeleteVersions(IEnumerable versionIds)
{
foreach (var group in versionIds.InGroupsOf(Constants.Sql.MaxParameterCount))
{
var groupedVersionIds = group.ToList();
// Note: We had discussed doing this in a single SQL Command.
// If you can work out how to make that work with SQL CE, let me know!
// Can use test PerformContentVersionCleanup_WithNoKeepPeriods_DeletesEverythingExceptActive to try things out.
var query = _scopeAccessor.AmbientScope.SqlContext.Sql()
.Delete()
.WhereIn(x => x.VersionId, groupedVersionIds);
_scopeAccessor.AmbientScope.Database.Execute(query);
query = _scopeAccessor.AmbientScope.SqlContext.Sql()
.Delete()
.WhereIn(x => x.VersionId, groupedVersionIds);
_scopeAccessor.AmbientScope.Database.Execute(query);
query = _scopeAccessor.AmbientScope.SqlContext.Sql()
.Delete()
.WhereIn(x => x.Id, groupedVersionIds);
_scopeAccessor.AmbientScope.Database.Execute(query);
query = _scopeAccessor.AmbientScope.SqlContext.Sql()
.Delete()
.WhereIn(x => x.Id, groupedVersionIds);
_scopeAccessor.AmbientScope.Database.Execute(query);
}
}
}
}