Esempio n. 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);
            }
        }
Esempio n. 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);
                }
            }
        }
        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);
            }
        }
Esempio n. 4
0
 public ReplyData(Int32 hdrReqID, Int32 hdrRespTo, ResponseFlags flags, Int64 cursorID, Int32 startingFrom, BSONDocument[] docs)
 {
     HDR_RequestID  = hdrReqID;
     HDR_ResponseTo = hdrRespTo;
     Flags          = flags;
     CursorID       = cursorID;
     StartingFrom   = startingFrom;
     Documents      = docs;
 }
Esempio n. 5
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);
                }
            }
        }
        private MongoReplyMessage <TDocument> GetReply(MongoConnection connection, MongoRequestMessage message)
        {
            var readerSettings = _cursor.Collection.GetReaderSettings(connection);

            connection.SendMessage(message);
            var reply = connection.ReceiveMessage <TDocument>(readerSettings, _cursor.Serializer, _cursor.SerializationOptions);

            _responseFlags = reply.ResponseFlags;
            _openCursorId  = reply.CursorId;
            return(reply);
        }
Esempio n. 7
0
        private MongoReplyMessage <TDocument> GetReply(MongoConnection connection, MongoRequestMessage message)
        {
            var readerSettings = cursor.Collection.GetReaderSettings(connection);

            connection.SendMessage(message, SafeMode.False); // safemode doesn't apply to queries
            var reply = connection.ReceiveMessage <TDocument>(readerSettings, cursor.SerializationOptions);

            responseFlags = reply.ResponseFlags;
            openCursorId  = reply.CursorId;
            return(reply);
        }
        private MongoReplyMessage <TDocument> GetReply(MongoConnection connection, MongoRequestMessage message)
        {
            var readerSettings = _cursor.Collection.GetReaderSettings(connection);

            connection.SendMessage(message, null, _cursor.Database.Name); // write concern doesn't apply to queries
            var reply = connection.ReceiveMessage <TDocument>(readerSettings, _cursor.SerializationOptions);

            _responseFlags = reply.ResponseFlags;
            _openCursorId  = reply.CursorId;
            return(reply);
        }
        // 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);
                }
            }
        }
Esempio n. 10
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);
                }
            }
        }
Esempio n. 11
0
 public ReplyData(Int32 hdrReqID, Int32 hdrRespTo, ResponseFlags flags, Int64 cursorID, Int32 startingFrom, BSONDocument[] docs)
 {
     HDR_RequestID = hdrReqID;
                   HDR_ResponseTo = hdrRespTo;
                   Flags = flags;
                   CursorID = cursorID;
                   StartingFrom = startingFrom;
                   Documents = docs;
 }