Exemple #1
0
        public static short[] ReadFixedSizeItemLengths(IPage page)
        {
            SizeRange range = PageHeaderBase.GetSizeRange(page);

            if (range == SizeRange.MultiPage || range == SizeRange.NotApplicable)
            {
                throw new PageFormatException("Page is not dedicated to fixed size items.");
            }

            short headerLength    = PageHeaderBase.GetHeaderLength(page);
            short itemSizesLength = BitConverter.ToInt16(page.Content, headerLength);

            var result = new short[itemSizesLength];

            int offset  = headerLength + OnPagePointerSize;
            var content = page.Content;

            for (int i = 0; i < itemSizesLength; i++)
            {
                result[i] = BitConverter.ToInt16(content, offset);
                offset   += OnPagePointerSize;
            }

            return(result);
        }
Exemple #2
0
        public static List <DbItem> ReadFixedSizeItems(IPage page)
        {
            short[] itemLengths = ReadFixedSizeItemLengths(page);
            var     result      = new List <DbItem>(itemLengths.Length);

            short maxSize = DbItem.GetMaxSize(PageHeaderBase.GetSizeRange(page));
            int   offset  = page.Content.Length - maxSize;
            var   content = page.Content;
            int   cnt     = itemLengths.Length;

            for (int i = 0; i < cnt; i++)
            {
                var il = itemLengths[i];
                if (il != -1) // item is actualy present on page, read it
                {
                    var itemBytes = new byte[Math.Max(il, (short)0)];
                    Buffer.BlockCopy(content, offset, itemBytes, 0, itemBytes.Length);

                    result.Add(new DbItem(itemBytes));
                }

                offset -= maxSize;
            }

            return(result);
        }
Exemple #3
0
        public static short ReadFixedSizeItemMarkersLength(IPage page)
        {
            SizeRange sc = PageHeaderBase.GetSizeRange(page);

            if (sc == SizeRange.MultiPage || sc == SizeRange.NotApplicable)
            {
                throw new PageFormatException("Page is not dedicated to fixed size items.");
            }

            short headerLength = BitConverter.ToInt16(page.Content, OnPageOffsets.HeaderLength);

            return(BitConverter.ToInt16(page.Content, headerLength));
        }
Exemple #4
0
        public static DbItem ReadFixedSizeItem(IPage page, short itemIndex)
        {
            short itemLength = ReadFixedSizeItemLength(page, itemIndex);

            if (itemLength == -1)
            {
                throw new PageFormatException("Item has been deleted.");
            }

            var   itemBytes = new byte[itemLength];
            short slotSize  = DbItem.GetMaxSize(PageHeaderBase.GetSizeRange(page));
            int   offset    = page.Content.Length - slotSize * (itemIndex + 1);

            for (int j = 0; j < itemBytes.Length; j++)
            {
                itemBytes[j] = page.Content[j + offset];
            }

            return(new DbItem(itemBytes));
        }
Exemple #5
0
        public static short ReadFixedSizeItemLength(IPage page, short itemIndex)
        {
            SizeRange range = PageHeaderBase.GetSizeRange(page);

            if (range == SizeRange.MultiPage || range == SizeRange.NotApplicable)
            {
                throw new PageFormatException("Page is not dedicated to fixed size items.");
            }

            short headerLength    = BitConverter.ToInt16(page.Content, OnPageOffsets.HeaderLength);
            short itemSizesLength = BitConverter.ToInt16(page.Content, headerLength);

            if (itemIndex >= itemSizesLength)
            {
                throw new ArgumentOutOfRangeException(nameof(itemIndex));
            }

            int offset = headerLength + OnPagePointerSize + itemIndex * OnPagePointerSize;

            return(BitConverter.ToInt16(page.Content, offset));
        }
Exemple #6
0
        public static bool IsFixedSizeItemAllocated(IPage page, short itemIndex)
        {
            SizeRange sc = PageHeaderBase.GetSizeRange(page);

            if (sc == SizeRange.MultiPage || sc == SizeRange.NotApplicable)
            {
                throw new PageFormatException("Page is not dedicated to fixed size items.");
            }

            short headerLength    = BitConverter.ToInt16(page.Content, OnPageOffsets.HeaderLength);
            short itemSizesLength = BitConverter.ToInt16(page.Content, headerLength);

            if (itemIndex >= itemSizesLength)
            {
                return(false);
            }

            int offset = headerLength + OnPagePointerSize + itemIndex * OnPagePointerSize;

            return(BitConverter.ToInt16(page.Content, offset) != -1);
        }