From ca32f08966f1b51fcb19460f0996bb0c4048e6fe Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 3 Dec 2011 13:29:22 +0100 Subject: Update to MediaWiki 1.18.0 * also update ArchLinux skin to chagnes in MonoBook * Use only css to hide our menu bar when printing --- includes/BacklinkCache.php | 131 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 108 insertions(+), 23 deletions(-) (limited to 'includes/BacklinkCache.php') diff --git a/includes/BacklinkCache.php b/includes/BacklinkCache.php index 02b0f170..8d1571ec 100644 --- a/includes/BacklinkCache.php +++ b/includes/BacklinkCache.php @@ -1,21 +1,71 @@ getBacklinkCache(). + * File for BacklinkCache class + * @file + */ + +/** + * Class for fetching backlink lists, approximate backlink counts and + * partitions. This is a shared cache. + * + * Instances of this class should typically be fetched with the method + * $title->getBacklinkCache(). + * + * Ideally you should only get your backlinks from here when you think + * there is some advantage in caching them. Otherwise it's just a waste + * of memory. * - * Ideally you should only get your backlinks from here when you think there is some - * advantage in caching them. Otherwise it's just a waste of memory. + * Introduced by r47317 + * + * @internal documentation reviewed on 18 Mar 2011 by hashar + * + * @author Tim Starling + * @copyright © 2009, Tim Starling, Domas Mituzas + * @copyright © 2010, Max Sem + * @copyright © 2011, Ashar Voultoiz */ class BacklinkCache { - var $partitionCache = array(); - var $fullResultCache = array(); - var $title; - var $db; + + /** + * Multi dimensions array representing batches. Keys are: + * > (string) links table name + * > 'numRows' : Number of rows for this link table + * > 'batches' : array( $start, $end ) + * + * @see BacklinkCache::partitionResult() + * + * Cleared with BacklinkCache::clear() + */ + protected $partitionCache = array(); + + /** + * Contains the whole links from a database result. + * This is raw data that will be partitioned in $partitionCache + * + * Initialized with BacklinkCache::getLinks() + * Cleared with BacklinkCache::clear() + */ + protected $fullResultCache = array(); + + /** + * Local copy of a database object. + * + * Accessor: BacklinkCache::getDB() + * Mutator : BacklinkCache::setDB() + * Cleared with BacklinkCache::clear() + */ + protected $db; + + /** + * Local copy of a Title object + */ + protected $title; const CACHE_EXPIRY = 3600; /** * Create a new BacklinkCache + * @param Title $title : Title object to create a backlink cache for. */ function __construct( $title ) { $this->title = $title; @@ -23,16 +73,17 @@ class BacklinkCache { /** * Serialization handler, diasallows to serialize the database to prevent - * failures after this class is deserialized from cache with dead DB connection. + * failures after this class is deserialized from cache with dead DB + * connection. */ function __sleep() { return array( 'partitionCache', 'fullResultCache', 'title' ); } /** - * Clear locally stored data + * Clear locally stored data and database object. */ - function clear() { + public function clear() { $this->partitionCache = array(); $this->fullResultCache = array(); unset( $this->db ); @@ -40,11 +91,18 @@ class BacklinkCache { /** * Set the Database object to use + * + * @param $db DatabaseBase */ public function setDB( $db ) { $this->db = $db; } + /** + * Get the slave connection to the database + * When non existing, will initialize the connection. + * @return Database object + */ protected function getDB() { if ( !isset( $this->db ) ) { $this->db = wfGetDB( DB_SLAVE ); @@ -58,7 +116,7 @@ class BacklinkCache { * @param $table String * @param $startId Integer or false * @param $endId Integer or false - * @return TitleArray + * @return TitleArrayFromResult */ public function getLinks( $table, $startId = false, $endId = false ) { wfProfileIn( __METHOD__ ); @@ -95,6 +153,7 @@ class BacklinkCache { return $ta; } + // @todo FIXME: Make this a function? if ( !isset( $this->fullResultCache[$table] ) ) { wfDebug( __METHOD__ . ": from DB\n" ); $res = $this->getDB()->select( @@ -117,14 +176,15 @@ class BacklinkCache { /** * Get the field name prefix for a given table + * @param $table String */ protected function getPrefix( $table ) { static $prefixes = array( - 'pagelinks' => 'pl', - 'imagelinks' => 'il', + 'pagelinks' => 'pl', + 'imagelinks' => 'il', 'categorylinks' => 'cl', 'templatelinks' => 'tl', - 'redirect' => 'rd', + 'redirect' => 'rd', ); if ( isset( $prefixes[$table] ) ) { @@ -135,18 +195,32 @@ class BacklinkCache { } /** - * Get the SQL condition array for selecting backlinks, with a join on the page table + * Get the SQL condition array for selecting backlinks, with a join + * on the page table. + * @param $table String */ protected function getConditions( $table ) { $prefix = $this->getPrefix( $table ); + // @todo FIXME: imagelinks and categorylinks do not rely on getNamespace, + // they could be moved up for nicer case statements switch ( $table ) { case 'pagelinks': case 'templatelinks': + $conds = array( + "{$prefix}_namespace" => $this->title->getNamespace(), + "{$prefix}_title" => $this->title->getDBkey(), + "page_id={$prefix}_from" + ); + break; case 'redirect': $conds = array( "{$prefix}_namespace" => $this->title->getNamespace(), - "{$prefix}_title" => $this->title->getDBkey(), + "{$prefix}_title" => $this->title->getDBkey(), + $this->getDb()->makeList( array( + "{$prefix}_interwiki = ''", + "{$prefix}_interwiki is null", + ), LIST_OR ), "page_id={$prefix}_from" ); break; @@ -171,6 +245,8 @@ class BacklinkCache { /** * Get the approximate number of backlinks + * @param $table String + * @return integer */ public function getNumLinks( $table ) { if ( isset( $this->fullResultCache[$table] ) ) { @@ -189,15 +265,17 @@ class BacklinkCache { /** * Partition the backlinks into batches. - * Returns an array giving the start and end of each range. The first batch has - * a start of false, and the last batch has an end of false. + * Returns an array giving the start and end of each range. The first + * batch has a start of false, and the last batch has an end of false. * * @param $table String: the links table name * @param $batchSize Integer * @return Array */ public function partition( $table, $batchSize ) { - // Try cache + + // 1) try partition cache ... + if ( isset( $this->partitionCache[$table][$batchSize] ) ) { wfDebug( __METHOD__ . ": got from partition cache\n" ); return $this->partitionCache[$table][$batchSize]['batches']; @@ -206,7 +284,8 @@ class BacklinkCache { $this->partitionCache[$table][$batchSize] = false; $cacheEntry =& $this->partitionCache[$table][$batchSize]; - // Try full result cache + // 2) ... then try full result cache ... + if ( isset( $this->fullResultCache[$table] ) ) { $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize ); wfDebug( __METHOD__ . ": got from full result cache\n" ); @@ -214,7 +293,8 @@ class BacklinkCache { return $cacheEntry['batches']; } - // Try memcached + // 3) ... fallback to memcached ... + global $wgMemc; $memcKey = wfMemcKey( @@ -233,7 +313,9 @@ class BacklinkCache { return $cacheEntry['batches']; } - // Fetch from database + + // 4) ... finally fetch from the slow database :( + $this->getLinks( $table ); $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize ); // Save to memcached @@ -245,6 +327,9 @@ class BacklinkCache { /** * Partition a DB result with backlinks in it into batches + * @param $res ResultWrapper database result + * @param $batchSize integer + * @return array @see */ protected function partitionResult( $res, $batchSize ) { $batches = array(); -- cgit v1.2.2