X-Git-Url: https://git.cyclocoop.org/%242?a=blobdiff_plain;f=includes%2FTitle.php;h=e45994c0946e44acdcb1ff42d0b0acbee1f20753;hb=17eba67ef329fb8f444f681e6ff515d1919376cb;hp=b810b36e9319cac7da4d822b20789ab489ef60a0;hpb=f17a70e253c24f5ceee072de10b7ef0b5b5e228a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Title.php b/includes/Title.php index b810b36e93..e45994c094 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -2549,6 +2549,29 @@ class Title implements LinkTarget { * protection, or false if there's none. */ public function getTitleProtection() { + $protection = $this->getTitleProtectionInternal(); + if ( $protection ) { + if ( $protection['permission'] == 'sysop' ) { + $protection['permission'] = 'editprotected'; // B/C + } + if ( $protection['permission'] == 'autoconfirmed' ) { + $protection['permission'] = 'editsemiprotected'; // B/C + } + } + return $protection; + } + + /** + * Fetch title protection settings + * + * To work correctly, $this->loadRestrictions() needs to have access to the + * actual protections in the database without munging 'sysop' => + * 'editprotected' and 'autoconfirmed' => 'editsemiprotected'. Other + * callers probably want $this->getTitleProtection() instead. + * + * @return array|bool + */ + protected function getTitleProtectionInternal() { // Can't protect pages in special namespaces if ( $this->getNamespace() < 0 ) { return false; @@ -2576,12 +2599,6 @@ class Title implements LinkTarget { // fetchRow returns false if there are no rows. $row = $dbr->fetchRow( $res ); if ( $row ) { - if ( $row['permission'] == 'sysop' ) { - $row['permission'] = 'editprotected'; // B/C - } - if ( $row['permission'] == 'autoconfirmed' ) { - $row['permission'] = 'editsemiprotected'; // B/C - } $row['expiry'] = $dbr->decodeExpiry( $row['expiry'] ); } $this->mTitleProtection = $row; @@ -2926,8 +2943,6 @@ class Title implements LinkTarget { continue; } - // This code should be refactored, now that it's being used more generally, - // But I don't really see any harm in leaving it in Block for now -werdna $expiry = $dbr->decodeExpiry( $row->pr_expiry ); // Only apply the restrictions if they haven't expired! @@ -2979,7 +2994,7 @@ class Title implements LinkTarget { $this->loadRestrictionsFromRows( $rows, $oldFashionedRestrictions ); } else { - $title_protection = $this->getTitleProtection(); + $title_protection = $this->getTitleProtectionInternal(); if ( $title_protection ) { $now = wfTimestampNow(); @@ -3865,7 +3880,7 @@ class Title implements LinkTarget { * categories' names. * * @return array Array of parents in the form: - * $parent => $currentarticle + * $parent => $currentarticle */ public function getParentCategories() { global $wgContLang; @@ -3946,14 +3961,22 @@ class Title implements LinkTarget { * @return int|bool Old revision ID, or false if none exists */ public function getPreviousRevisionID( $revId, $flags = 0 ) { - $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA ); + /* This function and getNextRevisionID have bad performance when + used on a page with many revisions on mysql. An explicit extended + primary key may help in some cases, if the PRIMARY KEY is banned: + T159319 */ + if ( $flags & self::GAID_FOR_UPDATE ) { + $db = wfGetDB( DB_MASTER ); + } else { + $db = wfGetDB( DB_REPLICA, 'contributions' ); + } $revId = $db->selectField( 'revision', 'rev_id', [ 'rev_page' => $this->getArticleID( $flags ), 'rev_id < ' . intval( $revId ) ], __METHOD__, - [ 'ORDER BY' => 'rev_id DESC' ] + [ 'ORDER BY' => 'rev_id DESC', 'IGNORE INDEX' => 'PRIMARY' ] ); if ( $revId === false ) { @@ -3971,14 +3994,18 @@ class Title implements LinkTarget { * @return int|bool Next revision ID, or false if none exists */ public function getNextRevisionID( $revId, $flags = 0 ) { - $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA ); + if ( $flags & self::GAID_FOR_UPDATE ) { + $db = wfGetDB( DB_MASTER ); + } else { + $db = wfGetDB( DB_REPLICA, 'contributions' ); + } $revId = $db->selectField( 'revision', 'rev_id', [ 'rev_page' => $this->getArticleID( $flags ), 'rev_id > ' . intval( $revId ) ], __METHOD__, - [ 'ORDER BY' => 'rev_id' ] + [ 'ORDER BY' => 'rev_id', 'IGNORE INDEX' => 'PRIMARY' ] ); if ( $revId === false ) {