Ejemplo n.º 1
0
 public Subscription(string id, QueryStream queryStream, ChannelWriter <OperationMessage> output,
                     CancellationTokenSource cancellationTokenSource)
 {
     ID          = id;
     QueryStream = queryStream;
     Unsubscribe = cancellationTokenSource;
 }
Ejemplo n.º 2
0
 public QueryObject GetObject(Query Query)
 {
     using (var Stream = new QueryStream())
     {
         Stream.Push(Query);
         return(Stream.Pop(this));
     }
 }
Ejemplo n.º 3
0
    private async Task <QueryStream> SubscribeAsync(
        ExecutionOptions options,
        CancellationToken cancellationToken)
    {
        if (!cancellationToken.CanBeCanceled)
        {
            throw new InvalidOperationException(
                      "Invalid cancellation token. To unsubscribe the provided cancellation token must be cancellable.");
        }

        var unsubscribeSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
        var result            = await Executor.SubscribeAsync(options, unsubscribeSource.Token);

        _logger.Subscribed(options.OperationName, options.VariableValues, null);

        unsubscribeSource.Token.Register(() =>
        {
            _logger?.Unsubscribed(
                options.OperationName,
                options.VariableValues,
                null);
        });

        if (result.Errors != null && result.Errors.Any())
        {
            if (_logger.IsEnabled(LogLevel.Debug))
            {
                foreach (var error in result.Errors)
                {
                    _logger.LogError($"GraphQL ERROR: '{error.Message}', Path: '{error.Path}'");
                }
            }

            var channel = Channel.CreateBounded <ExecutionResult>(1);
            await channel.Writer.WriteAsync(new ExecutionResult
            {
                Errors     = result.Errors.ToList(),
                Extensions = result.Extensions.ToDictionary(kv => kv.Key, kv => kv.Value)
            }, CancellationToken.None);

            channel.Writer.TryComplete();

            // unsubscribe
            unsubscribeSource.Cancel();

            return(new QueryStream(channel.Reader));
        }

        var stream = new QueryStream(result.Source);

        return(stream);
    }
Ejemplo n.º 4
0
        public override async Task <IQueryStream <TElement> > ExecuteQueryStreamedAsync <TElement>(
            TableQuery <TElement> query, TableRequestOptions requestOptions = null, OperationContext operationContext = null)
        {
            if (query.SelectColumns != null)
            {
                throw new NotImplementedException("select");
            }
            if (query.TakeCount != null)
            {
                throw new NotImplementedException("top");
            }
            var stream = new QueryStream <TElement>(this, query, requestOptions, operationContext);
            await stream.StartAsync();

            return(stream);
        }
Ejemplo n.º 5
0
        public Stack <QueryObject> GetObjects(params Query[] Querys)
        {
            Stack <QueryObject> Stack = new Stack <QueryObject>();

            using (var Stream = new QueryStream())
            {
                foreach (var Query in Querys)
                {
                    Stream.Push(Query);
                }

                for (int i = 0; i <= Stream.Querys.Count; i++)
                {
                    Stack.Push(Stream.Pop(this));
                }
            }

            return(Stack);
        }
