From 34b25e6afcf93d4f3fb7be57de7e3c449b29f41e Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Sun, 3 Jan 2016 22:57:28 +0100 Subject: [PATCH] Use EmptyIdException in Fave deletion try-catch --- plugins/Favorite/classes/Fave.php | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/plugins/Favorite/classes/Fave.php b/plugins/Favorite/classes/Fave.php index 7fa7705e8f..66d5a186d8 100644 --- a/plugins/Favorite/classes/Fave.php +++ b/plugins/Favorite/classes/Fave.php @@ -124,27 +124,30 @@ class Fave extends Managed_DataObject $result = parent::delete($useWhere); - self::blowCacheForProfileId($this->user_id); - self::blowCacheForNoticeId($this->notice_id); - self::blow('popular'); - if ($result !== false) { Event::handle('EndDisfavorNotice', array($profile, $notice)); } } } catch (NoResultException $e) { + // In case there's some inconsistency where the profile or notice was deleted without losing the fave db entry common_log(LOG_INFO, '"'.get_class($e->obj).'" with id=='.var_export($e->obj->id, true).' object not found when deleting favorite, ignoring...'); - - // Delete it without the event, as something is wrong and we don't want it anyway. - $result = parent::delete($useWhere); - - self::blowCacheForProfileId($this->user_id); - self::blowCacheForNoticeId($this->notice_id); - self::blow('popular'); + } catch (EmptyIdException $e) { + // Some buggy instances of GNU social have had favroites with notice id==0 stored in the database + common_log(LOG_INFO, '"'.get_class($e->obj).'"object had empty id deleting favorite, ignoring...'); } + // If we catch an exception above, then $result===null because parent::delete only returns an int>=0 or boolean false + if (is_null($result)) { + // Delete it without the event, as something is wrong and we don't want it anyway. + $result = parent::delete($useWhere); + } + // Err, apparently we can reference $this->user_id after parent::delete, + // I guess it's safe because this is the order it was before! + self::blowCacheForProfileId($this->user_id); + self::blowCacheForNoticeId($this->notice_id); + self::blow('popular'); return $result; }