Migrate several wfGetDB() to use ICP

And doing proper dependency injection.

Bug: T330641
Change-Id: I4978c158e513f88f5547343c4fbbe4b39078dc09
This commit is contained in:
Amir Sarabadani 2023-07-05 10:57:11 +02:00
parent 953a7c1251
commit 3e157496ff
8 changed files with 39 additions and 10 deletions

View file

@ -290,7 +290,8 @@ return [
'BacklinkCacheFactory' => static function ( MediaWikiServices $services ): BacklinkCacheFactory {
return new BacklinkCacheFactory(
$services->getMainWANObjectCache(),
$services->getHookContainer()
$services->getHookContainer(),
$services->getDBLoadBalancerFactory()
);
},

View file

@ -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() ] )

View file

@ -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();
}
/**

View file

@ -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
);
}

View file

@ -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(

View file

@ -764,6 +764,7 @@ class SpecialPageFactory {
'services' => [
'Parser',
'UrlUtils',
'DBLoadBalancerFactory',
]
],
'Lockdb' => [

View file

@ -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

View file

@ -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 ) );