diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-01-27 04:15:53 +0100 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-01-27 04:15:53 +0100 |
commit | ae7393db3d99a7ac223ae917129cccd9f49888e3 (patch) | |
tree | 7f54b72b0d01c38afd1378365a67e4f192922423 /db/feedmapper.php | |
parent | 483784caa38bd6131405ac474347a215584e30a5 (diff) |
merged the angularjs branch
Diffstat (limited to 'db/feedmapper.php')
-rw-r--r-- | db/feedmapper.php | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/db/feedmapper.php b/db/feedmapper.php new file mode 100644 index 000000000..906ced069 --- /dev/null +++ b/db/feedmapper.php @@ -0,0 +1,263 @@ +<?php +/** +* ownCloud - News app +* +* @author Alessandro Cosentino +* Copyright (c) 2012 - Alessandro Cosentino <cosenal@gmail.com> +* +* This file is licensed under the Affero General Public License version 3 or later. +* See the COPYING-README file +* +*/ + +namespace OCA\News; + +/** + * This class maps a feed to an entry in the feeds table of the database. + */ +class FeedMapper { + + const tableName = '*PREFIX*news_feeds'; + private $userid; + + public function __construct($userid = null) { + if ($userid !== null) { + $this->userid = $userid; + } + else { + $this->userid = \OCP\USER::getUser(); + } + } + + /** + * @brief + * @param row a row from the feeds table of the database + * @returns an object of the class OCA\News\Feed + */ + public function fromRow($row) { + $url = $row['url']; + $title = $row['title']; + $id = $row['id']; + $folderid = $row['folder_id']; + $feed = new Feed($url, $title, null, $id); + $favicon = $row['favicon_link']; + $feed->setFavicon($favicon); + $feed->setFolderId($folderid); + + return $feed; + } + + /** + * @brief + * @returns + */ + public function findAll() { + $query = 'SELECT * FROM ' . self::tableName . ' WHERE user_id = ?'; + $stmt = \OCP\DB::prepare($query); + $result = $stmt->execute(array($this->userid)); + + $feeds = array(); + while($row = $result->fetchRow()){ + $feed = $this->fromRow($row); + array_push($feeds, $feed); + } + + return $feeds; + } + + /** + * @brief returns the number of feeds that a user has + * @returns the number of feeds that a user has + */ + public function feedCount() { + $query = 'SELECT COUNT(*) AS size FROM ' . self::tableName . ' WHERE user_id = ?'; + $stmt = \OCP\DB::prepare($query); + $result = $stmt->execute(array($this->userid))->fetchRow(); + return $result['size']; + } + + + /** + * @brief Retrieve a feed from the database + * @param id The id of the feed in the database table. + * @returns + */ + public function findById($id) { + $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE id = ?'); + $result = $stmt->execute(array($id)); + if(!$row = $result->fetchRow()) + return null; + $feed = self::fromRow($row); + return $feed; + } + + /** + * @brief Retrieve all the feeds contained in the folder $folderid + * @param folderid The id of the folder in the database table. + * @returns a list of feeds + */ + public function findByFolderId($folderid) { + $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE user_id = ? AND folder_id = ?'); + $result = $stmt->execute(array($this->userid, $folderid)); + $feeds = array(); + while ($row = $result->fetchRow()) { + $feed = self::fromRow($row); + $feeds[] = $feed; + } + return $feeds; + } + + + /** + * @brief Retrieve a feed and all its items from the database + * @param id The id of the feed in the database table. + * @returns an instance of OCA\News\Feed + */ + public function findWithItems($id) { + $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE id = ?'); + $result = $stmt->execute(array($id)); + $row = $result->fetchRow(); + + $feed = self::fromRow($row); + $itemMapper = new ItemMapper(); + $items = $itemMapper->findById($id); + $feed->setItems($items); + + return $feed; + } + + /** + * @brief Find the id of a feed and all its items from the database + * @param url url of the feed + * @return id of the feed corresponding to the url passed as parameters + * null - if there is no such feed + */ + public function findIdFromUrl($url) { + $url_hash = md5($url); + $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE url_hash = ?'); + $result = $stmt->execute(array($url_hash)); + $row = $result->fetchRow(); + $id = null; + if ($row != null) { + $id = $row['id']; + } + return $id; + } + + public function mostRecent() { + //FIXME: does something like SELECT TOP 1 * exists in pear/mdb2 ?? + $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' ORDER BY lastmodified'); + $result = $stmt->execute(); + $row = $result->fetchRow(); + $id = null; + if ($row != null) { + $id = $row['id']; + } + return $id; + } + + /** + * @brief Save the feed and all its items into the database + * @param feed the feed to be saved + * @returns The id of the feed in the database table. + */ + //TODO: handle error case + public function save(Feed $feed, $folderid) { + $title = $feed->getTitle(); + $url = $feed->getUrl(); + $url_hash = md5($url); + + if(empty($title)) { + $l = \OC_L10N::get('news'); + $title = $l->t('no title'); + } + + $favicon = $feed->getFavicon(); + + //FIXME: Detect when feed contains already a database id + $feedid = $this->findIdFromUrl($url); + if ($feedid === null) { + $query = \OCP\DB::prepare(" + INSERT INTO " . self::tableName . + "(url, url_hash, title, favicon_link, folder_id, user_id, added, lastmodified) + VALUES (?, ?, ?, ?, ?, ?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()) + "); + + $params=array( + $url, + $url_hash, + $title, + $favicon, + $folderid, + $this->userid + ); + $query->execute($params); + + $feedid = \OCP\DB::insertid(self::tableName); + } + else { + //update the db. it needs to be done, since it might be the first save after a full fetch + $stmt = \OCP\DB::prepare(' + UPDATE ' . self::tableName . + ' SET favicon_link = ? , lastmodified = UNIX_TIMESTAMP() , folder_id = ? + WHERE id = ? + '); + + $params=array( + $favicon, + $folderid, + $feedid + ); + $stmt->execute($params); + } + $feed->setId($feedid); + + $itemMapper = new ItemMapper(); + + $items = $feed->getItems(); + if ($items !== null) { + foreach($items as $item) { + $itemMapper->save($item, $feedid); + } + } + + return $feedid; + } + + + public function deleteById($id) { + if ($id == null) { + return false; + } + $stmt = \OCP\DB::prepare('DELETE FROM ' . self::tableName .' WHERE id = ? AND user_id = ?'); + + $result = $stmt->execute(array($id, $this->userid)); + + $itemMapper = new ItemMapper(); + //TODO: handle the value that the execute returns + $itemMapper->deleteAll($id); + + return true; + } + + public function delete(Feed $feed) { + $id = $feed->getId(); + return deleteById($id); + } + + public function deleteAll($folderid) { + if ($folderid == null) { + return false; + } + + $stmt = \OCP\DB::prepare('SELECT id FROM ' . self::tableName . ' WHERE folder_id = ? AND user_id = ?'); + + $result = $stmt->execute(array($folderid, $this->userid)); + while ($row = $result->fetchRow()) { + if(!self::deleteById($row['id'])) + return false; + } + + return true; + } +} |