/** * @param CommitId $commitId * @param Contract $streamContract * @param Identifier $streamId * @param int $expectedStreamRevision * @param EventEnvelope[] $eventEnvelopes * @throws OptimisticConcurrencyFailed */ public function commit(CommitId $commitId, Contract $streamContract, Identifier $streamId, $expectedStreamRevision, array $eventEnvelopes) { $actualStreamRevision = $this->revisionFor($streamContract, $streamId); if ($actualStreamRevision != $expectedStreamRevision) { throw OptimisticConcurrencyFailed::revisionDoesNotMatch($expectedStreamRevision, $actualStreamRevision); } foreach ($eventEnvelopes as $eventEnvelope) { $record = new InMemoryRecord(); $record->checkpointNumber = "todo"; $record->streamContract = $streamContract; $record->streamId = $streamId; $record->streamRevision = "todo"; $record->eventContract = $eventEnvelope->getEventContract(); $record->eventPayload = $eventEnvelope->getEventPayload(); $record->utcCommittedTime = new DateTimeImmutable(); $record->eventId = $eventEnvelope->getEventId(); $record->commitId = $commitId; $this->records[] = $record; } }
/** * @param Contract $streamContract * @param Identifier $streamId * @param $expectedStreamRevision * @throws \EventCentric\Persistence\OptimisticConcurrencyFailed */ protected function controlOptimisticConcurrency(Contract $streamContract, Identifier $streamId, $expectedStreamRevision) { $result = $this->connection->fetchArray(MaxStreamRevision::from(self::TABLE_NAME), ['streamContract' => $streamContract, 'streamId' => $streamId]); $actualStreamRevision = (int) $result[0]; if ($actualStreamRevision != $expectedStreamRevision) { throw OptimisticConcurrencyFailed::revisionDoesNotMatch($expectedStreamRevision, $actualStreamRevision); } }