示例#1
0
        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);
        }
示例#2
0
        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;
                }
            }
        }