X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fpq-gateway;a=blobdiff_plain;f=lib%2Fpq%2FGateway%2FRowset.php;h=d6134caaa314de1bfee7ba4a620fd98322cacd26;hp=2527b029a1f629cad222161c05e73cf84540a216;hb=4879955d1b86d606dc24401f26ebde9be7612fbf;hpb=01bd45d05ce58796db7540d60671b8cff5d46bff diff --git a/lib/pq/Gateway/Rowset.php b/lib/pq/Gateway/Rowset.php index 2527b02..d6134ca 100644 --- a/lib/pq/Gateway/Rowset.php +++ b/lib/pq/Gateway/Rowset.php @@ -20,18 +20,16 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable protected $rows; /** - * @var string + * @var mixed */ - protected $row; + protected $row = "\\pq\\Gateway\\Row"; /** * @param \pq\Gateway\Table $table * @param \pq\Result $result */ - function __construct(Table $table, \pq\Result $result, $row = "\\pq\\Gateway\\Row") { + function __construct(Table $table, \pq\Result $result = null) { $this->table = $table; - $this->row = $row; - $this->hydrate($result); } @@ -51,20 +49,36 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable * @param \pq\Result $result * @return array */ - protected function hydrate(\pq\Result $result) { + protected function hydrate(\pq\Result $result = null) { $this->index = 0; $this->rows = array(); - $row = $this->row; - if (is_callable($row)) { - while (($data = $result->fetchRow(\pq\Result::FETCH_ASSOC))) { - $this->rows[] = $row($data); - } - } else { - while (($data = $result->fetchRow(\pq\Result::FETCH_ASSOC))) { - $this->rows[] = new $row($this->table, $data); + if ($result) { + $row = $this->row; + + if (is_callable($row)) { + while (($data = $result->fetchRow(\pq\Result::FETCH_ASSOC))) { + $this->rows[] = $row($data); + } + } elseif ($row) { + while (($data = $result->fetchRow(\pq\Result::FETCH_ASSOC))) { + $this->rows[] = new $row($this->table, $data); + } + } else { + $this->rows = $result->fetchAll(\pq\Result::FETCH_OBJECT); } } + + return $this; + } + + /** + * Set the row prototype + * @param mixed $row + * @return \pq\Gateway\Table + */ + function setRowPrototype($row) { + $this->row = $row; return $this; } @@ -75,24 +89,75 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable return $this->table; } - function create() { - array_map(function ($row) { - $row->create(); - }, $this->rows); + /** + * Create all rows of this rowset + * @param bool $txn + * @return \pq\Gateway\Rowset + * @throws Exception + */ + function create($txn = true) { + $txn = $txn ? $this->table->getConnection()->startTransaction() : false; + try { + foreach ($this->rows as $row) { + $row->create(); + } + } catch (\Exception $e) { + if ($txn) { + $txn->rollback(); + } + throw $e; + } + if ($txn) { + $txn->commit(); + } return $this; } - function update() { - array_map(function ($row) { - $row->update(); - }, $this->rows); + /** + * Update all rows of this rowset + * @param bool $txn + * @return \pq\Gateway\Rowset + * @throws \Exception + */ + function update($txn = true) { + $txn = $txn ? $this->table->getConnection()->startTransaction() : false; + try { + foreach ($this->rows as $row) { + $row->update(); + } + } catch (\Exception $e) { + if ($txn) { + $txn->rollback(); + } + throw $e; + } + if ($txn) { + $txn->commit(); + } return $this; } - function delete() { - array_map(function ($row) { - $row->delete(); - }, $this->rows); + /** + * Delete all rows of this rowset + * @param type $txn + * @return \pq\Gateway\Rowset + * @throws \Exception + */ + function delete($txn = true) { + $txn = $txn ? $this->table->getConnection()->startTransaction() : false; + try { + foreach ($this->rows as $row) { + $row->delete(); + } + } catch (\Exception $e) { + if ($txn) { + $txn->rollback(); + } + throw $e; + } + if ($txn) { + $txn->commit(); + } return $this; } @@ -150,6 +215,8 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable if (!$this->valid()) { throw new \OutOfBoundsException("Invalid seek position ($pos)"); } + + return $this; } /** @@ -168,6 +235,16 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable return $this->rows; } + /** + * Apply a callback on each row of this rowset + * @param callable $cb + * @return \pq\Gateway\Rowset + */ + function apply(callable $cb) { + array_walk($this->rows, $cb, $this); + return $this; + } + /** * Filter by callback * @param callable $cb @@ -178,4 +255,13 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable $rowset->rows = array_filter($this->rows, $cb); return $rowset; } + + /** + * Append a row to the rowset + * @param \pq\Gateway\Row $row + */ + function append(Row $row) { + $this->rows[] = $row; + return $this; + } }