if (!defined('MEDIAWIKI')) {
// Eclipse helper - will be ignored in production
- require_once ("ApiQueryBase.php");
+ require_once ('ApiQueryBase.php');
}
-class ApiQueryAllpages extends ApiQueryBase {
+class ApiQueryAllpages extends ApiQueryGeneratorBase {
- public function __construct($query, $moduleName, $generator = false) {
- parent :: __construct($query, $moduleName, $generator);
+ public function __construct($query, $moduleName) {
+ parent :: __construct($query, $moduleName, 'ap');
}
public function execute() {
- $aplimit = $apfrom = $apnamespace = $apfilterredir = null;
+ $this->run();
+ }
+
+ public function executeGenerator($resultPageSet) {
+ if ($resultPageSet->isResolvingRedirects())
+ $this->dieUsage('Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params');
+
+ $this->run($resultPageSet);
+ }
+
+ private function run($resultPageSet = null) {
+ $limit = $from = $namespace = $filterredir = null;
extract($this->extractRequestParams());
$db = $this->getDB();
+
$where = array (
- 'page_namespace' => $apnamespace
+ 'page_namespace' => $namespace
);
- if (isset ($apfrom))
- $where[] = 'page_title>=' . $db->addQuotes(ApiQueryBase :: titleToKey($apfrom));
-
- if ($apfilterredir === 'redirects')
+
+ if (isset ($from)) {
+ $where[] = 'page_title>=' . $db->addQuotes(ApiQueryBase :: titleToKey($from));
+ }
+
+ if ($filterredir === 'redirects') {
$where['page_is_redirect'] = 1;
- else
- if ($apfilterredir === 'nonredirects')
- $where['page_is_redirect'] = 0;
+ }
+ elseif ($filterredir === 'nonredirects') {
+ $where['page_is_redirect'] = 0;
+ }
+
+ if (is_null($resultPageSet)) {
+ $fields = array (
+ 'page_id',
+ 'page_namespace',
+ 'page_title'
+ );
+ } else {
+ $fields = $resultPageSet->getPageTableFields();
+ }
$this->profileDBIn();
- $res = $db->select('page', array (
- 'page_id',
- 'page_namespace',
- 'page_title'
- ), $where, __CLASS__ . '::' . __METHOD__, array (
+ $res = $db->select('page', $fields, $where, __CLASS__ . '::' . __METHOD__, array (
'USE INDEX' => 'name_title',
- 'LIMIT' => $aplimit +1,
+ 'LIMIT' => $limit +1,
'ORDER BY' => 'page_namespace, page_title'
));
$this->profileDBOut();
-
+
$data = array ();
- $data['_element'] = 'p';
$count = 0;
while ($row = $db->fetchObject($res)) {
- if (++ $count > $aplimit) {
+ if (++ $count > $limit) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
$msg = array (
- 'continue' => 'apfrom=' . ApiQueryBase :: keyToTitle($row->page_title
- ));
- $this->getResult()->addMessage('query-status', 'allpages', $msg);
+ 'continue' => $this->encodeParamName('from'
+ ) . '=' . ApiQueryBase :: keyToTitle($row->page_title));
+ $this->getResult()->addValue('query-status', 'allpages', $msg);
break;
}
// skip any pages that user has no rights to read
if ($title->userCanRead()) {
- $id = intval($row->page_id);
- $pagedata = array ();
- $pagedata['id'] = $id;
- if ($title->getNamespace() !== 0)
- $pagedata['ns'] = $title->getNamespace();
- $pagedata['title'] = $title->getPrefixedText();
- $pagedata['*'] = '';
-
- $data[$id] = $pagedata;
+ if (is_null($resultPageSet)) {
+ $id = intval($row->page_id);
+ $data[] = $id; // in generator mode, just assemble a list of page IDs.
+ } else {
+ $resultPageSet->processDbRow($row);
+ }
}
}
$db->freeResult($res);
- $this->getResult()->addMessage('query', 'allpages', $data);
+
+ if (is_null($resultPageSet)) {
+ ApiResult :: setIndexedTagName($data, 'p');
+ $this->getResult()->addValue('query', 'allpages', $data);
+ }
}
protected function getAllowedParams() {
}
return array (
- 'apfrom' => null,
- 'apnamespace' => array (
- GN_ENUM_DFLT => 0,
- GN_ENUM_TYPE => $validNamespaces
+ 'from' => null,
+ 'namespace' => array (
+ ApiBase :: PARAM_DFLT => 0,
+ ApiBase :: PARAM_TYPE => $validNamespaces
),
- 'apfilterredir' => array (
- GN_ENUM_DFLT => 'all',
- GN_ENUM_TYPE => array (
+ 'filterredir' => array (
+ ApiBase :: PARAM_DFLT => 'all',
+ ApiBase :: PARAM_TYPE => array (
'all',
'redirects',
'nonredirects'
)
),
- 'aplimit' => array (
- GN_ENUM_DFLT => 10,
- GN_ENUM_TYPE => 'limit',
- GN_ENUM_MIN => 1,
- GN_ENUM_MAX1 => 500,
- GN_ENUM_MAX2 => 5000
+ 'limit' => array (
+ ApiBase :: PARAM_DFLT => 10,
+ ApiBase :: PARAM_TYPE => 'limit',
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX1 => 500,
+ ApiBase :: PARAM_MAX2 => 5000
)
);
}
protected function getParamDescription() {
- return array ();
+ return array (
+ 'from' => 'The page title to start enumerating from.',
+ 'namespace' => 'The namespace to enumerate. Default 0 (Main).',
+ 'filterredir' => 'Which pages to list: "all" (default), "redirects", or "nonredirects"',
+ 'limit' => 'How many total pages to return'
+ );
}
protected function getDescription() {
protected function getExamples() {
return array (
- 'api.php?action=query&list=allpages',
- 'api.php?action=query&list=allpages&apfrom=B&aplimit=5'
+ 'Simple Use',
+ ' api.php?action=query&list=allpages',
+ ' api.php?action=query&list=allpages&apfrom=B&aplimit=5',
+ 'Using as Generator',
+ ' Show info about 4 pages starting at the letter "T"',
+ ' api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info',
+ ' Show content of first 2 non-redirect pages begining at "Re"',
+ ' api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content'
);
}
- public function getCanGenerate() {
- return true;
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id$';
}
}
?>
\ No newline at end of file