. */ namespace Doctrine\DBAL\Cache; use Doctrine\DBAL\Driver\ResultStatement; use PDO; class ArrayStatement implements \IteratorAggregate, ResultStatement { private $data; private $columnCount = 0; private $num = 0; private $defaultFetchMode = PDO::FETCH_BOTH; public function __construct(array $data) { $this->data = $data; if (count($data)) { $this->columnCount = count($data[0]); } } public function closeCursor() { unset ($this->data); } public function columnCount() { return $this->columnCount; } public function setFetchMode($fetchMode, $arg2 = null, $arg3 = null) { if ($arg2 !== null || $arg3 !== null) { throw new \InvalidArgumentException("Caching layer does not support 2nd/3rd argument to setFetchMode()"); } $this->defaultFetchMode = $fetchMode; } public function getIterator() { $data = $this->fetchAll(); return new \ArrayIterator($data); } public function fetch($fetchMode = null) { if (isset($this->data[$this->num])) { $row = $this->data[$this->num++]; $fetchMode = $fetchMode ?: $this->defaultFetchMode; if ($fetchMode === PDO::FETCH_ASSOC) { return $row; } else if ($fetchMode === PDO::FETCH_NUM) { return array_values($row); } else if ($fetchMode === PDO::FETCH_BOTH) { return array_merge($row, array_values($row)); } else if ($fetchMode === PDO::FETCH_COLUMN) { return reset($row); } else { throw new \InvalidArgumentException("Invalid fetch-style given for fetching result."); } } return false; } public function fetchAll($fetchMode = null) { $rows = array(); while ($row = $this->fetch($fetchMode)) { $rows[] = $row; } return $rows; } public function fetchColumn($columnIndex = 0) { $row = $this->fetch(PDO::FETCH_NUM); if (!isset($row[$columnIndex])) { // TODO: verify this is correct behavior return false; } return $row[$columnIndex]; } }