/// <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) { var value = this.ReadElement(reader, out string name); arr.Add(value); } reader.ReadByte(); // zero return(arr); }
/// <summary> /// Get internal information about database. Can filter collections /// </summary> public BsonDocument Info() { using (_locker.Read()) { var header = _pager.GetPage <HeaderPage>(0); var collections = new BsonArray(); foreach (var colName in header.CollectionPages.Keys) { var col = this.GetCollectionPage(colName, false); var colDoc = new BsonDocument { { "name", col.CollectionName }, { "pageID", (double)col.PageID }, { "count", col.DocumentCount }, { "sequence", col.Sequence }, { "indexes", new BsonArray( col.Indexes.Where(x => !x.IsEmpty).Select(i => new BsonDocument { { "slot", i.Slot }, { "field", i.Field }, { "expression", i.Expression }, { "unique", i.Unique } })) } }; collections.Add(colDoc); } return(new BsonDocument { { "userVersion", (int)header.UserVersion }, { "encrypted", header.Password.Any(x => x > 0) }, { "changeID", (int)header.ChangeID }, { "lastPageID", (int)header.LastPageID }, { "fileSize", BasePage.GetSizeOfPages(header.LastPageID + 1) }, { "collections", collections } }); } }
private BsonArray ReadArray() { var arr = new BsonArray(); var token = _tokenizer.ReadToken(); while (token.TokenType != JsonTokenType.EndArray) { var value = this.ReadValue(token); arr.Add(value); token = _tokenizer.ReadToken(); if (token.TokenType == JsonTokenType.Comma) { token = _tokenizer.ReadToken(); } } return(arr); }
/// <summary> /// Register a property as a DbRefList - implement a custom Serialize/Deserialize actions to convert entity to $id, $ref only /// </summary> private static void RegisterDbRefList(BsonMapper mapper, MemberMapper member, string collection) { // get entity from list item type var entity = mapper.GetEntityMapper(member.UnderlyingType); member.Serialize = (list, m) => { // supports null values when "SerializeNullValues = true" if (list == null) { return(BsonValue.Null); } var result = new BsonArray(); var idField = entity.Id; foreach (var item in (IEnumerable)list) { if (item == null) { continue; } var id = idField.Getter(item); result.Add(new BsonDocument { { "$id", m.Serialize(id.GetType(), id, 0) }, { "$ref", collection } }); } return(result); }; member.Deserialize = (bson, m) => { var array = bson.AsArray; if (array.Count == 0) { return(m.Deserialize(member.DataType, array)); } // copy array changing $id to _id var result = new BsonArray(); foreach (var item in array) { var refId = item.AsDocument["$id"]; // if refId is null was included by "include" query, so "item" is full filled document if (refId.IsNull) { result.Add(item); } else { result.Add(new BsonDocument { { "_id", refId } }); } } return(m.Deserialize(member.DataType, result)); }; }