示例#1
0
        private TreeNodeHeader *AllocateNewNode(int index, int nodeSize)
        {
            TreePageHeader *header = Header;

            int upper;

            if (Upper == ushort.MaxValue && PageSize == Constants.Compression.MaxPageSize)
            {
                upper = Constants.Compression.MaxPageSize;
            }
            else
            {
                upper = header->Upper;
            }

            var newNodeOffset = (ushort)(upper - nodeSize);

            Debug.Assert(newNodeOffset >= header->Lower + Constants.Tree.NodeOffsetSize);

            var node = (TreeNodeHeader *)(Base + newNodeOffset);

            KeysOffsets[index] = newNodeOffset;

            header->Upper  = newNodeOffset;
            header->Lower += Constants.Tree.NodeOffsetSize;

            node->Flags = 0;
            return(node);
        }
示例#2
0
        private TreeNodeHeader *AllocateNewNode(int index, int nodeSize, ushort previousNodeVersion)
        {
            int newSize = previousNodeVersion + 1;

            if (newSize > ushort.MaxValue)
            {
                previousNodeVersion = 0;
            }

            TreePageHeader *header = Header;

            var newNodeOffset = (ushort)(header->Upper - nodeSize);

            Debug.Assert(newNodeOffset >= header->Lower + Constants.NodeOffsetSize);

            var node = (TreeNodeHeader *)(Base + newNodeOffset);

            KeysOffsets[index] = newNodeOffset;

            header->Upper  = newNodeOffset;
            header->Lower += Constants.NodeOffsetSize;

            node->Flags   = 0;
            node->Version = ++previousNodeVersion;
            return(node);
        }