*/ class PDOStatement extends \PDOStatement implements \IteratorAggregate { /** @var int */ protected $cursorPos = 0; /** @var array */ public $cache = []; /** @var ?array */ public $fields; function getIterator(): \Iterator { return new StatementIterator($this); } protected function __construct() { } function rewind(): void { $this->cursorPos = 0; } /** * @param int $rownum * @return bool */ public function seek($rownum): bool { if ($rownum < 0) { return false; } // PostgreSQL rows start w/ 0, but this works, because we are // looking to move the position _before_ the next desired position $this->cursorPos = $rownum; return true; } function valid(): bool { return true; } /** * @return bool */ public function first() { if ($this->cursorPos !== 0) { $this->seek(0); } return $this->next(); } function next(): bool{ if ($this->getRecordCount() > $this->cursorPos) { if (!isset($this->cache[$this->cursorPos])) { $this->cache[$this->cursorPos] = $this->fetch(PDO::FETCH_ASSOC); } $this->fields = $this->cache[$this->cursorPos]; $this->cursorPos++; return true; } else { $this->fields = null; return false; } } function key(): int { return $this->cursorPos; } /** * @return mixed */ function current() { return $this->cache[$this->cursorPos]; } /** * @return array|null */ function getRow() { return $this->fields; } /** * @param string $name * @return int */ function getInt($name): int { if (!$this->fields) { throw new \Exception('no fields'); } return (int)$this->fields[$name]; } /** * @param string $name * @return string */ function getBlob($name) { return $this->fields[$name]; } /** * @param string $name * @return string */ function getString($name) { return $this->fields[$name] ?? null; } /** * @param string $name * @return bool */ function getBoolean($name) { return (bool)$this->fields[$name]; } /** * @param string $name * @return mixed */ function get($name) { return $this->fields[$name]; } /** * @param string $name * @return array */ function getArray($name) { return StringUtil::strToArray($this->fields[$name]); } /** * @return int */ function getRecordCount() { return count($this->cache); } /** * @param array $args * @return bool */ function execute($args = null): bool { $result = parent::execute($args); return $result; } }