예제 #1
0
        private Task <StreamEventsPage> ReadSteamBackwards(string streamId, int start, int count)
        {
            var connection = _getConnection();

            var results = connection.Table <SqliteEvent>()
                          .Where(e => e.StreamId == streamId)
                          .OrderByDescending(e => e.SequenceNumber)
                          .Skip(start)
                          .Take(count)
                          // Must enumerate the results before selecting a StreamEvent else activation
                          // exception from Sqlite.Net trying create a StreamEvent. Comment out the
                          // line below if you want to see the test(s) fail.
                          .ToArray()
                          .Select(@event => @event.ToStreamEvent())
                          .ToArray();

            var streamEventsPage = new StreamEventsPage(
                streamId: streamId,
                status: PageReadStatus.Success,
                fromStreamVersion: start,
                nextStreamVersion: results[0].StreamVersion - 1,
                lastStreamVersion: results[0].StreamVersion,
                direction: ReadDirection.Backward,
                isEndOfStream: true,
                events: results);

            return(Task.FromResult(streamEventsPage));
        }
예제 #2
0
 public ReadStreamTheory(
     string streamId,
     int start,
     int pageSize,
     StreamEventsPage expectedStreamEventsPage)
 {
     StreamId = streamId;
     Start    = start;
     PageSize = pageSize;
     ExpectedStreamEventsPage = expectedStreamEventsPage;
 }
        protected override Task <StreamEventsPage> ReadStreamBackwardsInternal(
            string streamId,
            int fromVersionInclusive,
            int count,
            CancellationToken cancellationToken = new CancellationToken())
        {
            if (_isDisposed)
            {
                throw new ObjectDisposedException(nameof(InMemoryEventStore));
            }

            _lock.EnterReadLock();
            try
            {
                InMemoryStream stream;
                if (!_streams.TryGetValue(streamId, out stream))
                {
                    var notFound = new StreamEventsPage(streamId,
                                                        PageReadStatus.StreamNotFound,
                                                        fromVersionInclusive,
                                                        -1,
                                                        -1,
                                                        ReadDirection.Backward,
                                                        true);
                    return(Task.FromResult(notFound));
                }
                if (stream.IsDeleted)
                {
                    var deleted = new StreamEventsPage(streamId,
                                                       PageReadStatus.StreamDeleted,
                                                       fromVersionInclusive,
                                                       0,
                                                       0,
                                                       ReadDirection.Backward,
                                                       true);
                    return(Task.FromResult(deleted));
                }

                var events = new List <StreamEvent>();
                var i      = fromVersionInclusive == StreamVersion.End ? stream.Events.Count - 1 : fromVersionInclusive;
                while (i >= 0 && count > 0)
                {
                    var inMemoryStreamEvent = stream.Events[i];
                    var streamEvent         = new StreamEvent(
                        streamId,
                        inMemoryStreamEvent.EventId,
                        inMemoryStreamEvent.StreamVersion,
                        inMemoryStreamEvent.Checkpoint,
                        inMemoryStreamEvent.Created,
                        inMemoryStreamEvent.Type,
                        inMemoryStreamEvent.JsonData,
                        inMemoryStreamEvent.JsonMetadata);
                    events.Add(streamEvent);

                    i--;
                    count--;
                }

                var lastStreamVersion = stream.Events.Last().StreamVersion;
                var nextStreamVersion = events.Last().StreamVersion - 1;
                var endOfStream       = nextStreamVersion < 0;

                var page = new StreamEventsPage(
                    streamId,
                    PageReadStatus.Success,
                    fromVersionInclusive,
                    nextStreamVersion,
                    lastStreamVersion,
                    ReadDirection.Backward,
                    endOfStream,
                    events.ToArray());

                return(Task.FromResult(page));
            }
            finally
            {
                _lock.ExitReadLock();
            }
        }