]> source.dussan.org Git - nextcloud-server.git/commitdiff
Create unique names for temporary indexes
authorRobin Appelman <icewind@owncloud.com>
Thu, 30 Jan 2014 13:21:16 +0000 (14:21 +0100)
committerRobin Appelman <icewind@owncloud.com>
Tue, 3 Jun 2014 09:17:21 +0000 (11:17 +0200)
lib/private/db/migrator.php
tests/lib/db/migrator.php

index 91060663f87a790dc49781b618bcd874977e3396..a6c61f35424ba106808442f98c8d08dfe95f0c38 100644 (file)
@@ -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) {
index ed7c36dbdf421f984aea5eb3538140f35e04bf98..e08f1cf4547ce6a6e45886711aa3c423f9ca1284 100644 (file)
@@ -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;
        }