From 136f445581b84b2ab2e122d8d1fbf8bc50709b36 Mon Sep 17 00:00:00 2001 From: Victor Dubiniuk Date: Sat, 7 Sep 2013 21:26:22 +0300 Subject: [PATCH] Cleanup session data if original file is removed --- appinfo/app.php | 3 +++ lib/member.php | 23 +++++++++++++++-------- lib/op.php | 16 +++++++++++----- lib/session.php | 18 ++++++++++++------ lib/storage.php | 23 ++++++++++++++++------- 5 files changed, 57 insertions(+), 26 deletions(-) diff --git a/appinfo/app.php b/appinfo/app.php index fa5a130e..4ed6c854 100755 --- a/appinfo/app.php +++ b/appinfo/app.php @@ -40,3 +40,6 @@ OC::$CLASSPATH['OCA\Documents\SessionController'] = 'documents/ajax/sessionContr OC::$CLASSPATH['OCA\Documents\UserController'] = 'documents/ajax/userController.php'; OC::$CLASSPATH['OCA\Documents\Download_Simple'] = 'documents/lib/download/simple.php'; OC::$CLASSPATH['OCA\Documents\Download_Range'] = 'documents/lib/download/range.php'; + +//Listen to delete file signal +\OCP\Util::connectHook('OC_Filesystem', 'delete', "OCA\Documents\Storage", "onDelete"); \ No newline at end of file diff --git a/lib/member.php b/lib/member.php index c81891b7..b2ee726c 100644 --- a/lib/member.php +++ b/lib/member.php @@ -14,6 +14,8 @@ namespace OCA\Documents; class Member extends Db{ + const DB_TABLE = '`*PREFIX*documents_member`'; + const ACTIVITY_THRESHOLD = 60; // 10 Minutes const MEMBER_STATUS_ACTIVE = 1; @@ -21,7 +23,7 @@ class Member extends Db{ public static function add($esId, $displayname, $color){ $query = \OCP\DB::prepare(' - INSERT INTO `*PREFIX*documents_member` (`es_id`, `uid`, `color`, `last_activity`) + INSERT INTO ' . self::DB_TABLE . ' (`es_id`, `uid`, `color`, `last_activity`) VALUES (?, ?, ?, ?) '); $query->execute(array( @@ -31,11 +33,11 @@ class Member extends Db{ time() )); - return \OCP\DB::insertid(`*PREFIX*documents_member`); + return \OCP\DB::insertid(self::DB_TABLE); } public static function getMember($id){ - $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*documents_member` WHERE `member_id`= ?'); + $query = \OCP\DB::prepare('SELECT * FROM ' . self::DB_TABLE . ' WHERE `member_id`= ?'); $result = $query->execute(array($id)); return $result->fetchRow(); } @@ -47,13 +49,13 @@ class Member extends Db{ } $stmt = self::buildPlaceholders($ids); - $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*documents_member` WHERE `member_id` IN (' . $stmt . ')'); + $query = \OCP\DB::prepare('SELECT * FROM ' . self::DB_TABLE . ' WHERE `member_id` IN (' . $stmt . ')'); $result = $query->execute($ids); return $result->fetchAll(); } public static function updateMemberActivity($memberId){ - $query = \OCP\DB::prepare('UPDATE `*PREFIX*documents_member` SET `last_activity`=? WHERE `member_id`=?'); + $query = \OCP\DB::prepare('UPDATE ' . self::DB_TABLE . ' SET `last_activity`=? WHERE `member_id`=?'); $query->execute(array( time(), $memberId @@ -67,7 +69,7 @@ class Member extends Db{ $activeSince = $lastActivity; } - $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*documents_member` WHERE `es_id`= ? AND `last_activity` > ?'); + $query = \OCP\DB::prepare('SELECT * FROM ' . self::DB_TABLE . ' WHERE `es_id`= ? AND `last_activity` > ?'); $result = $query->execute(array($esId, $activeSince)); return $result->fetchAll(); } @@ -82,7 +84,7 @@ class Member extends Db{ $query = \OCP\DB::prepare(' SELECT `member_id` - FROM `*PREFIX*documents_member` + FROM ' . self::DB_TABLE . ' WHERE `es_id`= ? AND `last_activity`execute($esId); + } + protected static function getInactivityPeriod(){ return time() - self::ACTIVITY_THRESHOLD; } diff --git a/lib/op.php b/lib/op.php index 0867eb73..e91ff97f 100644 --- a/lib/op.php +++ b/lib/op.php @@ -13,9 +13,11 @@ namespace OCA\Documents; class Op { + const DB_TABLE = '`*PREFIX*documents_op`'; + public static function add($esId, $memberId, $opspec){ $query = \OCP\DB::prepare(' - INSERT INTO `*PREFIX*documents_op` (`es_id`, `member`, `opspec`) + INSERT INTO ' . self::DB_TABLE . ' (`es_id`, `member`, `opspec`) VALUES (?, ?, ?) '); $query->execute(array( @@ -23,9 +25,8 @@ class Op { $memberId, $opspec, )); - // throw something - if query fails - thats fatal - return \OCP\DB::insertid(`*PREFIX*documents_op`); + return \OCP\DB::insertid(self::DB_TABLE); } public static function addOpsArray($esId, $memberId, $ops){ @@ -43,7 +44,7 @@ class Op { public static function getHeadSeq($esId){ $query = \OCP\DB::prepare(' SELECT `seq` - FROM `*PREFIX*documents_op` + FROM ' . self::DB_TABLE . ' WHERE `es_id`=? ORDER BY `seq` DESC ', 1); @@ -77,7 +78,7 @@ class Op { } $query = \OCP\DB::prepare(' SELECT `opspec` - FROM `*PREFIX*documents_op` + FROM ' . self::DB_TABLE . ' WHERE `es_id`=? AND `seq`>? ORDER BY `seq` ASC @@ -86,6 +87,11 @@ class Op { return $result->fetchAll(); } + public static function deleteBySessionId($esId){ + $query = \OCP\DB::prepare('DELETE FROM ' . self::DB_TABLE . ' WHERE `es_id` = ?'); + $query->execute($esId); + } + public static function removeCursor($esId, $memberId){ return self::add( $esId, diff --git a/lib/session.php b/lib/session.php index 85d9e762..b368337e 100644 --- a/lib/session.php +++ b/lib/session.php @@ -12,10 +12,11 @@ namespace OCA\Documents; class Session extends Db{ + const DB_TABLE = '`*PREFIX*documents_session`'; public static function add($genesis, $hash, $fileId){ $query = \OCP\DB::prepare(' - INSERT INTO `*PREFIX*documents_session` (`es_id`, `genesis_url`, `genesis_hash`, `owner`, `file_id`) + INSERT INTO ' . self::DB_TABLE . ' (`es_id`, `genesis_url`, `genesis_hash`, `owner`, `file_id`) VALUES (?, ?, ?, ?, ?) '); @@ -35,13 +36,13 @@ class Session extends Db{ } public static function getAll(){ - $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*documents_session`'); + $query = \OCP\DB::prepare('SELECT * FROM ' . self::DB_TABLE); $result = $query->execute(); return $result->fetchAll(); } public static function getSession($id){ - $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*documents_session` WHERE `es_id`= ?'); + $query = \OCP\DB::prepare('SELECT * FROM ' . self::DB_TABLE . ' WHERE `es_id`= ?'); $result = $query->execute(array($id)); return $result->fetchRow(); } @@ -50,7 +51,7 @@ class Session extends Db{ $query = \OCP\DB::prepare(' SELECT `s`.*, COUNT(`m`.`member_id`) AS `users` - FROM `*PREFIX*documents_session` AS `s` + FROM ' . self::DB_TABLE . ' AS `s` LEFT JOIN `*PREFIX*documents_member` AS `m` ON `s`.`es_id`=`m`.`es_id` AND `m`.`status`='. Member::MEMBER_STATUS_ACTIVE .' AND `m`.`uid` != ? @@ -88,7 +89,7 @@ class Session extends Db{ } $stmt = self::buildPlaceholders($fileIds); - $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*documents_session` WHERE `file_id` IN (' . $stmt .')'); + $query = \OCP\DB::prepare('SELECT * FROM ' . self::DB_TABLE . ' WHERE `file_id` IN (' . $stmt .')'); $result = $query->execute($fileIds); $sessions = $result->fetchAll(); if (!is_array($sessions)){ @@ -109,7 +110,7 @@ class Session extends Db{ $query = \OCP\DB::prepare(' SELECT `s`.*, COUNT(`m`.`member_id`) AS `users` - FROM `*PREFIX*documents_session` AS `s` + FROM ' . self::DB_TABLE . ' AS `s` LEFT JOIN `*PREFIX*documents_member` AS `m` ON `s`.`es_id`=`m`.`es_id` AND `m`.`status`='. Member::MEMBER_STATUS_ACTIVE .' WHERE `s`.`file_id` IN (' . $stmt .') @@ -123,6 +124,11 @@ class Session extends Db{ } return $info; } + + public static function deleteByFileid($fileId){ + $query = \OCP\DB::prepare('DELETE FROM ' . self::DB_TABLE . ' WHERE `file_id` = ?'); + $query->execute($fileId); + } protected static function getUniqueSessionId(){ do { diff --git a/lib/storage.php b/lib/storage.php index 870d9dd3..05f9537f 100755 --- a/lib/storage.php +++ b/lib/storage.php @@ -42,18 +42,27 @@ class Storage { } /** - * @brief Copy files to trash bin + * @brief Cleanup session data on removing the document * @param array * * This function is connected to the delete signal of OC_Filesystem - * to copy the file to the trash bin + * to delete the related info from database */ public static function onDelete($params) { - - if ( \OCP\App::isEnabled('files_trashbin') ) { - $path = $params['path']; - Trashbin::move2trash($path); + $info = \OC\Files\Filesystem::getFileInfo($params['path']); + + $fileId = @$info['fileid']; + if (!$fileId){ + return; + } + + $session = Session::getSessionByFileId($fileId); + if (!is_array($session)){ + return; } + + Member::deleteBySessionId($session['es_id']); + Op::deleteBySessionId($session['es_id']); + Session::deleteByFileid($fileId); } - }