* Formats the result as something that can be understood by the API.
* Defaults to setting id, ns and title
*/
- function formatApiResult( $result ) {
+ function formatApiResult( $row ) {
$title = Title::makeTitle( $row->namespace, $row->title );
return array(
- 'pageid' => intval( $row->id ),
+ //'pageid' => intval( $row->id ),
'ns' => intval( $title->getNamespace() ),
'title' => $title->getPrefixedText(),
);
* 'count' => number of results,
* 'dbr' => the database used for fetching the data
*/
- protected function reallyDoQuery( $offset, $limit ) {
+ public function reallyDoQuery( $offset, $limit ) {
$result = array( 'disabled' => false );
$this->offset = $offset;
--- /dev/null
+<?php
+
+/*
+ * Created on Jul 12, 2009
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2009 Bryan Tong Minh <Bryan.TongMinh@Gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ('ApiQueryBase.php');
+}
+
+/**
+ * Query module to access querypages
+ *
+ * @ingroup API
+ */
+class ApiQueryQuerypage extends ApiQueryBase {
+ static $queryPages = array(
+ 'brokenredirects' => 'BrokenRedirectsPage'
+ );
+
+ public function __construct($query, $moduleName) {
+ parent :: __construct($query, $moduleName, 'qp');
+ }
+
+ public function execute() {
+ $this->run();
+ }
+
+ public function executeGenerator($resultPageSet) {
+ $this->run( $resultPageSet );
+ }
+
+ private function run($resultPageSet = null) {
+ $params = $this->extractRequestParams();
+ $offset = $params['offset'];
+ $limit = $params['limit'];
+
+ // Try to find an entry in $wgQueryPages
+ $qpName = $params['querypage'];
+ if ( is_null( $qpName ) )
+ $this->dieUsageMsg( array( 'missingparam', 'querypage' ) );
+ if ( !isset( self::$queryPages[$qpName] ) )
+ $this->dieUsage( 'Querypage unrecognized', 'unknownquerypage' );
+
+ $qpClass = self::$queryPages[$qpName];
+ $qpInstance = new $qpClass;
+ $result = $qpInstance->reallyDoQuery( $offset, $limit + 1 );
+
+ $apiResult = $this->getResult();
+ $count = 0;
+ while ( $row = $result['dbr']->fetchObject( $result['result'] ) ) {
+ if ( ++ $count > $limit ) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter( 'offset', $offset + $count - 1 );
+ break;
+ }
+ if ( is_null( $resultPageSet ) ) {
+ // Normal mode; let the query page make a sensible result out of it
+ $vals = $qpInstance->formatApiResult( $row );
+ $fit = $apiResult->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+ if( !$fit )
+ {
+ $this->setContinueEnumParameter( 'offset', $params['offset'] + $count );
+ break;
+ }
+ } else {
+ // Generator mode; not yet supported
+ $resultPageSet->processDbRow( $row );
+ }
+ }
+
+
+ if ( is_null( $resultPageSet ) ) {
+ $apiResult->setIndexedTagName_internal( array( 'query', $this->getModuleName()), 'p' );
+ }
+ }
+
+ public function getAllowedParams() {
+
+ return array (
+ 'offset' => 0,
+ 'limit' => array (
+ ApiBase :: PARAM_DFLT => 10,
+ ApiBase :: PARAM_TYPE => 'limit',
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ ),
+ 'querypage' => array(
+ ApiBase :: PARAM_TYPE => array_keys( self::$queryPages )
+ ),
+ );
+ }
+
+ public function getParamDescription() {
+ return array (
+ 'offset' => 'The offset to start enumerating from.',
+ 'limit' => 'How many total pages to return.',
+ 'querypage' => 'Which querypage to use',
+ );
+ }
+
+ public function getDescription() {
+ return 'Query one of the builtin query pages.';
+ }
+
+ protected function getExamples() {
+ return array (
+ ' Query a list of broken redirects',
+ ' api.php?action=query&list=querypage&qpquerypage=brokenredirects',
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id:$';
+ }
+}
\ No newline at end of file