MySQL: adding repair step to convert MyIsam tables to InnoDB
This commit is contained in:
parent
5c444c2da8
commit
b091b15f0b
|
@ -81,6 +81,7 @@ class Repair extends BasicEmitter {
|
||||||
*/
|
*/
|
||||||
public static function getBeforeUpgradeRepairSteps() {
|
public static function getBeforeUpgradeRepairSteps() {
|
||||||
return array(
|
return array(
|
||||||
|
new \OC\Repair\InnoDB()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2014 Thomas Müller <deepdiver@owncloud.com>
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later.
|
||||||
|
* See the COPYING-README file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OC\Repair;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Platforms\MySqlPlatform;
|
||||||
|
use OC\Hooks\BasicEmitter;
|
||||||
|
|
||||||
|
class InnoDB extends BasicEmitter implements \OC\RepairStep {
|
||||||
|
|
||||||
|
public function getName() {
|
||||||
|
return 'Repair MySQL database engine';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fix mime types
|
||||||
|
*/
|
||||||
|
public function run() {
|
||||||
|
$connection = \OC_DB::getConnection();
|
||||||
|
if (!$connection->getDatabasePlatform() instanceof MySqlPlatform) {
|
||||||
|
$this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to no'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tables = $this->getAllMyIsamTables($connection);
|
||||||
|
foreach ($tables as $table) {
|
||||||
|
$connection->exec("ALTER TABLE $table ENGINE=InnoDB;");
|
||||||
|
$this->emit('\OC\Repair', 'info', array("Fixed $table"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \Doctrine\DBAL\Connection $connection
|
||||||
|
* @return string[]
|
||||||
|
*/
|
||||||
|
private function getAllMyIsamTables($connection) {
|
||||||
|
$dbName = \OC::$server->getConfig()->getSystemValue("dbname");
|
||||||
|
$result = $connection->fetchArray(
|
||||||
|
"SELECT table_name FROM information_schema.tables WHERE table_schema = ? AND engine = 'MyISAM'",
|
||||||
|
array($dbName)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2014 Thomas Müller <deepdiver@owncloud.com>
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later.
|
||||||
|
* See the COPYING-README file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for the converting of MySQL tables to InnoDB engine
|
||||||
|
*
|
||||||
|
* @see \OC\Repair\RepairMimeTypes
|
||||||
|
*/
|
||||||
|
class TestRepairInnoDB extends PHPUnit_Framework_TestCase {
|
||||||
|
|
||||||
|
/** @var \OC\RepairStep */
|
||||||
|
private $repair;
|
||||||
|
|
||||||
|
/** @var \Doctrine\DBAL\Connection */
|
||||||
|
private $connection;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
private $tableName;
|
||||||
|
|
||||||
|
public function setUp() {
|
||||||
|
$this->connection = \OC_DB::getConnection();
|
||||||
|
if (!$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\MySqlPlatform) {
|
||||||
|
$this->markTestSkipped("Test only relevant on MySql");
|
||||||
|
}
|
||||||
|
|
||||||
|
$dbPrefix = \OC::$server->getConfig()->getSystemValue("dbtableprefix");
|
||||||
|
$this->tableName = uniqid($dbPrefix . "_innodb_test");
|
||||||
|
$this->connection->exec("CREATE TABLE $this->tableName(id INT) ENGINE MyISAM");
|
||||||
|
|
||||||
|
$this->repair = new \OC\Repair\InnoDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tearDown() {
|
||||||
|
$this->connection->getSchemaManager()->dropTable($this->tableName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInnoDBConvert() {
|
||||||
|
$result = $this->countMyIsamTables();
|
||||||
|
$this->assertEquals(1, $result);
|
||||||
|
|
||||||
|
$this->repair->run();
|
||||||
|
|
||||||
|
$result = $this->countMyIsamTables();
|
||||||
|
$this->assertEquals(0, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $dbName
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
private function countMyIsamTables() {
|
||||||
|
$dbName = \OC::$server->getConfig()->getSystemValue("dbname");
|
||||||
|
|
||||||
|
$result = $this->connection->fetchColumn(
|
||||||
|
"SELECT count(*) FROM information_schema.tables WHERE table_schema = ? and table_name = ? AND engine = 'MyISAM'",
|
||||||
|
array($dbName, $this->tableName)
|
||||||
|
);
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue