public override async Task <IStatementResultCursor> RunInExplicitTransactionAsync(IConnection connection,
                                                                                          Statement statement, bool reactive, long fetchSize = Config.Infinite)
        {
            var summaryBuilder = new SummaryBuilder(statement, connection.Server);
            var streamBuilder  = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync,
                                                                  RequestMore(connection, summaryBuilder, null),
                                                                  CancelRequest(connection, summaryBuilder, null), null,
                                                                  fetchSize, reactive);
            var runHandler = new V4.RunResponseHandler(streamBuilder, summaryBuilder);

            var pullMessage = default(PullMessage);
            var pullHandler = default(V4.PullResponseHandler);

            if (!reactive)
            {
                pullMessage = new PullMessage(fetchSize);
                pullHandler = new V4.PullResponseHandler(streamBuilder, summaryBuilder, null);
            }

            await connection.EnqueueAsync(new RunWithMetadataMessage(statement),
                                          runHandler, pullMessage, pullHandler)
            .ConfigureAwait(false);

            await connection.SendAsync().ConfigureAwait(false);

            return(streamBuilder.CreateCursor());
        }
        public override async Task <IStatementResultCursor> RunInAutoCommitTransactionAsync(IConnection connection,
                                                                                            Statement statement, bool reactive, IBookmarkTracker bookmarkTracker,
                                                                                            IResultResourceHandler resultResourceHandler,
                                                                                            string database, Bookmark bookmark, TransactionConfig configBuilder, long fetchSize = Config.Infinite)
        {
            var summaryBuilder = new SummaryBuilder(statement, connection.Server);
            var streamBuilder  = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync,
                                                                  RequestMore(connection, summaryBuilder, bookmarkTracker),
                                                                  CancelRequest(connection, summaryBuilder, bookmarkTracker),
                                                                  resultResourceHandler,
                                                                  fetchSize, reactive);
            var runHandler = new V4.RunResponseHandler(streamBuilder, summaryBuilder);

            var pullMessage = default(PullMessage);
            var pullHandler = default(V4.PullResponseHandler);

            if (!reactive)
            {
                pullMessage = new PullMessage(fetchSize);
                pullHandler = new V4.PullResponseHandler(streamBuilder, summaryBuilder, bookmarkTracker);
            }

            await connection
            .EnqueueAsync(
                new RunWithMetadataMessage(statement, database, bookmark, configBuilder,
                                           connection.GetEnforcedAccessMode()), runHandler,
                pullMessage, pullHandler)
            .ConfigureAwait(false);

            await connection.SendAsync().ConfigureAwait(false);

            return(streamBuilder.CreateCursor());
        }
        public void ShouldStartInRunRequestedState()
        {
            var builder =
                new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null);

            builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunRequested);
        }
        public void ShouldTransitionToRunCompletedWhenRunCompleted()
        {
            var builder =
                new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null);

            builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunRequested);

            builder.RunCompleted(0, new[] { "a", "b", "c" }, null);
            builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunCompleted);
        }
        public void ShouldTransitionToCompletedWhenPullCompleted()
        {
            var builder =
                new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null)
            {
                CurrentState = StatementResultCursorBuilder.State.RecordsStreaming
            };

            builder.PullCompleted(false, null);
            builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.Completed);
        }
        public void ShouldTransitionToRecordsStreamingStreamingWhenRecordIsPushed()
        {
            var builder =
                new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(), null, null, null);

            builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunRequested);

            builder.RunCompleted(0, new[] { "a", "b", "c" }, null);
            builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RunCompleted);

            builder.PushRecord(new object[] { 1, 2, 3 });
            builder.CurrentState.Should().Be(StatementResultCursorBuilder.State.RecordsStreaming);
        }
示例#7
0
        public async Task <IStatementResultCursor> RunInExplicitTransactionAsync(IConnection connection,
                                                                                 Statement statement, bool reactive)
        {
            var summaryBuilder = new SummaryBuilder(statement, connection.Server);
            var streamBuilder  = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, null, null, null);
            var runHandler     = new V1.RunResponseHandler(streamBuilder, summaryBuilder);
            var pullAllHandler = new V1.PullResponseHandler(streamBuilder, summaryBuilder);
            await connection.EnqueueAsync(new RunMessage(statement), runHandler, PullAll, pullAllHandler)
            .ConfigureAwait(false);

            await connection.SendAsync().ConfigureAwait(false);

            return(streamBuilder.CreateCursor());
        }
