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)); } }
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)); }
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)); } } }
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)); }
public IndexReadStreamResult ReadStreamEventsBackward(string streamName, TStreamId streamId, long fromEventNumber, int maxCount) => _readIndex.ReadStreamEventsBackward(streamName, streamId, fromEventNumber, maxCount);
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)); }
public static IndexReadStreamResult ReadStreamEventsBackward(this IReadIndex <string> index, string streamName, long fromEventNumber, int maxCount) => index.ReadStreamEventsBackward(streamName, streamName, fromEventNumber, maxCount);