internal void ReadFrom( BsonBuffer buffer, IBsonSerializationOptions serializationOptions ) { var messageStartPosition = buffer.Position; ReadMessageHeaderFrom(buffer); responseFlags = (ResponseFlags)buffer.ReadInt32(); cursorId = buffer.ReadInt64(); startingFrom = buffer.ReadInt32(); numberReturned = buffer.ReadInt32(); using (BsonReader bsonReader = BsonReader.Create(buffer, readerSettings)) { if ((responseFlags & ResponseFlags.CursorNotFound) != 0) { throw new MongoQueryException("Cursor not found."); } if ((responseFlags & ResponseFlags.QueryFailure) != 0) { var document = BsonDocument.ReadFrom(bsonReader); var err = document["$err", null].AsString ?? "Unknown error."; var message = string.Format("QueryFailure flag was {0} (response was {1}).", err, document.ToJson()); throw new MongoQueryException(message, document); } documents = new List <TDocument>(numberReturned); while (buffer.Position - messageStartPosition < messageLength) { var document = (TDocument)BsonSerializer.Deserialize(bsonReader, typeof(TDocument), serializationOptions); documents.Add(document); } } }
internal override void ReadHeaderFrom(BsonBuffer buffer) { base.ReadHeaderFrom(buffer); _responseFlags = (ResponseFlags)buffer.ReadInt32(); _cursorId = buffer.ReadInt64(); _startingFrom = buffer.ReadInt32(); _numberReturned = buffer.ReadInt32(); if ((_responseFlags & ResponseFlags.CursorNotFound) != 0) { throw new MongoQueryException("Cursor not found."); } if ((_responseFlags & ResponseFlags.QueryFailure) != 0) { BsonDocument document; using (BsonReader bsonReader = new BsonBinaryReader(buffer, false, _readerSettings)) { document = (BsonDocument)BsonDocumentSerializer.Instance.Deserialize(bsonReader, typeof(BsonDocument), null); } var mappedException = ExceptionMapper.Map(document); if (mappedException != null) { throw mappedException; } var err = document.GetValue("$err", "Unknown error."); var message = string.Format("QueryFailure flag was {0} (response was {1}).", err, document.ToJson()); throw new MongoQueryException(message, document); } }
// internal methods internal void ReadFrom(BsonBuffer buffer, IBsonSerializationOptions serializationOptions) { if (serializationOptions == null && typeof(TDocument) == typeof(BsonDocument)) { serializationOptions = DocumentSerializationOptions.AllowDuplicateNamesInstance; } var messageStartPosition = buffer.Position; ReadMessageHeaderFrom(buffer); _responseFlags = (ResponseFlags)buffer.ReadInt32(); _cursorId = buffer.ReadInt64(); _startingFrom = buffer.ReadInt32(); _numberReturned = buffer.ReadInt32(); if ((_responseFlags & ResponseFlags.CursorNotFound) != 0) { throw new MongoQueryException("Cursor not found."); } if ((_responseFlags & ResponseFlags.QueryFailure) != 0) { BsonDocument document; using (BsonReader bsonReader = new BsonBinaryReader(buffer, false, _readerSettings)) { document = (BsonDocument)BsonDocumentSerializer.Instance.Deserialize(bsonReader, typeof(BsonDocument), null); } var err = document.GetValue("$err", "Unknown error."); var message = string.Format("QueryFailure flag was {0} (response was {1}).", err, document.ToJson()); throw new MongoQueryException(message, document); } _documents = new List <TDocument>(_numberReturned); for (int i = 0; i < _numberReturned; i++) { BsonBuffer sliceBuffer; if (buffer.ByteBuffer is MultiChunkBuffer) { // we can use slightly faster SingleChunkBuffers for all documents that don't span chunk boundaries var position = buffer.Position; var length = buffer.ReadInt32(); var slice = buffer.ByteBuffer.GetSlice(position, length); buffer.Position = position + length; sliceBuffer = new BsonBuffer(slice, true); } else { sliceBuffer = new BsonBuffer(buffer.ByteBuffer, false); } using (var bsonReader = new BsonBinaryReader(sliceBuffer, true, _readerSettings)) { var document = (TDocument)_serializer.Deserialize(bsonReader, typeof(TDocument), serializationOptions); _documents.Add(document); } } }
// internal methods internal void ReadFrom(BsonBuffer buffer, IBsonSerializationOptions serializationOptions) { if (serializationOptions == null && typeof(TDocument) == typeof(BsonDocument)) { serializationOptions = DocumentSerializationOptions.AllowDuplicateNamesInstance; } var messageStartPosition = buffer.Position; ReadMessageHeaderFrom(buffer); _responseFlags = (ResponseFlags)buffer.ReadInt32(); _cursorId = buffer.ReadInt64(); _startingFrom = buffer.ReadInt32(); _numberReturned = buffer.ReadInt32(); using (BsonReader bsonReader = BsonReader.Create(buffer, _readerSettings)) { if ((_responseFlags & ResponseFlags.CursorNotFound) != 0) { throw new MongoQueryException("Cursor not found."); } if ((_responseFlags & ResponseFlags.QueryFailure) != 0) { var document = (BsonDocument)BsonDocumentSerializer.Instance.Deserialize(bsonReader, typeof(BsonDocument), null); var err = document.GetValue("$err", "Unknown error."); var message = string.Format("QueryFailure flag was {0} (response was {1}).", err, document.ToJson()); throw new MongoQueryException(message, document); } _documents = new List <TDocument>(_numberReturned); while (buffer.Position - messageStartPosition < MessageLength) { var document = (TDocument)BsonSerializer.Deserialize(bsonReader, typeof(TDocument), serializationOptions); _documents.Add(document); } } }
internal void ReadFrom( BsonBuffer buffer ) { var messageStartPosition = buffer.Position; ReadMessageHeaderFrom(buffer); responseFlags = (ResponseFlags)buffer.ReadInt32(); cursorId = buffer.ReadInt64(); startingFrom = buffer.ReadInt32(); numberReturned = buffer.ReadInt32(); var settings = new BsonBinaryReaderSettings { MaxDocumentSize = connection.ServerInstance.MaxDocumentSize }; using (BsonReader bsonReader = BsonReader.Create(buffer, settings)) { if ((responseFlags & ResponseFlags.CursorNotFound) != 0) { throw new MongoQueryException("Cursor not found."); } if ((responseFlags & ResponseFlags.QueryFailure) != 0) { var document = BsonDocument.ReadFrom(bsonReader); var err = document["$err", null].AsString ?? "Unknown error."; var message = string.Format("QueryFailure flag set: {0} (response: {1})", err, document.ToJson()); throw new MongoQueryException(message); } documents = new List <TDocument>(numberReturned); while (buffer.Position - messageStartPosition < messageLength) { var document = BsonSerializer.Deserialize <TDocument>(bsonReader); documents.Add(document); } } }