diff options
Diffstat (limited to 'includes/WatchedItem.php')
-rw-r--r-- | includes/WatchedItem.php | 105 |
1 files changed, 97 insertions, 8 deletions
diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php index 031b2b48..932af169 100644 --- a/includes/WatchedItem.php +++ b/includes/WatchedItem.php @@ -1,14 +1,34 @@ <?php /** + * Accessor and mutator for watchlist entries. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * * @file * @ingroup Watchlist */ /** + * Representation of a pair of user and title for watchlist entries. + * * @ingroup Watchlist */ class WatchedItem { var $mTitle, $mUser, $id, $ns, $ti; + private $loaded = false, $watched, $timestamp; /** * Create a WatchedItem object with the given user and title @@ -32,18 +52,83 @@ class WatchedItem { } /** - * Is mTitle being watched by mUser? - * @return bool + * Return an array of conditions to select or update the appropriate database + * row. + * + * @return array */ - public function isWatched() { + private function dbCond() { + return array( 'wl_user' => $this->id, 'wl_namespace' => $this->ns, 'wl_title' => $this->ti ); + } + + /** + * Load the object from the database + */ + private function load() { + if ( $this->loaded ) { + return; + } + $this->loaded = true; + # Pages and their talk pages are considered equivalent for watching; # remember that talk namespaces are numbered as page namespace+1. $dbr = wfGetDB( DB_SLAVE ); - $res = $dbr->select( 'watchlist', 1, array( 'wl_user' => $this->id, 'wl_namespace' => $this->ns, - 'wl_title' => $this->ti ), __METHOD__ ); - $iswatched = ($dbr->numRows( $res ) > 0) ? 1 : 0; - return $iswatched; + $row = $dbr->selectRow( 'watchlist', 'wl_notificationtimestamp', + $this->dbCond(), __METHOD__ ); + + if ( $row === false ) { + $this->watched = false; + } else { + $this->watched = true; + $this->timestamp = $row->wl_notificationtimestamp; + } + } + + /** + * Is mTitle being watched by mUser? + * @return bool + */ + public function isWatched() { + $this->load(); + return $this->watched; + } + + /** + * Get the notification timestamp of this entry. + * + * @return false|null|string: false if the page is not watched, the value of + * the wl_notificationtimestamp field otherwise + */ + public function getNotificationTimestamp() { + $this->load(); + if ( $this->watched ) { + return $this->timestamp; + } else { + return false; + } + } + + /** + * Reset the notification timestamp of this entry + * + * @param $force Whether to force the write query to be executed even if the + * page is not watched or the notification timestamp is already NULL. + */ + public function resetNotificationTimestamp( $force = '' ) { + if ( $force != 'force' ) { + $this->load(); + if ( !$this->watched || $this->timestamp === null ) { + return; + } + } + + // If the page is watched by the user (or may be watched), update the timestamp on any + // any matching rows + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => null ), + $this->dbCond(), __METHOD__ ); + $this->timestamp = null; } /** @@ -75,6 +160,8 @@ class WatchedItem { 'wl_notificationtimestamp' => null ), __METHOD__, 'IGNORE' ); + $this->watched = true; + wfProfileOut( __METHOD__ ); return true; } @@ -115,6 +202,8 @@ class WatchedItem { $success = true; } + $this->watched = false; + wfProfileOut( __METHOD__ ); return $success; } @@ -139,7 +228,7 @@ class WatchedItem { * * @return bool */ - private static function doDuplicateEntries( $ot, $nt ) { + private static function doDuplicateEntries( $ot, $nt ) { $oldnamespace = $ot->getNamespace(); $newnamespace = $nt->getNamespace(); $oldtitle = $ot->getDBkey(); |