// TDeserialize can be : InheritedCommandResult<TResult>, DocumentInheritedCommandResult<TResult> // method should be used when TResult can be change tracked public async Task <ICommandResult <TResult> > RequestGenericSingleResult <TResult, TDeserialize>(object data = null) where TDeserialize : new() { var response = await SendCommandAsync(data).ConfigureAwait(false); ICommandResult <TResult> result = null; using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { var serializer = new DocumentSerializer(db); if (EnableChangeTracking) { result = new TDeserialize() as ICommandResult <TResult>; BaseResult baseResult = null; result.Result = serializer.DeserializeSingleResult <TResult>(stream, out baseResult); result.BaseResult = baseResult; } else { result = serializer.Deserialize <TDeserialize>(stream) as ICommandResult <TResult>; } } new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult); return(result); }
async Task <bool> SetCurrent() { while (readerState.ReadNextProperty(jsonTextReader)) { readerState.ReadNextPropertyValue(jsonTextReader); CursorResult.SetFromJsonTextReader(readerState.PropertyName, readerState.Token, readerState.Value); } if (jsonTextReader.TokenType == JsonToken.EndObject) { new BaseResultAnalyzer(db).ThrowIfNeeded(CursorResult); if (db.Setting.ThrowForServerErrors == false && CursorResult.HasError()) { return(false); } } if (readerState.ReadNextArrayValue(jsonTextReader)) { var documentSerializer = new DocumentSerializer(db); if (db.Setting.DisableChangeTracking == true || jsonTextReader.TokenType != JsonToken.StartObject) { Current = documentSerializer.Deserialize <T>(jsonTextReader); } else { JObject jObject = null; Current = documentSerializer.DeserializeSingleResult <T>(jsonTextReader, out jObject); db.ChangeTracker.TrackChanges(Current, jObject); } return(true); } else { while (readerState.ReadNextProperty(jsonTextReader)) { readerState.ReadNextPropertyValue(jsonTextReader); CursorResult.SetFromJsonTextReader(readerState.PropertyName, readerState.Token, readerState.Value); } if (CursorResult.HasMore) { Dispose(); await MakeNextRequest().ConfigureAwait(false); readerState.InitiateRead(jsonTextReader); return(await SetCurrent().ConfigureAwait(false)); } else { Dispose(); return(false); } } }
// T can be any type // method should be used when base result is provided on server errors public async Task <ICommandResult <T> > RequestDistinctResult <T>(object data = null, Func <StreamWriter, Task> onStreamReady = null, bool?throwForServerErrors = null) { DistinctCommandResult <T> result = new DistinctCommandResult <T>(); HttpResponseMessage response = null; if (onStreamReady == null) { response = await SendCommandAsync(data).ConfigureAwait(false); } else { response = await SendStreamCommandAsync(onStreamReady).ConfigureAwait(false); } var serializer = new DocumentSerializer(db); using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { if (EnableChangeTracking) { JObject jObject = null; result.Result = response.IsSuccessStatusCode ? serializer.DeserializeSingleResult <T>(stream, out jObject) : default(T); if (response.IsSuccessStatusCode) { db.ChangeTracker.TrackChanges(result.Result, jObject); } } else { result.Result = response.IsSuccessStatusCode ? serializer.Deserialize <T>(stream) : default(T); } // response has not BaseResult if If-None-Match point to a match revision (status: HttpStatusCode.NotModified) result.BaseResult = response.IsSuccessStatusCode == false && response.StatusCode != HttpStatusCode.NotModified ? serializer.Deserialize <BaseResult>(stream) : new BaseResult(); } if (throwForServerErrors.HasValue == false || throwForServerErrors.Value == true) { new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult); } return(result); }
// T can be any type // method should be used when base result is provided on server errors public async Task <ICommandResult <T> > RequestDistinctResult <T>(object data = null, Func <StreamWriter, Task> onStreamReady = null) { DistinctCommandResult <T> result = new DistinctCommandResult <T>(); HttpResponseMessage response = null; if (onStreamReady == null) { response = await SendCommandAsync(data).ConfigureAwait(false); } else { response = await SendStreamCommandAsync(onStreamReady).ConfigureAwait(false); } var serializer = new DocumentSerializer(db); using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { if (EnableChangeTracking) { JObject jObject = null; result.Result = response.IsSuccessStatusCode ? serializer.DeserializeSingleResult <T>(stream, out jObject) : default(T); if (response.IsSuccessStatusCode) { db.ChangeTracker.TrackChanges(result.Result, jObject); } } else { result.Result = response.IsSuccessStatusCode ? serializer.Deserialize <T>(stream) : default(T); } result.BaseResult = !response.IsSuccessStatusCode ? serializer.Deserialize <BaseResult>(stream) : new BaseResult { Code = (int)response.StatusCode }; } new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult); return(result); }