. */ namespace Doctrine\DBAL\Sharding; use Doctrine\DBAL\Sharding\ShardChoser\ShardChoser; /** * Shard Manager for the Connection Pooling Shard Strategy * * @author Benjamin Eberlei */ class PoolingShardManager implements ShardManager { private $conn; private $choser; private $currentDistributionValue; public function __construct(PoolingShardConnection $conn) { $params = $conn->getParams(); $this->conn = $conn; $this->choser = $params['shardChoser']; } public function selectGlobal() { $this->conn->connect(0); $this->currentDistributionValue = null; } public function selectShard($distributionValue) { $shardId = $this->choser->pickShard($distributionValue, $this->conn); $this->conn->connect($shardId); $this->currentDistributionValue = $distributionValue; } public function getCurrentDistributionValue() { return $this->currentDistributionValue; } public function getShards() { $params = $this->conn->getParams(); $shards = array(); foreach ($params['shards'] as $shard) { $shards[] = array('id' => $shard['id']); } return $shards; } public function queryAll($sql, array $params, array $types) { $shards = $this->getShards(); if (!$shards) { throw new \RuntimeException("No shards found."); } $result = array(); $oldDistribution = $this->getCurrentDistributionValue(); foreach ($shards as $shard) { $this->selectShard($shard['id']); foreach ($this->conn->fetchAll($sql, $params, $types) as $row) { $result[] = $row; } } if ($oldDistribution === null) { $this->selectGlobal(); } else { $this->selectShard($oldDistribution); } return $result; } }