示例#8
0
        public async Task <IStatementResultCursor> RunInAutoCommitTransactionAsync(IConnection connection,
                                                                                   Statement statement, bool reactive, IBookmarkTracker bookmarkTracker,
                                                                                   IResultResourceHandler resultResourceHandler,
                                                                                   Bookmark ignored, TransactionConfig txConfig)
        {
            AssertNullOrEmptyTransactionConfig(txConfig);
            var summaryBuilder = new SummaryBuilder(statement, connection.Server);
            var streamBuilder  = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, null, null,
                                                                  resultResourceHandler);
            var runHandler     = new V1.RunResponseHandler(streamBuilder, summaryBuilder);
            var pullAllHandler = new V1.PullResponseHandler(streamBuilder, summaryBuilder);
            await connection.EnqueueAsync(new RunMessage(statement), runHandler, PullAll, pullAllHandler)
            .ConfigureAwait(false);

            await connection.SendAsync().ConfigureAwait(false);

            return(streamBuilder.CreateCursor());
        }
            public async Task ShouldCallMoreOnceAndReturnRecords()
            {
                var actions = new Queue <Action>();
                var builder =
                    new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions),
                                                     MoreFunction(), CancelFunction(), null);

                actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null));
                actions.Enqueue(() => builder.PushRecord(new object[] { 1 }));
                actions.Enqueue(() => builder.PushRecord(new object[] { 2 }));
                actions.Enqueue(() => builder.PushRecord(new object[] { 3 }));
                actions.Enqueue(() => builder.PullCompleted(false, null));

                var list = await builder.CreateCursor().ToListAsync(r => r[0].As <int>());

                list.Should().BeEquivalentTo(1, 2, 3);
                moreCallCount.Should().Be(1);
                cancelCallCount.Should().Be(0);
            }
            public async Task ShouldReturnFirstBatchOfRecordsAndCancel()
            {
                var actions = new Queue <Action>();
                var builder =
                    new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions),
                                                     MoreFunction(), CancelFunction(), null);

                actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null));
                actions.Enqueue(() => builder.PushRecord(new object[] { 1 }));
                actions.Enqueue(() => builder.PushRecord(new object[] { 2 }));
                actions.Enqueue(() => builder.PullCompleted(true, null));
                actions.Enqueue(() => builder.PullCompleted(false, null));

                var cursor = builder.CreateCursor();

                var keys = await cursor.KeysAsync();

                keys.Should().BeEquivalentTo("a");

                var hasRecord1 = await cursor.FetchAsync();

                var record1 = cursor.Current;

                hasRecord1.Should().BeTrue();
                record1[0].Should().Be(1);

                var hasRecord2 = await cursor.FetchAsync();

                var record2 = cursor.Current;

                hasRecord2.Should().BeTrue();
                record2[0].Should().Be(2);

                cursor.Discard();

                var list = await cursor.ToListAsync(r => r[0].As <int>());

                list.Should().BeEmpty();
                moreCallCount.Should().Be(1);
                cancelCallCount.Should().Be(1);
            }
示例#11
0
        public virtual async Task <IStatementResultCursor> RunInAutoCommitTransactionAsync(IConnection connection,
                                                                                           Statement statement, bool reactive, IBookmarkTracker bookmarkTracker,
                                                                                           IResultResourceHandler resultResourceHandler,
                                                                                           Bookmark bookmark, TransactionConfig txConfig)
        {
            var summaryBuilder = new SummaryBuilder(statement, connection.Server);
            var streamBuilder  = new StatementResultCursorBuilder(summaryBuilder, connection.ReceiveOneAsync, null, null,
                                                                  resultResourceHandler);
            var runHandler     = new V3.RunResponseHandler(streamBuilder, summaryBuilder);
            var pullAllHandler = new V3.PullResponseHandler(streamBuilder, summaryBuilder, bookmarkTracker);
            await connection
            .EnqueueAsync(
                new RunWithMetadataMessage(statement, bookmark, txConfig, connection.GetEnforcedAccessMode()),
                runHandler, PullAll,
                pullAllHandler)
            .ConfigureAwait(false);

            await connection.SendAsync().ConfigureAwait(false);

            return(streamBuilder.CreateCursor());
        }
            public async Task ShouldCallCancelAndReturnNoRecords()
            {
                var actions = new Queue <Action>();
                var builder =
                    new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions),
                                                     MoreFunction(), CancelFunction(), null);

                actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null));
                actions.Enqueue(() => builder.PullCompleted(false, null));

                var cursor = builder.CreateCursor();

                var keys = await cursor.KeysAsync();

                keys.Should().BeEquivalentTo("a");

                cursor.Discard();

                var list = await cursor.ToListAsync(r => r[0].As <int>());

                list.Should().BeEmpty();
                moreCallCount.Should().Be(0);
                cancelCallCount.Should().Be(1);
            }
        public async Task ShouldInvokeResourceHandlerWhenCompleted()
        {
            var actions         = new Queue <Action>();
            var resourceHandler = new Mock <IResultResourceHandler>();
            var builder         =
                new StatementResultCursorBuilder(CreateSummaryBuilder(), CreateTaskQueue(actions), null, null,
                                                 resourceHandler.Object);

            actions.Enqueue(() => builder.RunCompleted(0, new[] { "a" }, null));
            actions.Enqueue(() => builder.PushRecord(new object[] { 1 }));
            actions.Enqueue(() => builder.PushRecord(new object[] { 2 }));
            actions.Enqueue(() => builder.PushRecord(new object[] { 3 }));
            actions.Enqueue(() => builder.PullCompleted(false, null));

            var cursor = builder.CreateCursor();

            var hasNext = await cursor.FetchAsync();

            hasNext.Should().BeTrue();
            resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Never);

            hasNext = await cursor.FetchAsync();

            hasNext.Should().BeTrue();
            resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Never);

            hasNext = await cursor.FetchAsync();

            hasNext.Should().BeTrue();
            resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Never);

            hasNext = await cursor.FetchAsync();

            hasNext.Should().BeFalse();
            resourceHandler.Verify(x => x.OnResultConsumedAsync(), Times.Once);
        }