MySQL: adding repair step to convert MyIsam tables to InnoDB
This commit is contained in:
parent
5c444c2da8
commit
b091b15f0b
3 changed files with 117 additions and 0 deletions
|
@ -81,6 +81,7 @@ class Repair extends BasicEmitter {
|
|||
*/
|
||||
public static function getBeforeUpgradeRepairSteps() {
|
||||
return array(
|
||||
new \OC\Repair\InnoDB()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
51
lib/repair/innodb.php
Normal file
51
lib/repair/innodb.php
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
65
tests/lib/repair/repairinnodb.php
Normal file
65
tests/lib/repair/repairinnodb.php
Normal file
|
@ -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 a new issue