コード例 #1
0
        private ClientMessage.ReadStreamEventsBackwardCompleted ReadStreamEventsBackward(ClientMessage.ReadStreamEventsBackward msg)
        {
            var lastCommitPosition = _readIndex.LastCommitPosition;

            try
            {
                if (msg.ValidationStreamVersion.HasValue && _readIndex.GetLastStreamEventNumber(msg.EventStreamId) == msg.ValidationStreamVersion)
                {
                    return(NoData(msg, ReadStreamResult.NotModified, lastCommitPosition));
                }
                var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User);
                if (!access.Granted)
                {
                    return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                }

                var result = _readIndex.ReadStreamEventsBackward(msg.EventStreamId, msg.FromEventNumber, msg.MaxCount);
                CheckEventsOrder(msg, result);
                var resolvedPairs = ResolveLinkToEvents(result.Records, msg.ResolveLinkTos, msg.User);
                if (resolvedPairs == null)
                {
                    return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                }

                return(new ClientMessage.ReadStreamEventsBackwardCompleted(
                           msg.CorrelationId, msg.EventStreamId, result.FromEventNumber, result.MaxCount,
                           (ReadStreamResult)result.Result, resolvedPairs, result.Metadata, access.Public, string.Empty,
                           result.NextEventNumber, result.LastEventNumber, result.IsEndOfStream, lastCommitPosition));
            }
            catch (Exception exc)
            {
                Log.ErrorException(exc, "Error during processing ReadStreamEventsBackward request.");
                return(NoData(msg, ReadStreamResult.Error, lastCommitPosition, exc.Message));
            }
        }
コード例 #2
0
        void IHandle <ClientMessage.ReadStreamEventsBackward> .Handle(ClientMessage.ReadStreamEventsBackward message)
        {
            var lastCommitPosition = _readIndex.LastCommitPosition;

            EventRecord[] records;
            var           result          = _readIndex.ReadStreamEventsBackward(message.EventStreamId, message.FromEventNumber, message.MaxCount, out records);
            var           nextEventNumber = result == RangeReadResult.Success & records.Length > 0
                                      ? records[records.Length - 1].EventNumber - 1
                                      : -1;

            if (result == RangeReadResult.Success && records.Length > 1)
            {
                for (var index = 1; index < records.Length; index++)
                {
                    if (records[index].EventNumber != records[index - 1].EventNumber - 1)
                    {
                        throw new Exception(string.Format(
                                                "Invalid order of events has been detected in read index for the event stream '{0}'. "
                                                + "The event {1} at position {2} goes after the event {3} at position {4}",
                                                message.EventStreamId,
                                                records[index].EventNumber,
                                                records[index].LogPosition,
                                                records[index - 1].EventNumber,
                                                records[index - 1].LogPosition));
                    }
                }
            }
            EventLinkPair[] resolvedPairs;
            if (result == RangeReadResult.Success && message.ResolveLinks)
            {
                resolvedPairs = ResolveLinkToEvents(records);
            }
            else
            {
                resolvedPairs = new EventLinkPair[records.Length];
                for (int i = 0; i < records.Length; ++i)
                {
                    resolvedPairs[i] = new EventLinkPair(records[i], null);
                }
            }

            message.Envelope.ReplyWith(
                new ClientMessage.ReadStreamEventsBackwardCompleted(message.CorrelationId,
                                                                    message.EventStreamId,
                                                                    resolvedPairs,
                                                                    result,
                                                                    nextEventNumber,
                                                                    records.Length == 0 ? lastCommitPosition : (long?)null));
        }
