Exemplo n.º 1
0
 public CommitResults Store(CommitsForStorage commits)
 {
     try
     {
         return doStore(commits);
     }
     catch (Exception e)
     {
         throw new EventStorageException(e);
     }
 }
Exemplo n.º 2
0
        public CommitResults Store(CommitsForStorage commits)
        {
            var unSuccessful = new List<Guid>();

            var commitsToSave = commits.Commits.Where(x => x.Events.Length > 0);
            var entries = commitsToSave.OrderBy(x => x.Events.Min(y => y.Timestamp));

            foreach (var commit in entries)
            {
                var expectedVersion = getExpectedVersion(commit);
                var versionForCommit = commit.Events.Length > 0 ? commit.Events.Min(x => x.Sequence) : 0;

                if (expectedVersion != versionForCommit && versionForCommit != ExpectedVersion.Any)
                {
                    unSuccessful.Add(commit.CommitId);
                    continue;
                }

                for (int index = 0; index < commit.Events.Length; index++)
                {
                    var e = commit.Events[index];

                    var version = e.Sequence == -1 ? expectedVersion + index : e.Sequence;

                    _globalSequence++;

                    _events.Add(new EventInStorage(e.EventId, commit.Context, commit.Stream,
                        version,
                        _globalSequence,
                        e.Timestamp,
                        e.TypeKey, e.Headers, e.Body));
                }
            }

            var successful = commits.Commits.Where(x => unSuccessful.Contains(x.CommitId) == false).Select(x => x.CommitId).ToArray();

            ++WriteCount;

            return new CommitResults(successful.ToArray(), unSuccessful.ToArray());
        }
Exemplo n.º 3
0
        private void store(Entry[] entries)
        {
            Logger.Debug("[StorageWriter] Writing entries.");
            var commits = entries.ToDictionary(x => x.Commit.CommitId, x => x);
            var commit = new CommitsForStorage(commits.Values.Select(x => x.Commit).ToArray());

            try
            {
                Logger.Debug("[StorageWriter] Storing {0} commits.", commit.Commits.Length);
                var results = _storage.Store(commit);
                Logger.Debug("[StorageWriter] Entries stored.");

                //these can't fail as they're try operations.
                foreach (var c in results.SuccessfulCommits)
                    commits[c].signalCompletion();

                foreach (var c in results.FailedDueToConcurrencyCommits)
                    commits[c].signalConcurrencyFailure();
            }
            catch (Exception e)
            {
                foreach (var entry in entries)
                    entry.Fail(e);
            }
            finally
            {
                commits.Clear();
            }
        }
Exemplo n.º 4
0
        private string storeEvent(string context, string typeKey, string body, string stream)
        {
            var @event = new EventForStorage(Guid.NewGuid(), 1, DateTime.UtcNow, typeKey, null, body);
            var commit = new CommitForStorage(Guid.NewGuid(), context, stream, @event);
            var commits = new CommitsForStorage(commit);
            _storage.Store(commits);

            return stream;
        }
Exemplo n.º 5
0
 private void addCommitsToTable(CommitsForStorage commits, DataTable table)
 {
     foreach (var commit in commits.Commits)
         for (int index = 0; index < commit.Events.Length; index++)
         {
             var e = commit.Events[index];
             table.Rows.Add(e.EventId, commit.Stream, commit.Context, e.Sequence, index + 1, e.Timestamp, e.TypeKey, e.Headers, e.Body,
                 commit.CommitId);
         }
 }
Exemplo n.º 6
0
 private SqlParameter getEventsParameter(CommitsForStorage commits)
 {
     var eventsTable = getEmptyEventsTable();
     addCommitsToTable(commits, eventsTable);
     var parameter = new SqlParameter("Events", SqlDbType.Structured);
     parameter.Value = eventsTable;
     parameter.TypeName = "EventParameter";
     return parameter;
 }
Exemplo n.º 7
0
        private CommitResults doStore(CommitsForStorage commits)
        {
            var eventsParameter = getEventsParameter(commits);

            using (var connection = new SqlConnection(_connectionString))
            using (var command = new SqlCommand("AppendEvents", connection))
            {
                var unsuccessful = new List<Guid>();

                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.Add(eventsParameter);

                try
                {
                    Log.Debug("[SqlEventStorage] Opening connection.");
                    command.Connection.Open();
                    Log.Debug("[SqlEventStorage] Executing sproc to write events.");
                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            unsuccessful.Add(reader.GetGuid(0));
                        }

                        var unsuccessfulCommits = unsuccessful.ToArray();
                        var successfulCommits =
                            commits.
                                Commits.Where(x => unsuccessful.Contains(x.CommitId) == false)
                                .Select(x => x.CommitId).ToArray();

                        return new CommitResults(successfulCommits, unsuccessfulCommits);
                    }
                }
                catch (Exception e)
                {
                    Log.Warn("[SqlEventStorage] Error during event storage.", e);
                    throw;
                }
            }
        }