X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FLinkCache.php;h=33447c31bf71272046960336928ede75c18acd56;hb=814f8a80c2a4e326676684551e536da589c80bdb;hp=8664ef8f802c84a7a5ed3b14ee67ae41135fe371;hpb=ee80c43ca01d98fda0caf129e655d27e5a0676c6;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/LinkCache.php b/includes/LinkCache.php index 8664ef8f80..33447c31bf 100644 --- a/includes/LinkCache.php +++ b/includes/LinkCache.php @@ -1,21 +1,54 @@ -mActive = true; + function LinkCache() { + $this->mForUpdate = false; + $this->mPageLinks = array(); $this->mGoodLinks = array(); $this->mBadLinks = array(); - $this->mImageLinks = array(); } - function getGoodLinkID( $title ) - { + /* private */ function getKey( $title ) { + global $wgDBname; + return $wgDBname.':lc:title:'.$title; + } + + /** + * General accessor to get/set whether SELECT FOR UPDATE should be used + */ + function forUpdate( $update = NULL ) { + return wfSetVar( $this->mForUpdate, $update ); + } + + function getGoodLinkID( $title ) { if ( array_key_exists( $title, $this->mGoodLinks ) ) { return $this->mGoodLinks[$title]; } else { @@ -23,99 +56,123 @@ class LinkCache { } } - function isBadLink( $title ) - { - return in_array( $title, $this->mBadLinks ); + function isBadLink( $title ) { + return array_key_exists( $title, $this->mBadLinks ); } - function addGoodLink( $id, $title ) - { - if ( $this->mActive ) { - $this->mGoodLinks[$title] = $id; - } + function addGoodLinkObj( $id, $title ) { + $dbkey = $title->getPrefixedDbKey(); + $this->mGoodLinks[$dbkey] = $id; + $this->mPageLinks[$dbkey] = $title; } - function addBadLink( $title ) - { - if ( $this->mActive && ( ! $this->isBadLink( $title ) ) ) { - array_push( $this->mBadLinks, $title ); + function addBadLinkObj( $title ) { + $dbkey = $title->getPrefixedDbKey(); + if ( ! $this->isBadLink( $dbkey ) ) { + $this->mBadLinks[$dbkey] = 1; + $this->mPageLinks[$dbkey] = $title; } } - function addImageLink( $title ) - { - if ( $this->mActive ) { $this->mImageLinks[$title] = 1; } + function clearBadLink( $title ) { + unset( $this->mBadLinks[$title] ); + $this->clearLink( $title ); } - function clearBadLink( $title ) - { - $index = array_search( $title, $this->mBadLinks ); - if ( isset( $index ) ) { - unset( $this->mBadLinks[$index] ); - } + function clearLink( $title ) { + global $wgMemc, $wgLinkCacheMemcached; + if( $wgLinkCacheMemcached ) + $wgMemc->delete( $this->getKey( $title ) ); } - function suspend() { $this->mActive = false; } - function resume() { $this->mActive = true; } + function getPageLinks() { return $this->mPageLinks; } function getGoodLinks() { return $this->mGoodLinks; } - function getBadLinks() { return $this->mBadLinks; } - function getImageLinks() { return $this->mImageLinks; } + function getBadLinks() { return array_keys( $this->mBadLinks ); } + + /** + * Add a title to the link cache, return the page_id or zero if non-existent + * @param string $title Title to add + * @return integer + */ + function addLink( $title ) { + $nt = Title::newFromDBkey( $title ); + if( $nt ) { + return $this->addLinkObj( $nt ); + } else { + return 0; + } + } - function addLink( $title ) - { + /** + * Add a title to the link cache, return the page_id or zero if non-existent + * @param Title $nt Title to add + * @return integer + */ + function addLinkObj( &$nt ) { + global $wgMemc, $wgLinkCacheMemcached, $wgAntiLockFlags; + $title = $nt->getPrefixedDBkey(); if ( $this->isBadLink( $title ) ) { return 0; } $id = $this->getGoodLinkID( $title ); if ( 0 != $id ) { return $id; } - wfProfileIn( "LinkCache::addLink-checkdatabase" ); + $fname = 'LinkCache::addLinkObj'; + global $wgProfiling, $wgProfiler; + if ( $wgProfiling && isset( $wgProfiler ) ) { + $fname .= ' (' . $wgProfiler->getCurrentSection() . ')'; + } + + wfProfileIn( $fname ); - $nt = Title::newFromDBkey( $title ); $ns = $nt->getNamespace(); $t = $nt->getDBkey(); - if ( "" == $t ) { return 0; } - $sql = "SELECT HIGH_PRIORITY cur_id FROM cur WHERE cur_namespace=" . - "{$ns} AND cur_title='" . wfStrencode( $t ) . "'"; - $res = wfQuery( $sql, "LinkCache::addLink" ); - - if ( 0 == wfNumRows( $res ) ) { - $id = 0; - } else { - $s = wfFetchObject( $res ); - $id = $s->cur_id; + if ( '' == $title ) { + wfProfileOut( $fname ); + return 0; } - if ( 0 == $id ) { $this->addBadLink( $title ); } - else { $this->addGoodLink( $id, $title ); } - wfProfileOut(); - return $id; - } - function preFill( $fromtitle ) - { - wfProfileIn( "LinkCache::preFill" ); - # Note -- $fromtitle is a Title *object* - $dbkeyfrom = wfStrencode( $fromtitle->getPrefixedDBKey() ); - $sql = "SELECT HIGH_PRIORITY cur_id,cur_namespace,cur_title - FROM cur,links - WHERE cur_id=l_to AND l_from='{$dbkeyfrom}'"; - $res = wfQuery( $sql, "LinkCache::preFill" ); - while( $s = wfFetchObject( $res ) ) { - $this->addGoodLink( $s->cur_id, - Title::makeName( $s->cur_namespace, $s->cur_title ) - ); + $id = NULL; + if( $wgLinkCacheMemcached ) + $id = $wgMemc->get( $key = $this->getKey( $title ) ); + if( ! is_integer( $id ) ) { + if ( $this->mForUpdate ) { + $db =& wfGetDB( DB_MASTER ); + if ( !( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) ) { + $options = array( 'FOR UPDATE' ); + } else { + $options = array(); + } + } else { + $db =& wfGetDB( DB_SLAVE ); + $options = array(); + } + + $id = $db->selectField( 'page', 'page_id', + array( 'page_namespace' => $ns, 'page_title' => $t ), + $fname, $options ); + if ( !$id ) { + $id = 0; + } + if( $wgLinkCacheMemcached ) + $wgMemc->add( $key, $id, 3600*24 ); } - $sql = "SELECT HIGH_PRIORITY bl_to - FROM brokenlinks - WHERE bl_from='{$dbkeyfrom}'"; - $res = wfQuery( $sql, "LinkCache::preFill" ); - while( $s = wfFetchObject( $res ) ) { - $this->addBadLink( $s->bl_to ); + if( 0 == $id ) { + $this->addBadLinkObj( $nt ); + } else { + $this->addGoodLinkObj( $id, $nt ); } - - wfProfileOut(); + wfProfileOut( $fname ); + return $id; } + /** + * Clears cache + */ + function clear() { + $this->mPageLinks = array(); + $this->mGoodLinks = array(); + $this->mBadLinks = array(); + } } - ?>