コード例 #3
0
        private ClientMessage.ReadStreamEventsBackwardCompleted ReadStreamEventsBackward(ClientMessage.ReadStreamEventsBackward msg)
        {
            using (HistogramService.Measure(_readerStreamRangeHistogram))
            {
                var lastCommitPosition = _readIndex.LastReplicatedPosition;
                try
                {
                    if (msg.MaxCount > MaxPageSize)
                    {
                        throw new ArgumentException(string.Format("Read size too big, should be less than {0} items",
                                                                  MaxPageSize));
                    }
                    if (msg.ValidationStreamVersion.HasValue &&
                        _readIndex.GetStreamLastEventNumber(msg.EventStreamId) == msg.ValidationStreamVersion)
                    {
                        return(NoData(msg, ReadStreamResult.NotModified, lastCommitPosition,
                                      msg.ValidationStreamVersion.Value));
                    }

                    var access = _readIndex.CheckStreamAccess(msg.EventStreamId, StreamAccessType.Read, msg.User);
                    if (!access.Granted)
                    {
                        return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                    }

                    var result = _readIndex.ReadStreamEventsBackward(msg.EventStreamId, msg.FromEventNumber,
                                                                     msg.MaxCount);
                    CheckEventsOrder(msg, result);
                    var resolvedPairs = ResolveLinkToEvents(result.Records, msg.ResolveLinkTos, msg.User);
                    if (resolvedPairs == null)
                    {
                        return(NoData(msg, ReadStreamResult.AccessDenied, lastCommitPosition));
                    }

                    return(new ClientMessage.ReadStreamEventsBackwardCompleted(
                               msg.CorrelationId, msg.EventStreamId, result.FromEventNumber, result.MaxCount,
                               (ReadStreamResult)result.Result, resolvedPairs, result.Metadata, access.Public, string.Empty,
                               result.NextEventNumber, result.LastEventNumber, result.IsEndOfStream, lastCommitPosition));
                }
                catch (Exception exc)
                {
                    Log.ErrorException(exc, "Error during processing ReadStreamEventsBackward request.");
                    return(NoData(msg, ReadStreamResult.Error, lastCommitPosition, error: exc.Message));
                }
            }
        }
コード例 #4
0
        void IHandle <ClientMessage.ReadStreamEventsBackward> .Handle(ClientMessage.ReadStreamEventsBackward message)
        {
            var lastCommitPosition = _readIndex.LastCommitPosition;

            var result = _readIndex.ReadStreamEventsBackward(message.EventStreamId, message.FromEventNumber, message.MaxCount);

            if (result.Result == RangeReadResult.Success && result.Records.Length > 1)
            {
                var records = result.Records;
                for (var index = 1; index < records.Length; index++)
                {
                    if (records[index].EventNumber != records[index - 1].EventNumber - 1)
                    {
                        throw new Exception(string.Format(
                                                "Invalid order of events has been detected in read index for the event stream '{0}'. "
                                                + "The event {1} at position {2} goes after the event {3} at position {4}",
                                                message.EventStreamId,
                                                records[index].EventNumber,
                                                records[index].LogPosition,
                                                records[index - 1].EventNumber,
                                                records[index - 1].LogPosition));
                    }
                }
            }
            var resolvedPairs = ResolveLinkToEvents(result.Records, message.ResolveLinks);

            message.Envelope.ReplyWith(
                new ClientMessage.ReadStreamEventsBackwardCompleted(message.CorrelationId,
                                                                    message.EventStreamId,
                                                                    resolvedPairs,
                                                                    result.Result,
                                                                    result.NextEventNumber,
                                                                    result.LastEventNumber,
                                                                    result.IsEndOfStream,
                                                                    result.IsEndOfStream ? lastCommitPosition : (long?)null));
        }
コード例 #5
0
 public IndexReadStreamResult ReadStreamEventsBackward(string streamName, TStreamId streamId, long fromEventNumber, int maxCount) =>
 _readIndex.ReadStreamEventsBackward(streamName, streamId, fromEventNumber, maxCount);
コード例 #6
0
        public static IndexReadStreamResult ReadStreamEventsBackward <TStreamId>(this IReadIndex <TStreamId> self, string streamName, long fromEventNumber, int maxCount)
        {
            var streamId = self.GetStreamId(streamName);

            return(self.ReadStreamEventsBackward(streamName, streamId, fromEventNumber, maxCount));
        }
コード例 #7
0
 public static IndexReadStreamResult ReadStreamEventsBackward(this IReadIndex <string> index, string streamName, long fromEventNumber, int maxCount) =>
 index.ReadStreamEventsBackward(streamName, streamName, fromEventNumber, maxCount);