X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FLinkCache.php;h=0c50c7d2f797eda9fb8a3b013479bffedbe16660;hb=7c2a640280313655ec0fab0d6959612b37f9f9e1;hp=25b84ac4bc5abf73c407fb493c5ba4221252a7a4;hpb=b64fae638363395e47d89b066b6144b900bbf792;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/LinkCache.php b/includes/LinkCache.php index 25b84ac4bc..0c50c7d2f7 100644 --- a/includes/LinkCache.php +++ b/includes/LinkCache.php @@ -1,17 +1,25 @@ -mActive = true; @@ -34,7 +42,7 @@ class LinkCache { function isBadLink( $title ) { - return in_array( $title, $this->mBadLinks ); + return array_key_exists( $title, $this->mBadLinks ); } function addGoodLink( $id, $title ) @@ -47,7 +55,7 @@ class LinkCache { function addBadLink( $title ) { if ( $this->mActive && ( ! $this->isBadLink( $title ) ) ) { - array_push( $this->mBadLinks, $title ); + $this->mBadLinks[$title] = 1; } } @@ -56,49 +64,65 @@ class LinkCache { if ( $this->mActive ) { $this->mImageLinks[$title] = 1; } } + function addImageLinkObj( $nt ) + { + if ( $this->mActive ) { $this->mImageLinks[$nt->getDBkey()] = 1; } + } + function clearBadLink( $title ) { - $index = array_search( $title, $this->mBadLinks ); - if ( isset( $index ) ) { - unset( $this->mBadLinks[$index] ); - } - global $wgMemc, $wgDBname; - $wgMemc->delete( "$wgDBname:lc:title:$title" ); + unset( $this->mBadLinks[$title] ); + $this->clearLink( $title ); + } + + function clearLink( $title ) + { + global $wgMemc, $wgLinkCacheMemcached; + if( $wgLinkCacheMemcached ) + $wgMemc->delete( $this->getKey( $title ) ); } function suspend() { $this->mActive = false; } function resume() { $this->mActive = true; } function getGoodLinks() { return $this->mGoodLinks; } - function getBadLinks() { return $this->mBadLinks; } + function getBadLinks() { return array_keys( $this->mBadLinks ); } function getImageLinks() { return $this->mImageLinks; } function addLink( $title ) { - return $this->addLinkObj( Title::newFromDBkey( $title ) ); + $nt = Title::newFromDBkey( $title ); + if( $nt ) { + return $this->addLinkObj( $nt ); + } else { + return 0; + } } function addLinkObj( &$nt ) { - $title = $nt->getDBkey(); - if ( $this->isBadLink( $title ) ) { return 0; } + global $wgMemc, $wgLinkCacheMemcached; + $title = $nt->getPrefixedDBkey(); + if ( $this->isBadLink( $title ) ) { return 0; } $id = $this->getGoodLinkID( $title ); if ( 0 != $id ) { return $id; } - global $wgMemc, $wgDBname; - $fname = "LinkCache::addLink-checkdatabase"; + $fname = "LinkCache::addLinkObj"; wfProfileIn( $fname ); $ns = $nt->getNamespace(); + $t = $nt->getDBkey(); if ( "" == $title ) { wfProfileOut( $fname ); return 0; } - - $id = $wgMemc->get( $key = "$wgDBname:lc:title:$title" ); - if( $id === FALSE ) { - $sql = "SELECT HIGH_PRIORITY cur_id FROM cur WHERE cur_namespace=" . - "{$ns} AND cur_title='" . wfStrencode( $title ) . "'"; + + $id = NULL; + if( $wgLinkCacheMemcached ) + $id = $wgMemc->get( $key = $this->getKey( $title ) ); + if( ! is_integer( $id ) ) { + $sql = "SELECT cur_id FROM cur WHERE cur_namespace=" . + "{$ns} AND cur_title='" . wfStrencode( $t ) . "'"; $res = wfQuery( $sql, DB_READ, "LinkCache::addLink" ); if ( 0 == wfNumRows( $res ) ) { @@ -107,8 +131,10 @@ class LinkCache { $s = wfFetchObject( $res ); $id = $s->cur_id; } - $wgMemc->add( $key, $id, time()+3600 ); + if( $wgLinkCacheMemcached ) + $wgMemc->add( $key, $id, 3600*24 ); } + if ( 0 == $id ) { $this->addBadLink( $title ); } else { $this->addGoodLink( $id, $title ); } wfProfileOut( $fname ); @@ -117,25 +143,39 @@ class LinkCache { function preFill( &$fromtitle ) { + global $wgEnablePersistentLC; + $fname = "LinkCache::preFill"; wfProfileIn( $fname ); # Note -- $fromtitle is a Title *object* - $dbkeyfrom = wfStrencode( $fromtitle->getPrefixedDBKey() ); - $sql = "SELECT HIGH_PRIORITY cur_id,cur_namespace,cur_title + + $this->suspend(); + $id = $fromtitle->getArticleID(); + $this->resume(); + + if( $id == 0 ) { + wfDebug( "$fname - got id 0 for title '" . $fromtitle->getPrefixedDBkey() . "'\n" ); + wfProfileOut( $fname ); + return; + } + + if ( $wgEnablePersistentLC ) { + if( $this->fillFromLinkscc( $id ) ){ + return; + } + } + + $sql = "SELECT cur_id,cur_namespace,cur_title FROM cur,links - WHERE cur_id=l_to AND l_from='{$dbkeyfrom}'"; - $res = wfQuery( $sql, DB_READ, "LinkCache::preFill" ); + WHERE cur_id=l_to AND l_from=$id"; + $res = wfQuery( $sql, DB_READ, $fname ); while( $s = wfFetchObject( $res ) ) { $this->addGoodLink( $s->cur_id, Title::makeName( $s->cur_namespace, $s->cur_title ) ); } - $this->suspend(); - $id = $fromtitle->getArticleID(); - $this->resume(); - - $sql = "SELECT HIGH_PRIORITY bl_to + $sql = "SELECT bl_to FROM brokenlinks WHERE bl_from='{$id}'"; $res = wfQuery( $sql, DB_READ, "LinkCache::preFill" ); @@ -146,7 +186,10 @@ class LinkCache { $this->mOldBadLinks = $this->mBadLinks; $this->mOldGoodLinks = $this->mGoodLinks; $this->mPreFilled = true; - + + if ( $wgEnablePersistentLC ) { + $this->saveToLinkscc( $id ); + } wfProfileOut( $fname ); } @@ -157,7 +200,9 @@ class LinkCache { function getBadAdditions() { - return array_values( array_diff( $this->mBadLinks, $this->mOldBadLinks ) ); + #wfDebug( "mOldBadLinks: " . implode( ', ', array_keys( $this->mOldBadLinks ) ) . "\n" ); + #wfDebug( "mBadLinks: " . implode( ', ', array_keys( $this->mBadLinks ) ) . "\n" ); + return array_values( array_diff( array_keys( $this->mBadLinks ), array_keys( $this->mOldBadLinks ) ) ); } function getImageAdditions() @@ -172,7 +217,7 @@ class LinkCache { function getBadDeletions() { - return array_values( array_diff( $this->mOldBadLinks, $this->mBadLinks ) ); + return array_values( array_diff( array_keys( $this->mOldBadLinks ), array_keys( $this->mBadLinks ) )); } function getImageDeletions() @@ -217,6 +262,64 @@ class LinkCache { $this->mBadLinks = array(); $this->mImageLinks = array(); } - + + /* private */ function fillFromLinkscc( $id ){ + $id = IntVal( $id ); + $res = wfQuery("SELECT lcc_cacheobj FROM linkscc WHERE lcc_pageid = $id", + DB_READ); + $row = wfFetchObject( $res ); + if( $row == FALSE) + return false; + + $cacheobj = false; + if( function_exists( "gzuncompress" ) ) + $cacheobj = @gzuncompress( $row->lcc_cacheobj ); + + if($cacheobj == FALSE){ + $cacheobj = $row->lcc_cacheobj; + } + $cc = @unserialize( $cacheobj ); + if( isset( $cc->mClassVer ) and ($cc->mClassVer == $this->mClassVer ) ){ + $this->mOldGoodLinks = $this->mGoodLinks = $cc->mGoodLinks; + $this->mOldBadLinks = $this->mBadLinks = $cc->mBadLinks; + $this->mPreFilled = true; + return TRUE; + } else { + return FALSE; + } + + } + + /* private */ function saveToLinkscc( $pid ){ + global $wgCompressedPersistentLC; + if( $wgCompressedPersistentLC and function_exists( "gzcompress" ) ) { + $ser = wfStrencode( gzcompress( serialize( $this ), 3 )); + } else { + $ser = wfStrencode( serialize( $this ) ); + } + wfQuery("REPLACE INTO linkscc(lcc_pageid,lcc_cacheobj) " . + "VALUES({$pid}, '{$ser}')", DB_WRITE); + } + + # $pid is a page id + /* static */ function linksccClearLinksTo( $pid ){ + $pid = intval( $pid ); + wfQuery("DELETE linkscc FROM linkscc,links ". + "WHERE lcc_pageid=links.l_from AND l_to={$pid}", DB_WRITE); + wfQuery("DELETE FROM linkscc WHERE lcc_pageid='{$pid}'", DB_WRITE); + } + + # $title is a prefixed db title, for example like Title->getPrefixedDBkey() returns. + /* static */ function linksccClearBrokenLinksTo( $title ){ + $title = wfStrencode( $title ); + wfQuery("DELETE linkscc FROM linkscc,brokenlinks ". + "WHERE lcc_pageid=bl_from AND bl_to='{$title}'", DB_WRITE); + } + + # $pid is a page id + /* static */ function linksccClearPage( $pid ){ + $pid = intval( $pid ); + wfQuery("DELETE FROM linkscc WHERE lcc_pageid='{$pid}'", DB_WRITE); + } } ?>