API: Add nosuchuser message to ApiBase::$messageMap
[lhc/web/wiklou.git] / includes / api / ApiQueryExtLinksUsage.php
index 5ce9222..8d76e8b 100644 (file)
@@ -29,7 +29,7 @@ if (!defined('MEDIAWIKI')) {
 }
 
 /**
- * @addtogroup API
+ * @ingroup API
  */
 class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
 
@@ -51,43 +51,53 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
 
                $protocol = $params['protocol'];
                $query = $params['query'];
-               if (is_null($query))
-                       $this->dieUsage('Missing required query parameter', 'params');
-               
+
                // Find the right prefix
                global $wgUrlProtocols;
-               foreach ($wgUrlProtocols as $p) {
-                       if( substr( $p, 0, strlen( $protocol ) ) === $protocol ) {
-                               $protocol = $p;
-                               break;
+               if($protocol && !in_array($protocol, $wgUrlProtocols))
+               {
+                       foreach ($wgUrlProtocols as $p) {
+                               if( substr( $p, 0, strlen( $protocol ) ) === $protocol ) {
+                                       $protocol = $p;
+                                       break;
+                               }
                        }
                }
-               
-               $likeQuery = LinkFilter::makeLike($query , $protocol);
-               if (!$likeQuery)
-                       $this->dieUsage('Invalid query', 'bad_query');
-               $likeQuery = substr($likeQuery, 0, strpos($likeQuery,'%')+1);
-
-               $this->addTables(array('page','externallinks'));        // must be in this order for 'USE INDEX' 
-               $this->addOption('USE INDEX', 'el_index');
+               else
+                       $protocol = null;
 
                $db = $this->getDB();
+               $this->addTables(array('page','externallinks'));        // must be in this order for 'USE INDEX'
+               $this->addOption('USE INDEX', 'el_index');
                $this->addWhere('page_id=el_from');
-               $this->addWhere('el_index LIKE ' . $db->addQuotes( $likeQuery ));
                $this->addWhereFld('page_namespace', $params['namespace']);
 
+               if(!is_null($query) || $query != '')
+               {
+                       if(is_null($protocol))
+                               $protocol = 'http://';
+
+                       $likeQuery = LinkFilter::makeLike($query, $protocol);
+                       if (!$likeQuery)
+                               $this->dieUsage('Invalid query', 'bad_query');
+                       $likeQuery = substr($likeQuery, 0, strpos($likeQuery,'%')+1);
+                       $this->addWhere('el_index LIKE ' . $db->addQuotes( $likeQuery ));
+               }
+               else if(!is_null($protocol))
+                       $this->addWhere('el_index LIKE ' . $db->addQuotes( "$protocol%" ));
+
                $prop = array_flip($params['prop']);
                $fld_ids = isset($prop['ids']);
                $fld_title = isset($prop['title']);
                $fld_url = isset($prop['url']);
-               
+
                if (is_null($resultPageSet)) {
                        $this->addFields(array (
                                'page_id',
                                'page_namespace',
                                'page_title'
                        ));
-                       $this->addFieldsIf('el_to', $fld_url);                  
+                       $this->addFieldsIf('el_to', $fld_url);
                } else {
                        $this->addFields($resultPageSet->getPageTableFields());
                }
@@ -100,28 +110,30 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
 
                $res = $this->select(__METHOD__);
 
-               $data = array ();
+               $result = $this->getResult();
                $count = 0;
                while ($row = $db->fetchObject($res)) {
                        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+$limit+1);
+                               $this->setContinueEnumParameter('offset', $offset+$limit);
                                break;
                        }
 
                        if (is_null($resultPageSet)) {
-                               $title = Title :: makeTitle($row->page_namespace, $row->page_title);
-                               if ($title->userCanRead()) {
-                                       $vals = array();
-                                       if ($fld_ids)
-                                               $vals['pageid'] = intval($row->page_id);
-                                       if ($fld_title) {
-                                               $vals['ns'] = intval($title->getNamespace());
-                                               $vals['title'] = $title->getPrefixedText();
-                                       }
-                                       if ($fld_url)
-                                               $vals['url'] = $row->el_to;
-                                       $data[] = $vals;
+                               $vals = array();
+                               if ($fld_ids)
+                                       $vals['pageid'] = intval($row->page_id);
+                               if ($fld_title) {
+                                       $title = Title :: makeTitle($row->page_namespace, $row->page_title);
+                                       ApiQueryBase::addTitleInfo($vals, $title);
+                               }
+                               if ($fld_url)
+                                       $vals['url'] = $row->el_to;
+                               $fit = $result->addValue(array('query', $this->getModuleName()), null, $vals);
+                               if(!$fit)
+                               {
+                                       $this->setContinueEnumParameter('offset', $offset + $count - 1);
+                                       break;
                                }
                        } else {
                                $resultPageSet->processDbRow($row);
@@ -130,19 +142,18 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                $db->freeResult($res);
 
                if (is_null($resultPageSet)) {
-                       $result = $this->getResult();
-                       $result->setIndexedTagName($data, 'p');
-                       $result->addValue('query', $this->getModuleName(), $data);
+                       $result->setIndexedTagName_internal(array('query', $this->getModuleName()),
+                                       $this->getModulePrefix());
                }
        }
 
-       protected function getAllowedParams() {
+       public function getAllowedParams() {
                global $wgUrlProtocols;
-               $protocols = array();
+               $protocols = array('');
                foreach ($wgUrlProtocols as $p) {
                        $protocols[] = substr($p, 0, strpos($p,':'));
                }
-               
+
                return array (
                        'prop' => array (
                                ApiBase :: PARAM_ISMULTI => true,
@@ -158,7 +169,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                        ),
                        'protocol' => array (
                                ApiBase :: PARAM_TYPE => $protocols,
-                               ApiBase :: PARAM_DFLT => 'http',
+                               ApiBase :: PARAM_DFLT => '',
                        ),
                        'query' => null,
                        'namespace' => array (
@@ -175,18 +186,19 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                );
        }
 
-       protected function getParamDescription() {
+       public function getParamDescription() {
                return array (
                        'prop' => 'What pieces of information to include',
                        'offset' => 'Used for paging. Use the value returned for "continue"',
-                       'protocol' => 'Protocol of the url',
-                       'query' => 'Search string without protocol. See [[Special:LinkSearch]]',
+                       'protocol' => array(    'Protocol of the url. If empty and euquery set, the protocol is http.',
+                                               'Leave both this and euquery empty to list all external links'),
+                       'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
                        'namespace' => 'The page namespace(s) to enumerate.',
-                       'limit' => 'How many entries to return.'
+                       'limit' => 'How many pages to return.'
                );
        }
 
-       protected function getDescription() {
+       public function getDescription() {
                return 'Enumerate pages that contain a given URL';
        }
 
@@ -197,7 +209,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        }
 
        public function getVersion() {
-               return __CLASS__ . ': $Id:$';
+               return __CLASS__ . ': $Id$';
        }
-}
-?>
+}
\ No newline at end of file