示例#1
0
        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));
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }