X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FQueryPage.php;h=2371444aba2348124d9ffb6e7dcbc15edb6c366d;hb=9868d5322d89811dc57b629868ae9a9450d0fc74;hp=50f34c340553a3b629bbfe8ac9e813994d358d9d;hpb=f5d4ebe686269f9c825d3881a08d966d79ad6059;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/QueryPage.php b/includes/QueryPage.php index 50f34c3405..2371444aba 100644 --- a/includes/QueryPage.php +++ b/includes/QueryPage.php @@ -1,104 +1,402 @@ - +sortDescending() ? 'DESC' : ''); + } + + /** + * Is this query expensive (for some definition of expensive)? Then we + * don't let it run in miser mode. $wgDisableQueryPages causes all query + * pages to be declared expensive. Some query pages are always expensive. + */ + function isExpensive( ) { + global $wgDisableQueryPages; + return $wgDisableQueryPages; + } + + /** + * Sometime we dont want to build rss / atom feeds. + */ + function isSyndicated() { + return true; + } + + /** + * Formats the results of the query for display. The skin is the current + * skin; you can use it for making links. The result is a single row of + * result data. You should be able to grab SQL results off of it. + * If the function return "false", the line output will be skipped. + */ + function formatResult( $skin, $result ) { + return ''; + } + + /** + * The content returned by this function will be output before any result + */ + function getPageHeader( ) { + return ''; + } + + /** + * If using extra form wheely-dealies, return a set of parameters here + * as an associative array. They will be encoded and added to the paging + * links (prev/next/lengths). + * @return array + */ + function linkParameters() { + return array(); + } - global $wgUser, $wgOut, $wgLang, $wgMiserMode; + /** + * Some special pages (for example SpecialListusers) might not return the + * current object formatted, but return the previous one instead. + * Setting this to return true, will call one more time wfFormatResult to + * be sure that the very last result is formatted and shown. + */ + function tryLastResult( ) { + return false; + } + + /** + * Clear the cache and save new results + */ + function recache( $ignoreErrors = true ) { + $fname = get_class($this) . '::recache'; + $dbw =& wfGetDB( DB_MASTER ); + $dbr =& wfGetDB( DB_SLAVE, array( $this->getName(), 'QueryPage::recache', 'vslow' ) ); + if ( !$dbw || !$dbr ) { + return false; + } - $sname = $this->getName(); - $fname = get_class($this) . "::doQuery"; + $querycache = $dbr->tableName( 'querycache' ); + + if ( $ignoreErrors ) { + $ignoreW = $dbw->ignoreErrors( true ); + $ignoreR = $dbr->ignoreErrors( true ); + } + + # Clear out any old cached data + $dbw->delete( 'querycache', array( 'qc_type' => $this->getName() ), $fname ); + # Do query + $res = $dbr->query( $this->getSQL() . $this->getOrder() . $dbr->limitResult( 1000,0 ), $fname ); + $num = false; + if ( $res ) { + $num = $dbr->numRows( $res ); + # Fetch results + $insertSql = "INSERT INTO $querycache (qc_type,qc_namespace,qc_title,qc_value) VALUES "; + $first = true; + while ( $res && $row = $dbr->fetchObject( $res ) ) { + if ( $first ) { + $first = false; + } else { + $insertSql .= ','; + } + if ( isset( $row->value ) ) { + $value = $row->value; + } else { + $value = ''; + } + + $insertSql .= '(' . + $dbw->addQuotes( $row->type ) . ',' . + $dbw->addQuotes( $row->namespace ) . ',' . + $dbw->addQuotes( $row->title ) . ',' . + $dbw->addQuotes( $value ) . ')'; + } + + # Save results into the querycache table on the master + if ( !$first ) { + if ( !$dbw->query( $insertSql, $fname ) ) { + // Set result to false to indicate error + $dbr->freeResult( $res ); + $res = false; + } + } + if ( $res ) { + $dbr->freeResult( $res ); + } + if ( $ignoreErrors ) { + $dbw->ignoreErrors( $ignoreW ); + $dbr->ignoreErrors( $ignoreR ); + } + } + return $num; + } + + /** + * This is the actual workhorse. It does everything needed to make a + * real, honest-to-gosh query page. + * + * @param $offset database query offset + * @param $limit database query limit + * @param $shownavigation show navigation like "next 200"? + */ + function doQuery( $offset, $limit, $shownavigation=true ) { + global $wgUser, $wgOut, $wgLang, $wgRequest, $wgContLang; + global $wgMiserMode; + + $sname = $this->getName(); + $fname = get_class($this) . '::doQuery'; + $sql = $this->getSQL(); + $dbr =& wfGetDB( DB_SLAVE ); + $dbw =& wfGetDB( DB_MASTER ); + $querycache = $dbr->tableName( 'querycache' ); + + $wgOut->setSyndicated( $this->isSyndicated() ); + + if ( $this->isExpensive() ) { + // Disabled recache parameter due to retry problems -- TS + if( $wgMiserMode ) { + $type = $dbr->strencode( $sname ); + $sql = + "SELECT qc_type as type, qc_namespace as namespace,qc_title as title, qc_value as value + FROM $querycache WHERE qc_type='$type'"; + $wgOut->addWikiText( wfMsg( 'perfcached' ) ); + } + } + + $res = $dbr->query( $sql . $this->getOrder() . + $dbr->limitResult( $limit,$offset ), $fname ); + $num = $dbr->numRows($res); + + $sk = $wgUser->getSkin( ); + + if($shownavigation) { + $wgOut->addHTML( $this->getPageHeader() ); + $top = wfShowingResults( $offset, $num); + $wgOut->addHTML( "
{$top}\n" );
- if ( $this->isExpensive( ) ) {
-
- $vsp = $wgLang->getValidSpecialPages();
- $logpage = new LogPage( $vsp[$sname] );
- $logpage->mUpdateRecentChanges = false;
-
- if ( $wgMiserMode ) {
- $logpage->showAsDisabledPage();
- return;
- }
+ # often disable 'next' link when we reach the end
+ if($num < $limit) { $atend = true; } else { $atend = false; }
+
+ $sl = wfViewPrevNext( $offset, $limit ,
+ $wgContLang->specialPage( $sname ),
+ wfArrayToCGI( $this->linkParameters() ), $atend );
+ $wgOut->addHTML( "
{$sl}
{$sl}
\n" ); + } + return $num; } - $sql = $this->getSQL( $offset, $limit ); + /** + * Similar to above, but packaging in a syndicated feed instead of a web page + */ + function doFeed( $class = '' ) { + global $wgFeedClasses; + global $wgOut, $wgLanguageCode, $wgLang; + if( isset($wgFeedClasses[$class]) ) { + $feed = new $wgFeedClasses[$class]( + $this->feedTitle(), + $this->feedDesc(), + $this->feedUrl() ); + $feed->outHeader(); - $res = wfQuery( $sql, DB_READ, $fname ); + $dbr =& wfGetDB( DB_SLAVE ); + $sql = $this->getSQL() . $this->getOrder().$dbr->limitResult( 50, 0 ); + $res = $dbr->query( $sql, 'QueryPage::doFeed' ); + while( $obj = $dbr->fetchObject( $res ) ) { + $item = $this->feedResult( $obj ); + if( $item ) $feed->outItem( $item ); + } + $dbr->freeResult( $res ); - $sk = $wgUser->getSkin( ); + $feed->outFooter(); + return true; + } else { + return false; + } + } - $top = wfShowingResults( $offset, $limit ); - $wgOut->addHTML( "{$top}\n" );
+ /**
+ * Override for custom handling. If the titles/links are ok, just do
+ * feedItemDesc()
+ */
+ function feedResult( $row ) {
+ if( !isset( $row->title ) ) {
+ return NULL;
+ }
+ $title = Title::MakeTitle( IntVal( $row->namespace ), $row->title );
+ if( $title ) {
+ if( isset( $row->timestamp ) ) {
+ $date = $row->timestamp;
+ } else {
+ $date = '';
+ }
- $sl = wfViewPrevNext( $offset, $limit, $wgLang->specialPage( $sname ) );
- $wgOut->addHTML( "
{$sl}\n" );
+ $comments = '';
+ if( $title ) {
+ $talkpage = $title->getTalkPage();
+ $comments = $talkpage->getFullURL();
+ }
- $s = "
{$sl}\n" ); - # Saving cache - - if ( $this->isExpensive() && $offset == 0 && $limit >= 50 ) { - $logpage->replaceContent( $s ); + function feedItemDesc( $row ) { + return isset( $row->comment ) + ? htmlspecialchars( $row->comment ) + : ''; + } + + function feedItemAuthor( $row ) { + if( isset( $row->user_text ) ) { + return $row->user_text; + } else { + return ''; + } } - } -} -# This is a subclass for very simple queries that are just looking for page -# titles that match some criteria. It formats each result item as a link to -# that page. + function feedTitle() { + global $wgLanguageCode, $wgSitename, $wgLang; + $page = SpecialPage::getPage( $this->getName() ); + $desc = $page->getDescription(); + return "$wgSitename - $desc [$wgLanguageCode]"; + } + function feedDesc() { + return wfMsg( 'tagline' ); + } + + function feedUrl() { + global $wgLang; + $title = Title::MakeTitle( NS_SPECIAL, $this->getName() ); + return $title->getFullURL(); + } +} + +/** + * This is a subclass for very simple queries that are just looking for page + * titles that match some criteria. It formats each result item as a link to + * that page. + * + * @package MediaWiki + */ class PageQueryPage extends QueryPage { - function formatResult( $skin, $result ) { - return $skin->makeKnownLink( $result->cur_title, "" ); - } + function formatResult( $skin, $result ) { + global $wgContLang; + $nt = Title::makeTitle( $result->namespace, $result->title ); + return $skin->makeKnownLinkObj( $nt, $wgContLang->convert( $nt->getPrefixedText() ) ); + } } ?>