예제 #1
0
        public async Task Save(Guid aggregateId, ImmutableList<Event> events, int expectedVersion)
        {
            using (var session = _writeConnectionFactory.Connect())
            {
                // TODO: use something different than a integer for the version
                var lastVersion = await GetLastVersion(session, aggregateId);

                if (expectedVersion != -1 && lastVersion != expectedVersion)
                {
                    throw new ConcurrencyException();
                }

                var insert =
                    await session.PrepareAsync("INSERT INTO event (id, version, type, payload) VALUES (?, ?, ?, ?)");

                var batch = new BatchStatement();

                var increasingVersion = lastVersion;
                foreach (var evt in events)
                {
                    batch.Add(insert.Bind(
                        aggregateId,
                        ++increasingVersion,
                        evt.GetType().AssemblyQualifiedName,
                        _serializer.Serialize(evt)));
                }

                await session.ExecuteAsync(batch);
            }
        }
예제 #2
0
        public void Up()
        {
            using (var session = _writeConnectionFactory.Connect())
            {
                var dropStatement = session.Prepare("DROP TABLE IF EXISTS event");
                session.Execute(dropStatement.Bind());

                var statement =
                    session.Prepare(
                        "CREATE TABLE event (id UUID, version INT, type TEXT, payload TEXT, PRIMARY KEY (id, version)) WITH CLUSTERING ORDER BY (version ASC)");
                session.Execute(statement.Bind());
            }
        }