Beispiel #1
0
        /// <summary>
        /// Allocates new db item with specified content and produces reference to it.
        /// </summary>
        /// <param name="content">Content of item to allocate</param>
        /// <returns>Reference to the allocated item</returns>
        public DbItemReference Allocate(byte[] content)
        {
            var item = new DbItem(content);

            return(item.GetAllocationType(_pageManager.PageSize) == AllocationType.SinglePage
                ? AllocateSinglePage(item)
                : AllocateMultiPage(item));
        }
Beispiel #2
0
        /// <summary>
        /// Reallocates already allocated db item with specified content and produces reference to it.
        /// </summary>
        /// <param name="reference">Reference to already allocated item</param>
        /// <param name="newContent">Content of item to reallocate</param>
        /// <returns>Reference to the reallocated item</returns>
        public DbItemReference Reallocate(DbItemReference reference, byte[] newContent)
        {
            var item = new DbItem(newContent);

            if (item.GetAllocationType(_pageManager.PageSize) == AllocationType.SinglePage)
            {
                IPage page = _pageManager.FetchPage(reference.PageIndex);
                if (PageFormatter.GetPageHeader(page).SizeRange == item.SizeRange)
                {
                    PageFormatter.RewriteFixedSizeItem(page, reference.ItemIndex, item);

                    _pageManager.UpdatePage(page);

                    return(reference);
                }

                Free(reference);
                return(AllocateSinglePage(item));
            }

            Free(reference);
            return(AllocateMultiPage(item));
        }