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