예제 #1
0
        public IEnumerator <BlittableJsonReaderObject> SetResult(StreamResult response)
        {
            if (response == null)
            {
                throw new InvalidOperationException("The index does not exists, failed to stream results");
            }

            var state = new JsonParserState();

            JsonOperationContext.ManagedPinnedBuffer buffer;

            using (response.Response)
                using (response.Stream)
                    using (var parser = new UnmanagedJsonParser(_session.Context, state, "stream contents"))
                        using (_session.Context.GetManagedBuffer(out buffer))
                            using (var peepingTomStream = new PeepingTomStream(response.Stream, _session.Context))
                            {
                                if (UnmanagedJsonParserHelper.Read(peepingTomStream, parser, state, buffer) == false)
                                {
                                    UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                                }

                                if (state.CurrentTokenType != JsonParserToken.StartObject)
                                {
                                    UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                                }


                                if (_isQueryStream)
                                {
                                    HandleStreamQueryStats(_session.Context, response, parser, state, buffer, _statistics);
                                }

                                var property = UnmanagedJsonParserHelper.ReadString(_session.Context, peepingTomStream, parser, state, buffer);
                                if (string.Equals(property, "Results") == false)
                                {
                                    UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                                }

                                foreach (var result in UnmanagedJsonParserHelper.ReadArrayToMemory(_session.Context, peepingTomStream, parser, state, buffer))
                                {
                                    yield return(result);
                                }

                                if (UnmanagedJsonParserHelper.Read(peepingTomStream, parser, state, buffer) == false)
                                {
                                    UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                                }

                                if (state.CurrentTokenType != JsonParserToken.EndObject)
                                {
                                    UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                                }
                            }
        }
예제 #2
0
        public override void SetResponseRaw(HttpResponseMessage response, Stream stream, JsonOperationContext context)
        {
            var state = new JsonParserState();

            using (var parser = new UnmanagedJsonParser(context, state, "multi_get/response"))
                using (context.GetMemoryBuffer(out var buffer))
                    using (var peepingTomStream = new PeepingTomStream(stream, context))
                        using (_cached)
                        {
                            if (UnmanagedJsonParserHelper.Read(peepingTomStream, parser, state, buffer) == false)
                            {
                                ThrowInvalidJsonResponse(peepingTomStream);
                            }

                            if (state.CurrentTokenType != JsonParserToken.StartObject)
                            {
                                ThrowInvalidJsonResponse(peepingTomStream);
                            }

                            var property = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);
                            if (property != nameof(BlittableArrayResult.Results))
                            {
                                ThrowInvalidJsonResponse(peepingTomStream);
                            }

                            var i = 0;
                            Result = new List <GetResponse>(_commands.Count);
                            foreach (var getResponse in ReadResponses(context, peepingTomStream, parser, state, buffer))
                            {
                                var command = _commands[i];

                                MaybeSetCache(getResponse, command);

                                Result.Add(_cached != null && getResponse.StatusCode == HttpStatusCode.NotModified
                        ? new GetResponse {
                                    Result = _cached.Values[i].Cached.Clone(context), StatusCode = HttpStatusCode.NotModified
                                }
                        : getResponse);

                                i++;
                            }

                            if (UnmanagedJsonParserHelper.Read(peepingTomStream, parser, state, buffer) == false)
                            {
                                ThrowInvalidJsonResponse(peepingTomStream);
                            }

                            if (state.CurrentTokenType != JsonParserToken.EndObject)
                            {
                                ThrowInvalidJsonResponse(peepingTomStream);
                            }
                        }
        }
예제 #3
0
            public async Task InitializeAsync()
            {
                var property = UnmanagedJsonParserHelper.ReadString(_context, _peepingTomStream, _parser, _state, _buffer);

                if (property.StartsWith(Constants.TimeSeries.QueryFunction) == false)
                    UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);

                if (await UnmanagedJsonParserHelper.ReadAsync(_peepingTomStream, _parser, _state, _buffer, _token).ConfigureAwait(false) == false)
                    UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);

                if (_state.CurrentTokenType != JsonParserToken.StartArray)
                    UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);
            }
예제 #4
0
            public async Task InitializeAsync()
            {
                AssertNotSync();

                try
                {
                    _initialized = true;

                    _state        = new JsonParserState();
                    _parser       = new UnmanagedJsonParser(_session.Context, _state, "stream contents");
                    _returnBuffer = _session.Context.GetManagedBuffer(out _buffer);

                    if (await UnmanagedJsonParserHelper.ReadAsync(_peepingTomStream, _parser, _state, _buffer).ConfigureAwait(false) == false)
                    {
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);
                    }

                    if (_state.CurrentTokenType != JsonParserToken.StartObject)
                    {
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);
                    }

                    if (_isQueryStream)
                    {
                        HandleStreamQueryStats(_session.Context, _response, _parser, _state, _buffer, _streamQueryStatistics);
                    }

                    var property = UnmanagedJsonParserHelper.ReadString(_session.Context, _peepingTomStream, _parser, _state, _buffer);

                    if (string.Equals(property, "Results") == false)
                    {
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);
                    }

                    if (await UnmanagedJsonParserHelper.ReadAsync(_peepingTomStream, _parser, _state, _buffer).ConfigureAwait(false) == false)
                    {
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);
                    }

                    if (_state.CurrentTokenType != JsonParserToken.StartArray)
                    {
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);
                    }
                }
                catch
                {
                    Dispose();

                    throw;
                }
            }
