public TreeDataInTransaction GetTreeInformation(Tree tree) { // ReSharper disable once PossibleUnintendedReferenceComparison if (tree == _env.Root) { return(_rootTreeData ?? (_rootTreeData = new TreeDataInTransaction(_env.Root) { RootPageNumber = _env.Root.State.RootPageNumber })); } // ReSharper disable once PossibleUnintendedReferenceComparison if (tree == _env.FreeSpaceRoot) { return(_fresSpaceTreeData ?? (_fresSpaceTreeData = new TreeDataInTransaction(_env.FreeSpaceRoot) { RootPageNumber = _env.FreeSpaceRoot.State.RootPageNumber })); } TreeDataInTransaction c; if (_treesInfo.TryGetValue(tree, out c)) { return(c); } c = new TreeDataInTransaction(tree) { RootPageNumber = tree.State.RootPageNumber }; _treesInfo.Add(tree, c); return(c); }
public Page ModifyCursor(TreeDataInTransaction txInfo, Cursor c) { Debug.Assert(c.Pages.Count > 0); // cannot modify an empty cursor var node = c.Pages.Last; while (node != null) { var parent = node.Next != null ? node.Next.Value : null; c.Update(node, ModifyPage(txInfo.Tree, parent, node.Value.PageNumber, c)); node = node.Previous; } txInfo.RootPageNumber = c.Pages.Last.Value.PageNumber; return(c.Pages.First.Value); }
internal void UpdateRoots(Tree root, Tree freeSpace) { if (_treesInfo.TryGetValue(root, out _rootTreeData)) { _treesInfo.Remove(root); } else { _rootTreeData = new TreeDataInTransaction(root); } if (_treesInfo.TryGetValue(freeSpace, out _fresSpaceTreeData)) { _treesInfo.Remove(freeSpace); } else { _fresSpaceTreeData = new TreeDataInTransaction(freeSpace); } }