From 89caabf7e3ebc62190fccba97e3bc11f7f32b58c Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Thu, 7 Mar 2013 10:10:44 +0100 Subject: [PATCH 1/1] flush --- lib/pq/Gateway/Row.php | 2 +- lib/pq/Gateway/Rowset.php | 20 ++++++++++-- lib/pq/Gateway/Table.php | 53 ++++++++++++++++++++++++++------ lib/pq/Query/Writer.php | 2 +- lib/pq/Query/WriterInterface.php | 15 +++++++++ 5 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 lib/pq/Query/WriterInterface.php diff --git a/lib/pq/Gateway/Row.php b/lib/pq/Gateway/Row.php index a8b8793..0a2820a 100644 --- a/lib/pq/Gateway/Row.php +++ b/lib/pq/Gateway/Row.php @@ -26,7 +26,7 @@ class Row implements \JsonSerializable */ function __construct(Table $table, array $data = null, $prime = false) { $this->table = $table; - $this->data = $data; + $this->data = (array) $data; if ($prime) { $this->prime(); diff --git a/lib/pq/Gateway/Rowset.php b/lib/pq/Gateway/Rowset.php index d6134ca..7c0a3c2 100644 --- a/lib/pq/Gateway/Rowset.php +++ b/lib/pq/Gateway/Rowset.php @@ -38,7 +38,7 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable * @param \pq\Result $result * @return \pq\Gateway\Rowset */ - function __invoke(\pq\Result $result) { + function __invoke(\pq\Result $result = null) { $that = clone $this; $that->hydrate($result); return $that; @@ -54,7 +54,7 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable $this->rows = array(); if ($result) { - $row = $this->row; + $row = $this->getRowPrototype(); if (is_callable($row)) { while (($data = $result->fetchRow(\pq\Result::FETCH_ASSOC))) { @@ -82,6 +82,14 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable return $this; } + /** + * Get the row prototype + * @return mixed + */ + function getRowPrototype() { + return $this->row; + } + /** * @return \pq\Gateway\Table */ @@ -176,12 +184,14 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable function rewind() { $this->index = 0; } + /** * @implements \Iterator */ function next() { ++$this->index; } + /** * @implements \Iterator * @return bool @@ -189,13 +199,18 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable function valid() { return $this->index < count($this->rows); } + /** * @implements \Iterator * @return \pq\Gateway\Row */ function current() { + if (!$this->valid()) { + throw new OutOfBoundsException("Invalid row index {$this->index}"); + } return $this->rows[$this->index]; } + /** * @implements \Iterator * @return int @@ -252,6 +267,7 @@ class Rowset implements \SeekableIterator, \Countable, \JsonSerializable */ function filter(callable $cb) { $rowset = clone $this; + $rowset->index = 0; $rowset->rows = array_filter($this->rows, $cb); return $rowset; } diff --git a/lib/pq/Gateway/Table.php b/lib/pq/Gateway/Table.php index ba8094a..ebab838 100644 --- a/lib/pq/Gateway/Table.php +++ b/lib/pq/Gateway/Table.php @@ -25,6 +25,11 @@ class Table * @var string */ protected $rowset = "\\pq\\Gateway\\Rowset"; + + /** + * @var \pq\Query\Writer + */ + protected $query; /** * @param string $name @@ -45,6 +50,32 @@ class Table return $this; } + /** + * Get the rowset prototype + * @return mixed + */ + function getRowsetPrototype() { + return $this->rowset; + } + + /** + * Set the query writer + * @param \pq\Query\WriterInterface $query + * @return \pq\Gateway\Table + */ + function setQueryWriter(\pq\Query\WriterInterface $query) { + $this->query = $query; + return $this; + } + + /** + * Get the query writer + * @return \pq\Query\WriterInterface + */ + function getQueryWriter() { + return $this->query ?: new QueryWriter; + } + /** * @return \pq\Connection */ @@ -71,12 +102,10 @@ class Table return $result; } - if (is_callable($this->rowset)) { - return call_user_func($this->rowset, $result); - } - - if ($this->rowset) { - $rowset = $this->rowset; + $rowset = $this->getRowsetPrototype(); + if (is_callable($rowset)) { + return $rowset($result); + } elseif ($rowset) { return new $rowset($this, $result); } @@ -92,7 +121,8 @@ class Table * @return \pq\Result */ function find(array $where = null, $order = null, $limit = 0, $offset = 0) { - $query = new QueryWriter("SELECT * FROM ". $this->conn->quoteName($this->name)); + $query = $this->getQueryWriter()->reset(); + $query->write("SELECT * FROM", $this->conn->quoteName($this->name)); if ($where) { $query->write("WHERE")->criteria($where); } @@ -113,7 +143,8 @@ class Table * @return \pq\Result */ function create(array $data = null, $returning = "*") { - $query = new QueryWriter("INSERT INTO ".$this->conn->quoteName($this->name)); + $query = $this->getQueryWriter()->reset(); + $query->write("INSERT INTO", $this->conn->quoteName($this->name)); if ($data) { $first = true; $params = array(); @@ -141,7 +172,8 @@ class Table * @retunr \pq\Result */ function update(array $where, array $data, $returning = "*") { - $query = new QueryWriter("UPDATE ".$this->conn->quoteName($this->name)); + $query = $this->getQueryWriter()->reset(); + $query->write("UPDATE", $this->conn->quoteName($this->name)); $first = true; foreach ($data as $key => $val) { $query->write($first ? "SET" : ",", $key, "=", $query->param($val)); @@ -161,7 +193,8 @@ class Table * @return pq\Result */ function delete(array $where, $returning = null) { - $query = new QueryWriter("DELETE FROM ".$this->conn->quoteName($this->name)); + $query = $this->getQueryWriter()->reset(); + $query->write("DELETE FROM", $this->conn->quoteName($this->name)); $query->write("WHERE")->criteria($where); if (strlen($returning)) { $query->write("RETURNING", $returning); diff --git a/lib/pq/Query/Writer.php b/lib/pq/Query/Writer.php index f326f1e..fd5e51a 100644 --- a/lib/pq/Query/Writer.php +++ b/lib/pq/Query/Writer.php @@ -5,7 +5,7 @@ namespace pq\Query; /** * A very simple query writer used by \pq\Gateway */ -class Writer +class Writer implements WriterInterface { /** * @var string diff --git a/lib/pq/Query/WriterInterface.php b/lib/pq/Query/WriterInterface.php new file mode 100644 index 0000000..32e133b --- /dev/null +++ b/lib/pq/Query/WriterInterface.php @@ -0,0 +1,15 @@ +