/lib/pkp/classes/db/DAOResultFactory.inc.php
PHP | 238 lines | 124 code | 27 blank | 87 comment | 18 complexity | 97f736845f431807678f1e805dc30339 MD5 | raw file
Possible License(s): GPL-2.0
- <?php
- /**
- * @file classes/db/DAOResultFactory.inc.php
- *
- * Copyright (c) 2000-2012 John Willinsky
- * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING.
- *
- * @class DAOResultFactory
- * @ingroup db
- *
- * @brief Wrapper around ADORecordSet providing "factory" features for generating
- * objects from DAOs.
- */
- // $Id$
- import('core.ItemIterator');
- class DAOResultFactory extends ItemIterator {
- /** The DAO used to create objects */
- var $dao;
- /** The name of the DAO's factory function (to be called with an associative array of values) */
- var $functionName;
- /**
- * @var array an array of primary key field names that uniquely
- * identify a result row in the record set.
- */
- var $idFields;
- /** The ADORecordSet to be wrapped around */
- var $records;
- /** True iff the resultset was always empty */
- var $wasEmpty;
- var $isFirst;
- var $isLast;
- var $page;
- var $count;
- var $pageCount;
- /**
- * Constructor.
- * Initialize the DAOResultFactory
- * @param $records object ADO record set
- * @param $dao object DAO class for factory
- * @param $functionName The function to call on $dao to create an object
- * @param $idFields array an array of primary key field names that uniquely
- * identify a result row in the record set.
- * Should be data object _data array key, not database column name
- */
- function DAOResultFactory(&$records, &$dao, $functionName, $idFields = array()) {
- $this->functionName = $functionName;
- $this->dao =& $dao;
- $this->idFields = $idFields;
- if (!$records || $records->EOF) {
- if ($records) $records->Close();
- $this->records = null;
- $this->wasEmpty = true;
- $this->page = 1;
- $this->isFirst = true;
- $this->isLast = true;
- $this->count = 0;
- $this->pageCount = 1;
- } else {
- $this->records =& $records;
- $this->wasEmpty = false;
- $this->page = $records->AbsolutePage();
- $this->isFirst = $records->atFirstPage();
- $this->isLast = $records->atLastPage();
- $this->count = $records->MaxRecordCount();
- $this->pageCount = $records->LastPageNo();
- }
- }
- /**
- * Return the object representing the next row.
- * @return object
- */
- function &next() {
- if ($this->records == null) return $this->records;
- if (!$this->records->EOF) {
- $functionName = $this->functionName;
- $dao =& $this->dao;
- $row =& $this->records->getRowAssoc(false);
- $result =& $dao->$functionName($row);
- if (!$this->records->MoveNext()) $this->_cleanup();
- return $result;
- } else {
- $this->_cleanup();
- $nullVar = null;
- return $nullVar;
- }
- }
- /**
- * Return the next row, with key.
- * @return array ($key, $value)
- */
- function &nextWithKey() {
- $result =& $this->next();
- if (empty($this->idFields)) {
- $key = null;
- } else {
- assert(is_a($result, 'DataObject') && is_array($this->idFields));
- $key = '';
- foreach($this->idFields as $idField) {
- assert(!is_null($result->getData($idField)));
- if (!empty($key)) $key .= '-';
- $key .= (string)$result->getData($idField);
- }
- }
- $returner = array($key, &$result);
- return $returner;
- }
- /**
- * Determine whether this iterator represents the first page of a set.
- * @return boolean
- */
- function atFirstPage() {
- return $this->isFirst;
- }
- /**
- * Determine whether this iterator represents the last page of a set.
- * @return boolean
- */
- function atLastPage() {
- return $this->isLast;
- }
- /**
- * Get the page number of a set that this iterator represents.
- * @return int
- */
- function getPage() {
- return $this->page;
- }
- /**
- * Get the total number of items in the set.
- * @return int
- */
- function getCount() {
- return $this->count;
- }
- /**
- * Get the total number of pages in the set.
- * @return int
- */
- function getPageCount() {
- return $this->pageCount;
- }
- /**
- * Return a boolean indicating whether or not we've reached the end of results
- * @return boolean
- */
- function eof() {
- if ($this->records == null) return true;
- if ($this->records->EOF) {
- $this->_cleanup();
- return true;
- }
- return false;
- }
- /**
- * Return a boolean indicating whether or not this resultset was empty from the beginning
- * @return boolean
- */
- function wasEmpty() {
- return $this->wasEmpty;
- }
- /**
- * PRIVATE function used internally to clean up the record set.
- * This is called aggressively because it can free resources.
- */
- function _cleanup() {
- $this->records->close();
- unset($this->records);
- $this->records = null;
- }
- /**
- * Convert this iterator to an array.
- * @return array
- */
- function &toArray() {
- $returner = array();
- while (!$this->eof()) {
- $returner[] = $this->next();
- }
- return $returner;
- }
- /**
- * Convert this iterator to an associative array by database ID.
- * @return array
- */
- function &toAssociativeArray($idField) {
- $returner = array();
- while (!$this->eof()) {
- $result =& $this->next();
- $returner[$result->getData($idField)] =& $result;
- unset($result);
- }
- return $returner;
- }
- /**
- * Determine whether or not this iterator is in the range of pages for the set it represents
- * @return boolean
- */
- function isInBounds() {
- return ($this->pageCount >= $this->page);
- }
- /**
- * Get the RangeInfo representing the last page in the set.
- * @return object
- */
- function &getLastPageRangeInfo() {
- import('db.DBResultRange');
- $returner = new DBResultRange($this->count, $this->pageCount);
- return $returner;
- }
- }
- ?>