예제 #1
0
 /**
  * Helper for database teardown, called from the teardown closure. Destroy
  * the database clone and fix up some things that CloneDatabase doesn't fix.
  *
  * @todo Move most things here to CloneDatabase
  */
 private function teardownDatabase()
 {
     $this->checkSetupDone('setupDatabase');
     $this->dbClone->destroy();
     $this->databaseSetupDone = false;
     if ($this->useTemporaryTables) {
         if ($this->db->getType() == 'sqlite') {
             # Under SQLite the searchindex table is virtual and need
             # to be explicitly destroyed. See bug 29912
             # See also MediaWikiTestCase::destroyDB()
             wfDebug(__METHOD__ . " explicitly destroying sqlite virtual table parsertest_searchindex\n");
             $this->db->query("DROP TABLE `parsertest_searchindex`");
         }
         # Don't need to do anything
         return;
     }
     $tables = $this->listTables();
     foreach ($tables as $table) {
         if ($this->db->getType() == 'oracle') {
             $this->db->query("DROP TABLE pt_{$table} DROP CONSTRAINTS");
         } else {
             $this->db->query("DROP TABLE `parsertest_{$table}`");
         }
     }
     if ($this->db->getType() == 'oracle') {
         $this->db->query('BEGIN FILL_WIKI_INFO; END;');
     }
 }
예제 #2
0
 /**
  * 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;');
     }
 }
 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;');
     }
 }
예제 #4
0
 /**
  * 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;
     }
 }
예제 #5
0
 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);
 }