/// <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); }
/// <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)); }
/// <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)); }