protected void AddEntry(LowLevelTransaction lltx, FixedSizeTreePage page, long key, Span <byte> value) { if (!page.AllocForKey(key, out var matchFlags, out _, out var entry)) { SplitLeaf(lltx, page, key, page.FixedHeader.Count / 2); return; } if (matchFlags == 0) { return; } if (page.FixedHeader.DataElementSize < value.Length) { throw new InvalidOperationException($@"the value-size:{value.Length} of node must be lessThan or equals:{page.FixedHeader.DataElementSize} bytes in page:{page.Position}"); } entry.Key = key; value.CopyTo(entry.Value); lltx.WriteFixedBTreeLeafPageInsertEntry(page.Position, key, value); }
private SplitContext SplitLeaf(LowLevelTransaction lltx, FixedSizeTreePage current, long pageNumber, int index) { if (!current.IsLeaf) { throw new InvalidOperationException($"page:{current.Position} is not a leaf page"); } ref var currentHeader = ref current.FixedHeader;
protected void RemovePageRecursion(LowLevelTransaction lltx, FixedSizeTreePage page, long removedKey) { var branch = GetPageForUpdate(lltx, removedKey, (byte)(page.Depth - 1)); if (branch != null && branch.FixedHeader.Count == 2) { RemoveBranchRecursion(lltx, page, branch); return; } ref var header = ref page.FixedHeader;
protected void AddBranchEntry(LowLevelTransaction lltx, FixedSizeTreePage page, FixedSizeTreePage leaf, long lPageNumber, long rPageNumber, long key) { ref var fixedHeader = ref page.FixedHeader;