From ff5b2768365c6f96943a55aa210fbb876d5c5a9d Mon Sep 17 00:00:00 2001 From: Bryan Tong Minh Date: Mon, 5 May 2008 09:37:14 +0000 Subject: [PATCH] API: Expose cascading protection via inprop=protection for non-existent pages. --- includes/api/ApiQueryInfo.php | 62 +++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php index f1e16ba897..ae651afa96 100644 --- a/includes/api/ApiQueryInfo.php +++ b/includes/api/ApiQueryInfo.php @@ -173,13 +173,71 @@ class ApiQueryInfo extends ApiQueryBase { $res = $this->select(__METHOD__); $prottitles = array(); while($row = $db->fetchObject($res)) { - $prottitles[$row->pt_namespace][$row->pt_title] = array( + $prottitles[$row->pt_namespace][$row->pt_title][] = array( 'type' => 'create', 'level' => $row->pt_create_perm, 'expiry' => Block::decodeExpiry($row->pt_expiry, TS_ISO_8601) ); } $db->freeResult($res); + + $images = array(); + $others = array(); + foreach ($missing as $title) + if ($title->getNamespace() == NS_IMAGE) + $images[] = $title->getDbKey(); + else + $others[] = $title; + + if (count($others) != 0) { + $lb = new LinkBatch($others); + $this->resetQueryParams(); + $this->addTables(array('page_restrictions', 'page', 'templatelinks')); + $this->addFields(array('pr_type', 'pr_level', 'pr_expiry', + 'page_title', 'page_namespace', + 'tl_title', 'tl_namespace')); + $this->addWhere($lb->constructSet('tl', $db)); + $this->addWhere('pr_page = page_id'); + $this->addWhere('pr_page = tl_from'); + $this->addWhereFld('pr_cascade', 1); + + $res = $this->select(__METHOD__); + while($row = $db->fetchObject($res)) { + $source = Title::makeTitle($row->page_namespace, $row->page_title); + $a = array( + 'type' => $row->pr_type, + 'level' => $row->pr_level, + 'expiry' => Block::decodeExpiry( $row->pr_expiry, TS_ISO_8601 ), + 'source' => $source->getPrefixedText() + ); + $prottitles[$row->tl_namespace][$row->tl_title][] = $a; + } + $db->freeResult($res); + } + + if (count($images) != 0) { + $this->resetQueryParams(); + $this->addTables(array('page_restrictions', 'page', 'imagelinks')); + $this->addFields(array('pr_type', 'pr_level', 'pr_expiry', + 'page_title', 'page_namespace', 'il_to')); + $this->addWhere('pr_page = page_id'); + $this->addWhere('pr_page = il_from'); + $this->addWhereFld('pr_cascade', 1); + $this->addWhereFld('il_to', $images); + + $res = $this->select(__METHOD__); + while($row = $db->fetchObject($res)) { + $source = Title::makeTitle($row->page_namespace, $row->page_title); + $a = array( + 'type' => $row->pr_type, + 'level' => $row->pr_level, + 'expiry' => Block::decodeExpiry( $row->pr_expiry, TS_ISO_8601 ), + 'source' => $source->getPrefixedText() + ); + $prottitles[NS_IMAGE][$row->il_to][] = $a; + } + $db->freeResult($res); + } } // Run the talkid/subjectid query @@ -307,7 +365,7 @@ class ApiQueryInfo extends ApiQueryBase { // Apparently the XML formatting code doesn't like array(null) // This is painful to fix, so we'll just work around it if(isset($prottitles[$title->getNamespace()][$title->getDBkey()])) - $res['query']['pages'][$pageid]['protection'][] = $prottitles[$title->getNamespace()][$title->getDBkey()]; + $res['query']['pages'][$pageid]['protection'] = $prottitles[$title->getNamespace()][$title->getDBkey()]; else $res['query']['pages'][$pageid]['protection'] = array(); $result->setIndexedTagName($res['query']['pages'][$pageid]['protection'], 'pr'); -- 2.20.1