/**
  * @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);
     }
 }