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); } } } }