public IAsyncEnumerator <BlittableJsonReaderObject> SetResultAsync(StreamResult response) { return(new YieldStreamResults(_session, response)); }
public YieldStreamResults(InMemoryDocumentSessionOperations session, StreamResult stream) { _response = stream; _session = session; }
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); } } }