/** * Creates an empty skeleton of the wiki database by cloning its structure * to equivalent tables using the given $prefix. Then sets MediaWiki to * use the new set of tables (aka schema) instead of the original set. * * This is used to generate a dummy table set, typically consisting of temporary * tables, that will be used by tests instead of the original wiki database tables. * * @since 1.21 * * @note the original table prefix is stored in self::$oldTablePrefix. This is used * by teardownTestDB() to return the wiki to using the original table set. * * @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 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) { global $wgDBprefix; if ($wgDBprefix === $prefix) { throw new MWException('Cannot run unit tests, the database prefix is already "' . $prefix . '"'); } if (self::$dbSetup) { return; } $tablesCloned = self::listTables($db); $dbClone = new CloneDatabase($db, $tablesCloned, $prefix); $dbClone->useTemporaryTables(self::$useTemporaryTables); self::$dbSetup = true; self::$oldTablePrefix = $wgDBprefix; if (($db->getType() == 'oracle' || !self::$useTemporaryTables) && self::$reuseDB) { CloneDatabase::changePrefix($prefix); return; } else { $dbClone->cloneTableStructure(); } if ($db->getType() == 'oracle') { $db->query('BEGIN FILL_WIKI_INFO; END;'); } }
/** * Setups a database with the given prefix. * * If reuseDB is true and certain conditions apply, it will just change the prefix. * Otherwise, it will clone the tables and change the prefix. * * Clones all tables in the given database (whatever database that connection has * open), to versions with the test prefix. * * @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(Database $db, $prefix) { $tablesCloned = self::listTables($db); $dbClone = new CloneDatabase($db, $tablesCloned, $prefix); $dbClone->useTemporaryTables(self::$useTemporaryTables); if (($db->getType() == 'oracle' || !self::$useTemporaryTables) && self::$reuseDB) { CloneDatabase::changePrefix($prefix); return false; } else { $dbClone->cloneTableStructure(); return true; } }
private function initDB() { global $wgDBprefix; if ($wgDBprefix === $this->dbPrefix()) { throw new MWException('Cannot run unit tests, the database prefix is already "unittest_"'); } $tablesCloned = $this->listTables(); $dbClone = new CloneDatabase($this->db, $tablesCloned, $this->dbPrefix()); $dbClone->useTemporaryTables($this->useTemporaryTables); if (($this->db->getType() == 'oracle' || !$this->useTemporaryTables) && $this->reuseDB) { CloneDatabase::changePrefix($this->dbPrefix()); $this->resetDB(); return; } else { $dbClone->cloneTableStructure(); } if ($this->db->getType() == 'oracle') { $this->db->query('BEGIN FILL_WIKI_INFO; END;'); } }
protected function destroyDB() { if ($this->useTemporaryTables || is_null($this->db)) { # Don't need to do anything return; } $tables = $this->db->listTables($this->dbPrefix(), __METHOD__); foreach ($tables as $table) { try { $sql = $this->db->getType() == 'oracle' ? "DROP TABLE {$table} CASCADE CONSTRAINTS PURGE" : "DROP TABLE `{$table}`"; $this->db->query($sql, __METHOD__); } catch (MWException $mwe) { } } if ($this->db->getType() == 'oracle') { $this->db->query('BEGIN FILL_WIKI_INFO; END;', __METHOD__); } CloneDatabase::changePrefix($this->oldTablePrefix); }