protected override void ReadContent(ByteReader reader) { this.DataBlocks = new Dictionary<ushort, DataBlock>(ItemCount); for (var i = 0; i < ItemCount; i++) { var block = new DataBlock(); block.Page = this; block.Position = new PageAddress(this.PageID, reader.ReadUInt16()); block.ExtendPageID = reader.ReadUInt32(); var size = reader.ReadUInt16(); block.Data = reader.ReadBytes(size); this.DataBlocks.Add(block.Position.Index, block); } }
/// <summary> /// Insert data inside a datapage. Returns dataPageID that idicates the first page /// </summary> public DataBlock Insert(CollectionPage col, byte[] data) { // need to extend (data is bigger than 1 page) var extend = (data.Length + DataBlock.DATA_BLOCK_FIXED_SIZE) > BasePage.PAGE_AVAILABLE_BYTES; // if extend, just search for a page with BLOCK_SIZE avaiable var dataPage = _pager.GetFreePage<DataPage>(col.FreeDataPageID, extend ? DataBlock.DATA_BLOCK_FIXED_SIZE : data.Length + DataBlock.DATA_BLOCK_FIXED_SIZE); // create a new block with first empty index on DataPage var block = new DataBlock { Position = new PageAddress(dataPage.PageID, dataPage.DataBlocks.NextIndex()), Page = dataPage }; // if extend, store all bytes on extended page. if (extend) { var extendPage = _pager.NewPage<ExtendPage>(); block.ExtendData = data; block.ExtendPageID = extendPage.PageID; this.StoreExtendData(extendPage, data); } else { block.Data = data; } // add dataBlock to this page dataPage.DataBlocks.Add(block.Position.Index, block); // update freebytes + items count dataPage.UpdateItemCount(); dataPage.IsDirty = true; // add/remove dataPage on freelist if has space _pager.AddOrRemoveToFreeList(dataPage.FreeBytes > DataPage.DATA_RESERVED_BYTES, dataPage, col, ref col.FreeDataPageID); col.DocumentCount++; col.IsDirty = true; return block; }
public override void ReadContent(BinaryReader reader) { this.DataBlocks = new Dictionary<ushort, DataBlock>(ItemCount); for (var i = 0; i < ItemCount; i++) { var block = new DataBlock(); block.Page = this; block.Position = new PageAddress(this.PageID, reader.ReadUInt16()); block.ExtendPageID = reader.ReadUInt32(); for(var j = 0; j < CollectionIndex.INDEX_PER_COLLECTION; j++) { block.IndexRef[j] = reader.ReadPageAddress(); } var size = reader.ReadUInt16(); block.Data = reader.ReadBytes(size); this.DataBlocks.Add(block.Position.Index, block); } }
/// <summary> /// Update byte array from existing data block. Update free space too /// </summary> public void UpdateBlockData(DataBlock block, byte[] data) { this.FreeBytes = this.FreeBytes + block.Data.Length - data.Length; block.Data = data; }