internal void ReadFrom(Stream stream) { var streamReader = new BsonStreamReader(stream, Utf8Helper.StrictUtf8Encoding); ReadHeaderFrom(streamReader); ReadBodyFrom(streamReader); }
internal override void ReadHeaderFrom(BsonStreamReader streamReader) { base.ReadHeaderFrom(streamReader); _responseFlags = (ResponseFlags)streamReader.ReadInt32(); _cursorId = streamReader.ReadInt64(); _startingFrom = streamReader.ReadInt32(); _numberReturned = streamReader.ReadInt32(); if ((_responseFlags & ResponseFlags.CursorNotFound) != 0) { throw new MongoQueryException("Cursor not found."); } if ((_responseFlags & ResponseFlags.QueryFailure) != 0) { BsonDocument document; using (BsonReader bsonReader = new BsonBinaryReader(streamReader.BaseStream, _readerSettings)) { var context = BsonDeserializationContext.CreateRoot <BsonDocument>(bsonReader, b => b.AllowDuplicateElementNames = true); document = BsonDocumentSerializer.Instance.Deserialize(context); } 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); } }
private static List <RequestMessage> TranslateBytesToRequests(byte[] bytes) { var requests = new List <RequestMessage>(); using (var stream = new MemoryStream(bytes)) { int bytesRead = 0; while (stream.Length > bytesRead) { int startPosition = bytesRead; var streamReader = new BsonStreamReader(stream, Utf8Helper.StrictUtf8Encoding); var length = streamReader.ReadInt32(); var requestId = streamReader.ReadInt32(); var responseTo = streamReader.ReadInt32(); var opCode = (Opcode)streamReader.ReadInt32(); bytesRead += length; stream.Position = startPosition; var encoderFactory = new BinaryMessageEncoderFactory(stream, null); switch (opCode) { case Opcode.Query: requests.Add(encoderFactory.GetQueryMessageEncoder().ReadMessage()); break; default: throw new InvalidOperationException("Unsupported request type."); } } } return(requests); }
// internal methods internal virtual void ReadHeaderFrom(BsonStreamReader streamReader) { _messageLength = streamReader.ReadInt32(); _requestId = streamReader.ReadInt32(); _responseTo = streamReader.ReadInt32(); if ((MessageOpcode)streamReader.ReadInt32() != _opcode) { throw new FileFormatException("Message header opcode is not the expected one."); } }
// internal methods internal void ReadBodyFrom(BsonStreamReader streamReader) { var allowDuplicateElementNames = typeof(TDocument) == typeof(BsonDocument); _documents = new List <TDocument>(_numberReturned); for (int i = 0; i < _numberReturned; i++) { using (var bsonReader = new BsonBinaryReader(streamReader.BaseStream, _readerSettings)) { var context = BsonDeserializationContext.CreateRoot <TDocument>(bsonReader, b => b.AllowDuplicateElementNames = allowDuplicateElementNames); var document = _serializer.Deserialize(context); _documents.Add(document); } } }
private byte[] RemoveLastDocument(Stream stream) { var streamReader = new BsonStreamReader(stream, WriterSettings.Encoding); var lastDocumentLength = (int)streamReader.Position - _lastDocumentStartPosition; streamReader.Position = _lastDocumentStartPosition; var lastDocument = streamReader.ReadBytes(lastDocumentLength); streamReader.Position = _lastDocumentStartPosition; streamReader.BaseStream.SetLength(_lastDocumentStartPosition); _batchCount -= 1; _batchLength = (int)streamReader.Position - _batchStartPosition; return(lastDocument); }
private IByteBuffer RemoveOverflow(Stream stream) { var streamReader = new BsonStreamReader(stream, Utf8Helper.StrictUtf8Encoding); var lastRequestLength = (int)stream.Position - _lastRequestPosition; stream.Position = _lastRequestPosition; var lastArrayItem = streamReader.ReadBytes(lastRequestLength); if ((BsonType)lastArrayItem[0] != BsonType.Document) { throw new MongoInternalException("Expected overflow item to be a BsonDocument."); } var sliceOffset = Array.IndexOf <byte>(lastArrayItem, 0) + 1; // skip over type and array index var overflow = new ByteArrayBuffer(lastArrayItem, sliceOffset, lastArrayItem.Length - sliceOffset, true); stream.Position = _lastRequestPosition; stream.SetLength(_lastRequestPosition); _batchCount--; _batchLength = (int)stream.Position - _batchStartPosition; return(overflow); }