public void Save(IEventProvider eventProvider) { if (!_isRunningWithinTransaction) { throw new Exception("Opperation is not running within a transaction"); } var version = GetEventProviderVersion(eventProvider, _sqLiteTransaction); if (version != eventProvider.Version) { throw new ConcurrencyViolationException(); } foreach (var domainEvent in eventProvider.GetChanges()) { SaveEvent(domainEvent, eventProvider, _sqLiteTransaction); } eventProvider.UpdateVersion(eventProvider.Version + eventProvider.GetChanges().Count()); UpdateEventProviderVersion(eventProvider, _sqLiteTransaction); }
static void UpdateEventProviderVersion(IEventProvider eventProvider, SqlTransaction transaction) { int numberOfChanges = eventProvider.GetChanges().Count(); const string commandText = "UPDATE EventProvider SET Version = Version + @numberOfChanges WHERE EventProviderId = @eventProviderId"; using (var command = new SqlCommand(commandText, transaction.Connection, transaction)) { command.Parameters.Add(new SqlParameter("@eventProviderId", eventProvider.Id)); command.Parameters.Add(new SqlParameter("@numberOfChanges", numberOfChanges)); command.ExecuteNonQuery(); } }
public void Save(IEventProvider eventProvider) { Within.Transaction(_dbConfig.ConnectionString, transaction => { int version = GetEventProviderVersion(eventProvider.Id, transaction); if (version == -1) StoreEventProvider(eventProvider, transaction); if (version > eventProvider.Version) throw new ConcurrencyViolationException(); eventProvider.GetChanges().ForEach(e => StoreChange(e, eventProvider.Id, transaction)); UpdateEventProviderVersion(eventProvider, transaction); }); }
public void Save(IEventProvider eventProvider) { Within.Transaction(_dbConfig.ConnectionString, transaction => { int version = GetEventProviderVersion(eventProvider.Id, transaction); if (version == -1) { StoreEventProvider(eventProvider, transaction); } if (version > eventProvider.Version) { throw new ConcurrencyViolationException(); } eventProvider.GetChanges().ForEach(e => StoreChange(e, eventProvider.Id, transaction)); UpdateEventProviderVersion(eventProvider, transaction); }); }
/// <summary> /// Saves all events from an event provider. /// </summary> /// <param name="provider">The event provider.</param> /// <returns>The events that are saved.</returns> public IEnumerable<IEvent> Save(IEventProvider provider) { // Get all events. IEnumerable<IEvent> events = provider.GetChanges(); // Create new connection. using (var connection = new SqlConnection(ConnectionString)) { // Open connection and begin a transaction so we can // commit or rollback all the changes that has been made. connection.Open(); SqlTransaction transaction = connection.BeginTransaction(); try { // Get the current version of the event provider. int? currentVersion = GetVersion(provider.Id, transaction); // Create new event provider when it is not found. if (currentVersion == null) { CreateEventProvider(provider, transaction); } else if (currentVersion.Value != provider.Version) { throw new ConcurrencyException(provider.Version, currentVersion.Value); } // Save all events to the store. SaveEvents(events, provider.Id, transaction); // Update the version of the provider. UpdateEventProviderVersion(provider, transaction); // Everything is handled, commint transaction. transaction.Commit(); } catch { // Something went wrong, rollback transaction. transaction.Rollback(); throw; } } return events; }