private TreePage SearchForPage(Slice key, bool allowCompressed, out TreeCursorConstructor cursorConstructor, out TreeNodeHeader *node, bool addToRecentlyFoundPages = true) { var p = GetReadOnlyTreePage(State.RootPageNumber); var cursor = new TreeCursor(); cursor.Push(p); bool rightmostPage = true; bool leftmostPage = true; while ((p.TreeFlags & TreePageFlags.Branch) == TreePageFlags.Branch) { int nodePos; if (key.Options == SliceOptions.BeforeAllKeys) { p.LastSearchPosition = nodePos = 0; rightmostPage = false; } else if (key.Options == SliceOptions.AfterAllKeys) { p.LastSearchPosition = nodePos = (ushort)(p.NumberOfEntries - 1); leftmostPage = false; } else { if (p.Search(_llt, key) != null) { nodePos = p.LastSearchPosition; if (p.LastMatch != 0) { nodePos--; p.LastSearchPosition--; } if (nodePos != 0) { leftmostPage = false; } rightmostPage = false; } else { nodePos = (ushort)(p.LastSearchPosition - 1); leftmostPage = false; } } var pageNode = p.GetNode(nodePos); p = GetReadOnlyTreePage(pageNode->PageNumber); Debug.Assert(pageNode->PageNumber == p.PageNumber, string.Format("Requested Page: #{0}. Got Page: #{1}", pageNode->PageNumber, p.PageNumber)); cursor.Push(p); } cursorConstructor = new TreeCursorConstructor(cursor); if (p.IsLeaf == false) { VoronUnrecoverableErrorException.Raise(_llt.Environment, "Index points to a non leaf page"); } if (allowCompressed == false && p.IsCompressed) { ThrowOnCompressedPage(p); } node = p.Search(_llt, key); // will set the LastSearchPosition if (p.NumberOfEntries > 0 && addToRecentlyFoundPages) // compressed page can have no ordinary entries { AddToRecentlyFoundPages(cursor, p, leftmostPage, rightmostPage); } return(p); }
public TreeRebalancer(LowLevelTransaction tx, Tree tree, TreeCursor cursor) { _tx = tx; _tree = tree; _cursor = cursor; }
public TreeCursorRef(TreeCursor cursor) { this.Cursor = cursor; }