123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- namespace Doctrine\DBAL\Sharding;
- use Doctrine\DBAL\Sharding\ShardChoser\ShardChoser;
- use Doctrine\Deprecations\Deprecation;
- use RuntimeException;
- /**
- * Shard Manager for the Connection Pooling Shard Strategy
- *
- * @deprecated
- */
- class PoolingShardManager implements ShardManager
- {
- /** @var PoolingShardConnection */
- private $conn;
- /** @var ShardChoser */
- private $choser;
- /** @var string|null */
- private $currentDistributionValue;
- public function __construct(PoolingShardConnection $conn)
- {
- Deprecation::trigger(
- 'doctrine/dbal',
- 'https://github.com/doctrine/dbal/issues/3595',
- 'Native Sharding support in DBAL is removed without replacement.'
- );
- $params = $conn->getParams();
- $this->conn = $conn;
- $this->choser = $params['shardChoser'];
- }
- /**
- * {@inheritDoc}
- */
- public function selectGlobal()
- {
- $this->conn->connect(0);
- $this->currentDistributionValue = null;
- }
- /**
- * {@inheritDoc}
- */
- public function selectShard($distributionValue)
- {
- $shardId = $this->choser->pickShard($distributionValue, $this->conn);
- $this->conn->connect($shardId);
- $this->currentDistributionValue = $distributionValue;
- }
- /**
- * {@inheritDoc}
- */
- public function getCurrentDistributionValue()
- {
- return $this->currentDistributionValue;
- }
- /**
- * {@inheritDoc}
- */
- public function getShards()
- {
- $params = $this->conn->getParams();
- $shards = [];
- foreach ($params['shards'] as $shard) {
- $shards[] = ['id' => $shard['id']];
- }
- return $shards;
- }
- /**
- * {@inheritDoc}
- *
- * @throws RuntimeException
- */
- public function queryAll($sql, array $params, array $types)
- {
- $shards = $this->getShards();
- if (! $shards) {
- throw new RuntimeException('No shards found.');
- }
- $result = [];
- $oldDistribution = $this->getCurrentDistributionValue();
- foreach ($shards as $shard) {
- $this->conn->connect($shard['id']);
- foreach ($this->conn->fetchAllAssociative($sql, $params, $types) as $row) {
- $result[] = $row;
- }
- }
- if ($oldDistribution === null) {
- $this->selectGlobal();
- } else {
- $this->selectShard($oldDistribution);
- }
- return $result;
- }
- }
|