"Fossies" - the Fresh Open Source Software Archive

Member "icingaweb2-2.11.4/library/vendor/Zend/Db/Table/Rowset/Abstract.php" (26 Jan 2023, 11278 Bytes) of package /linux/www/icingaweb2-2.11.4.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) PHP source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 <?php
    2 /**
    3  * Zend Framework
    4  *
    5  * LICENSE
    6  *
    7  * This source file is subject to the new BSD license that is bundled
    8  * with this package in the file LICENSE.txt.
    9  * It is also available through the world-wide-web at this URL:
   10  * http://framework.zend.com/license/new-bsd
   11  * If you did not receive a copy of the license and are unable to
   12  * obtain it through the world-wide-web, please send an email
   13  * to license@zend.com so we can send you a copy immediately.
   14  *
   15  * @category   Zend
   16  * @package    Zend_Db
   17  * @subpackage Table
   18  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
   19  * @license    http://framework.zend.com/license/new-bsd     New BSD License
   20  * @version    $Id$
   21  */
   22 
   23 /**
   24  * @category   Zend
   25  * @package    Zend_Db
   26  * @subpackage Table
   27  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
   28  * @license    http://framework.zend.com/license/new-bsd     New BSD License
   29  */
   30 abstract class Zend_Db_Table_Rowset_Abstract implements SeekableIterator, Countable, ArrayAccess
   31 {
   32     /**
   33      * The original data for each row.
   34      *
   35      * @var array
   36      */
   37     protected $_data = array();
   38 
   39     /**
   40      * Zend_Db_Table_Abstract object.
   41      *
   42      * @var Zend_Db_Table_Abstract
   43      */
   44     protected $_table;
   45 
   46     /**
   47      * Connected is true if we have a reference to a live
   48      * Zend_Db_Table_Abstract object.
   49      * This is false after the Rowset has been deserialized.
   50      *
   51      * @var boolean
   52      */
   53     protected $_connected = true;
   54 
   55     /**
   56      * Zend_Db_Table_Abstract class name.
   57      *
   58      * @var string
   59      */
   60     protected $_tableClass;
   61 
   62     /**
   63      * Zend_Db_Table_Row_Abstract class name.
   64      *
   65      * @var string
   66      */
   67     protected $_rowClass = 'Zend_Db_Table_Row';
   68 
   69     /**
   70      * Iterator pointer.
   71      *
   72      * @var integer
   73      */
   74     protected $_pointer = 0;
   75 
   76     /**
   77      * How many data rows there are.
   78      *
   79      * @var integer
   80      */
   81     protected $_count;
   82 
   83     /**
   84      * Collection of instantiated Zend_Db_Table_Row objects.
   85      *
   86      * @var array
   87      */
   88     protected $_rows = array();
   89 
   90     /**
   91      * @var boolean
   92      */
   93     protected $_stored = false;
   94 
   95     /**
   96      * @var boolean
   97      */
   98     protected $_readOnly = false;
   99 
  100     /**
  101      * Constructor.
  102      *
  103      * @param array $config
  104      */
  105     public function __construct(array $config)
  106     {
  107         if (isset($config['table'])) {
  108             $this->_table      = $config['table'];
  109             $this->_tableClass = get_class($this->_table);
  110         }
  111         if (isset($config['rowClass'])) {
  112             $this->_rowClass   = $config['rowClass'];
  113         }
  114         if (!class_exists($this->_rowClass)) {
  115             Zend_Loader::loadClass($this->_rowClass);
  116         }
  117         if (isset($config['data'])) {
  118             $this->_data       = $config['data'];
  119         }
  120         if (isset($config['readOnly'])) {
  121             $this->_readOnly   = $config['readOnly'];
  122         }
  123         if (isset($config['stored'])) {
  124             $this->_stored     = $config['stored'];
  125         }
  126 
  127         // set the count of rows
  128         $this->_count = count($this->_data);
  129 
  130         $this->init();
  131     }
  132 
  133     /**
  134      * Store data, class names, and state in serialized object
  135      *
  136      * @return array
  137      */
  138     public function __sleep()
  139     {
  140         return array('_data', '_tableClass', '_rowClass', '_pointer', '_count', '_rows', '_stored',
  141                      '_readOnly');
  142     }
  143 
  144     /**
  145      * Setup to do on wakeup.
  146      * A de-serialized Rowset should not be assumed to have access to a live
  147      * database connection, so set _connected = false.
  148      *
  149      * @return void
  150      */
  151     public function __wakeup()
  152     {
  153         $this->_connected = false;
  154     }
  155 
  156     /**
  157      * Initialize object
  158      *
  159      * Called from {@link __construct()} as final step of object instantiation.
  160      *
  161      * @return void
  162      */
  163     public function init()
  164     {
  165     }
  166 
  167     /**
  168      * Return the connected state of the rowset.
  169      *
  170      * @return boolean
  171      */
  172     public function isConnected()
  173     {
  174         return $this->_connected;
  175     }
  176 
  177     /**
  178      * Returns the table object, or null if this is disconnected rowset
  179      *
  180      * @return Zend_Db_Table_Abstract
  181      */
  182     public function getTable()
  183     {
  184         return $this->_table;
  185     }
  186 
  187     /**
  188      * Set the table object, to re-establish a live connection
  189      * to the database for a Rowset that has been de-serialized.
  190      *
  191      * @param Zend_Db_Table_Abstract $table
  192      * @return boolean
  193      * @throws Zend_Db_Table_Row_Exception
  194      */
  195     public function setTable(Zend_Db_Table_Abstract $table)
  196     {
  197         $this->_table = $table;
  198         $this->_connected = false;
  199         // @todo This works only if we have iterated through
  200         // the result set once to instantiate the rows.
  201         foreach ($this as $row) {
  202             $connected = $row->setTable($table);
  203             if ($connected == true) {
  204                 $this->_connected = true;
  205             }
  206         }
  207         $this->rewind();
  208         return $this->_connected;
  209     }
  210 
  211     /**
  212      * Query the class name of the Table object for which this
  213      * Rowset was created.
  214      *
  215      * @return string
  216      */
  217     public function getTableClass()
  218     {
  219         return $this->_tableClass;
  220     }
  221 
  222     /**
  223      * Rewind the Iterator to the first element.
  224      * Similar to the reset() function for arrays in PHP.
  225      * Required by interface Iterator.
  226      *
  227      * @return Zend_Db_Table_Rowset_Abstract Fluent interface.
  228      */
  229     public function rewind()
  230     {
  231         $this->_pointer = 0;
  232         return $this;
  233     }
  234 
  235     /**
  236      * Return the current element.
  237      * Similar to the current() function for arrays in PHP
  238      * Required by interface Iterator.
  239      *
  240      * @return Zend_Db_Table_Row_Abstract current element from the collection
  241      */
  242     public function current()
  243     {
  244         if ($this->valid() === false) {
  245             return null;
  246         }
  247 
  248         // return the row object
  249         return $this->_loadAndReturnRow($this->_pointer);
  250     }
  251 
  252     /**
  253      * Return the identifying key of the current element.
  254      * Similar to the key() function for arrays in PHP.
  255      * Required by interface Iterator.
  256      *
  257      * @return int
  258      */
  259     public function key()
  260     {
  261         return $this->_pointer;
  262     }
  263 
  264     /**
  265      * Move forward to next element.
  266      * Similar to the next() function for arrays in PHP.
  267      * Required by interface Iterator.
  268      *
  269      * @return void
  270      */
  271     public function next()
  272     {
  273         ++$this->_pointer;
  274     }
  275 
  276     /**
  277      * Check if there is a current element after calls to rewind() or next().
  278      * Used to check if we've iterated to the end of the collection.
  279      * Required by interface Iterator.
  280      *
  281      * @return bool False if there's nothing more to iterate over
  282      */
  283     public function valid()
  284     {
  285         return $this->_pointer >= 0 && $this->_pointer < $this->_count;
  286     }
  287 
  288     /**
  289      * Returns the number of elements in the collection.
  290      *
  291      * Implements Countable::count()
  292      *
  293      * @return int
  294      */
  295     public function count()
  296     {
  297         return $this->_count;
  298     }
  299 
  300     /**
  301      * Take the Iterator to position $position
  302      * Required by interface SeekableIterator.
  303      *
  304      * @param int $position the position to seek to
  305      * @return Zend_Db_Table_Rowset_Abstract
  306      * @throws Zend_Db_Table_Rowset_Exception
  307      */
  308     public function seek($position)
  309     {
  310         $position = (int) $position;
  311         if ($position < 0 || $position >= $this->_count) {
  312             throw new Zend_Db_Table_Rowset_Exception("Illegal index $position");
  313         }
  314         $this->_pointer = $position;
  315         return $this;
  316     }
  317 
  318     /**
  319      * Check if an offset exists
  320      * Required by the ArrayAccess implementation
  321      *
  322      * @param string $offset
  323      * @return boolean
  324      */
  325     public function offsetExists($offset)
  326     {
  327         return isset($this->_data[(int) $offset]);
  328     }
  329 
  330     /**
  331      * Get the row for the given offset
  332      * Required by the ArrayAccess implementation
  333      *
  334      * @param string $offset
  335      * @return Zend_Db_Table_Row_Abstract
  336      */
  337     public function offsetGet($offset)
  338     {
  339         $offset = (int) $offset;
  340         if ($offset < 0 || $offset >= $this->_count) {
  341             throw new Zend_Db_Table_Rowset_Exception("Illegal index $offset");
  342         }
  343         $this->_pointer = $offset;
  344 
  345         return $this->current();
  346     }
  347 
  348     /**
  349      * Does nothing
  350      * Required by the ArrayAccess implementation
  351      *
  352      * @param string $offset
  353      * @param mixed $value
  354      */
  355     public function offsetSet($offset, $value)
  356     {
  357     }
  358 
  359     /**
  360      * Does nothing
  361      * Required by the ArrayAccess implementation
  362      *
  363      * @param string $offset
  364      */
  365     public function offsetUnset($offset)
  366     {
  367     }
  368 
  369     /**
  370      * Returns a Zend_Db_Table_Row from a known position into the Iterator
  371      *
  372      * @param int $position the position of the row expected
  373      * @param bool $seek wether or not seek the iterator to that position after
  374      * @return Zend_Db_Table_Row
  375      * @throws Zend_Db_Table_Rowset_Exception
  376      */
  377     public function getRow($position, $seek = false)
  378     {
  379         try {
  380             $row = $this->_loadAndReturnRow($position);
  381         } catch (Zend_Db_Table_Rowset_Exception $e) {
  382             throw new Zend_Db_Table_Rowset_Exception('No row could be found at position ' . (int) $position, 0, $e);
  383         }
  384 
  385         if ($seek == true) {
  386             $this->seek($position);
  387         }
  388 
  389         return $row;
  390     }
  391 
  392     /**
  393      * Returns all data as an array.
  394      *
  395      * Updates the $_data property with current row object values.
  396      *
  397      * @return array
  398      */
  399     public function toArray()
  400     {
  401         // @todo This works only if we have iterated through
  402         // the result set once to instantiate the rows.
  403         foreach ($this->_rows as $i => $row) {
  404             $this->_data[$i] = $row->toArray();
  405         }
  406         return $this->_data;
  407     }
  408 
  409     protected function _loadAndReturnRow($position)
  410     {
  411         if (!isset($this->_data[$position])) {
  412             throw new Zend_Db_Table_Rowset_Exception("Data for provided position does not exist");
  413         }
  414 
  415         // do we already have a row object for this position?
  416         if (empty($this->_rows[$position])) {
  417             $this->_rows[$position] = new $this->_rowClass(
  418                 array(
  419                     'table'    => $this->_table,
  420                     'data'     => $this->_data[$position],
  421                     'stored'   => $this->_stored,
  422                     'readOnly' => $this->_readOnly
  423                 )
  424             );
  425 
  426             if ( $this->_table instanceof Zend_Db_Table_Abstract ) {
  427                 $info = $this->_table->info();
  428 
  429                 if ( $this->_rows[$position] instanceof Zend_Db_Table_Row_Abstract ) {
  430                     if ($info['cols'] == array_keys($this->_data[$position])) {
  431                         $this->_rows[$position]->setTable($this->getTable());
  432                     }
  433                 }
  434             } else {
  435                 $this->_rows[$position]->setTable(null);
  436             }
  437         }
  438 
  439         // return the row object
  440         return $this->_rows[$position];
  441     }
  442 
  443 }