コード例 #1
0
        // 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);
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        // 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);
        }
コード例 #4
0
        // 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);
        }