예제 #1
0
 public IAsyncEnumerator <BlittableJsonReaderObject> SetResultAsync(StreamResult response)
 {
     return(new YieldStreamResults(_session, response));
 }
예제 #2
0
 public YieldStreamResults(InMemoryDocumentSessionOperations session, StreamResult stream)
 {
     _response = stream;
     _session  = session;
 }
예제 #3
0
        public IEnumerator <BlittableJsonReaderObject> SetResult(StreamResult response)
        {
            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))
                        {
                            ReadNextToken(response.Stream, parser, buffer);

                            if (state.CurrentTokenType != JsonParserToken.StartObject)
                            {
                                throw new InvalidOperationException("Expected stream to start, but got " +
                                                                    state.CurrentTokenType);
                            }
                            ReadNextToken(response.Stream, parser, buffer);

                            if (state.CurrentTokenType != JsonParserToken.String)
                            {
                                throw new InvalidOperationException("Expected stream intial property, but got " +
                                                                    state.CurrentTokenType);
                            }

                            // TODO: Need to handle initial properties here from QueryHeaderInformation

                            var propery = GetPropertyName(state);
                            if (propery.Equals("Results") == false)
                            {
                                throw new InvalidOperationException("Expected stream property 'Results' but got " + propery);
                            }

                            ReadNextToken(response.Stream, parser, buffer);

                            if (state.CurrentTokenType != JsonParserToken.StartArray)
                            {
                                throw new InvalidOperationException("Expected stream intial property, but got " +
                                                                    state.CurrentTokenType);
                            }
                            ReadNextToken(response.Stream, parser, buffer);
                            while (state.CurrentTokenType != JsonParserToken.EndArray)
                            {
                                _session.Context.CachedProperties.NewDocument();
                                var builder = new BlittableJsonDocumentBuilder(_session.Context, BlittableJsonDocumentBuilder.UsageMode.ToDisk, "ImportObject", parser, state);
                                builder.ReadNestedObject();
                                while (builder.Read() == false)
                                {
                                    var read = response.Stream.Read(buffer.Buffer.Array, buffer.Buffer.Offset, buffer.Length);
                                    if (read == 0)
                                    {
                                        throw new EndOfStreamException("Stream ended without reaching end of json content");
                                    }
                                    parser.SetBuffer(buffer, read);
                                }
                                builder.FinalizeDocument();
                                ReadNextToken(response.Stream, parser, buffer);
                                yield return(builder.CreateReader());
                            }

                            ReadNextToken(response.Stream, parser, buffer);

                            if (state.CurrentTokenType != JsonParserToken.EndObject)
                            {
                                throw new InvalidOperationException("Expected stream closing token, but got " +
                                                                    state.CurrentTokenType);
                            }
                        }
        }