Ejemplo n.º 6
0
        public bool GetCharacter(string Ticket, out Character Character)
        {
            Character = null;

            using (var Stream = new QueryStream("SELECT * FROM characters WHERE auth_ticket = @ticket LIMIT 1"))
            {
                Stream.AddParameter("ticket", Ticket);

                var DataRow = Stream.Excecute<DataRow>();

                if (DataRow == default(DataRow))
                {
                    return false;
                }

                Character = new Character(DataRow);
            }

            return true;
        }
        public async Task Stop()
        {
            /* Given */
            var output             = Channel.CreateUnbounded <OperationMessage>();
            var queryStreamService = Substitute.For <IQueryStreamService>();

            var queryStream = Channel.CreateUnbounded <ExecutionResult>();
            var queryResult = new QueryStream(queryStream);

            queryStreamService.QueryAsync(null, default)
            .ReturnsForAnyArgs(ci =>
            {
                ci.Arg <CancellationToken>().Register(() => queryStream.Writer.Complete());
                return(queryResult);
            });

            var sut     = CreateSut(queryStreamService);
            var message = new OperationMessage
            {
                Id      = "1",
                Type    = MessageType.GQL_START,
                Payload = new OperationMessageQueryPayload()
            };

            var context = new MessageContext(message, output);
            await sut.Handle(context);

            /* When */
            await sut.Handle(new MessageContext(new OperationMessage()
            {
                Id = "1",
                Type = MessageType.GQL_STOP
            }, output));

            /* Then */
            var subscription = sut.GetSubscription(message.Id);

            Assert.Equal(default, subscription);
Ejemplo n.º 8
0
        private async Task <List <T> > ToListAsync <T>(
            QueryStream createStreamQuery,
            Query <T> createQuery,
            string queryText,
            QueryRequestOptions requestOptions)
        {
            HttpStatusCode expectedStatus     = HttpStatusCode.OK;
            FeedIterator   feedStreamIterator = createStreamQuery(queryText, null, requestOptions);
            List <T>       streamResults      = new List <T>();

            while (feedStreamIterator.HasMoreResults)
            {
                ResponseMessage response = await feedStreamIterator.ReadNextAsync();

                response.EnsureSuccessStatusCode();
                Assert.AreEqual(expectedStatus, response.StatusCode);

                StreamReader sr     = new StreamReader(response.Content);
                string       result = await sr.ReadToEndAsync();

                ICollection <T> responseResults;
                responseResults = JsonConvert.DeserializeObject <CosmosFeedResponseUtil <T> >(result).Data;

                Assert.IsTrue(responseResults.Count <= 1);

                streamResults.AddRange(responseResults);
            }

            string   continuationToken  = null;
            List <T> pagedStreamResults = new List <T>();

            do
            {
                FeedIterator    pagedFeedIterator = createStreamQuery(queryText, continuationToken, requestOptions);
                ResponseMessage response          = await pagedFeedIterator.ReadNextAsync();

                response.EnsureSuccessStatusCode();
                Assert.AreEqual(expectedStatus, response.StatusCode);

                IEnumerable <T> responseResults = TestCommon.SerializerCore.FromStream <CosmosFeedResponseUtil <T> >(response.Content).Data;
                Assert.IsTrue(responseResults.Count() <= 1);

                pagedStreamResults.AddRange(responseResults);
                continuationToken = response.Headers.ContinuationToken;
                Assert.AreEqual(response.ContinuationToken, response.Headers.ContinuationToken);
            } while (continuationToken != null);

            Assert.AreEqual(pagedStreamResults.Count, streamResults.Count);

            // Both lists should be the same if not PermssionsProperties. PermissionProperties will have a different ResouceToken in the payload when read.
            string streamResultString      = JsonConvert.SerializeObject(streamResults);
            string streamPagedResultString = JsonConvert.SerializeObject(pagedStreamResults);

            if (typeof(T) != typeof(PermissionProperties))
            {
                Assert.AreEqual(streamPagedResultString, streamResultString);
            }

            FeedIterator <T> feedIterator = createQuery(queryText, null, requestOptions);
            List <T>         results      = new List <T>();

            while (feedIterator.HasMoreResults)
            {
                FeedResponse <T> response = await feedIterator.ReadNextAsync();

                Assert.AreEqual(expectedStatus, response.StatusCode);
                Assert.IsTrue(response.Count <= 1);
                Assert.IsTrue(response.Resource.Count() <= 1);

                results.AddRange(response);
            }

            continuationToken = null;
            List <T> pagedResults = new List <T>();

            do
            {
                FeedIterator <T> pagedFeedIterator = createQuery(queryText, continuationToken, requestOptions);
                FeedResponse <T> response          = await pagedFeedIterator.ReadNextAsync();

                Assert.AreEqual(expectedStatus, response.StatusCode);
                Assert.IsTrue(response.Count <= 1);
                Assert.IsTrue(response.Resource.Count() <= 1);
                pagedResults.AddRange(response);
                continuationToken = response.ContinuationToken;
            } while (continuationToken != null);

            Assert.AreEqual(pagedResults.Count, results.Count);

            // Both lists should be the same
            string resultString      = JsonConvert.SerializeObject(results);
            string pagedResultString = JsonConvert.SerializeObject(pagedResults);

            if (typeof(T) != typeof(PermissionProperties))
            {
                Assert.AreEqual(pagedResultString, resultString);
                Assert.AreEqual(streamPagedResultString, resultString);
            }

            return(results);
        }
Ejemplo n.º 9
0
        private async Task <List <T> > ToListAsync <T>(
            QueryStream createStreamQuery,
            Query <T> createQuery,
            string queryText,
            QueryRequestOptions requestOptions)
        {
            FeedIterator feedStreamIterator = createStreamQuery(queryText, null, requestOptions);
            List <T>     streamResults      = new List <T>();

            while (feedStreamIterator.HasMoreResults)
            {
                ResponseMessage response = await feedStreamIterator.ReadNextAsync();

                response.EnsureSuccessStatusCode();

                StreamReader sr     = new StreamReader(response.Content);
                string       result = await sr.ReadToEndAsync();

                ICollection <T> responseResults = JsonConvert.DeserializeObject <CosmosFeedResponseUtil <T> >(result).Data;
                Assert.IsTrue(responseResults.Count <= 1);

                streamResults.AddRange(responseResults);
            }

            string   continuationToken  = null;
            List <T> pagedStreamResults = new List <T>();

            do
            {
                FeedIterator    pagedFeedIterator = createStreamQuery(queryText, continuationToken, requestOptions);
                ResponseMessage response          = await pagedFeedIterator.ReadNextAsync();

                response.EnsureSuccessStatusCode();

                ICollection <T> responseResults = TestCommon.Serializer.FromStream <CosmosFeedResponseUtil <T> >(response.Content).Data;
                Assert.IsTrue(responseResults.Count <= 1);

                pagedStreamResults.AddRange(responseResults);
                continuationToken = response.Headers.ContinuationToken;
                Assert.AreEqual(response.ContinuationToken, response.Headers.ContinuationToken);
            } while (continuationToken != null);

            Assert.AreEqual(pagedStreamResults.Count, streamResults.Count);

            // Both lists should be the same
            string streamResultString      = JsonConvert.SerializeObject(streamResults);
            string streamPagedResultString = JsonConvert.SerializeObject(pagedStreamResults);

            Assert.AreEqual(streamPagedResultString, streamResultString);

            FeedIterator <T> feedIterator = createQuery(queryText, null, requestOptions);
            List <T>         results      = new List <T>();

            while (feedIterator.HasMoreResults)
            {
                FeedResponse <T> iterator = await feedIterator.ReadNextAsync();

                Assert.IsTrue(iterator.Count <= 1);
                Assert.IsTrue(iterator.Resource.Count() <= 1);

                results.AddRange(iterator);
            }

            continuationToken = null;
            List <T> pagedResults = new List <T>();

            do
            {
                FeedIterator <T> pagedFeedIterator = createQuery(queryText, continuationToken, requestOptions);
                FeedResponse <T> iterator          = await pagedFeedIterator.ReadNextAsync();

                Assert.IsTrue(iterator.Count <= 1);
                Assert.IsTrue(iterator.Resource.Count() <= 1);
                pagedResults.AddRange(iterator);
                continuationToken = iterator.ContinuationToken;
            } while (continuationToken != null);

            Assert.AreEqual(pagedResults.Count, results.Count);

            // Both lists should be the same
            string resultString      = JsonConvert.SerializeObject(results);
            string pagedResultString = JsonConvert.SerializeObject(pagedResults);

            Assert.AreEqual(pagedResultString, resultString);

            Assert.AreEqual(streamPagedResultString, resultString);
            return(results);
        }
Ejemplo n.º 10
0
 internal Subscriber(QueryStream <TElement> outer)
 {
     this.outer = outer;
 }