From: Brion Vibber
Date: Thu, 7 Aug 2003 11:54:16 +0000 (+0000)
Subject: Updates to watchlist:
X-Git-Tag: 1.1.0~358
X-Git-Url: http://git.cyclocoop.org/ecrire?a=commitdiff_plain;h=22cdb40a4e7ebdb5c074c46db00335303c8d7a5d;p=lhc%2Fweb%2Fwiklou.git
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.
---
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" );
+
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
#