Пример #1
0
        public static DBDump Read(Stream stream)
        {
            DBDump dump = new DBDump();

            using (DumpReader reader = new DumpReader(stream))
            {
                System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                watch.Start();
                dump.ReadInner(reader);
                watch.Stop();
            }
            return(dump);
        }
Пример #2
0
        public DBDump Optimize()
        {
            DBDump db = new DBDump();

            db.Version = Version;
            db.Type    = Type;
            TreeDump[] typeTrees = new TreeDump[TypeTrees.Count];
            for (int i = 0; i < TypeTrees.Count; i++)
            {
                typeTrees[i] = (TreeDump)TypeTrees[i].Optimize();
            }
            db.TypeTrees = typeTrees;
            return(db);
        }
Пример #3
0
        private void ReadDump(object state)
        {
            string filePath = (string)state;

            Dump          = DBDump.Read(filePath);
            DumpOptimized = Dump.Optimize();
            Dispatcher.Invoke(() =>
            {
                VersionLabel.Content    = Dump.Version.ToString();
                TypeLabel.Content       = Dump.Type;
                CountLabel.Content      = Dump.TypeTrees.Count.ToString();
                ChangedStack.Visibility = Visibility.Collapsed;
                AddedStack.Visibility   = Visibility.Collapsed;
                RemovedStack.Visibility = Visibility.Collapsed;

                DropArea.IsEnabled  = true;
                DropArea.Visibility = Visibility.Hidden;
            });
            EventDumpCreated?.Invoke();
        }
Пример #4
0
        public DBDiff(DBDump left, DBDump right)
        {
            if (left == null)
            {
                throw new ArgumentNullException(nameof(left));
            }
            if (right == null)
            {
                throw new ArgumentNullException(nameof(right));
            }

            LeftVersion  = left.Version;
            RightVersion = right.Version;

            Dictionary <int, TreeDump> leftTrees = new Dictionary <int, TreeDump>(left.TypeTrees.Count);

            foreach (TreeDump leftTree in left.TypeTrees)
            {
                leftTrees.Add(leftTree.ClassID, leftTree);
            }
            Dictionary <int, TreeDump> rightTrees = new Dictionary <int, TreeDump>(right.TypeTrees.Count);

            foreach (TreeDump rightTree in right.TypeTrees)
            {
                rightTrees.Add(rightTree.ClassID, rightTree);
            }

            List <TreeDiff> treeDiffs = new List <TreeDiff>();

            for (int li = 0, ri = 0; li < left.TypeTrees.Count; li++)
            {
                TreeDump leftTree = left.TypeTrees[li];
                if (rightTrees.TryGetValue(leftTree.ClassID, out TreeDump rightTree))
                {
                    TreeDiff treeDiff = new TreeDiff(leftTree, rightTree);
                    treeDiffs.Add(treeDiff);
                    rightTrees.Remove(leftTree.ClassID);
                }
                else
                {
                    TreeDiff treeDiff = new TreeDiff(leftTree, DiffStatus.Deleted);
                    treeDiffs.Add(treeDiff);
                }

                while (ri < right.TypeTrees.Count)
                {
                    TreeDump tree = right.TypeTrees[ri++];
                    if (leftTrees.ContainsKey(tree.ClassID))
                    {
                        break;
                    }
                    else
                    {
                        TreeDiff treeDiff = new TreeDiff(tree, DiffStatus.Added);
                        treeDiffs.Add(treeDiff);
                        rightTrees.Remove(tree.ClassID);
                    }
                }
            }
            foreach (TreeDump rightTree in rightTrees.Values)
            {
                TreeDiff tree = new TreeDiff(rightTree, DiffStatus.Added);
                treeDiffs.Add(tree);
            }
            TreeDiffs = treeDiffs.ToArray();
        }