<?php
 
/**
 
 * @package DATA_MySQL5
 
 */
 
 
/**
 
 * Table rows iterator.
 
 * 
 
 * Row access isn't read only on iteration, which means rows can be modified
 
 * on a foreach loop, but this modifications won't be observed on the iteration
 
 * itself, since the iteration results are cached.
 
 */
 
class DATA_MySQL5_TableIterator implements Iterator {
 
    /**
 
     * Table name.
 
     * @var string
 
     * @access private
 
     */
 
    private $table;
 
    /**
 
     * Stored query.
 
     * @var resource
 
     * @access private
 
     */
 
    private $query;
 
    /**
 
     * Last fetched row data.
 
     * @var array
 
     * @access private
 
     */
 
    private $currentRecord;
 
    /**
 
     * Last fetched row number.
 
     * @var int
 
     * @access private
 
     */
 
    private $currentRecordNumber;
 
    
 
    /**
 
     * Default constructor.
 
     * @access protected
 
     * @param string $table The table name.
 
     */
 
    public function __construct($table) {
 
        $this->table = $table;
 
        $this->query = null;
 
        $this->currentRecord = null;
 
        $this->currentRecordNumber = 0;
 
    }
 
    
 
    /**
 
     * Destructor.
 
     * Frees the stored query. 
 
     */
 
    public function __destruct() {
 
        if ($this->query !== null) {
 
            DATA_MySQL5_Access::freeResult($this->query);
 
        }
 
    }
 
    
 
    /**
 
     * Lazily runs the stored query for this iteration.
 
     * Ran before starting any other function call that requires the stored query.
 
     * @access private
 
     */
 
    private function lazyRunQuery() {
 
        if ($this->query === null) {
 
            $this->query = DATA_MySQL5_Access::query("
 
                SELECT *
 
                  FROM `{$this->table}`
 
            ");
 
            $this->currentRecord = DATA_MySQL5_Access::fetchAssoc($this->query);
 
        }
 
    }
 
    
 
    /**
 
     * Returns current row in iteration.
 
     * @return DATA_MySQL5_Row The current row.
 
     */
 
    public function current() {
 
        $this->lazyRunQuery();
 
        return new DATA_MySQL5_Row($this->table, $this->currentRecord);
 
    }
 
    
 
    /**
 
     * Returns current row number.
 
     * @return int The current row number.
 
     */
 
    public function key() {
 
        return $this->currentRecordNumber;
 
    }
 
    
 
    /**
 
     * Moves the iteration to the next row.
 
     */
 
    public function next() {
 
        $this->lazyRunQuery();
 
        $this->currentRecord = DATA_MySQL5_Access::fetchAssoc($this->query);
 
        $this->currentRecordNumber++;
 
    }
 
    
 
    /**
 
     * Moves the iteration to the first row.
 
     */
 
    public function rewind() {
 
        $this->lazyRunQuery();
 
        DATA_MySQL5_Access::dataSeek($this->query, 0);
 
        $this->currentRecord = DATA_MySQL5_Access::fetchAssoc($this->query);
 
        $this->currentRecordNumber = 0;
 
    }
 
    
 
    /**
 
     * Indicates if there are still rows in the iteration.
 
     * @return bool True if there are still rows remaining.
 
     */
 
    public function valid() {
 
        $this->lazyRunQuery();
 
        return $this->currentRecord !== false;
 
    }
 
}
 
?>
 
 
 |