sintonia/library/propel/runtime/lib/collection/PropelOnDemandIterator.php

118 lines
2.7 KiB
PHP

<?php
/**
* This file is part of the Propel package.
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @license MIT License
*/
/**
* Class for iterating over a statement and returning one Propel object at a time
*
* @author Francois Zaninotto
* @package propel.runtime.collection
*/
class PropelOnDemandIterator implements Iterator
{
protected
$formatter,
$stmt,
$currentRow,
$currentKey = -1,
$isValid = null,
$enableInstancePoolingOnFinish = false;
public function __construct(PropelFormatter $formatter, PDOStatement $stmt)
{
$this->formatter = $formatter;
$this->stmt = $stmt;
$this->enableInstancePoolingOnFinish = Propel::disableInstancePooling();
}
public function closeCursor()
{
$this->stmt->closeCursor();
}
/**
* Returns the number of rows in the resultset
* Warning: this number is inaccurate for most databases. Do not rely on it for a portable application.
*
* @return int number of results
*/
public function count()
{
return $this->stmt->rowCount();
}
// Iterator Interface
/**
* Gets the current Model object in the collection
* This is where the hydration takes place.
*
* @see PropelObjectFormatter::getAllObjectsFromRow()
*
* @return BaseObject
*/
public function current()
{
return $this->formatter->getAllObjectsFromRow($this->currentRow);
}
/**
* Gets the current key in the iterator
*
* @return string
*/
public function key()
{
return $this->currentKey;
}
/**
* Advances the curesor in the statement
* Closes the cursor if the end of the statement is reached
*/
public function next()
{
$this->currentRow = $this->stmt->fetch(PDO::FETCH_NUM);
$this->currentKey++;
$this->isValid = (boolean) $this->currentRow;
if (!$this->isValid) {
$this->closeCursor();
if ($this->enableInstancePoolingOnFinish) {
Propel::enableInstancePooling();
}
}
}
/**
* Initializes the iterator by advancing to the first position
* This method can only be called once (this is a NoRewindIterator)
*/
public function rewind()
{
// check that the hydration can begin
if (null === $this->formatter) {
throw new PropelException('The On Demand collection requires a formatter. Add it by calling setFormatter()');
}
if (null === $this->stmt) {
throw new PropelException('The On Demand collection requires a statement. Add it by calling setStatement()');
}
if (null !== $this->isValid) {
throw new PropelException('The On Demand collection can only be iterated once');
}
// initialize the current row and key
$this->next();
}
public function valid()
{
return $this->isValid;
}
}