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