Exemplo n.º 1
0
        /// <summary>
        /// Gets DbItem instance by reference.
        /// </summary>
        /// <param name="reference">Reference to the requested db item</param>
        /// <returns></returns>
        public DbItem Get(DbItemReference reference)
        {
            if (!_pageManager.PageExists(reference.PageIndex))
            {
                return(null);
            }

            IPage page = _pageManager.FetchPage(reference.PageIndex);

            var header = PageFormatter.GetPageHeader(page);

            if (header.SizeRange == SizeRange.MultiPage)
            {
                var  length  = PageFormatter.ReadMultipageItemLength(page);
                var  content = new byte[length];
                long offset  = 0;

                while (page != null)
                {
                    var readBytes = PageFormatter.ReadMultipageItemBlock(page, Math.Min(_pageManager.PageSize, (int)(length - offset)));
                    readBytes.CopyTo(content, offset);
                    offset += readBytes.Length;
                    var nextPageIndex = ((MultipageItemPageHeader)header).NextPageIndex;

                    if (nextPageIndex != -1)
                    {
                        page   = _pageManager.FetchPage(nextPageIndex);
                        header = PageFormatter.GetPageHeader(page);
                    }
                    else
                    {
                        page = null;
                    }
                }

                return(new DbItem(content));
            }

            return(PageFormatter.IsFixedSizeItemAllocated(page, reference.ItemIndex)
                    ? PageFormatter.ReadFixedSizeItem(page, reference.ItemIndex)
                    : null);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets the db item length (in bytes).
        /// </summary>
        /// <param name="reference">Reference to the requested db item</param>
        /// <returns>The length of requested db item</returns>
        public long GetLength(DbItemReference reference)
        {
            if (!_pageManager.PageExists(reference.PageIndex))
            {
                return(0);
            }

            IPage page = _pageManager.FetchPage(reference.PageIndex);

            var header = PageFormatter.GetPageHeader(page);

            if (header.SizeRange == SizeRange.MultiPage)
            {
                return(PageFormatter.ReadMultipageItemLength(page));
            }

            return(PageFormatter.IsFixedSizeItemAllocated(page, reference.ItemIndex)
                    ? PageFormatter.ReadFixedSizeItemLength(page, reference.ItemIndex)
                    : 0);
        }
Exemplo n.º 3
0
        private byte[] GetFixedSizeItemSegment(IPage page, DbItemReference reference, long startIndex, long endIndex)
        {
            if (!PageFormatter.IsFixedSizeItemAllocated(page, reference.ItemIndex))
            {
                return new byte[] { }
            }
            ;

            var item = PageFormatter.ReadFixedSizeItem(page, reference.ItemIndex);

            if (item.RawData.Length >= endIndex)
            {
                throw new ArgumentOutOfRangeException(nameof(endIndex));
            }

            var length = endIndex - startIndex + 1;
            var result = new byte[length];

            Array.Copy(item.RawData, startIndex, result, 0, length);

            return(result);
        }