Skip to content
Snippets Groups Projects
Commit 0035147b authored by Robin Appelman's avatar Robin Appelman
Browse files

Create unique names for temporary indexes

parent 9c6a93a8
Branches
No related tags found
No related merge requests found
......@@ -9,9 +9,11 @@
namespace OC\DB;
use \Doctrine\DBAL\DBALException;
use \Doctrine\DBAL\Schema\Index;
use \Doctrine\DBAL\Schema\Table;
use \Doctrine\DBAL\Schema\Schema;
use \Doctrine\DBAL\Schema\SchemaConfig;
use \Doctrine\DBAL\Schema\Comparator;
class Migrator {
/**
......@@ -57,15 +59,16 @@ class Migrator {
* Check the migration of a table on a copy so we can detect errors before messing with the real table
*
* @param \Doctrine\DBAL\Schema\Table $table
* @throws \OC\DB\MigrationException
*/
protected function checkTableMigrate(Table $table) {
$name = $table->getName();
$tmpName = $name . '_copy_' . uniqid();
$tmpName = uniqid();
$this->copyTable($name, $tmpName);
//create the migration schema for the temporary table
$tmpTable = new Table($tmpName, $table->getColumns(), $table->getIndexes(), $table->getForeignKeys(), $table->_idGeneratorType, $table->getOptions());
$tmpTable = $this->renameTableSchema($table, $tmpName);
$schemaConfig = new SchemaConfig();
$schemaConfig->setName($this->connection->getDatabase());
$schema = new Schema(array($tmpTable), array(), $schemaConfig);
......@@ -79,6 +82,23 @@ class Migrator {
}
}
/**
* @param \Doctrine\DBAL\Schema\Table $table
* @param string $newName
* @return \Doctrine\DBAL\Schema\Table
*/
protected function renameTableSchema(Table $table, $newName) {
$indexes = $table->getIndexes();
$newIndexes = array();
foreach ($indexes as $index) {
$indexName = uniqid(); // avoid conflicts in index names
$newIndexes[] = new Index($indexName, $index->getColumns(), $index->isUnique(), $index->isPrimary(), $index->getFlags());
}
// foreign keys are not supported so we just set it to an empty array
return new Table($newName, $table->getColumns(), $indexes, array(), 0, $table->getOptions());
}
/**
* @param \Doctrine\DBAL\Schema\Schema $targetSchema
* @param \Doctrine\DBAL\Connection $connection
......@@ -104,7 +124,7 @@ class Migrator {
}
}
$comparator = new \Doctrine\DBAL\Schema\Comparator();
$comparator = new Comparator();
$schemaDiff = $comparator->compare($sourceSchema, $targetSchema);
foreach ($schemaDiff->changedTables as $tableDiff) {
......
......@@ -20,30 +20,33 @@ class Migrator extends \PHPUnit_Framework_TestCase {
private $tableName;
private $fullTableName;
public function setUp() {
$this->tableName = 'test_' . uniqid();
$this->connection = \OC_DB::getConnection();
$this->tableName = $this->connection->getDatabase() . '.' . $this->tableName;
$this->fullTableName = $this->connection->getDatabase() . '.' . $this->tableName;
}
public function tearDown() {
$this->connection->exec('DROP TABLE ' . $this->tableName);
$this->connection->exec('DROP TABLE ' . $this->fullTableName);
}
private function getInitialSchema() {
$schema = new Schema(array(), array(), $this->getSchemaConfig());
$table = $schema->createTable($this->tableName);
$table = $schema->createTable($this->fullTableName);
$table->addColumn('id', 'integer');
$table->addColumn('name', 'string');
$table->addIndex(array('id'), $this->tableName . '_id');
return $schema;
}
private function getNewSchema() {
$schema = new Schema(array(), array(), $this->getSchemaConfig());
$table = $schema->createTable($this->tableName);
$table = $schema->createTable($this->fullTableName);
$table->addColumn('id', 'integer');
$table->addColumn('name', 'string');
$table->addUniqueIndex(array('id'));
$table->addUniqueIndex(array('id'), $this->tableName . '_id');
return $schema;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment