Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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();
                }
        }