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);
            }
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 6
0
        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);
            }