Exemple #1
0
        private async Task <IQueryResult <T> > ExecuteQuery <T>(QueryOptions options, IDataMapper dataMapper)
        {
            // try get Query node
            var node = Context.GetRandomNodeForService(ServiceType.Query);
            var body = options.GetFormValuesAsJson();

            StreamingQueryResult <T> queryResult;

            using (var content = new StringContent(body, System.Text.Encoding.UTF8, MediaType.Json))
            {
                try
                {
                    var response = await HttpClient.PostAsync(node.QueryUri, content, options.CancellationToken).ConfigureAwait(false);

                    var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);

                    queryResult = new StreamingQueryResult <T>
                    {
                        ResponseStream = stream,
                        HttpStatusCode = response.StatusCode,
                        Success        = response.StatusCode == HttpStatusCode.OK
                    };

                    if (response.StatusCode != HttpStatusCode.OK)
                    {
                        //read the header and stop when we reach the queried rows
                        queryResult.ReadToRows();
                        if (response.StatusCode != HttpStatusCode.OK || queryResult.Status != QueryStatus.Success)
                        {
                            throw new QueryException(queryResult.Message,
                                                     queryResult.Status,
                                                     queryResult.Errors);
                        }
                    }
                }
                catch (TaskCanceledException e)
                {
                    throw new TimeoutException("The request has timed out.", e);
                }
            }

            return(queryResult);
        }