API:
authorRoan Kattouw <catrope@users.mediawiki.org>
Mon, 10 Dec 2007 15:55:12 +0000 (15:55 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Mon, 10 Dec 2007 15:55:12 +0000 (15:55 +0000)
* Add list=allcategories module
* Fix token-related E_NOTICEs

RELEASE-NOTES
includes/AutoLoader.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php [new file with mode: 0644]
includes/api/ApiQueryInfo.php
includes/api/ApiQueryRevisions.php

index 31f7daf..37b44c5 100644 (file)
@@ -346,7 +346,7 @@ Full API documentation is available at http://www.mediawiki.org/wiki/API
 * Fixed sessionid attribute in action=login
 * Standardized limits. Revisions and Deletedrevisions formerly using 200 / 10000, 
   now 500 / 5000, in line with other modules.
-
+* Added list=allcategories module
 
 === Languages updated in 1.12 ===
 
index ec533ff..2a01444 100644 (file)
@@ -320,6 +320,7 @@ function __autoload($className) {
                'ApiQuery' => 'includes/api/ApiQuery.php',
                'ApiQueryAllpages' => 'includes/api/ApiQueryAllpages.php',
                'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php',
+               'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php',
                'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
                'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
                'ApiQueryGeneratorBase' => 'includes/api/ApiQueryBase.php',
index 40485ad..c42e7c9 100644 (file)
@@ -60,6 +60,7 @@ class ApiQuery extends ApiBase {
        private $mQueryListModules = array (
                'allpages' => 'ApiQueryAllpages',
                'alllinks' => 'ApiQueryAllLinks',
+               'allcategories' => 'ApiQueryAllCategories',
                'allusers' => 'ApiQueryAllUsers',
                'backlinks' => 'ApiQueryBacklinks',
                'blocks' => 'ApiQueryBlocks',
diff --git a/includes/api/ApiQueryAllCategories.php b/includes/api/ApiQueryAllCategories.php
new file mode 100644 (file)
index 0000000..04f4300
--- /dev/null
@@ -0,0 +1,141 @@
+<?php\r
+\r
+/*\r
+ * Created on December 12, 2007\r
+ *\r
+ * API for MediaWiki 1.8+\r
+ *\r
+ * Copyright (C) 2007 Roan Kattouw <Firstname>.<Lastname>@home.nl\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along\r
+ * with this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+ * http://www.gnu.org/copyleft/gpl.html\r
+ */\r
+\r
+if (!defined('MEDIAWIKI')) {\r
+       // Eclipse helper - will be ignored in production\r
+       require_once ('ApiQueryBase.php');\r
+}\r
+\r
+/**\r
+ * Query module to enumerate all categories, even the ones that don't have\r
+ * category pages.\r
+ * \r
+ * @addtogroup API\r
+ */\r
+class ApiQueryAllCategories extends ApiQueryGeneratorBase {\r
+\r
+       public function __construct($query, $moduleName) {\r
+               parent :: __construct($query, $moduleName, 'ac');\r
+       }\r
+\r
+       public function execute() {\r
+               $this->run();\r
+       }\r
+\r
+       public function executeGenerator($resultPageSet) {\r
+               $this->run($resultPageSet);\r
+       }\r
+\r
+       private function run($resultPageSet = null) {\r
+\r
+               $db = $this->getDB();\r
+               $params = $this->extractRequestParams();\r
+\r
+               $this->addTables('categorylinks');\r
+               $this->addFields('cl_to');\r
+               \r
+               if (!is_null($params['from']))\r
+                       $this->addWhere('cl_to>=' . $db->addQuotes(ApiQueryBase :: titleToKey($params['from'])));\r
+               if (isset ($params['prefix']))\r
+                       $this->addWhere("cl_to LIKE '" . $db->escapeLike(ApiQueryBase :: titleToKey($params['prefix'])) . "%'");\r
+\r
+               $this->addOption('LIMIT', $params['limit']+1);\r
+               $this->addOption('ORDER BY', 'cl_to' . ($params['dir'] == 'ZtoA' ? ' DESC' : ''));\r
+               $this->addOption('DISTINCT');\r
+\r
+               $res = $this->select(__METHOD__);\r
+\r
+               $pages = array();\r
+               $count = 0;\r
+               while ($row = $db->fetchObject($res)) {\r
+                       if (++ $count > $params['limit']) {\r
+                               // We've reached the one extra which shows that there are additional cats to be had. Stop here...\r
+                               // TODO: Security issue - if the user has no right to view next title, it will still be shown\r
+                               $this->setContinueEnumParameter('from', ApiQueryBase :: keyToTitle($row->cl_to));\r
+                               break;\r
+                       }\r
+                       \r
+                       // Normalize titles\r
+                       if(!is_null($resultPageSet))\r
+                               $titleObj = Title::newFromText('Category:' . $row->cl_to);\r
+                       else\r
+                               $titleObj = Title::newFromText($row->cl_to);\r
+                       $pages[] = $titleObj->getPrefixedText();\r
+               }\r
+               $db->freeResult($res);\r
+\r
+               if (is_null($resultPageSet)) {\r
+                       $result = $this->getResult();\r
+                       $result->setIndexedTagName($pages, 'c');\r
+                       $result->addValue('query', $this->getModuleName(), $pages);\r
+               } else {\r
+                       $resultPageSet->populateFromTitles($pages);\r
+               }\r
+       }\r
+\r
+       protected function getAllowedParams() {\r
+               return array (\r
+                       'from' => null,\r
+                       'prefix' => null,\r
+                       'dir' => array(\r
+                               ApiBase :: PARAM_DFLT => 'AtoZ',\r
+                               ApiBase :: PARAM_TYPE => array(\r
+                                       'AtoZ',\r
+                                       'ZtoA'\r
+                               ),\r
+                       ),\r
+                       'limit' => array (\r
+                               ApiBase :: PARAM_DFLT => 10,\r
+                               ApiBase :: PARAM_TYPE => 'limit',\r
+                               ApiBase :: PARAM_MIN => 1,\r
+                               ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,\r
+                               ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2\r
+                       )\r
+               );\r
+       }\r
+\r
+       protected function getParamDescription() {\r
+               return array (\r
+                       'from' => 'The category to start enumerating from.',\r
+                       'prefix' => 'Search for all category titles that begin with this value.',\r
+                       'dir' => 'Direction to sort in.',\r
+                       'limit' => 'How many categories to return.'\r
+               );\r
+       }\r
+\r
+       protected function getDescription() {\r
+               return 'Enumerate all categories';\r
+       }\r
+\r
+       protected function getExamples() {\r
+               return array (\r
+                       'api.php?action=query&generator=allcategories&gacprefix=List&prop=info',\r
+               );\r
+       }\r
+\r
+       public function getVersion() {\r
+               return __CLASS__ . ': $Id: ApiQueryAllLinks.php 28216 2007-12-06 18:33:18Z vasilievvv $';\r
+       }\r
+}\r
index 39a6c80..8bb80ef 100644 (file)
@@ -66,6 +66,9 @@ class ApiQueryInfo extends ApiQueryBase {
                        $tok_protect = $this->getTokenFlag($token, 'protect');
                        $tok_move = $this->getTokenFlag($token, 'move');
                }
+               else
+                       // Fix E_NOTICEs about unset variables
+                       $token = $tok_edit = $tok_delete = $tok_protect = $tok_move = null;
                
                $pageSet = $this->getPageSet();
                $titles = $pageSet->getGoodTitles();
index d5a108d..4eb0e2a 100644 (file)
@@ -85,6 +85,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                $this->fld_timestamp = $this->addFieldsIf('rev_timestamp', isset ($prop['timestamp']));
                $this->fld_comment = $this->addFieldsIf('rev_comment', isset ($prop['comment']));
                $this->fld_size = $this->addFieldsIf('rev_len', isset ($prop['size']));
+               $this->tok_rollback = false; // Prevent PHP undefined property notice
                if(!is_null($token))
                {
                        $this->tok_rollback = $this->getTokenFlag($token, 'rollback');