/// <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> /// Write header data from variable into byte[] buffer. When override, call base.UpdateBuffer() after write your code /// </summary> public virtual PageBuffer UpdateBuffer() { // using fixed position to be faster than BufferWriter ENSURE(this.PageID == _buffer.ReadUInt32(P_PAGE_ID), "pageID can't be changed"); // page information // PageID - never change! _buffer.Write(this.PrevPageID, P_PREV_PAGE_ID); _buffer.Write(this.NextPageID, P_NEXT_PAGE_ID); // transaction information _buffer.Write(this.TransactionID, P_TRANSACTION_ID); _buffer.Write(this.IsConfirmed, P_IS_CONFIRMED); _buffer.Write(this.ColID, P_COL_ID); // segments information _buffer.Write(this.ItemsCount, P_ITEMS_COUNT); _buffer.Write(this.UsedBytes, P_USED_BYTES); _buffer.Write(this.FragmentedBytes, P_FRAGMENTED_BYTES); _buffer.Write(this.NextFreePosition, P_NEXT_FREE_POSITION); _buffer.Write(this.HighestIndex, P_HIGHEST_INDEX); return(_buffer); }