예제 #1
0
 public OrderingDbDataSeeder(
     ILogger <OrderingDbDataSeeder> logger,
     IExecutionPolicy policy,
     IDbDataProvider <IEnumerable <OrderStatus> > orderStatusDataProvider,
     IDbDataProvider <IEnumerable <CardType> > cardTypesDataProvider)
 {
     _logger = logger;
     _policy = policy;
     _orderStatusDataProvider = orderStatusDataProvider;
     _cardTypesDataProvider   = cardTypesDataProvider;
 }
예제 #2
0
        protected override async Task <BoltResponse> RunQuery(BoltGraphClient graphClient, CypherQuery query,
                                                              IExecutionPolicy policy, string commandDescription)
        {
            var result = await BoltTransaction.DriverTransaction.RunAsync(query, graphClient).ConfigureAwait(false);

            var resp = new BoltResponse {
                StatementResult = result
            };

            return(resp);
        }
예제 #3
0
        private void CheckTransactionEnvironmentWithPolicy(IExecutionPolicy policy)
        {
            var inTransaction = InTransaction;

            if (inTransaction && policy.TransactionExecutionPolicy == TransactionExecutionPolicy.Denied)
            {
                throw new InvalidOperationException("Cannot be done inside a transaction scope.");
            }

            if (!inTransaction && policy.TransactionExecutionPolicy == TransactionExecutionPolicy.Required)
            {
                throw new InvalidOperationException("Cannot be done outside a transaction scope.");
            }
        }
예제 #4
0
 public static Uri AddPath(this Uri startUri, object startReference, IExecutionPolicy policy)
 {
     return(policy.AddPath(startUri, startReference));
 }
예제 #5
0
 public JobExecutor(IJobExecutionEngine defaultExecutionEngine)
 {
     _defaultPolicy = new ApplyToAllPolicy(defaultExecutionEngine);
 }
예제 #6
0
        public Task<HttpResponseMessage> EnqueueTask(string commandDescription, IGraphClient client, IExecutionPolicy policy, CypherQuery query)
        {
            // grab the endpoint in the same thread
            var txBaseEndpoint = policy.BaseEndpoint;
            var serializedQuery = policy.SerializeRequest(query);
            var task = new Task<HttpResponseMessage>(() =>
                Request.With(client.ExecutionConfiguration)
                    .Post(Endpoint ?? txBaseEndpoint)
                    .WithJsonContent(serializedQuery)
                    // HttpStatusCode.Created may be returned when emitting the first query on a transaction
                    .WithExpectedStatusCodes(HttpStatusCode.OK, HttpStatusCode.Created)
                    .ExecuteAsync(
                        commandDescription,
                        responseTask =>
                        {
                            // we need to check for errors returned by the transaction. The difference with a normal REST cypher
                            // query is that the errors are embedded within the result object, instead of having a 400 bad request
                            // status code.
                            var response = responseTask.Result;
                            policy.AfterExecution(TransactionHttpUtils.GetMetadataFromResponse(response), this);

                            return response;
                        })
                    .Result
            );
            _taskQueue.Add(task, _cancellationTokenSource.Token);

            if (_consumer == null)
            {
                _consumer = () =>
                {
                    while (true)
                    {
                        try
                        {
                            Task queuedTask;
                            if (!_taskQueue.TryTake(out queuedTask, 0, _cancellationTokenSource.Token))
                            {
                                // no items to consume
                                _consumer = null;
                                break;
                            }
                            queuedTask.RunSynchronously();
                        }
                        catch (InvalidOperationException)
                        {
                            // we are done, CompleteAdding has been called
                            break;
                        }
                        catch (OperationCanceledException)
                        {
                            // we are done, we were canceled
                            break;
                        }
                    }
                };

                _consumer.BeginInvoke(null, null);
            }

            return task;
        }
예제 #7
0
        public Task <BoltResponse> EnqueueTask(string commandDescription, BoltGraphClient graphClient, IExecutionPolicy policy, CypherQuery query)
        {
            var task = new Task <BoltResponse>(() =>
            {
                var result = BoltTransaction.DriverTransaction.Run(query, graphClient);

                var resp = new BoltResponse {
                    StatementResult = result
                };
                return(resp);
            }
                                               );

            taskQueue.Add(task, cancellationTokenSource.Token);

            if (consumer == null)
            {
                consumer = () =>
                {
                    while (true)
                    {
                        try
                        {
                            Task queuedTask;
                            if (!taskQueue.TryTake(out queuedTask, 0, cancellationTokenSource.Token))
                            {
                                // no items to consume
                                consumer = null;
                                break;
                            }
                            queuedTask.RunSynchronously();
                        }
                        catch (InvalidOperationException)
                        {
                            // we are done, CompleteAdding has been called
                            break;
                        }
                        catch (OperationCanceledException)
                        {
                            // we are done, we were canceled
                            break;
                        }
                    }
                };

                consumer.BeginInvoke(null, null);
            }

            return(task);
        }
