array( 'MIMEsearchPage', 'MIMEsearch' ),
array( 'MostcategoriesPage', 'Mostcategories' ),
array( 'MostimagesPage', 'Mostimages' ),
+ array( 'MostinterwikisPage', 'Mostinterwikis' ),
array( 'MostlinkedCategoriesPage', 'Mostlinkedcategories' ),
array( 'MostlinkedtemplatesPage', 'Mostlinkedtemplates' ),
array( 'MostlinkedPage', 'Mostlinked' ),
/**
* For back-compat, subclasses may return a raw SQL query here, as a string.
* This is stronly deprecated; getQueryInfo() should be overridden instead.
+ * @throws MWException
* @return string
*/
function getSQL() {
return false;
}
- 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 = $this->reallyDoQuery( $limit, false );
- $num = false;
- if ( $res ) {
- $num = $res->numRows();
- # Fetch results
- $vals = array();
- while ( $res && $row = $dbr->fetchObject( $res ) ) {
- if ( isset( $row->value ) ) {
- if ( $this->usesTimestamps() ) {
- $value = wfTimestamp( TS_UNIX,
- $row->value );
+ try {
+ # Clear out any old cached data
+ $dbw->delete( 'querycache', array( 'qc_type' => $this->getName() ), $fname );
+ # Do query
+ $res = $this->reallyDoQuery( $limit, false );
+ $num = false;
+ if ( $res ) {
+ $num = $res->numRows();
+ # Fetch results
+ $vals = array();
+ while ( $res && $row = $dbr->fetchObject( $res ) ) {
+ if ( isset( $row->value ) ) {
+ if ( $this->usesTimestamps() ) {
+ $value = wfTimestamp( TS_UNIX,
+ $row->value );
+ } else {
+ $value = intval( $row->value ); // @bug 14414
+ }
} else {
- $value = intval( $row->value ); // @bug 14414
+ $value = 0;
}
- } else {
- $value = 0;
- }
- $vals[] = array( 'qc_type' => $this->getName(),
- 'qc_namespace' => $row->namespace,
- 'qc_title' => $row->title,
- 'qc_value' => $value );
- }
+ $vals[] = array( 'qc_type' => $this->getName(),
+ 'qc_namespace' => $row->namespace,
+ 'qc_title' => $row->title,
+ 'qc_value' => $value );
+ }
- # Save results into the querycache table on the master
- if ( count( $vals ) ) {
- if ( !$dbw->insert( 'querycache', $vals, __METHOD__ ) ) {
- // Set result to false to indicate error
- $num = false;
+ # Save results into the querycache table on the master
+ if ( count( $vals ) ) {
+ $dbw->insert( 'querycache', $vals, __METHOD__ );
}
+ # Update the querycache_info record for the page
+ $dbw->delete( 'querycache_info', array( 'qci_type' => $this->getName() ), $fname );
+ $dbw->insert( 'querycache_info',
+ array( 'qci_type' => $this->getName(), 'qci_timestamp' => $dbw->timestamp() ),
+ $fname );
}
- if ( $ignoreErrors ) {
- $dbw->ignoreErrors( $ignoreW );
- $dbr->ignoreErrors( $ignoreR );
+ } catch ( DBError $e ) {
+ if ( !$ignoreErrors ) {
+ throw $e; // report query error
}
-
- # Update the querycache_info record for the page
- $dbw->delete( 'querycache_info', array( 'qci_type' => $this->getName() ), $fname );
- $dbw->insert( 'querycache_info', array( 'qci_type' => $this->getName(), 'qci_timestamp' => $dbw->timestamp() ), $fname );
-
+ $num = false; // set result to false to indicate error
}
+
return $num;
}
$options['ORDER BY'] = 'qc_value ASC';
}
$res = $dbr->select( 'querycache', array( 'qc_type',
- 'qc_namespace AS namespace',
- 'qc_title AS title',
- 'qc_value AS value' ),
+ 'namespace' => 'qc_namespace',
+ 'title' => 'qc_title',
+ 'value' => 'qc_value' ),
array( 'qc_type' => $this->getName() ),
__METHOD__, $options
);
// TODO: Use doQuery()
if ( !$this->isCached() ) {
- $res = $this->reallyDoQuery( $this->limit, $this->offset );
+ # select one extra row for navigation
+ $res = $this->reallyDoQuery( $this->limit + 1, $this->offset );
} else {
- # Get the cached result
- $res = $this->fetchFromCache( $this->limit, $this->offset );
+ # Get the cached result, select one extra row for navigation
+ $res = $this->fetchFromCache( $this->limit + 1, $this->offset );
if ( !$this->listoutput ) {
# Fetch the timestamp of this update
$updateddate = $lang->userDate( $ts, $user );
$updatedtime = $lang->userTime( $ts, $user );
$out->addMeta( 'Data-Cache-Time', $ts );
- $out->addInlineScript( "var dataCacheTime = '$ts';" );
+ $out->addJsConfigVars( 'dataCacheTime', $ts );
$out->addWikiMsg( 'perfcachedts', $updated, $updateddate, $updatedtime, $maxResults );
} else {
$out->addWikiMsg( 'perfcached', $maxResults );
# If updates on this page have been disabled, let the user know
# that the data set won't be refreshed for now
if ( is_array( $wgDisableQueryPageUpdate ) && in_array( $this->getName(), $wgDisableQueryPageUpdate ) ) {
- $out->addWikiMsg( 'querypage-no-updates' );
+ $out->wrapWikiMsg( "<div class=\"mw-querypage-no-updates\">\n$1\n</div>", 'querypage-no-updates' );
}
}
}
$out->addHTML( $this->getPageHeader() );
if ( $this->numRows > 0 ) {
$out->addHTML( $this->msg( 'showingresults' )->numParams(
- $this->numRows, $this->offset + 1 )->parseAsBlock() );
+ min( $this->numRows, $this->limit ), # do not show the one extra row, if exist
+ $this->offset + 1 )->parseAsBlock() );
# Disable the "next" link when we reach the end
$paging = $this->getLanguage()->viewPrevNext( $this->getTitle( $par ), $this->offset,
- $this->limit, $this->linkParameters(), ( $this->numRows < $this->limit ) );
+ $this->limit, $this->linkParameters(), ( $this->numRows <= $this->limit ) );
$out->addHTML( '<p>' . $paging . '</p>' );
} else {
# No results to show, so don't bother with "showing X of Y" etc.
$this->getSkin(),
$dbr, # Should use a ResultWrapper for this
$res,
- $this->numRows,
+ min( $this->numRows, $this->limit ), # do not format the one extra row, if exist
$this->offset );
# Repeat the paging links at the bottom
$out->addHTML( Xml::closeElement( 'div' ) );
- return $this->numRows;
+ return min( $this->numRows, $this->limit ); # do not return the one extra row, if exist
}
/**
if ( !$wgFeed ) {
$this->getOutput()->addWikiMsg( 'feed-unavailable' );
- return;
+ return false;
}
global $wgFeedLimit;