Ejemplo n.º 1
0
        /// <summary>
        /// Create new Page based on pre-defined PageID and PageType
        /// </summary>
        public BasePage(PageBuffer buffer, uint pageID, PageType pageType)
        {
            _buffer = buffer;

            ENSURE(buffer.Slice(PAGE_HEADER_SIZE, PAGE_SIZE - PAGE_HEADER_SIZE - 1).All(0), "new page buffer must be empty before use in a new page");

            // page information
            this.PageID     = pageID;
            this.PageType   = pageType;
            this.PrevPageID = uint.MaxValue;
            this.NextPageID = uint.MaxValue;

            // transaction information
            this.ColID         = uint.MaxValue;
            this.TransactionID = uint.MaxValue;
            this.IsConfirmed   = false;

            // block information
            this.ItemsCount       = 0;
            this.UsedBytes        = 0;
            this.FragmentedBytes  = 0;
            this.NextFreePosition = PAGE_HEADER_SIZE; // 32
            this.HighestIndex     = byte.MaxValue;    // empty - not used yet

            // default values
            this.IsDirty = false;

            // writing direct into buffer in Ctor() because there is no change later (write once)
            _buffer.Write(this.PageID, P_PAGE_ID);
            _buffer.Write((byte)this.PageType, P_PAGE_TYPE);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Get a page segment item based on index slot
        /// </summary>
        public BufferSlice Get(byte index)
        {
            ENSURE(index < byte.MaxValue, "slot index must be between 0-254");

            // read slot address
            var positionAddr = CalcPositionAddr(index);
            var lengthAddr   = CalcLengthAddr(index);

            // read segment position/length
            var position = _buffer.ReadUInt16(positionAddr);
            var length   = _buffer.ReadUInt16(lengthAddr);

            ENSURE(this.IsValidPos(position), "invalid segment position");
            ENSURE(this.IsValidLen(length), "invalid segment length");

            // return buffer slice with content only data
            return(_buffer.Slice(position, length));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Get a page segment item based on index slot
        /// </summary>
        public BufferSlice Get(byte index)
        {
            ENSURE(this.ItemsCount > 0, "should have items in this page");
            ENSURE(this.HighestIndex != byte.MaxValue, "should be have at least 1 index in this page");
            ENSURE(index <= this.HighestIndex, "get only index below highest index");

            // read slot address
            var positionAddr = CalcPositionAddr(index);
            var lengthAddr   = CalcLengthAddr(index);

            // read segment position/length
            var position = _buffer.ReadUInt16(positionAddr);
            var length   = _buffer.ReadUInt16(lengthAddr);

            ENSURE(this.IsValidPos(position), "invalid segment position");
            ENSURE(this.IsValidLen(length), "invalid segment length");

            // return buffer slice with content only data
            return(_buffer.Slice(position, length));
        }