db = $db; if ( $result instanceof ResultWrapper ) { $this->result = $result->result; } else { $this->result = $result; } } /** * Get the number of rows in a result object * * @return int */ public function numRows() { return $this->getDB()->numRows( $this ); } /** * Fetch the next row from the given result object, in object form. Fields can be retrieved with * $row->fieldname, with fields acting like member variables. If no more rows are available, * false is returned. * * @return stdClass|bool * @throws DBUnexpectedError Thrown if the database returns an error */ public function fetchObject() { return $this->getDB()->fetchObject( $this ); } /** * Fetch the next row from the given result object, in associative array form. Fields are * retrieved with $row['fieldname']. If no more rows are available, false is returned. * * @return array|bool * @throws DBUnexpectedError Thrown if the database returns an error */ public function fetchRow() { return $this->getDB()->fetchRow( $this ); } /** * Change the position of the cursor in a result object. * See mysql_data_seek() * * @param int $row */ public function seek( $row ) { $this->getDB()->dataSeek( $this, $row ); } /** * Free a result object * * This either saves memory in PHP (buffered queries) or on the server (unbuffered queries). * In general, queries are not large enough in result sets for this to be worth calling. */ public function free() { if ( $this->db ) { $this->db->freeResult( $this ); $this->db = null; } $this->result = null; } /** * @return IDatabase * @throws RuntimeException */ private function getDB() { if ( !$this->db ) { throw new RuntimeException( get_class( $this ) . ' needs a DB handle for iteration.' ); } return $this->db; } function rewind() { if ( $this->numRows() ) { $this->getDB()->dataSeek( $this, 0 ); } $this->pos = 0; $this->currentRow = null; } /** * @return stdClass|array|bool */ function current() { if ( is_null( $this->currentRow ) ) { $this->next(); } return $this->currentRow; } /** * @return int */ function key() { return $this->pos; } /** * @return stdClass */ function next() { $this->pos++; $this->currentRow = $this->fetchObject(); return $this->currentRow; } function valid() { return $this->current() !== false; } }