public static Tree Create(LowLevelTransaction llt, Transaction tx, Slice name, TreeFlags flags = TreeFlags.None, RootObjectType type = RootObjectType.VariableSizeTree, bool isIndexTree = false, NewPageAllocator newPageAllocator = null) { if (type != RootObjectType.VariableSizeTree && type != RootObjectType.Table) { ThrowInvalidTreeCreateType(); } var newPage = newPageAllocator?.AllocateSinglePage(0) ?? llt.AllocatePage(1); TreePage newRootPage = PrepareTreePage(TreePageFlags.Leaf, 1, newPage); var tree = new Tree(llt, tx, newRootPage.PageNumber, name, isIndexTree, newPageAllocator) { _state = { RootObjectType = type, Depth = 1, Flags = flags, } }; if ((flags & TreeFlags.LeafsCompressed) == TreeFlags.LeafsCompressed) { tree.InitializeCompression(); } tree.State.RecordNewPage(newRootPage, 1); return(tree); }
internal TreePage NewPage(TreePageFlags flags, long nearbyPage) { var newPage = _newPageAllocator?.AllocateSinglePage(nearbyPage) ?? _llt.AllocatePage(1); var page = PrepareTreePage(flags, 1, newPage); State.RecordNewPage(page, 1); PageModified?.Invoke(page.PageNumber, page.Flags); return(page); }
public void Invalid_usage_of_DirectAdds() { var numberOfItems = 100; ushort valueSize = Constants.Storage.PageSize / 16; Slice fstName; using (Slice.From(Allocator, "ccc", out fstName)) using (var tx = Env.WriteTransaction()) { var parent = tx.CreateTree("parent"); var allocator = new NewPageAllocator(tx.LowLevelTransaction, parent); allocator.Create(); for (int i = 0; i < 6; i++) { parent.Add($"aaaaa-{i}", new byte[1000]); } parent.Add($"dummy-8", new byte[1300]); for (int i = 0; i < 6; i++) { parent.Delete($"aaaaa-{i}"); } for (int i = 0; i < NewPageAllocator.NumberOfPagesInSection - 1; i++) { allocator.AllocateSinglePage(0); } var fst = new FixedSizeTree(tx.LowLevelTransaction, parent, fstName, valueSize, newPageAllocator: allocator); var bytes = new byte[valueSize]; Slice val; using (Slice.From(Allocator, bytes, out val)) { for (var i = 0; i < numberOfItems; i++) { fst.Add(i, val); } } tx.Commit(); } }