array( 'DisambiguationsPage', 'Disambiguations' ),
array( 'DoubleRedirectsPage', 'DoubleRedirects' ),
array( 'LinkSearchPage', 'LinkSearch' ),
- array( 'ListredirectsPage', 'Listredirects' ),
+ array( 'ListredirectsPage', 'Listredirects' ),
array( 'LonelyPagesPage', 'Lonelypages' ),
array( 'LongPagesPage', 'Longpages' ),
array( 'MostcategoriesPage', 'Mostcategories' ),
array( 'MostimagesPage', 'Mostimages' ),
array( 'MostlinkedCategoriesPage', 'Mostlinkedcategories' ),
- array( 'SpecialMostlinkedtemplates', 'Mostlinkedtemplates' ),
+ array( 'SpecialMostlinkedtemplates', 'Mostlinkedtemplates' ),
array( 'MostlinkedPage', 'Mostlinked' ),
array( 'MostrevisionsPage', 'Mostrevisions' ),
array( 'FewestrevisionsPage', 'Fewestrevisions' ),
array( 'ShortPagesPage', 'Shortpages' ),
array( 'UncategorizedCategoriesPage', 'Uncategorizedcategories' ),
array( 'UncategorizedPagesPage', 'Uncategorizedpages' ),
- array( 'UncategorizedImagesPage', 'Uncategorizedimages' ),
- array( 'UncategorizedTemplatesPage', 'Uncategorizedtemplates' ),
+ array( 'UncategorizedImagesPage', 'Uncategorizedimages' ),
+ array( 'UncategorizedTemplatesPage', 'Uncategorizedtemplates' ),
array( 'UnusedCategoriesPage', 'Unusedcategories' ),
array( 'UnusedimagesPage', 'Unusedimages' ),
array( 'WantedCategoriesPage', 'Wantedcategories' ),
array( 'WantedFilesPage', 'Wantedfiles' ),
array( 'WantedPagesPage', 'Wantedpages' ),
- array( 'WantedTemplatesPage', 'Wantedtemplates' ),
+ array( 'WantedTemplatesPage', 'Wantedtemplates' ),
array( 'UnwatchedPagesPage', 'Unwatchedpages' ),
- array( 'UnusedtemplatesPage', 'Unusedtemplates' ),
- array( 'WithoutInterwikiPage', 'Withoutinterwiki' ),
+ array( 'UnusedtemplatesPage', 'Unusedtemplates' ),
+ array( 'WithoutInterwikiPage', 'Withoutinterwiki' ),
);
wfRunHooks( 'wgQueryPages', array( &$wgQueryPages ) );
global $wgDisableCounters;
if ( !$wgDisableCounters )
- $wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
+ $wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
/**
/**
* A mutator for $this->listoutput;
*
- * @param bool $bool
+ * @param $bool Boolean
*/
function setListoutput( $bool ) {
$this->listoutput = $bool;
* Subclasses return their name here. Make sure the name is also
* specified in SpecialPage.php and in Language.php as a language message
* param.
+ *
+ * @return String
*/
function getName() {
return '';
/**
* Override to sort by increasing values
+ *
+ * @return Boolean
*/
function sortDescending() {
return true;
* 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.
+ *
+ * @return Boolean
*/
- function isExpensive( ) {
+ function isExpensive() {
global $wgDisableQueryPages;
return $wgDisableQueryPages;
}
* Whether or not the output of the page in question is retrived from
* the database cache.
*
- * @return bool
+ * @return Boolean
*/
function isCached() {
global $wgMiserMode;
/**
* Sometime we dont want to build rss / atom feeds.
+ *
+ * @return Boolean
*/
function isSyndicated() {
return true;
* 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.
+ *
+ * @param $skin Skin object
+ * @param $result Object: database row
*/
function formatResult( $skin, $result ) {
return '';
}
- /**
- * Formats the result as something that can be understood by the API.
- * Defaults to setting id, ns and title
- */
- function formatApiResult( $result ) {
- $title = Title::makeTitle( $row->namespace, $row->title );
- return array(
- 'pageid' => intval( $row->id ),
- 'ns' => intval( $title->getNamespace() ),
- 'title' => $title->getPrefixedText(),
- );
- }
/**
* The content returned by this function will be output before any result
+ *
+ * @return String
*/
- function getPageHeader( ) {
+ 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
+ *
+ * @return Array
*/
function linkParameters() {
return array();
* 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( ) {
+ function tryLastResult() {
return false;
}
/**
* Clear the cache and save new results
+ *
+ * @param $limit Integer: limit for SQL statement
+ * @param $ignoreErrors Boolean: whether to ignore database errors
*/
function recache( $limit, $ignoreErrors = true ) {
$fname = get_class( $this ) . '::recache';
return false;
}
- $querycache = $dbr->tableName( 'querycache' );
-
if ( $ignoreErrors ) {
$ignoreW = $dbw->ignoreErrors( true );
$ignoreR = $dbr->ignoreErrors( true );
if ( count( $vals ) ) {
if ( !$dbw->insert( 'querycache', $vals, __METHOD__ ) ) {
// 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 );
function doQuery( $offset, $limit, $shownavigation=true ) {
global $wgUser, $wgOut, $wgLang, $wgContLang;
- $wgOut->setSyndicated( $this->isSyndicated() );
-
- # Really really do the query now
- $result = $this->reallyDoQuery( $offset, $limit );
-
- # Tell about cachiness
- if ( $result['cached'] !== false ) {
- if ( $result['cached'] === true ) {
- $wgOut->addWikiMsg( 'perfcached' );
- } else {
- $updated = $wgLang->timeAndDate( $result['cached'], true, true );
- $wgOut->addMeta( 'Data-Cache-Time', $result['cached'] );
- $wgOut->addInlineScript( "var dataCacheTime = '{$result['cached']}';" );
- $wgOut->addWikiMsg( 'perfcachedts', $updated );
- }
- }
- if ( $result['disabled'] ) {
- # If updates on this page have been disabled, let the user know
- # that the data set won't be refreshed for now
-
- $wgOut->addWikiMsg( 'querypage-no-updates' );
- }
-
- $wgOut->addHTML( XML::openElement( 'div', array('class' => 'mw-spcontent') ) );
-
- # Top header and navigation
- if( $shownavigation ) {
- $wgOut->addHTML( $this->getPageHeader() );
- if( $result['count'] > 0 ) {
- $wgOut->addHTML( '<p>' . wfShowingResults( $offset, $result['count'] ) . '</p>' );
- # Disable the "next" link when we reach the end
- $paging = wfViewPrevNext( $offset, $limit, $wgContLang->specialPage( $this->getName() ),
- wfArrayToCGI( $this->linkParameters() ), ( $result['count'] < $limit ) );
- $wgOut->addHTML( '<p>' . $paging . '</p>' );
- } else {
- # No results to show, so don't bother with "showing X of Y" etc.
- # -- just let the user know and give up now
- $wgOut->addHTML( '<p>' . wfMsgHtml( 'specialpage-empty' ) . '</p>' );
- $wgOut->addHTML( XML::closeElement( 'div' ) );
- return;
- }
- }
-
- # The actual results; specialist subclasses will want to handle this
- # with more than a straight list, so we hand them the info, plus
- # an OutputPage, and let them get on with it
- $this->outputResults( $wgOut,
- $wgUser->getSkin(),
- $result['dbr'], # Should use a ResultWrapper for this
- $result['result'],
- $result['count'],
- $offset );
-
- # Repeat the paging links at the bottom
- if( $shownavigation ) {
- $wgOut->addHTML( '<p>' . $paging . '</p>' );
- }
-
- $wgOut->addHTML( XML::closeElement( 'div' ) );
-
- return $result['count'];
- }
-
- /**
- * Really really do the query. Returns an array with:
- * 'disabled' => true if the data will not be further refreshed,
- * 'cached' => false if uncached, the timestamp of the last cache if known, else simply true,
- * 'result' => the real result object,
- * 'count' => number of results,
- * 'dbr' => the database used for fetching the data
- */
- protected function reallyDoQuery( $offset, $limit ) {
- $result = array( 'disabled' => false );
-
$this->offset = $offset;
$this->limit = $limit;
- $fname = get_class($this) . '::reallyDoQuery';
+ $sname = $this->getName();
+ $fname = get_class($this) . '::doQuery';
$dbr = wfGetDB( DB_SLAVE );
+ $wgOut->setSyndicated( $this->isSyndicated() );
if ( !$this->isCached() ) {
$sql = $this->getSQL();
- $result['cached'] = false;
} else {
# Get the cached result
$querycache = $dbr->tableName( 'querycache' );
- $type = $dbr->strencode( $this->getName() );
+ $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'";
$tRow = $dbr->fetchObject( $tRes );
if( $tRow ) {
- $result['cached'] = $tRow->qci_timestamp;
+ $updated = $wgLang->timeanddate( $tRow->qci_timestamp, true, true );
+ $updateddate = $wgLang->date( $tRow->qci_timestamp, true, true );
+ $updatedtime = $wgLang->time( $tRow->qci_timestamp, true, true );
+ $wgOut->addMeta( 'Data-Cache-Time', $tRow->qci_timestamp );
+ $wgOut->addInlineScript( "var dataCacheTime = '{$tRow->qci_timestamp}';" );
+ $wgOut->addWikiMsg( 'perfcachedts', $updated, $updateddate, $updatedtime );
} else {
- $result['cached'] = true;
+ $wgOut->addWikiMsg( 'perfcached' );
}
# If updates on this page have been disabled, let the user know
# that the data set won't be refreshed for now
global $wgDisableQueryPageUpdate;
if( is_array( $wgDisableQueryPageUpdate ) && in_array( $this->getName(), $wgDisableQueryPageUpdate ) ) {
- $result['disabled'] = true;
+ $wgOut->addWikiMsg( 'querypage-no-updates' );
}
+
}
}
$num = $dbr->numRows($res);
$this->preprocessResults( $dbr, $res );
-
- $result['result'] = $res;
- $result['count'] = $num;
- $result['dbr'] = $dbr;
- return $result;
+
+ $wgOut->addHTML( Xml::openElement( 'div', array('class' => 'mw-spcontent') ) );
+
+ # Top header and navigation
+ if( $shownavigation ) {
+ $wgOut->addHTML( $this->getPageHeader() );
+ if( $num > 0 ) {
+ $wgOut->addHTML( '<p>' . wfShowingResults( $offset, $num ) . '</p>' );
+ # Disable the "next" link when we reach the end
+ $paging = wfViewPrevNext( $offset, $limit, $wgContLang->specialPage( $sname ),
+ wfArrayToCGI( $this->linkParameters() ), ( $num < $limit ) );
+ $wgOut->addHTML( '<p>' . $paging . '</p>' );
+ } else {
+ # No results to show, so don't bother with "showing X of Y" etc.
+ # -- just let the user know and give up now
+ $wgOut->addHTML( '<p>' . wfMsgHtml( 'specialpage-empty' ) . '</p>' );
+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
+ return;
+ }
+ }
+
+ # The actual results; specialist subclasses will want to handle this
+ # with more than a straight list, so we hand them the info, plus
+ # an OutputPage, and let them get on with it
+ $this->outputResults( $wgOut,
+ $wgUser->getSkin(),
+ $dbr, # Should use a ResultWrapper for this
+ $res,
+ $dbr->numRows( $res ),
+ $offset );
+
+ # Repeat the paging links at the bottom
+ if( $shownavigation ) {
+ $wgOut->addHTML( '<p>' . $paging . '</p>' );
+ }
+
+ $wgOut->addHTML( Xml::closeElement( 'div' ) );
+
+ return $num;
}
/**
* Format and output report results using the given information plus
* OutputPage
*
- * @param OutputPage $out OutputPage to print to
- * @param Skin $skin User skin to use
- * @param Database $dbr Database (read) connection to use
- * @param int $res Result pointer
- * @param int $num Number of available result rows
- * @param int $offset Paging offset
+ * @param $out OutputPage to print to
+ * @param $skin Skin: user skin to use
+ * @param $dbr Database (read) connection to use
+ * @param $res Integer: result pointer
+ * @param $num Integer: number of available result rows
+ * @param $offset Integer: paging offset
*/
protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
global $wgContLang;
# $res might contain the whole 1,000 rows, so we read up to
# $num [should update this to use a Pager]
- for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+ for( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
$line = $this->formatResult( $skin, $row );
if( $line ) {
$attr = ( isset( $row->usepatrol ) && $row->usepatrol && $row->patrolled == 0 )
}
}
-
function openList( $offset ) {
return "\n<ol start='" . ( $offset + 1 ) . "' class='special'>\n";
}
$item = $this->feedResult( $obj );
if( $item ) $feed->outItem( $item );
}
- $dbr->freeResult( $res );
$feed->outFooter();
return true;
*/
function feedResult( $row ) {
if( !isset( $row->title ) ) {
- return NULL;
+ return null;
}
$title = Title::MakeTitle( intval( $row->namespace ), $row->title );
if( $title ) {
$this->feedItemAuthor( $row ),
$comments);
} else {
- return NULL;
+ return null;
}
}
if( $title instanceof Title ) {
if( $this->isCached() ) {
$pageLink = $title->exists()
- ? '<s>' . $skin->link( $title ) . '</s>'
+ ? '<del>' . $skin->link( $title ) . '</del>'
: $skin->link(
$title,
null,
/**
* Make a "what links here" link for a given title
*
- * @param Title $title Title to make the link for
- * @param Skin $skin Skin to use
- * @param object $result Result row
+ * @param $title Title to make the link for
+ * @param $skin Skin object to use
+ * @param $result Object: result row
* @return string
*/
private function makeWlhLink( $title, $skin, $result ) {