public CollectionIndex(BufferReader reader) { this.Slot = reader.ReadByte(); this.IndexType = reader.ReadByte(); this.Name = reader.ReadCString(); this.Expression = reader.ReadCString(); this.Unique = reader.ReadBoolean(); this.Head = reader.ReadPageAddress(); // 5 this.Tail = reader.ReadPageAddress(); // 5 this.MaxLevel = reader.ReadByte(); // 1 this.FreeIndexPageList = reader.ReadUInt32(); // 4 this.BsonExpr = BsonExpression.Create(this.Expression); }
public CollectionPage(PageBuffer buffer) : base(buffer) { if (this.PageType != PageType.Collection) { throw new LiteException(0, $"Invalid CollectionPage buffer on {PageID}"); } // create new buffer area to store BsonDocument indexes var area = _buffer.Slice(PAGE_HEADER_SIZE, PAGE_SIZE - PAGE_HEADER_SIZE); using (var r = new BufferReader(new[] { area }, false)) { // read position for FreeDataPage and FreeIndexPage for (var i = 0; i < PAGE_FREE_LIST_SLOTS; i++) { this.FreeDataPageID[i] = r.ReadUInt32(); this.FreeIndexPageID[i] = r.ReadUInt32(); } // read create/last analyzed (16 bytes) this.CreationTime = r.ReadDateTime(); this.LastAnalyzed = r.ReadDateTime(); // skip reserved area r.Skip(P_INDEXES - r.Position); // read indexes count (max 256 indexes per collection) var count = r.ReadByte(); // 1 byte for (var i = 0; i < count; i++) { var index = new CollectionIndex( slot: r.ReadByte(), name: r.ReadCString(), expr: r.ReadCString(), unique: r.ReadBoolean()) { Head = r.ReadPageAddress(), // 5 Tail = r.ReadPageAddress(), // 5 MaxLevel = r.ReadByte(), // 1 KeyCount = r.ReadUInt32(), // 4 UniqueKeyCount = r.ReadUInt32() // 4 }; _indexes[index.Name] = index; } } }
public CollectionPage(PageBuffer buffer) : base(buffer) { ENSURE(this.PageType == PageType.Collection, "page type must be collection page"); if (this.PageType != PageType.Collection) { LiteException.InvalidPageType(PageType.Collection, this); } // create new buffer area to store BsonDocument indexes var area = _buffer.Slice(PAGE_HEADER_SIZE, PAGE_SIZE - PAGE_HEADER_SIZE); using (var r = new BufferReader(new[] { area }, false)) { // read position for FreeDataPage and FreeIndexPage for (var i = 0; i < PAGE_FREE_LIST_SLOTS; i++) { this.FreeDataPageList[i] = r.ReadUInt32(); } // skip reserved area r.Skip(P_INDEXES - PAGE_HEADER_SIZE - r.Position); // read indexes count (max 255 indexes per collection) var count = r.ReadByte(); // 1 byte for (var i = 0; i < count; i++) { var index = new CollectionIndex(r); _indexes[index.Name] = index; } } }