From 22cdb40a4e7ebdb5c074c46db00335303c8d7a5d Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 7 Aug 2003 11:54:16 +0000 Subject: [PATCH] Updates to watchlist: * Dump fixed number cutoff in favor of stricter time cutoff * Try to guess which of two ways of doing the query will be more efficient * Default time cutoff of 1 hour to minimize database thrashing for large watchlists... * Add option to show the raw list and remove as many as you like in one go. --- includes/SpecialWatchlist.php | 170 +++++++++++++++++++++++++++++----- languages/Language.php | 18 ++++ 2 files changed, 167 insertions(+), 21 deletions(-) diff --git a/includes/SpecialWatchlist.php b/includes/SpecialWatchlist.php index cc04f1e1c2..c7a2d15ad1 100644 --- a/includes/SpecialWatchlist.php +++ b/includes/SpecialWatchlist.php @@ -18,23 +18,17 @@ function wfSpecialWatchlist() $days = $wgUser->getOption( "rcdays" ); if ( ! $days ) { $days = 3; } */ - $days = 7; + $days = (1.0 / 24.0); # 1 hour... } - $days = (int)$days; - list( $limit, $offset ) = wfCheckLimits( 100, "rclimit" ); + $days = floatval($days); if ( $days <= 0 ) { $docutoff = ''; } else { $docutoff = "cur_timestamp > '" . - wfUnix2Timestamp( time() - ( $days * 86400 ) ) + ( $cutoff = wfUnix2Timestamp( time() - intval( $days * 86400 ) ) ) . "' AND"; } - if ( $limit == 0 ) { - $dolimit = ""; - } else { - $dolimit = "LIMIT $limit"; - } $uid = $wgUser->getID(); if( $uid == 0 ) { @@ -42,24 +36,118 @@ function wfSpecialWatchlist() return; } - $sql = "SELECT DISTINCT - cur_id,cur_namespace,cur_title,cur_comment, - cur_user,cur_user_text,cur_timestamp,cur_minor_edit,cur_is_new - FROM cur,watchlist - WHERE wl_user={$uid} AND wl_title=cur_title - AND {$docutoff} (cur_namespace=wl_namespace OR cur_namespace=wl_namespace+1) - ORDER BY inverse_timestamp {$dolimit}"; - $res = wfQuery( $sql, $fname ); - if ( wfNumRows( $res ) == 0 ) { - $wgOut->addHTML( wfMsg( "nowatchlist" ) ); + global $action,$remove,$id; + if(($action == "submit") && isset($remove) && is_array($id)) { + $wgOut->addHTML( wfMsg( "removingchecked" ) ); + foreach($id as $one) { + $t = Title::newFromURL( $one ); + if($t->getDBkey() != "") { + $sql = "DELETE FROM watchlist WHERE wl_user=$uid AND " . + "wl_namespace=" . $t->getNamespace() . " AND " . + "wl_title='" . wfStrencode( $t->getDBkey() ) . "'"; + $res = wfQuery( $sql ); + if($res === FALSE) { + $wgOut->addHTML( "
\n" . wfMsg( "couldntremove", htmlspecialchars($one) ) ); + } else { + $wgOut->addHTML( " (" . htmlspecialchars($one) . ")" ); + } + } else { + $wgOut->addHTML( "
\n" . wfMsg( "iteminvalidname", htmlspecialchars($one) ) ); + } + } + $wgOut->addHTML( "done.\n

" ); + } + + $sql = "SELECT COUNT(*) AS n FROM watchlist WHERE wl_user=$uid"; + $res = wfQuery( $sql ); + $s = wfFetchObject( $res ); + $nitems = $s->n; + + if($nitems == 0) { + $wgOut->addHTML( wfMsg( "nowatchlist" ) ); + return; + } + + $sql = "SELECT COUNT(*) AS n FROM cur WHERE cur_timestamp>'$cutoff'"; + $res = wfQuery( $sql ); + $s = wfFetchObject( $res ); + $npages = $s->n; + + + if(isset($_REQUEST['magic'])) { + $wgOut->addHTML( wfMsg( "watchlistcontains", $nitems ) . + "

" . wfMsg( "watcheditlist" ) . "

