private IEnumerable <string> VersionsToKeep(int contentId, UnVersionConfigEntry configEntry, SqlConnection connection) { // Get a list of all versions // TODO: Need to find a better way to do this, but SQL CE 4 doesn't allow sub queries var sql = string.Format(@"SELECT cv.VersionId, cv.VersionDate, d.published, d.newest FROM cmsContentVersion cv LEFT OUTER JOIN cmsDocument d ON d.versionId = cv.VersionId WHERE cv.ContentId = {0} ORDER BY cv.VersionDate DESC", contentId); if (Logger.IsDebugEnabled) { Logger.Debug(sql); } var command = new SqlCommand(sql, connection); var versionsToKeep = new List <string>(); var readerIndex = 0; try { var reader = command.ExecuteReader(); while (reader.Read()) { var versionId = reader.GetGuid(0); var versionDate = reader.GetDateTime(1); var published = reader.GetBoolean(2); var newest = reader.GetBoolean(3); readerIndex++; var daysDiff = (DateTime.Now - versionDate).Days; if (published || newest || (daysDiff < configEntry.MaxDays && readerIndex <= configEntry.MaxCount)) { versionsToKeep.Add("'" + versionId.ToString("D") + "'"); } } reader.Close(); reader.Dispose(); } catch (Exception ex) { Logger.Warn(ex); if (!_catchSqlExceptions) { throw ex; } } return(versionsToKeep); }
public void GetVersions_Returns_Right_Based_Max_Count() { var config = new UnVersionConfigEntry() { MaxCount = 5 }; List <IContent> versions = new List <IContent>() { TestHelper.GetVersionMock(10, new DateTime(2019, 12, 10)).Object, // should be kept TestHelper.GetVersionMock(20, new DateTime(2019, 12, 19)).Object, // should be kept TestHelper.GetVersionMock(30, new DateTime(2019, 12, 20)).Object, // should be kept TestHelper.GetVersionMock(40, new DateTime(2019, 12, 10)).Object, // should be kept TestHelper.GetVersionMock(50, new DateTime(2019, 12, 19)).Object, // should be kept TestHelper.GetVersionMock(60, new DateTime(2019, 12, 20)).Object, // should be deleted TestHelper.GetVersionMock(70, new DateTime(2019, 12, 10)).Object, // should be deleted TestHelper.GetVersionMock(80, new DateTime(2019, 12, 19)).Object, // should be deleted TestHelper.GetVersionMock(90, new DateTime(2019, 12, 20)).Object, // should be deleted }; var service = new UnVersionService(null, null, null, null); var res = service.GetVersionsToDelete(versions, config, new DateTime(2019, 12, 30)); Assert.IsFalse(res.Contains(50)); Assert.IsTrue(res.Contains(60)); Assert.IsTrue(res.Contains(70)); Assert.IsTrue(res.Contains(80)); Assert.IsTrue(res.Contains(90)); }
public void GetVersions_Returns_Right_Based_On_Date() { var config = new UnVersionConfigEntry() { MaxDays = 10 }; List <IContent> versions = new List <IContent>() { TestHelper.GetVersionMock(1, new DateTime(2019, 12, 10)).Object, // should be deleted TestHelper.GetVersionMock(2, new DateTime(2019, 12, 19)).Object, // should be deleted TestHelper.GetVersionMock(3, new DateTime(2019, 12, 20)).Object // should be kept }; var service = new UnVersionService(null, null, null, null); var res = service.GetVersionsToDelete(versions, config, new DateTime(2019, 12, 30)); Assert.IsTrue(res.Contains(1)); Assert.IsTrue(res.Contains(2)); Assert.IsFalse(res.Contains(3)); }
/// <summary> /// Iterates a list of IContent versions and returns items to be removed based on a configEntry. /// </summary> /// <param name="versions"></param> /// <param name="configEntry"></param> /// <param name="currentDateTime"></param> /// <returns></returns> public List <int> GetVersionsToDelete(List <IContent> versions, UnVersionConfigEntry configEntry, DateTime currentDateTime) { List <int> versionIdsToDelete = new List <int>(); int iterationCount = 0; _logger.Debug <UnVersionService>("Getting versions for config entry. {alias}, {maxCount}, {maxDays}, {rootXpath}", configEntry.DocTypeAlias, configEntry.MaxCount, configEntry.MaxDays, configEntry.RootXPath); foreach (var version in versions) { iterationCount++; _logger.Debug <UnVersionService>("Comparing version {versionId}, iterationCount is {iterationCount}", version.VersionId, iterationCount); // If we have a maxCount and the current iteration is above that max-count if (configEntry.MaxCount > 0 && iterationCount > configEntry.MaxCount) { _logger.Debug <UnVersionService>("Remove version {versionId}, because iterationCount is {iterationCount} and max count is {maxCount}", version.VersionId, iterationCount, configEntry.MaxCount); versionIdsToDelete.Add(version.VersionId); // no need to compare dates since we've already added this version for deletion continue; } // If we have a max days and the current version is older if (configEntry.MaxDays > 0 && configEntry.MaxDays != int.MaxValue) { var dateRemoveBefore = currentDateTime.AddDays(0 - configEntry.MaxDays); if (version.UpdateDate < dateRemoveBefore) { _logger.Debug <UnVersionService>("Remove version {versionId}, because version is updated {updateDate} and max days is {maxDays} (cutoff: {dateRemoveBefore})", version.VersionId, version.UpdateDate, configEntry.MaxDays, dateRemoveBefore); versionIdsToDelete.Add(version.VersionId); } } } return(versionIdsToDelete); }
private IEnumerable<string> VersionsToKeep(int contentId, UnVersionConfigEntry configEntry, SqlConnection connection) { // Get a list of all versions // TODO: Need to find a better way to do this, but SQL CE 4 doesn't allow sub queries var sql = string.Format(@"SELECT cv.VersionId, cv.VersionDate, d.published, d.newest FROM cmsContentVersion cv LEFT OUTER JOIN cmsDocument d ON d.versionId = cv.VersionId WHERE cv.ContentId = {0} ORDER BY cv.VersionDate DESC", contentId); if (Logger.IsDebugEnabled) Logger.Debug(sql); var command = new SqlCommand(sql, connection); var versionsToKeep = new List<string>(); var readerIndex = 0; try { var reader = command.ExecuteReader(); while (reader.Read()) { var versionId = reader.GetGuid(0); var versionDate = reader.GetDateTime(1); var published = reader.GetBoolean(2); var newest = reader.GetBoolean(3); readerIndex++; var daysDiff = (DateTime.Now - versionDate).Days; if (published || newest || (daysDiff < configEntry.MaxDays && readerIndex <= configEntry.MaxCount)) versionsToKeep.Add("'" + versionId.ToString("D") + "'"); } reader.Close(); reader.Dispose(); } catch (Exception ex) { Logger.Warn(ex); if (!_catchSqlExceptions) throw ex; } return versionsToKeep; }