예제 #8
0
        public Task <HttpResponseMessage> EnqueueTask(string commandDescription, IGraphClient client, IExecutionPolicy policy, CypherQuery query)
        {
            // grab the endpoint in the same thread
            var txBaseEndpoint  = policy.BaseEndpoint;
            var serializedQuery = policy.SerializeRequest(query);

            CustomHeaders = query.CustomHeaders;
            var task = new Task <HttpResponseMessage>(() =>
                                                      Request.With(client.ExecutionConfiguration, query.CustomHeaders, query.MaxExecutionTime)
                                                      .Post(Endpoint ?? txBaseEndpoint)
                                                      .WithJsonContent(serializedQuery)
                                                      // HttpStatusCode.Created may be returned when emitting the first query on a transaction
                                                      .WithExpectedStatusCodes(HttpStatusCode.OK, HttpStatusCode.Created)
                                                      .ExecuteAsync(
                                                          commandDescription,
                                                          responseTask =>
            {
                // we need to check for errors returned by the transaction. The difference with a normal REST cypher
                // query is that the errors are embedded within the result object, instead of having a 400 bad request
                // status code.
                var response = responseTask.Result;
                policy.AfterExecution(TransactionHttpUtils.GetMetadataFromResponse(response), this);

                return(response);
            })
                                                      .Result
                                                      );

            taskQueue.Add(task, cancellationTokenSource.Token);

            if (consumer == null)
            {
                consumer = () =>
                {
                    while (true)
                    {
                        try
                        {
                            Task queuedTask;
                            if (!taskQueue.TryTake(out queuedTask, 0, cancellationTokenSource.Token))
                            {
                                // no items to consume
                                consumer = null;
                                break;
                            }
                            queuedTask.RunSynchronously();
                        }
                        catch (InvalidOperationException)
                        {
                            // we are done, CompleteAdding has been called
                            break;
                        }
                        catch (OperationCanceledException)
                        {
                            // we are done, we were canceled
                            break;
                        }
                    }
                };

                consumer.BeginInvoke(null, null);
            }

            return(task);
        }
 public static Uri AddPath(this Uri startUri, object startReference, IExecutionPolicy policy)
 {
     return policy.AddPath(startUri, startReference);
 }
예제 #10
0
        public async Task <TResponse> EnqueueTask(string commandDescription, TClient graphClient, IExecutionPolicy policy, CypherQuery query)
        {
            var taskCompletion = new TaskCompletionSource <TResponse>();

            try
            {
                var localPreviousTask = Interlocked.Exchange(ref previousTask, taskCompletion.Task);
                if (localPreviousTask != null)
                {
                    await localPreviousTask.ConfigureAwait(false);
                }
                var resp = await RunQuery(graphClient, query, policy, commandDescription).ConfigureAwait(false);

                taskCompletion.SetResult(resp);
            }
            catch (OperationCanceledException)
            {
                taskCompletion.SetCanceled();
            }
            catch (Exception e)
            {
                taskCompletion.SetException(e);
            }

            return(await taskCompletion.Task.ConfigureAwait(false));
        }
예제 #11
0
 protected abstract Task <TResponse> RunQuery(TClient client, CypherQuery query, IExecutionPolicy policy, string commandDescription);
예제 #12
0
        protected override Task <HttpResponseMessage> RunQuery(IGraphClient client, CypherQuery query, IExecutionPolicy policy, string commandDescription)
        {
            var txBaseEndpoint  = policy.BaseEndpoint((policy.InTransaction) ? policy.Database : query.Database, !policy.InTransaction);
            var serializedQuery = policy.SerializeRequest(query);

            CustomHeaders = query.CustomHeaders;
            return(Request.With(client.ExecutionConfiguration, query.CustomHeaders, query.MaxExecutionTime)
                   .Post(Endpoint ?? txBaseEndpoint)
                   .WithJsonContent(serializedQuery)
                   // HttpStatusCode.Created may be returned when emitting the first query on a transaction
                   .WithExpectedStatusCodes(HttpStatusCode.OK, HttpStatusCode.Created)
                   .ExecuteAsync(
                       commandDescription,
                       response =>
            {
                // we need to check for errors returned by the transaction. The difference with a normal REST cypher
                // query is that the errors are embedded within the result object, instead of having a 400 bad request
                // status code.
                policy.AfterExecution(TransactionHttpUtils.GetMetadataFromResponse(response), this);

                return response;
            }));
        }