예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
                }
            }
        }
예제 #3
0
        // 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);
                }
            }
        }
예제 #4
0
 // protected methods
 protected void ReadMessageHeaderFrom(BsonBuffer buffer)
 {
     _messageLength = buffer.ReadInt32();
     _requestId     = buffer.ReadInt32();
     _responseTo    = buffer.ReadInt32();
     if ((MessageOpcode)buffer.ReadInt32() != _opcode)
     {
         throw new FileFormatException("Message header opcode is not the expected one.");
     }
 }
예제 #5
0
        // internal methods
        internal void ReadBodyFrom(BsonBuffer buffer)
        {
            var serializationOptions = _serializationOptions;

            if (serializationOptions == null && typeof(TDocument) == typeof(BsonDocument))
            {
                serializationOptions = DocumentSerializationOptions.AllowDuplicateNamesInstance;
            }

            _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);
                }
            }
        }
예제 #7
0
        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);
                }
            }
        }