コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: FixedSizeTree.Balance.cs プロジェクト: zuvys/Vicuna
        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;
コード例 #3
0
ファイル: FixedSizeTree.Delete.cs プロジェクト: zuvys/Vicuna
        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;
コード例 #4
0
 protected void AddBranchEntry(LowLevelTransaction lltx, FixedSizeTreePage page, FixedSizeTreePage leaf, long lPageNumber, long rPageNumber, long key)
 {
     ref var fixedHeader = ref page.FixedHeader;