コード例 #1
0
        private ClientMessage.ReadStreamEventsForwardCompleted ReadStreamEventsForward(ClientMessage.ReadStreamEventsForward 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.ReadStreamEventsForward(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.ReadStreamEventsForwardCompleted(
                           msg.CorrelationId, msg.EventStreamId, msg.FromEventNumber, msg.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 ReadStreamEventsForward request.");
                return(NoData(msg, ReadStreamResult.Error, lastCommitPosition, exc.Message));
            }
        }