src/Core/Framework/Increment/MySQLIncrementer.php line 35

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Increment;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Defaults;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Doctrine\RetryableQuery;
  6. use Shopware\Core\Framework\Log\Package;
  7. use Shopware\Core\Framework\Plugin\Exception\DecorationPatternException;
  8. #[Package('core')]
  9. class MySQLIncrementer extends AbstractIncrementer
  10. {
  11.     /**
  12.      * @internal
  13.      */
  14.     public function __construct(private readonly Connection $connection)
  15.     {
  16.     }
  17.     public function getDecorated(): AbstractIncrementer
  18.     {
  19.         throw new DecorationPatternException(self::class);
  20.     }
  21.     public function increment(string $clusterstring $key): void
  22.     {
  23.         $payload = [
  24.             'pool' => $this->poolName,
  25.             'cluster' => $cluster,
  26.             'key' => $key,
  27.             'createdAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  28.         ];
  29.         $this->connection->executeStatement('
  30.             INSERT INTO `increment` (`pool`, `cluster`, `key`, `count`, `created_at`)
  31.             VALUES (:pool, :cluster, :key, 1, :createdAt)
  32.             ON DUPLICATE KEY UPDATE `count` = `count` + 1, `updated_at` = :createdAt
  33.         '$payload);
  34.     }
  35.     public function decrement(string $clusterstring $key): void
  36.     {
  37.         $payload = [
  38.             'pool' => $this->poolName,
  39.             'cluster' => $cluster,
  40.             'key' => $key,
  41.             'updatedAt' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  42.         ];
  43.         $this->connection->executeStatement('
  44.             UPDATE `increment`
  45.             SET `count` = `count` - 1, `updated_at` = :updatedAt
  46.             WHERE `pool` = :pool AND `cluster` = :cluster AND `key` = :key AND `count` > 0;
  47.         '$payload);
  48.     }
  49.     public function reset(string $cluster, ?string $key null): void
  50.     {
  51.         $query $this->connection->createQueryBuilder()
  52.             ->update('increment')
  53.             ->set('count'':count')
  54.             ->set('updated_at'':updatedAt')
  55.             ->where('pool = :pool')
  56.             ->andWhere('cluster = :cluster')
  57.             ->setParameter('updatedAt', (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT))
  58.             ->setParameter('cluster'$cluster)
  59.             ->setParameter('count'0)
  60.             ->setParameter('pool'$this->poolName);
  61.         if ($key !== null) {
  62.             $query->andWhere('`key` = :key')
  63.                 ->setParameter('key'$key);
  64.         }
  65.         RetryableQuery::retryable($this->connection, function () use ($query): void {
  66.             $query->execute();
  67.         });
  68.     }
  69.     public function list(string $clusterint $limit 5int $offset 0): array
  70.     {
  71.         $sql 'SELECT `key` as array_key, `pool`, `cluster`, `key`, `count`
  72.             FROM `increment`  WHERE `cluster` = :cluster AND `pool` = :pool
  73.             ORDER BY `count` DESC, `updated_at` DESC';
  74.         $payload = [
  75.             'pool' => $this->poolName,
  76.             'cluster' => $cluster,
  77.         ];
  78.         $types = [];
  79.         if ($limit > -1) {
  80.             $sql .= ' LIMIT :limit OFFSET :offset';
  81.             $payload['limit'] = $limit;
  82.             $payload['offset'] = $offset;
  83.             $types = [
  84.                 'offset' => \PDO::PARAM_INT,
  85.                 'limit' => \PDO::PARAM_INT,
  86.             ];
  87.         }
  88.         return $this->connection->fetchAllAssociativeIndexed($sql$payload$types);
  89.     }
  90. }