Example #1
0
        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);
        }
Example #2
0
        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();
            }
        }
Example #3
0
        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);
            });
        }
Example #4
0
        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);
            });
        }
Example #5
0
        /// <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;
        }
Example #6
0
        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();
            }
        }