/**
* Primary database
*
- * @var DatabaseBase
+ * @var Database
* @since 1.18
*/
protected $db;
* which we can't allow, as that would open a new connection for mysql.
* Replace with a HashBag. They would not be going to persist anyway.
*/
- $hashCache = [ 'class' => 'HashBagOStuff' ];
+ $hashCache = [ 'class' => 'HashBagOStuff', 'reportDupes' => false ];
$objectCaches = [
CACHE_DB => $hashCache,
CACHE_ACCEL => $hashCache,
JobQueueGroup::destroySingletons();
ObjectCache::clear();
+ $services = MediaWikiServices::getInstance();
+ $services->resetServiceForTesting( 'MainObjectStash' );
+ $services->resetServiceForTesting( 'LocalServerObjectCache' );
+ $services->getMainWANObjectCache()->clearProcessCache();
FileBackendGroup::destroySingleton();
// TODO: move global state into MediaWikiServices
* Clones all tables in the given database (whatever database that connection has
* open), to versions with the test prefix.
*
- * @param DatabaseBase $db Database to use
+ * @param Database $db Database to use
* @param string $prefix Prefix to use for test tables
* @return bool True if tables were cloned, false if only the prefix was changed
*/
- protected static function setupDatabaseWithTestPrefix( DatabaseBase $db, $prefix ) {
+ protected static function setupDatabaseWithTestPrefix( Database $db, $prefix ) {
$tablesCloned = self::listTables( $db );
$dbClone = new CloneDatabase( $db, $tablesCloned, $prefix );
$dbClone->useTemporaryTables( self::$useTemporaryTables );
* @note this method only works when first called. Subsequent calls have no effect,
* even if using different parameters.
*
- * @param DatabaseBase $db The database connection
+ * @param Database $db The database connection
* @param string $prefix The prefix to use for the new table set (aka schema).
*
* @throws MWException If the database table prefix is already $prefix
*/
- public static function setupTestDB( DatabaseBase $db, $prefix ) {
+ public static function setupTestDB( Database $db, $prefix ) {
if ( self::$dbSetup ) {
return;
}
}
// TODO: the below should be re-written as soon as LBFactory, LoadBalancer,
- // and DatabaseBase no longer use global state.
+ // and Database no longer use global state.
self::$dbSetup = true;
* Gets master database connections for all of the ExternalStoreDB
* stores configured in $wgDefaultExternalStore.
*
- * @return array Array of DatabaseBase master connections
+ * @return Database[] Array of Database master connections
*/
protected static function getExternalStoreDatabaseConnections() {
global $wgDefaultExternalStore;
+ /** @var ExternalStoreDB $externalStoreDB */
$externalStoreDB = ExternalStore::getStoreObject( 'DB' );
$defaultArray = (array) $wgDefaultExternalStore;
$dbws = [];
foreach ( $defaultArray as $url ) {
if ( strpos( $url, 'DB://' ) === 0 ) {
list( $proto, $cluster ) = explode( '://', $url, 2 );
- $dbw = $externalStoreDB->getMaster( $cluster );
+ // Avoid getMaster() because setupDatabaseWithTestPrefix()
+ // requires Database instead of plain DBConnRef/IDatabase
+ $lb = $externalStoreDB->getLoadBalancer( $cluster );
+ $dbw = $lb->getConnection( DB_MASTER );
$dbws[] = $dbw;
}
}
/**
* Empty all tables so they can be repopulated for tests
*
- * @param DatabaseBase $db|null Database to reset
+ * @param Database $db|null Database to reset
* @param array $tablesUsed Tables to reset
*/
private function resetDB( $db, $tablesUsed ) {
/**
* @since 1.18
*
- * @param DatabaseBase $db
+ * @param Database $db
*
* @return array
*/
- public static function listTables( $db ) {
+ public static function listTables( Database $db ) {
$prefix = $db->tablePrefix();
$tables = $db->listTables( $prefix, __METHOD__ );
if ( $db->getType() === 'mysql' ) {
- # bug 43571: cannot clone VIEWs under MySQL
- $views = $db->listViews( $prefix, __METHOD__ );
- $tables = array_diff( $tables, $views );
+ static $viewListCache = null;
+ if ( $viewListCache === null ) {
+ $viewListCache = $db->listViews( null, __METHOD__ );
+ }
+ // T45571: cannot clone VIEWs under MySQL
+ $tables = array_diff( $tables, $viewListCache );
}
array_walk( $tables, [ __CLASS__, 'unprefixTable' ], $prefix );