diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-03-26 11:44:36 +0100 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-03-26 11:44:36 +0100 |
commit | b553ff390353a860195b61f5418847880f24410d (patch) | |
tree | 2040bb18fcc904bcc9cb0e758428c28b0c79db07 | |
parent | d0fde9dbce129b0dbb94d577d9685764c7d5ea4b (diff) |
fix referential integrity
-rw-r--r-- | db/feedmapper.php | 12 | ||||
-rw-r--r-- | db/foldermapper.php | 17 | ||||
-rw-r--r-- | tests/db/FeedMapperTest.php | 40 | ||||
-rw-r--r-- | tests/db/FolderMapperTest.php | 42 |
4 files changed, 111 insertions, 0 deletions
diff --git a/db/feedmapper.php b/db/feedmapper.php index 22f71d7a3..05fa729b4 100644 --- a/db/feedmapper.php +++ b/db/feedmapper.php @@ -27,6 +27,8 @@ namespace OCA\News\Db; use \OCA\AppFramework\Core\API; use \OCA\AppFramework\Db\Mapper; +use \OCA\AppFramework\Db\Entity; + class FeedMapper extends Mapper implements IMapper { @@ -95,7 +97,17 @@ class FeedMapper extends Mapper implements IMapper { $feed->fromRow($row); return $feed; + } + + + public function delete(Entity $entity){ + parent::delete($entity); + // someone please slap me for doing this manually :P + // we needz CASCADE + FKs please + $sql = 'DELETE FROM `*PREFIX*news_items` WHERE `feed_id` = ?'; + $params = array($entity->getId()); + $this->execute($sql, $params); } }
\ No newline at end of file diff --git a/db/foldermapper.php b/db/foldermapper.php index 82739df1b..8978bb45b 100644 --- a/db/foldermapper.php +++ b/db/foldermapper.php @@ -27,6 +27,7 @@ namespace OCA\News\Db; use \OCA\AppFramework\Core\API; use \OCA\AppFramework\Db\Mapper; +use \OCA\AppFramework\Db\Entity; class FolderMapper extends Mapper implements IMapper { @@ -79,4 +80,20 @@ class FolderMapper extends Mapper implements IMapper { return $this->findAllRows($sql, $params); } + + + public function delete(Entity $entity){ + parent::delete($entity); + + // someone please slap me for doing this manually :P + // we needz CASCADE + FKs please + $sql = 'DELETE FROM `*PREFIX*news_feeds` WHERE `folder_id` = ?; '. + 'DELETE `items` FROM `*PREFIX*news_items` `items` '. + 'LEFT JOIN `*PREFIX*news_feeds` `feeds` ON '. + '`items`.`feed_id` = `feed`.`id` WHERE `feeds`.`id` IS NULL;'; + $params = array($entity->getId()); + $this->execute($sql, $params); + } + + }
\ No newline at end of file diff --git a/tests/db/FeedMapperTest.php b/tests/db/FeedMapperTest.php index 71f82a26b..27ea769d1 100644 --- a/tests/db/FeedMapperTest.php +++ b/tests/db/FeedMapperTest.php @@ -181,4 +181,44 @@ class FeedMapperTest extends \OCA\AppFramework\Utility\MapperTestUtility { } + public function testDelete(){ + $feed = new Feed(); + $feed->setId(3); + + $sql = 'DELETE FROM `*PREFIX*news_feeds` WHERE `id` = ?'; + $arguments = array($feed->getId()); + + $sql2 = 'DELETE FROM `*PREFIX*news_items` WHERE `feed_id` = ?'; + $arguments2 = array($feed->getId()); + + $pdoResult = $this->getMock('Result', + array('fetchRow')); + $pdoResult->expects($this->any()) + ->method('fetchRow'); + + $query = $this->getMock('Query', + array('execute')); + $query->expects($this->at(0)) + ->method('execute') + ->with($this->equalTo($arguments)) + ->will($this->returnValue($pdoResult)); + $this->api->expects($this->at(0)) + ->method('prepareQuery') + ->with($this->equalTo($sql)) + ->will(($this->returnValue($query))); + + $query->expects($this->at(1)) + ->method('execute') + ->with($this->equalTo($arguments2)) + ->will($this->returnValue($pdoResult)); + $this->api->expects($this->at(1)) + ->method('prepareQuery') + ->with($this->equalTo($sql2)) + ->will(($this->returnValue($query))); + + $this->mapper->delete($feed); + + } + + }
\ No newline at end of file diff --git a/tests/db/FolderMapperTest.php b/tests/db/FolderMapperTest.php index b1d4e5e1e..af3e4da3a 100644 --- a/tests/db/FolderMapperTest.php +++ b/tests/db/FolderMapperTest.php @@ -131,4 +131,46 @@ class FolderMapperTest extends \OCA\AppFramework\Utility\MapperTestUtility { $this->assertEquals($this->folders, $result); } + + public function testDelete(){ + $folder = new Folder(); + $folder->setId(3); + + $sql = 'DELETE FROM `*PREFIX*news_folders` WHERE `id` = ?'; + $arguments = array($folder->getId()); + + $sql2 = 'DELETE FROM `*PREFIX*news_feeds` WHERE `folder_id` = ?; '. + 'DELETE `items` FROM `*PREFIX*news_items` `items` '. + 'LEFT JOIN `*PREFIX*news_feeds` `feeds` ON '. + '`items`.`feed_id` = `feed`.`id` WHERE `feeds`.`id` IS NULL;'; + $arguments2 = array($folder->getId()); + + $pdoResult = $this->getMock('Result', + array('fetchRow')); + $pdoResult->expects($this->any()) + ->method('fetchRow'); + + $query = $this->getMock('Query', + array('execute')); + $query->expects($this->at(0)) + ->method('execute') + ->with($this->equalTo($arguments)) + ->will($this->returnValue($pdoResult)); + $this->api->expects($this->at(0)) + ->method('prepareQuery') + ->with($this->equalTo($sql)) + ->will(($this->returnValue($query))); + + $query->expects($this->at(1)) + ->method('execute') + ->with($this->equalTo($arguments2)) + ->will($this->returnValue($pdoResult)); + $this->api->expects($this->at(1)) + ->method('prepareQuery') + ->with($this->equalTo($sql2)) + ->will(($this->returnValue($query))); + + $this->folderMapper->delete($folder); + } + }
\ No newline at end of file |