From 3e157496ff311811a60e19b48c079515ac7cd9ca Mon Sep 17 00:00:00 2001 From: Amir Sarabadani Date: Wed, 5 Jul 2023 10:57:11 +0200 Subject: [PATCH] Migrate several wfGetDB() to use ICP And doing proper dependency injection. Bug: T330641 Change-Id: I4978c158e513f88f5547343c4fbbe4b39078dc09 --- includes/ServiceWiring.php | 3 ++- includes/actions/DeleteAction.php | 6 +++++- includes/cache/BacklinkCache.php | 7 ++++++- includes/cache/BacklinkCacheFactory.php | 8 +++++++- includes/diff/DifferenceEngine.php | 9 ++++++--- includes/specialpage/SpecialPageFactory.php | 1 + includes/specials/SpecialVersion.php | 10 ++++++++-- .../unit/includes/cache/BacklinkCacheFactoryTest.php | 5 ++++- 8 files changed, 39 insertions(+), 10 deletions(-) diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index d47f8f21543..799b0144539 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -290,7 +290,8 @@ return [ 'BacklinkCacheFactory' => static function ( MediaWikiServices $services ): BacklinkCacheFactory { return new BacklinkCacheFactory( $services->getMainWANObjectCache(), - $services->getHookContainer() + $services->getHookContainer(), + $services->getDBLoadBalancerFactory() ); }, diff --git a/includes/actions/DeleteAction.php b/includes/actions/DeleteAction.php index ff6ad9ead50..1e7148da3be 100644 --- a/includes/actions/DeleteAction.php +++ b/includes/actions/DeleteAction.php @@ -30,6 +30,7 @@ use MediaWiki\Revision\RevisionRecord; use MediaWiki\Title\TitleFactory; use MediaWiki\User\UserOptionsLookup; use MediaWiki\Watchlist\WatchlistManager; +use Wikimedia\Rdbms\IConnectionProvider; use Wikimedia\Rdbms\ReadOnlyMode; use Wikimedia\RequestTimeout\TimeoutException; @@ -83,6 +84,8 @@ class DeleteAction extends FormAction { /** @var TitleFactory */ private $titleFactory; + private IConnectionProvider $dbProvider; + /** * @inheritDoc */ @@ -99,6 +102,7 @@ class DeleteAction extends FormAction { $this->namespaceInfo = $services->getNamespaceInfo(); $this->titleFormatter = $services->getTitleFormatter(); $this->titleFactory = $services->getTitleFactory(); + $this->dbProvider = $services->getDBLoadBalancerFactory(); } public function getName() { @@ -288,7 +292,7 @@ class DeleteAction extends FormAction { // This, as a side-effect, also makes sure that the following query isn't being run for // pages with a larger history, unless the user has the 'bigdelete' right // (and is about to delete this page). - $revisions = (int)wfGetDB( DB_REPLICA )->newSelectQueryBuilder() + $revisions = (int)$this->dbProvider->getReplicaDatabase()->newSelectQueryBuilder() ->select( 'COUNT(rev_page)' ) ->from( 'revision' ) ->where( [ 'rev_page' => $title->getArticleID() ] ) diff --git a/includes/cache/BacklinkCache.php b/includes/cache/BacklinkCache.php index 6f3c0088555..0d3d9b612b7 100644 --- a/includes/cache/BacklinkCache.php +++ b/includes/cache/BacklinkCache.php @@ -38,6 +38,7 @@ use MediaWiki\Title\TitleArray; use MediaWiki\Title\TitleArrayFromResult; use Wikimedia\Rdbms\Database; use Wikimedia\Rdbms\FakeResultWrapper; +use Wikimedia\Rdbms\IConnectionProvider; use Wikimedia\Rdbms\IReadableDatabase; use Wikimedia\Rdbms\IResultWrapper; use Wikimedia\Rdbms\SelectQueryBuilder; @@ -92,22 +93,26 @@ class BacklinkCache { protected $page; private const CACHE_EXPIRY = 3600; + private IConnectionProvider $dbProvider; /** * Create a new BacklinkCache * * @param WANObjectCache $wanCache * @param HookContainer $hookContainer + * @param IConnectionProvider $dbProvider * @param PageReference $page Page to create a backlink cache for */ public function __construct( WANObjectCache $wanCache, HookContainer $hookContainer, + IConnectionProvider $dbProvider, PageReference $page ) { $this->page = $page; $this->wanCache = $wanCache; $this->hookRunner = new HookRunner( $hookContainer ); + $this->dbProvider = $dbProvider; } /** @@ -141,7 +146,7 @@ class BacklinkCache { * @return IReadableDatabase */ protected function getDB() { - return wfGetDB( DB_REPLICA ); + return $this->dbProvider->getReplicaDatabase(); } /** diff --git a/includes/cache/BacklinkCacheFactory.php b/includes/cache/BacklinkCacheFactory.php index c032e300b86..f2eb49427cd 100644 --- a/includes/cache/BacklinkCacheFactory.php +++ b/includes/cache/BacklinkCacheFactory.php @@ -27,6 +27,7 @@ use BacklinkCache; use MediaWiki\HookContainer\HookContainer; use MediaWiki\Page\PageReference; use WANObjectCache; +use Wikimedia\Rdbms\IConnectionProvider; /** * @since 1.37 @@ -41,16 +42,20 @@ class BacklinkCacheFactory { /** @var HookContainer */ private $hookContainer; + private IConnectionProvider $dbProvider; + /** * @param WANObjectCache $wanCache * @param HookContainer $hookContainer */ public function __construct( WANObjectCache $wanCache, - HookContainer $hookContainer + HookContainer $hookContainer, + IConnectionProvider $dbProvider ) { $this->wanCache = $wanCache; $this->hookContainer = $hookContainer; + $this->dbProvider = $dbProvider; } /** @@ -68,6 +73,7 @@ class BacklinkCacheFactory { $this->latestBacklinkCache = new BacklinkCache( $this->wanCache, $this->hookContainer, + $this->dbProvider, $page ); } diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index 5ef8c77b4a4..5513b320b5d 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -41,6 +41,7 @@ use MediaWiki\Storage\NameTableAccessException; use MediaWiki\StubObject\StubUserLang; use MediaWiki\Title\Title; use MediaWiki\User\UserOptionsLookup; +use Wikimedia\Rdbms\IConnectionProvider; /** * DifferenceEngine is responsible for rendering the difference between two revisions as HTML. @@ -246,6 +247,8 @@ class DifferenceEngine extends ContextSource { /** @var CommentFormatter */ private $commentFormatter; + private IConnectionProvider $dbProvider; + /** @var Message[] */ private $revisionLoadErrors = []; @@ -281,6 +284,7 @@ class DifferenceEngine extends ContextSource { $this->wikiPageFactory = $services->getWikiPageFactory(); $this->userOptionsLookup = $services->getUserOptionsLookup(); $this->commentFormatter = $services->getCommentFormatter(); + $this->dbProvider = $services->getDBLoadBalancerFactory(); } /** @@ -514,9 +518,8 @@ class DifferenceEngine extends ContextSource { */ public function deletedLink( $id ) { if ( $this->getAuthority()->isAllowed( 'deletedhistory' ) ) { - $dbr = wfGetDB( DB_REPLICA ); $arQuery = $this->revisionStore->getArchiveQueryInfo(); - $row = $dbr->selectRow( + $row = $this->dbProvider->getReplicaDatabase()->selectRow( $arQuery['tables'], array_merge( $arQuery['fields'], [ 'ar_namespace', 'ar_title' ] ), [ 'ar_rev_id' => $id ], @@ -2148,7 +2151,7 @@ class DifferenceEngine extends ContextSource { } // Load tags information for both revisions - $dbr = wfGetDB( DB_REPLICA ); + $dbr = $this->dbProvider->getReplicaDatabase(); $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore(); if ( $this->mOldid !== false ) { $tagIds = $dbr->selectFieldValues( diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index 35c7b1365bb..4392d147220 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -764,6 +764,7 @@ class SpecialPageFactory { 'services' => [ 'Parser', 'UrlUtils', + 'DBLoadBalancerFactory', ] ], 'Lockdb' => [ diff --git a/includes/specials/SpecialVersion.php b/includes/specials/SpecialVersion.php index 697fe6c5861..9d66a0361e0 100644 --- a/includes/specials/SpecialVersion.php +++ b/includes/specials/SpecialVersion.php @@ -35,6 +35,7 @@ use MediaWiki\Utils\UrlUtils; use Symfony\Component\Yaml\Yaml; use Wikimedia\Parsoid\Core\SectionMetadata; use Wikimedia\Parsoid\Core\TOCData; +use Wikimedia\Rdbms\IConnectionProvider; /** * Give information about the version of MediaWiki, PHP, the DB and extensions @@ -76,17 +77,22 @@ class SpecialVersion extends SpecialPage { /** @var UrlUtils */ private $urlUtils; + private IConnectionProvider $dbProvider; + /** * @param Parser $parser * @param UrlUtils $urlUtils + * @param IConnectionProvider $dbProvider */ public function __construct( Parser $parser, - UrlUtils $urlUtils + UrlUtils $urlUtils, + IConnectionProvider $dbProvider ) { parent::__construct( 'Version' ); $this->parser = $parser; $this->urlUtils = $urlUtils; + $this->dbProvider = $dbProvider; } /** @@ -363,7 +369,7 @@ class SpecialVersion extends SpecialPage { * @return string[] Array of wikitext strings keyed by wikitext strings */ private function getSoftwareInformation() { - $dbr = wfGetDB( DB_REPLICA ); + $dbr = $this->dbProvider->getReplicaDatabase(); // Put the software in an array of form 'name' => 'version'. All messages should // be loaded here, so feel free to use wfMessage in the 'name'. Wikitext diff --git a/tests/phpunit/unit/includes/cache/BacklinkCacheFactoryTest.php b/tests/phpunit/unit/includes/cache/BacklinkCacheFactoryTest.php index 1a0a4851f0b..fccbe359856 100644 --- a/tests/phpunit/unit/includes/cache/BacklinkCacheFactoryTest.php +++ b/tests/phpunit/unit/includes/cache/BacklinkCacheFactoryTest.php @@ -2,6 +2,7 @@ use MediaWiki\Cache\BacklinkCacheFactory; use MediaWiki\Page\PageReferenceValue; +use Wikimedia\Rdbms\IConnectionProvider; /** * @group Cache @@ -13,10 +14,12 @@ class BacklinkCacheFactoryTest extends MediaWikiUnitTestCase { */ public function testGetBacklinkCache() { $wanCache = new WANObjectCache( [ 'cache' => new EmptyBagOStuff() ] ); + $dbProvider = $this->createMock( IConnectionProvider::class ); $page = PageReferenceValue::localReference( NS_CATEGORY, "kittens" ); $factory = new BacklinkCacheFactory( $wanCache, - $this->createHookContainer() + $this->createHookContainer(), + $dbProvider ); $cache = $factory->getBacklinkCache( $page ); $this->assertTrue( $cache->getPage()->isSamePageAs( $page ) );