43 'categories' => ApiQueryCategories::class,
44 'categoryinfo' => ApiQueryCategoryInfo::class,
45 'contributors' => ApiQueryContributors::class,
46 'deletedrevisions' => ApiQueryDeletedRevisions::class,
47 'duplicatefiles' => ApiQueryDuplicateFiles::class,
48 'extlinks' => ApiQueryExternalLinks::class,
49 'fileusage' => ApiQueryBacklinksprop::class,
50 'images' => ApiQueryImages::class,
51 'imageinfo' => ApiQueryImageInfo::class,
52 'info' => ApiQueryInfo::class,
53 'links' => ApiQueryLinks::class,
54 'linkshere' => ApiQueryBacklinksprop::class,
55 'iwlinks' => ApiQueryIWLinks::class,
56 'langlinks' => ApiQueryLangLinks::class,
57 'pageprops' => ApiQueryPageProps::class,
58 'redirects' => ApiQueryBacklinksprop::class,
59 'revisions' => ApiQueryRevisions::class,
60 'stashimageinfo' => ApiQueryStashImageInfo::class,
61 'templates' => ApiQueryLinks::class,
62 'transcludedin' => ApiQueryBacklinksprop::class,
70 'allcategories' => ApiQueryAllCategories::class,
71 'alldeletedrevisions' => ApiQueryAllDeletedRevisions::class,
72 'allfileusages' => ApiQueryAllLinks::class,
73 'allimages' => ApiQueryAllImages::class,
74 'alllinks' => ApiQueryAllLinks::class,
75 'allpages' => ApiQueryAllPages::class,
76 'allredirects' => ApiQueryAllLinks::class,
77 'allrevisions' => ApiQueryAllRevisions::class,
78 'mystashedfiles' => ApiQueryMyStashedFiles::class,
79 'alltransclusions' => ApiQueryAllLinks::class,
80 'allusers' => ApiQueryAllUsers::class,
81 'backlinks' => ApiQueryBacklinks::class,
82 'blocks' => ApiQueryBlocks::class,
83 'categorymembers' => ApiQueryCategoryMembers::class,
84 'deletedrevs' => ApiQueryDeletedrevs::class,
85 'embeddedin' => ApiQueryBacklinks::class,
86 'exturlusage' => ApiQueryExtLinksUsage::class,
87 'filearchive' => ApiQueryFilearchive::class,
88 'imageusage' => ApiQueryBacklinks::class,
89 'iwbacklinks' => ApiQueryIWBacklinks::class,
90 'langbacklinks' => ApiQueryLangBacklinks::class,
91 'logevents' => ApiQueryLogEvents::class,
92 'pageswithprop' => ApiQueryPagesWithProp::class,
93 'pagepropnames' => ApiQueryPagePropNames::class,
94 'prefixsearch' => ApiQueryPrefixSearch::class,
95 'protectedtitles' => ApiQueryProtectedTitles::class,
96 'querypage' => ApiQueryQueryPage::class,
97 'random' => ApiQueryRandom::class,
98 'recentchanges' => ApiQueryRecentChanges::class,
99 'search' => ApiQuerySearch::class,
100 'tags' => ApiQueryTags::class,
101 'usercontribs' => ApiQueryContributions::class,
102 'users' => ApiQueryUsers::class,
103 'watchlist' => ApiQueryWatchlist::class,
104 'watchlistraw' => ApiQueryWatchlistRaw::class,
112 'allmessages' => ApiQueryAllMessages::class,
113 'authmanagerinfo' => ApiQueryAuthManagerInfo::class,
114 'siteinfo' => ApiQuerySiteinfo::class,
115 'userinfo' => ApiQueryUserInfo::class,
116 'filerepoinfo' => ApiQueryFileRepoInfo::class,
117 'tokens' => ApiQueryTokens::class,
134 parent::__construct( $main, $action );
140 $this->mModuleMgr->addModules( self::$QueryPropModules,
'prop' );
141 $this->mModuleMgr->addModules( $config->get(
'APIPropModules' ),
'prop' );
142 $this->mModuleMgr->addModules( self::$QueryListModules,
'list' );
143 $this->mModuleMgr->addModules( $config->get(
'APIListModules' ),
'list' );
144 $this->mModuleMgr->addModules( self::$QueryMetaModules,
'meta' );
145 $this->mModuleMgr->addModules( $config->get(
'APIMetaModules' ),
'meta' );
147 Hooks::run(
'ApiQuery::moduleManager', [ $this->mModuleMgr ] );
172 if ( !array_key_exists( $name, $this->mNamedDB ) ) {
176 return $this->mNamedDB[
$name];
196 $this->
getMain()->createPrinterByName(
'xml' ) );
218 $propModules = array_keys( $allModules );
225 $modules = $continuationManager->getRunModules();
227 if ( !$continuationManager->isGeneratorDone() ) {
231 $module->requestExtraData( $this->mPageSet );
234 $this->mPageSet->execute();
238 $this->mPageSet->executeDryRun();
241 $cacheMode = $this->mPageSet->getCacheMode();
246 $params = $module->extractRequestParams();
248 $cacheMode, $module->getCacheMode(
$params ) );
250 Hooks::run(
'APIQueryAfterExecute', [ &$module ] );
254 $this->
getMain()->setCacheMode( $cacheMode );
258 if ( $this->mParams[
'rawcontinue'] ) {
259 $data = $continuationManager->getRawNonContinuation();
261 $this->
getResult()->addValue(
null,
'query-noncontinue', $data,
264 $data = $continuationManager->getRawContinuation();
266 $this->
getResult()->addValue(
null,
'query-continue', $data,
270 $continuationManager->setContinuationIntoResult( $this->
getResult() );
284 if ( $modCacheMode ===
'anon-public-user-private' ) {
285 if ( $cacheMode !==
'private' ) {
286 $cacheMode =
'anon-public-user-private';
288 } elseif ( $modCacheMode ===
'public' ) {
291 $cacheMode =
'private';
303 $wasPosted = $this->
getRequest()->wasPosted();
304 if ( isset( $this->mParams[$param] ) ) {
305 foreach ( $this->mParams[$param] as $moduleName ) {
306 $instance = $this->mModuleMgr->getModule( $moduleName, $param );
307 if ( $instance ===
null ) {
310 if ( !$wasPosted && $instance->mustBePosted() ) {
314 if ( !array_key_exists( $moduleName,
$modules ) ) {
334 $values = $pageSet->getNormalizedTitlesAsResult( $result );
336 $fit = $fit && $result->addValue(
'query',
'normalized', $values );
338 $values = $pageSet->getConvertedTitlesAsResult( $result );
340 $fit = $fit && $result->addValue(
'query',
'converted', $values );
342 $values = $pageSet->getInterwikiTitlesAsResult( $result, $this->mParams[
'iwurl'] );
344 $fit = $fit && $result->addValue(
'query',
'interwiki', $values );
346 $values = $pageSet->getRedirectTitlesAsResult( $result );
348 $fit = $fit && $result->addValue(
'query',
'redirects', $values );
350 $values = $pageSet->getMissingRevisionIDsAsResult( $result );
352 $fit = $fit && $result->addValue(
'query',
'badrevids', $values );
359 foreach ( $pageSet->getMissingTitles() as $fakeId => $title ) {
362 $vals[
'missing'] =
true;
363 if ( $title->isKnown() ) {
364 $vals[
'known'] =
true;
366 $pages[$fakeId] = $vals;
369 foreach ( $pageSet->getInvalidTitlesAndReasons() as $fakeId => $data ) {
370 $pages[$fakeId] = $data + [
'invalid' =>
true ];
373 foreach ( $pageSet->getMissingPageIDs() as $pageid ) {
381 foreach ( $pageSet->getSpecialTitles() as $fakeId => $title ) {
384 $vals[
'special'] =
true;
385 if ( !$title->isKnown() ) {
386 $vals[
'missing'] =
true;
388 $pages[$fakeId] = $vals;
392 foreach ( $pageSet->getGoodTitles() as $pageid => $title ) {
394 $vals[
'pageid'] = $pageid;
396 $pages[$pageid] = $vals;
399 if ( count( $pages ) ) {
400 $pageSet->populateGeneratorData( $pages );
403 if ( $this->mParams[
'indexpageids'] ) {
406 $pageIDs = array_map(
'strval', $pageIDs );
408 $fit = $fit && $result->addValue(
'query',
'pageids', $pageIDs );
412 $fit = $fit && $result->addValue(
'query',
'pages', $pages );
416 $this->
dieWithError(
'apierror-badconfig-resulttoosmall',
'badconfig' );
419 if ( $this->mParams[
'export'] ) {
420 $this->
doExport( $pageSet, $result );
430 $titles = $pageSet->getGoodTitles();
434 foreach (
$titles as $title ) {
435 if ( $title->userCan(
'read', $user ) ) {
443 $exporter->setOutputSink( $sink );
444 $exporter->openStream();
445 foreach ( $exportTitles as $title ) {
446 $exporter->pageByTitle( $title );
448 $exporter->closeStream();
453 if ( $this->mParams[
'exportnowrap'] ) {
479 'indexpageids' =>
false,
481 'exportnowrap' =>
false,
486 'rawcontinue' =>
false,
489 $result += $this->
getPageSet()->getFinalParams( $flags );
506 [
'rawcontinue' => 1,
'indexpageids' => 1 ]
509 if ( array_keys(
$params ) !== [
'meta' ] ) {
518 if ( $module->isReadMode() ) {
528 'action=query&prop=revisions&meta=siteinfo&' .
529 'titles=Main%20Page&rvprop=user|comment&continue='
530 =>
'apihelp-query-example-revisions',
531 'action=query&generator=allpages&gapprefix=API/&prop=revisions&continue='
532 =>
'apihelp-query-example-allpages',
538 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Query',
539 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Meta',
540 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Properties',
541 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Lists',
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
This abstract class implements many basic API functions, and is the base of all API classes.
getParameter( $paramName, $parseLimit=true)
Get a value for the given parameter.
getDB()
Gets a default replica DB connection object.
dieWithError( $msg, $code=null, $data=null, $httpCode=null)
Abort execution with an error.
dieWithErrorOrDebug( $msg, $code=null, $data=null, $httpCode=null)
Will only set a warning instead of failing if the global $wgDebugAPI is set to true.
static dieDebug( $method, $message)
Internal code errors should be reported with this method.
getMain()
Get the main module.
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below.
extractRequestParams( $parseLimit=true)
Using getAllowedParams(), this function makes an array of the values provided by the user,...
setContinuationManager(ApiContinuationManager $manager=null)
Set the continuation manager.
getResult()
Get the result object.
const PARAM_HELP_MSG
(string|array|Message) Specify an alternative i18n documentation message for this parameter.
const PARAM_ISMULTI
(boolean) Accept multiple pipe-separated values for this parameter (e.g.
This manages continuation state.
This is the main API class, used for both external and internal processing.
This class holds a list of modules and handles instantiation.
This class contains a list of pages that the client has requested.
static addTitleInfo(&$arr, $title, $prefix='')
Add information (title and namespace) about a Title object to a result array.
This is the main query class.
static array $QueryListModules
List of Api Query list modules.
isReadMode()
Indicates whether this module requires read rights.
instantiateModules(&$modules, $param)
Create instances of all modules requested by the client.
static array $QueryPropModules
List of Api Query prop modules.
mergeCacheMode( $cacheMode, $modCacheMode)
Update a cache mode string, applying the cache mode of a new module to it.
getAllowedParams( $flags=0)
getModuleManager()
Overrides to return this instance's module manager.
__construct(ApiMain $main, $action)
outputGeneralPageInfo()
Appends an element for each page in the current pageSet with the most general information (id,...
getExamplesMessages()
Returns usage examples for this module.
doExport( $pageSet, $result)
getHelpUrls()
Return links to more detailed help pages about the module.
getPageSet()
Gets the set of pages the user has requested (or generated)
execute()
Query execution happens in the following steps: #1 Create a PageSet object with any pages requested b...
static array $QueryMetaModules
List of Api Query meta modules.
getNamedDB( $name, $db, $groups)
Get the query database connection with the given name.
static stripMetadataNonRecursive( $data, &$metadata=null)
Remove metadata keys from a data array or object, non-recursive.
static setArrayType(array &$arr, $type, $kvpKeyName=null)
Set the array data type.
const NO_SIZE_CHECK
For addValue() and similar functions, do not check size while adding a value Don't use this unless yo...
const ADD_ON_TOP
For addValue(), setValue() and similar functions, if the value does not exist, add it as the first el...
const META_BC_SUBELEMENTS
Key for the 'BC subelements' metadata item.
static setIndexedTagName(array &$arr, $tag)
Set the tag name for numeric-keyed values in XML format.
namespace being checked & $result
namespace and then decline to actually register it file or subcat img or subcat $title
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return true
Allows to change the fields on the form that will be generated $name
linkcache txt The LinkCache class maintains a list of article titles and the information about whether or not the article exists in the database This is used to mark up links when displaying a page If the same link appears more than once on any page then it only has to be looked up once In most cases link lookups are done in batches with the LinkBatch class or the equivalent in so the link cache is mostly useful for short snippets of parsed and for links in the navigation areas of the skin The link cache was formerly used to track links used in a document for the purposes of updating the link tables This application is now deprecated To create a you can use the following $titles