public bool RemoveFromQueueByID(long ChangeLog_Entry_ID) { var change = _ChangeLogQueue.Where(c => c.Entry_ID == ChangeLog_Entry_ID).FirstOrDefault(); var e = ContextChangesQueue .Where(q => q.InitialChangeLogID <= ChangeLog_Entry_ID && q.EndingChangeLogID >= ChangeLog_Entry_ID).FirstOrDefault(); if (e == null) { return(false); } if (e.InitialChangeLogID == e.EndingChangeLogID) { ContextChangesQueue.Remove(e); } else { var type = e.Entity.GetType(); var propType = type.GetProperty(Repository_Helper.GetPropertyName(type, ctx, change.ColumnUpdated)).PropertyType; if (change.OldValue != null) { type.GetProperty(change.ColumnUpdated).SetValue(e.Entity, Convert.ChangeType(change.OldValue, propType)); } else { type.GetProperty(change.ColumnUpdated).SetValue(e.Entity, change.OldValue); } } return(_ChangeLogQueue.Remove(change)); }
public bool RemoveRangeFromQueue(long Beginning_ID, long Ending_ID) { var listToRemove = _ChangeLogQueue.Where(c => c.Entry_ID >= Beginning_ID && c.Entry_ID <= Ending_ID).ToList(); var entitiesToModify = ContextChangesQueue .Where(q => !q.IsCommitted && ((q.InitialChangeLogID >= Beginning_ID && q.InitialChangeLogID <= Ending_ID) || (q.EndingChangeLogID >= Beginning_ID && q.EndingChangeLogID >= Ending_ID))) .ToList(); var entitiesToRemoveFromQueue = new List <ContextChange_DTO>(); foreach (var e in entitiesToModify) { var type = e.Entity.GetType(); var entityChangeList = listToRemove.Where(r => r.Entry_ID >= e.InitialChangeLogID && r.Entry_ID <= e.EndingChangeLogID).ToList(); var dbset = ctx.Set(type); var keynames = GetKeyNames(type); var numKeysInChange = entityChangeList .Join(keynames, a => Repository_Helper.GetPropertyName(type, ctx, a.ColumnUpdated), k => k, (a, k) => a ).Count(); if (numKeysInChange == keynames.Count() && (e.InitialChangeLogID >= Beginning_ID || e.EndingChangeLogID <= Ending_ID)) { entitiesToRemoveFromQueue.Add(e); } else { foreach (var change in entityChangeList) { if (change.OldValue != null) { var propType = type.GetProperty(Repository_Helper.GetPropertyName(type, ctx, change.ColumnUpdated)).PropertyType; type.GetProperty(Repository_Helper.GetPropertyName(type, ctx, change.ColumnUpdated)) .SetValue(e.Entity, Convert.ChangeType(change.OldValue, propType)); } else { type.GetProperty(Repository_Helper.GetPropertyName(type, ctx, change.ColumnUpdated)) .SetValue(e.Entity, change.OldValue); } } } ContextChangesQueue = ContextChangesQueue.Except(entitiesToRemoveFromQueue).ToList(); _ChangeLogQueue = _ChangeLogQueue.Except(entityChangeList).ToList(); } return(true); }
public bool RollBackChange_Made_By_Previous_Repo_ByID(long ChangeLog_Entry_ID) { CheckDisposedAndKillOnDispose(); var entry = logger.ctx.RepositoryChangeLog.Where(q => q.RepositoryChangeLogId == ChangeLog_Entry_ID).FirstOrDefault(); if (entry == null) { return(false); } var type = Type.GetType(entry.FQAType); var dbset = ctx.Set(type); var keyname = GetKeyNames(type).FirstOrDefault(); // var qry = String.Format( //@"SELECT * //FROM {0} //WHERE {1} = {2}", type.Name, keyname, entry.PrimaryKey); // var res = QueryDatabase(dbset, qry).Result.ToList(); // object obj = null; // if (res.Count > 0) // obj = res.FirstOrDefault(); var obj = dbset.Find(entry.PrimaryKey); var actualPropName = Repository_Helper.GetPropertyName(type, ctx, entry.ColumnUpdated); var actualPropType = obj.GetType().GetProperty(actualPropName).GetType(); object convertedChangeValue = null; if (entry.OldValue != null) { convertedChangeValue = Convert.ChangeType(entry.OldValue, actualPropType); } obj.GetType().GetProperty(actualPropName).SetValue(obj, convertedChangeValue); if (keyname == actualPropName) { return(false); } entry.Operation = "Rolled Back"; UpdateContext(obj as dynamic); logger.ctx.SaveChanges(); return(true); }
public bool RollBackChangeByID(long ChangeLog_Entry_ID) { CheckDisposedAndKillOnDispose(); foreach (var item in ContextChangesQueue.Where(q => q.IsCommitted && (q.InitialChangeLogID <= ChangeLog_Entry_ID && q.EndingChangeLogID >= ChangeLog_Entry_ID))) { var type = item.Entity.GetType(); var dbset = ctx.Set(type); var keyvalues = GetKeyValues(GetKeyNames(type), item.Entity); var obj = dbset.Find(keyvalues.Select(kv => kv.Value).ToArray()); var changesList = _ChangeLogQueue.Where(c => c.Entry_ID == ChangeLog_Entry_ID).ToList(); if (changesList.Count() == 0) { return(false); } foreach (var c in changesList) { var propType = obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).PropertyType; object convertedChangeValue = null; if (c.OldValue != null) { convertedChangeValue = Convert.ChangeType(c.OldValue, propType); } obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).SetValue(obj, convertedChangeValue); var logEntry = logger.ctx.RepositoryChangeLog.Where(r => r.RepositoryChangeLogId == c.Entry_ID).FirstOrDefault(); if (logEntry != null) { logEntry.Operation = "Rolled Back"; } } UpdateContext(obj as dynamic); logger.ctx.SaveChanges(); } return(true); }
public bool RollBackChanges_Made_By_Previous_Repo_ByRange(long Beginning_ID, long Ending_ID) { CheckDisposedAndKillOnDispose(); var changeLogRangeMatchingUpdateList = logger.ctx.RepositoryChangeLog.Where(q => q.Operation == "Update" && (q.RepositoryChangeLogId >= Beginning_ID && q.RepositoryChangeLogId <= Ending_ID)).ToList(); var changeLogRangeMatchingInsertList = logger.ctx.RepositoryChangeLog.Where(q => q.Operation == "Insert" && (q.RepositoryChangeLogId >= Beginning_ID && q.RepositoryChangeLogId <= Ending_ID)).ToList(); string changeGroupKeyValue = null; foreach (var entry in changeLogRangeMatchingUpdateList) { if (!String.IsNullOrWhiteSpace(changeGroupKeyValue) && changeGroupKeyValue == entry.PrimaryKey) { continue; } var type = Type.GetType(entry.FQAType); var dbset = ctx.Set(type); var keyname = GetKeyNames(type).FirstOrDefault(); var obj = dbset.Find(entry.PrimaryKey); // var qry = String.Format( // @"SELECT * //FROM {0} //WHERE {1} = {2}", type.Name, keyname, entry.PrimaryKey); // var res = QueryDatabase(dbset, qry).Result.ToList(); // object obj = null; // if (res.Count > 0) // obj = res.FirstOrDefault(); var actualPropType = obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, entry.ColumnUpdated)).GetType(); var changeValue = Convert.ChangeType(entry.OldValue, actualPropType); obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, entry.ColumnUpdated)).SetValue(obj, changeValue); var changesList = logger.ctx.RepositoryChangeLog.Where(c => c.PrimaryKey == changeGroupKeyValue && c.TableUpdated == entry.TableUpdated && (c.RepositoryChangeLogId >= Beginning_ID && c.RepositoryChangeLogId <= Ending_ID)).ToList(); foreach (var c in changesList) { var propType = obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).PropertyType; object convertedChangeValue = null; if (c.OldValue != null) { convertedChangeValue = Convert.ChangeType(c.OldValue, propType); } obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).SetValue(obj, convertedChangeValue); var logEntry = logger.ctx.RepositoryChangeLog.Where(r => r.RepositoryChangeLogId == c.RepositoryChangeLogId).FirstOrDefault(); if (logEntry != null) { logEntry.Operation = "Rolled Back"; } } UpdateContext(obj as dynamic); logger.ctx.SaveChanges(); } changeGroupKeyValue = null; foreach (var entry in changeLogRangeMatchingInsertList) { if (!String.IsNullOrWhiteSpace(changeGroupKeyValue) && changeGroupKeyValue == entry.PrimaryKey) { continue; } var type = Type.GetType(entry.FQAType); var dbset = ctx.Set(type); changeGroupKeyValue = entry.PrimaryKey; var keyname = GetKeyNames(type).FirstOrDefault(); var dbkeyname = Repository_Helper.GetColumnName(type, ctx, keyname); var obj = dbset.Find(entry.PrimaryKey); // var qry = String.Format( // @"SELECT * //FROM {0} //WHERE {1} = {2}", type.Name, dbkeyname, entry.PrimaryKey); // var res = QueryDatabase(dbset, qry).Result.ToList(); //object obj = null; //if (res.Count > 0) // obj = res.FirstOrDefault(); // dbset.Find(new object[] { changeGroupKeyValue }); //var changeValue = Convert.ChangeType(changeGroupKeyValue, obj.GetType().GetProperty(keyname).GetType()); var changesList = logger.ctx.RepositoryChangeLog.Where(c => c.PrimaryKey == changeGroupKeyValue && c.TableUpdated == entry.TableUpdated && (c.RepositoryChangeLogId >= Beginning_ID && c.RepositoryChangeLogId <= Ending_ID)).ToList(); var keynames = GetKeyNames(type); var numKeysInChange = changesList .Join(keynames, a => Repository_Helper.GetPropertyName(type, ctx, a.ColumnUpdated), k => k, (a, k) => a ).Count(); var first = changesList.First(); var last = changesList.Last(); if (numKeysInChange == keynames.Count() && first.RepositoryChangeLogId >= Beginning_ID && first.RepositoryChangeLogId <= Ending_ID && last.RepositoryChangeLogId >= Beginning_ID && last.RepositoryChangeLogId <= Ending_ID) { foreach (var c in changesList) { var logEntry = logger.ctx.RepositoryChangeLog.Where(r => r.RepositoryChangeLogId == c.RepositoryChangeLogId).FirstOrDefault(); if (logEntry != null) { logEntry.Operation = "Rolled Back"; } } dbset.Remove(obj); ctx.SaveChanges(); } else { foreach (var c in changesList) { var propType = obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).PropertyType; object convertedChangeValue = null; if (c.OldValue != null) { convertedChangeValue = Convert.ChangeType(c.OldValue, propType); } obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).SetValue(obj, convertedChangeValue); var logEntry = logger.ctx.RepositoryChangeLog.Where(r => r.RepositoryChangeLogId == c.RepositoryChangeLogId).FirstOrDefault(); if (logEntry != null) { logEntry.Operation = "Rolled Back"; } } UpdateContext(obj as dynamic); } logger.ctx.SaveChanges(); } if (changeLogRangeMatchingInsertList.ToList().Count == 0 && changeLogRangeMatchingUpdateList.ToList().Count == 0) { return(false); } return(true); }
public bool RollBackChangesByRange(long Beginning_ID, long Ending_ID) { CheckDisposedAndKillOnDispose(); var changeLogRangeMatchingUpdateList = ContextChangesQueue.Where(q => q.IsCommitted && q.Operation == OperationType.Update && ( (q.InitialChangeLogID >= Beginning_ID && q.InitialChangeLogID <= Ending_ID) || (q.EndingChangeLogID >= Beginning_ID && q.EndingChangeLogID <= Ending_ID) )).ToList(); var changeLogRangeMatchingInsertList = ContextChangesQueue.Where(q => q.IsCommitted && q.Operation == OperationType.Insert && ( (q.InitialChangeLogID >= Beginning_ID && q.InitialChangeLogID <= Ending_ID) || (q.EndingChangeLogID >= Beginning_ID && q.EndingChangeLogID <= Ending_ID) )).ToList(); foreach (var item in changeLogRangeMatchingUpdateList) { var type = item.Entity.GetType(); var dbset = ctx.Set(type); var keynames = GetKeyNames(type); var keyvalues = GetKeyValues(keynames, item.Entity); var obj = dbset.Find(keyvalues.Select(kv => kv.Value).ToArray()); var changesList = _ChangeLogQueue.Where(c => c.Entry_ID >= item.InitialChangeLogID && c.Entry_ID <= item.EndingChangeLogID).ToList(); foreach (var c in changesList) { var propType = obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).PropertyType; object convertedChangeValue = null; if (c.OldValue != null) { convertedChangeValue = Convert.ChangeType(c.OldValue, propType); } obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).SetValue(obj, convertedChangeValue); var logEntry = logger.ctx.RepositoryChangeLog.Where(r => r.RepositoryChangeLogId == c.Entry_ID).FirstOrDefault(); if (logEntry != null) { logEntry.Operation = "Rolled Back"; } } UpdateContext(obj as dynamic); logger.ctx.SaveChanges(); } foreach (var item in changeLogRangeMatchingInsertList) { var type = item.Entity.GetType(); var dbset = ctx.Set(type); var keyvalues = GetKeyValues(GetKeyNames(type), item.Entity); var obj = dbset.Find(keyvalues.Select(kv => kv.Value).ToArray()); var changesList = _ChangeLogQueue.Where(c => c.Entry_ID >= item.InitialChangeLogID && c.Entry_ID <= item.EndingChangeLogID).ToList(); var keynames = GetKeyNames(type); var numKeysInChange = changesList .Join(keynames, a => Repository_Helper.GetPropertyName(type, ctx, a.ColumnUpdated), k => k, (a, k) => a ).Count(); if (numKeysInChange == keynames.Count() && (item.InitialChangeLogID >= Beginning_ID || item.EndingChangeLogID <= Ending_ID)) { foreach (var c in changesList) { var logEntry = logger.ctx.RepositoryChangeLog.Where(r => r.RepositoryChangeLogId == c.Entry_ID).FirstOrDefault(); if (logEntry != null) { logEntry.Operation = "Rolled Back"; } } dbset.Remove(obj); ctx.SaveChanges(); } else { foreach (var c in changesList) { var propType = obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).PropertyType; object convertedChangeValue = null; if (c.OldValue != null) { convertedChangeValue = Convert.ChangeType(c.OldValue, propType); } obj.GetType().GetProperty(Repository_Helper.GetPropertyName(type, ctx, c.ColumnUpdated)).SetValue(obj, convertedChangeValue); var logEntry = logger.ctx.RepositoryChangeLog.Where(r => r.RepositoryChangeLogId == c.Entry_ID).FirstOrDefault(); if (logEntry != null) { logEntry.Operation = "Rolled Back"; } } UpdateContext(obj as dynamic); } logger.ctx.SaveChanges(); } if (changeLogRangeMatchingInsertList.ToList().Count == 0 && changeLogRangeMatchingUpdateList.ToList().Count == 0) { return(false); } return(true); }
public void QueueContextChange <T>(T entry) where T : class { if (entry == null || ctx == null) { return; } //var entry = Clone<T>(original); CheckDisposedAndKillOnDispose(); if (ChangeLog_Entry.GetID_Counter() == 0) { long?max = null; if (logger.ctx.RepositoryChangeLog.Select(l => l.RepositoryChangeLogId).Count() > 0) { max = logger.ctx.RepositoryChangeLog.Max(m => m.RepositoryChangeLogId); } if (max.HasValue && max > 0) { ChangeLog_Entry.SetID_Counter(max.Value); } else { ChangeLog_Entry.SetID_Counter(0); } } var operation = GetOperationType(entry); var entity = new ContextChange_DTO { Entity = entry, Operation = operation, IsCommitted = false }; var type = typeof(T); var tableName = Repository_Helper.GetTableName(type, ctx); var props = type.GetProperties(); var first = props.First(); var last = props.Last(); var pk = GetKeyValues(GetKeyNames(type), entry).FirstOrDefault(); if (operation == OperationType.Insert) { foreach (var prop in props) { var val = prop.GetValue(entry); if (val == null) { if (entity.EndingChangeLogID == 0 && prop == last) { entity.EndingChangeLogID = ChangeLog_Entry.GetID_Counter() - 1; } continue; } else { var changeLogEntry = new ChangeLog_Entry { FQAType = entry.GetType().AssemblyQualifiedName, TableUpdated = tableName, PrimaryKey = null, ColumnUpdated = Repository_Helper.GetColumnName(type, ctx, prop.Name), NewValue = val.ToString(), OldValue = null, Operation = "Insert", CommittedAt = null, ErrorAt = null, ErrorNotes = null }; if (entity.InitialChangeLogID == 0 && prop == first) { entity.InitialChangeLogID = changeLogEntry.Entry_ID; } else if (entity.EndingChangeLogID == 0 && prop == last) { entity.EndingChangeLogID = changeLogEntry.Entry_ID; } QueueChangeLogEntry(changeLogEntry); } } } else if (operation == OperationType.Update) { var comparison = CheckAlreadyQueued(entry); if (comparison == null) { var dbset = ctx.Set(type); comparison = dbset.Find(GetKeyValues(GetKeyNames(type), entry).Select(kv => kv.Value).ToArray()); } var changelist = GetAllChanges_ThisEntity(entry); foreach (var prop in props) { object compOldValue = null; if (comparison != null) { compOldValue = prop.GetValue(comparison); } if (comparison != null && prop.GetValue(entry) != null && prop.GetValue(comparison) != null && prop.GetValue(entry).ToString() != prop.GetValue(comparison).ToString()) { var changeLogEntry = new ChangeLog_Entry { FQAType = entry.GetType().AssemblyQualifiedName, TableUpdated = tableName, PrimaryKey = pk.Value != null?pk.Value.ToString() : null, ColumnUpdated = Repository_Helper.GetColumnName(type, ctx, prop.Name), NewValue = prop.GetValue(entry) == null ? null : prop.GetValue(entry).ToString(), OldValue = compOldValue == null ? null : compOldValue.ToString(), Operation = "Update", CommittedAt = null, ErrorAt = null, ErrorNotes = null }; if (entity.InitialChangeLogID == 0 && prop == first) { entity.InitialChangeLogID = changeLogEntry.Entry_ID; } else if (entity.EndingChangeLogID == 0 && prop == last) { entity.EndingChangeLogID = changeLogEntry.Entry_ID; } QueueChangeLogEntry(changeLogEntry); } else if (comparison != null) { //var col = Repository_Helper.GetColumnName(type, ctx, prop.Name); var lastChangeMadeThisColumn = changelist.Where(c => c.ColumnUpdated == prop.Name).OrderByDescending(c => c.Entry_ID).FirstOrDefault(); if (lastChangeMadeThisColumn == null) { if (entity.EndingChangeLogID == 0 && prop == last) { entity.EndingChangeLogID = ChangeLog_Entry.GetID_Counter() - 1; } continue; } if (prop.GetValue(entry) == null || lastChangeMadeThisColumn.NewValue != prop.GetValue(entry).ToString()) { var changeLogEntry = new ChangeLog_Entry { FQAType = entry.GetType().AssemblyQualifiedName, TableUpdated = tableName, PrimaryKey = pk.Value != null?pk.Value.ToString() : null, ColumnUpdated = Repository_Helper.GetColumnName(type, ctx, prop.Name), NewValue = prop.GetValue(entry) == null ? null : prop.GetValue(entry).ToString(), OldValue = lastChangeMadeThisColumn.NewValue, Operation = "Update", CommittedAt = null, ErrorAt = null, ErrorNotes = null }; if (entity.InitialChangeLogID == 0 && prop == first) { entity.InitialChangeLogID = changeLogEntry.Entry_ID; } else if (entity.EndingChangeLogID == 0 && prop == last) { entity.EndingChangeLogID = changeLogEntry.Entry_ID; } QueueChangeLogEntry(changeLogEntry); } else if (prop.GetValue(entry) == null) { if (entity.EndingChangeLogID == 0 && prop == last) { entity.EndingChangeLogID = ChangeLog_Entry.GetID_Counter() - 1; } continue; } } } } ContextChangesQueue.Add(entity); }