public EventStream <T> Load <T>(string aggregateId, int version) { if (string.IsNullOrWhiteSpace(aggregateId)) { throw new ArgumentException("An aggregate ID is required", "aggregateId"); } if (version == EventStreamVersion.NoStream) { throw new ArgumentOutOfRangeException("version", "By definition you cannot load a stream when specifying the EventStreamVersion.NoStream (-1) value."); } _logger.Debug(this, "Loading " + typeof(T) + " version " + EventStreamVersion.GetName(version) + " from stream " + aggregateId); using (var transaction = GetTransaction()) using (var connection = GetConnection()) { connection.Open(); var command = connection.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = @"select * from AggregateRootEvent where AggregateId = @aggregateId and Version <= @Version order by Version;"; var aggregateIdParameter = command.Parameters.Add("@AggregateId", SqlDbType.UniqueIdentifier); var versionParameter = command.Parameters.Add("@Version", SqlDbType.Int); aggregateIdParameter.Value = Guid.Parse(aggregateId); versionParameter.Value = version == EventStreamVersion.Max ? int.MaxValue : version; var reader = command.ExecuteReader(CommandBehavior.SequentialAccess); var events = new List <IEvent>(); while (reader.Read()) { events.Add((IEvent)JsonConvert.DeserializeObject(reader.GetString(3), GetJsonSerialisationSettings())); } if (events.Count == 0) { return(null); } var result = new EventStream <T>(aggregateId); result.Append(events); if (version != EventStreamVersion.Max && result.GetVersion() != version) { var exception = new ArgumentOutOfRangeException("version", version, string.Format("Event for version {0} could not be found for stream {1}", version, aggregateId)); exception.Data.Add("Existing stream", events); throw exception; } transaction.Complete(); return(result); } }
public EventStream <T> Load <T>(string aggregateId, int version) { if (string.IsNullOrWhiteSpace(aggregateId)) { throw new ArgumentException("An aggregate ID is required", "aggregateId"); } if (version == EventStreamVersion.NoStream) { throw new ArgumentOutOfRangeException("version", "By definition you cannot load a stream when specifying the EventStreamVersion.NoStream (-1) value."); } _logger.Debug(this, "Loading " + typeof(T) + " version " + version + " from stream " + aggregateId); var streamEvents = new List <ResolvedEvent>(); StreamEventsSlice currentSlice; var nextSliceStart = StreamPosition.Start; do { currentSlice = _eventStoreConnection.ReadStreamEventsForwardAsync(aggregateId, nextSliceStart, 200, false).Result; nextSliceStart = currentSlice.NextEventNumber; foreach (var evt in currentSlice.Events) { streamEvents.Add(evt); if (evt.OriginalEventNumber == version) { break; } } } while (!currentSlice.IsEndOfStream); if (streamEvents.Count == 0) { return(null); } var domainEvents = streamEvents.Select(x => BuildDomainEvent(x.OriginalEvent.Data, x.OriginalEvent.Metadata)).ToList(); var result = new EventStream <T>(aggregateId); result.Append(domainEvents); if (version != EventStreamVersion.Max && result.GetVersion() != version) { var exception = new ArgumentOutOfRangeException("version", version, string.Format("Event for version {0} could not be found for stream {1}", version, aggregateId)); exception.Data.Add("Existing stream", domainEvents); throw exception; } return(result); }
public Task <EventStream> LoadEventStreamAsync(IIdentity identity, int skipEvents, int maxCount) { var eventStream = new EventStream(identity, 0, events: null, timeStamp: DateTimeOffset.Now); foreach (var @event in _store.Where(s => s.Identity.Equals(identity)) .Skip((int)skipEvents) .Take(maxCount)) { eventStream.Append(@event); } return(Task.FromResult(eventStream)); }
public async Task <EventStream> LoadEventStreamAsync(IIdentity identity, long skipEvents, int maxCount) { var eventStream = new EventStream(identity, 0, events: null, timeStamp: DateTimeOffset.MinValue); using (var conn = this._dbConnectionFactory.Get()) { using (var reader = await conn.ExecuteReaderAsync($"select * from EventStream where id=@id and version > @skipVersion limit {maxCount}", new { Id = identity.ToString(), SkipVersion = skipEvents })) { while (reader.Read()) { eventStream.Append(new EventStream(identity, reader.GetInt32(reader.GetOrdinal("version")), reader.GetString(reader.GetOrdinal("data")), DateTimeOffset.Parse(reader.GetString(reader.GetOrdinal("timestamp"))))); } } } return(eventStream); }