protected override void ReadContent(ByteReader reader) { this.Nodes = new Dictionary<ushort, IndexNode>(this.ItemCount); for (var i = 0; i < this.ItemCount; i++) { var index = reader.ReadUInt16(); var levels = reader.ReadByte(); var node = new IndexNode(levels); node.Page = this; node.Position = new PageAddress(this.PageID, index); node.KeyLength = reader.ReadUInt16(); node.Key = reader.ReadBsonValue(node.KeyLength); node.DataBlock = reader.ReadPageAddress(); for (var j = 0; j < node.Prev.Length; j++) { node.Prev[j] = reader.ReadPageAddress(); node.Next[j] = reader.ReadPageAddress(); } this.Nodes.Add(node.Position.Index, node); } }
private string ReadCString(ByteReader reader) { var pos = 0; while (true) { byte buf = reader.ReadByte(); if (buf == 0x00) break; _strBuffer[pos++] = buf; } return Encoding.UTF8.GetString(_strBuffer, 0, pos); }
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> /// Read a BsonDocument from reader /// </summary> public BsonDocument ReadDocument(ByteReader reader) { var length = reader.ReadInt32(); var end = reader.Position + length - 5; var obj = new BsonDocument(); while (reader.Position < end) { string name; var value = this.ReadElement(reader, out name); obj.RawValue[name] = value; } reader.ReadByte(); // zero return obj; }
/// <summary> /// Read an BsonArray from reader /// </summary> public BsonArray ReadArray(ByteReader reader) { var length = reader.ReadInt32(); var end = reader.Position + length - 5; var arr = new BsonArray(); while (reader.Position < end) { string name; var value = this.ReadElement(reader, out name); arr.Add(value); } reader.ReadByte(); // zero return arr; }
protected override void ReadContent(ByteReader reader) { this.CollectionName = reader.ReadString(); this.FreeDataPageID = reader.ReadUInt32(); this.DocumentCount = reader.ReadUInt32(); foreach (var index in this.Indexes) { index.Field = reader.ReadString(); index.HeadNode = reader.ReadPageAddress(); index.TailNode = reader.ReadPageAddress(); index.FreeIndexPageID = reader.ReadUInt32(); index.Options.Unique = reader.ReadBoolean(); index.Options.IgnoreCase = reader.ReadBoolean(); index.Options.TrimWhitespace = reader.ReadBoolean(); index.Options.EmptyStringToNull = reader.ReadBoolean(); index.Options.RemoveAccents = reader.ReadBoolean(); } }
protected override void ReadContent(ByteReader reader) { var info = reader.ReadString(HEADER_INFO.Length); var ver = reader.ReadByte(); if (info != HEADER_INFO) throw LiteException.InvalidDatabase(); if (ver != FILE_VERSION) throw LiteException.InvalidDatabaseVersion(ver); this.ChangeID = reader.ReadUInt16(); this.FreeEmptyPageID = reader.ReadUInt32(); this.LastPageID = reader.ReadUInt32(); this.DbParams.Read(reader); // read page collections references (position on end of page) var cols = reader.ReadByte(); for (var i = 0; i < cols; i++) { this.CollectionPages.Add(reader.ReadString(), reader.ReadUInt32()); } }
protected override void ReadContent(ByteReader reader) { this.CollectionName = reader.ReadString(); this.FreeDataPageID = reader.ReadUInt32(); var uintCount = reader.ReadUInt32(); // read as uint (4 bytes) foreach (var index in this.Indexes) { index.Field = reader.ReadString(); index.HeadNode = reader.ReadPageAddress(); index.TailNode = reader.ReadPageAddress(); index.FreeIndexPageID = reader.ReadUInt32(); index.Options.Unique = reader.ReadBoolean(); index.Options.IgnoreCase = reader.ReadBoolean(); index.Options.TrimWhitespace = reader.ReadBoolean(); index.Options.EmptyStringToNull = reader.ReadBoolean(); index.Options.RemoveAccents = reader.ReadBoolean(); } // be compatible with v2_beta var longCount = reader.ReadInt64(); this.DocumentCount = Math.Max(uintCount, longCount); }
public void Read(ByteReader reader) { this.DbVersion = reader.ReadUInt16(); reader.Skip(198); }
protected override void ReadContent(ByteReader reader) { }
/// <summary> /// Reads an element (key-value) from an reader /// </summary> private BsonValue ReadElement(ByteReader reader, out string name) { var type = reader.ReadByte(); name = this.ReadCString(reader); if (type == 0x01) // Double { return reader.ReadDouble(); } else if (type == 0x02) // String { return this.ReadString(reader); } else if (type == 0x03) // Document { return this.ReadDocument(reader); } else if (type == 0x04) // Array { return this.ReadArray(reader); } else if (type == 0x05) // Binary { var length = reader.ReadInt32(); var subType = reader.ReadByte(); var bytes = reader.ReadBytes(length); switch (subType) { case 0x00: return bytes; case 0x04: return new Guid(bytes); } } else if (type == 0x07) // ObjectId { return new ObjectId(reader.ReadBytes(12)); } else if (type == 0x08) // Boolean { return reader.ReadBoolean(); } else if (type == 0x09) // DateTime { var ts = reader.ReadInt64(); // catch specific values for MaxValue / MinValue #19 if (ts == 253402300800000) return DateTime.MaxValue; if (ts == -62135596800000) return DateTime.MinValue; return BsonValue.UnixEpoch.AddMilliseconds(ts).ToLocalTime(); } else if (type == 0x0A) // Null { return BsonValue.Null; } else if (type == 0x10) // Int32 { return reader.ReadInt32(); } else if (type == 0x12) // Int64 { return reader.ReadInt64(); } else if (type == 0xFF) // MinKey { return BsonValue.MinValue; } else if (type == 0x7F) // MaxKey { return BsonValue.MaxValue; } throw new NotSupportedException("BSON type not supported"); }
private string ReadString(ByteReader reader) { var length = reader.ReadInt32(); var bytes = reader.ReadBytes(length - 1); reader.ReadByte(); // discard \x00 return Encoding.UTF8.GetString(bytes); }
protected override void ReadContent(ByteReader reader) { this.Data = reader.ReadBytes(this.ItemCount); }
protected override void ReadContent(ByteReader reader) { this.CollectionName = reader.ReadString(); this.DocumentCount = reader.ReadInt64(); this.FreeDataPageID = reader.ReadUInt32(); foreach (var index in this.Indexes) { index.Field = reader.ReadString(); index.Unique = reader.ReadBoolean(); index.HeadNode = reader.ReadPageAddress(); index.TailNode = reader.ReadPageAddress(); index.FreeIndexPageID = reader.ReadUInt32(); } }
protected abstract void ReadContent(ByteReader reader);