예제 #5
0
            private static void HandleStreamQueryStats(JsonOperationContext context, StreamResult response, UnmanagedJsonParser parser, JsonParserState state, JsonOperationContext.MemoryBuffer buffer, StreamQueryStatistics streamQueryStatistics = null)
            {
                using (var peepingTomStream = new PeepingTomStream(response.Stream, context))
                {
                    var property = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);
                    if (string.Equals(property, nameof(StreamQueryStatistics.ResultEtag)) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                    var resultEtag = UnmanagedJsonParserHelper.ReadLong(context, peepingTomStream, parser, state, buffer);

                    property = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);
                    if (string.Equals(property, nameof(StreamQueryStatistics.IsStale)) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);

                    if (UnmanagedJsonParserHelper.Read(peepingTomStream, parser, state, buffer) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);

                    if (state.CurrentTokenType != JsonParserToken.False && state.CurrentTokenType != JsonParserToken.True)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                    var isStale = state.CurrentTokenType != JsonParserToken.False;

                    property = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);
                    if (string.Equals(property, nameof(StreamQueryStatistics.IndexName)) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                    var indexName = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);

                    property = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);
                    if (string.Equals(property, nameof(StreamQueryStatistics.TotalResults)) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                    var totalResults = (int)UnmanagedJsonParserHelper.ReadLong(context, peepingTomStream, parser, state, buffer);

                    property = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);
                    if (string.Equals(property, nameof(StreamQueryStatistics.IndexTimestamp)) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                    var indexTimestamp = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);

                    if (streamQueryStatistics == null)
                        return;

                    streamQueryStatistics.IndexName = indexName;
                    streamQueryStatistics.IsStale = isStale;
                    streamQueryStatistics.TotalResults = totalResults;
                    streamQueryStatistics.ResultEtag = resultEtag;

                    if (DateTime.TryParseExact(indexTimestamp, "o", CultureInfo.InvariantCulture,
                        DateTimeStyles.RoundtripKind, out DateTime timeStamp) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(peepingTomStream);
                    streamQueryStatistics.IndexTimestamp = timeStamp;
                }
            }
예제 #6
0
        public override void SetResponseRaw(HttpResponseMessage response, Stream stream, JsonOperationContext context)
        {
            var state = new JsonParserState();

            using (var parser = new UnmanagedJsonParser(context, state, "multi_get/response"))
                using (context.GetManagedBuffer(out JsonOperationContext.ManagedPinnedBuffer buffer))
                    using (var peepingTomStream = new PeepingTomStream(stream, context))
                    {
                        if (UnmanagedJsonParserHelper.Read(peepingTomStream, parser, state, buffer) == false)
                        {
                            ThrowInvalidJsonResponse(peepingTomStream);
                        }

                        if (state.CurrentTokenType != JsonParserToken.StartObject)
                        {
                            ThrowInvalidJsonResponse(peepingTomStream);
                        }

                        var property = UnmanagedJsonParserHelper.ReadString(context, peepingTomStream, parser, state, buffer);
                        if (property != nameof(BlittableArrayResult.Results))
                        {
                            ThrowInvalidJsonResponse(peepingTomStream);
                        }

                        var i = 0;
                        Result = new List <GetResponse>();
                        foreach (var getResponse in ReadResponses(context, peepingTomStream, parser, state, buffer))
                        {
                            var command = _commands[i];

                            MaybeSetCache(getResponse, command);
                            MaybeReadFromCache(getResponse, command, context);

                            Result.Add(getResponse);

                            i++;
                        }

                        if (UnmanagedJsonParserHelper.Read(peepingTomStream, parser, state, buffer) == false)
                        {
                            ThrowInvalidJsonResponse(peepingTomStream);
                        }

                        if (state.CurrentTokenType != JsonParserToken.EndObject)
                        {
                            ThrowInvalidJsonResponse(peepingTomStream);
                        }
                    }
        }
예제 #7
0
            public async Task InitializeAsync()
            {
                AssertNotSync();

                try
                {
                    _initialized = true;

                    _state = new JsonParserState();
                    _parser = new UnmanagedJsonParser(_session.Context, _state, "stream contents");
                    _builder = new BlittableJsonDocumentBuilder(_builderContext, BlittableJsonDocumentBuilder.UsageMode.ToDisk, "readArray/singleResult", _parser, _state);
                    _returnBuffer = _session.Context.GetMemoryBuffer(out _buffer);

                    if (await UnmanagedJsonParserHelper.ReadAsync(_peepingTomStream, _parser, _state, _buffer, _token).ConfigureAwait(false) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);

                    if (_state.CurrentTokenType != JsonParserToken.StartObject)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);

                    if (_isQueryStream)
                        HandleStreamQueryStats(_builderContext, _response, _parser, _state, _buffer, _streamQueryStatistics);

                    var property = UnmanagedJsonParserHelper.ReadString(_builderContext, _peepingTomStream, _parser, _state, _buffer);

                    if (string.Equals(property, "Results") == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);

                    if (await UnmanagedJsonParserHelper.ReadAsync(_peepingTomStream, _parser, _state, _buffer, _token).ConfigureAwait(false) == false)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);

                    if (_state.CurrentTokenType != JsonParserToken.StartArray)
                        UnmanagedJsonParserHelper.ThrowInvalidJson(_peepingTomStream);
                }
                catch
                {
                    await DisposeAsync().ConfigureAwait(false);

                    throw;
                }
            }