\n" ); + + $wgOut->addHTML( "
\n" . + "\n" . + "\n" . + "
\n" ); + return; } + + # If the watchlist is relatively short, it's simplest to zip + # down its entirety and then sort the results. + + # If it's relatively long, it may be worth our while to zip + # through the time-sorted page list checking for + + # Up estimate of watched items by 15% to compensate for talk pages... + if( ( $nitems*1.15 > $npages ) ) { + $x = "cur_timestamp"; + $y = wfMsg( "watchmethod-recent" ); + $z = "wl_namespace=cur_namespace&65534"; + } else { + $x = "name_title_timestamp"; + $y = wfMsg( "watchmethod-list" ); + $z = "(wl_namespace=cur_namespace OR wl_namespace+1=cur_namespace)"; + } + + $wgOut->addHTML( "" . wfMsg( "watchdetails", $nitems, $npages, $y, + wfLocalUrl( $wgLang->specialPage("Watchlist"),"magic=yes" ) ) . "
\n" ); + + + $sql = "SELECT + cur_namespace,cur_title,cur_comment, + cur_user,cur_user_text,cur_timestamp,cur_minor_edit,cur_is_new + FROM watchlist,cur USE INDEX ($x) + WHERE wl_user=$uid + AND $z + AND wl_title=cur_title + AND cur_timestamp>'$cutoff' + ORDER BY cur_timestamp DESC"; - $note = wfMsg( "rcnote", $limit, $days ); + + $res = wfQuery( $sql, $fname ); + + if($days >= 1) + $note = wfMsg( "rcnote", $limit, $days ); + else + $note = wfMsg( "wlnote", $limit, round($days*24) ); $wgOut->addHTML( "\n
\n{$note}\n
" ); - $note = rcDayLimitlinks( $days, $limit, "Watchlist", "", true ); + $note = wlCutoffLinks( $days, $limit ); $wgOut->addHTML( "{$note}\n" ); + if ( wfNumRows( $res ) == 0 ) { + $wgOut->addHTML( "

" . wfMsg( "watchnochange" ) . "

" ); + return; + } + $sk = $wgUser->getSkin(); $s = $sk->beginRecentChangesList(); @@ -82,4 +170,44 @@ function wfSpecialWatchlist() $wgOut->addHTML( $s ); } + +function wlHoursLink( $h, $page ) { + global $wgUser, $wgLang; + $sk = $wgUser->getSkin(); + $s = $sk->makeKnownLink( + $wgLang->specialPage( $page ), + $h, "days=" . ($h / 24.0) ); + return $s; +} + + +function wlDaysLink( $d, $page ) { + global $wgUser, $wgLang; + $sk = $wgUser->getSkin(); + $s = $sk->makeKnownLink( + $wgLang->specialPage( $page ), + $d, "days=$d" ); + return $s; +} + +function wlCutoffLinks( $days, $limit, $page = "Watchlist" ) +{ + $hours = array( 1, 2, 6, 12 ); + $days = array( 1, 3, 7 ); + $cl = ""; + $i = 0; + foreach( $hours as $h ) { + $hours[$i++] = wlHoursLink( $h, $page ); + } + $i = 0; + foreach( $days as $d ) { + $days[$i++] = wlDaysLink( $d, $page ); + } + return + "Show last " . + implode(" | ", $hours) . " hours " . + implode(" | ", $days) . " days"; +# $note = wfMsg( "rclinks", $cl, $dl, $mlink ); +} + ?> diff --git a/languages/Language.php b/languages/Language.php index dff60df648..f7d29dfa6c 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -919,6 +919,24 @@ make it easier to pick out.

"watchthispage" => "Watch this page", "unwatchthispage" => "Stop watching", "notanarticle" => "Not an article", +"watchnochange" => "None of your watched items were edited in the time period displayed.", +"watchdetails" => "($1 pages watched not counting talk pages; +$2 total pages edited since cutoff; +$3... +show and edit complete list.)", +"watchmethod-recent" => "checking recent edits for watched pages", +"watchmethod-list" => "checking watched pages for recent edits", +"removechecked" => "Remove checked items from watchlist", +"watchlistcontains" => "Your watchlist contains $1 pages.", +"watcheditlist" => "Here's an alphabetical list of your +watched pages. Check the boxes of pages you want to remove +from your watchlist and click the 'remove checked' button +at the bottom of the screen.", +"removingchecked" => "Removing requested items from watchlist...", +"couldntremove" => "Couldn't remove item '$1'...", +"iteminvalidname" => "Problem with item '$1', invalid name...", +"wlnote" => "Below are the last $1 changes in the last $2 hours.", + # Delete/protect/revert # -- 2.20.1