diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/DB/MigrationService.php | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php index a021f00a922..729f9753dfb 100644 --- a/lib/private/DB/MigrationService.php +++ b/lib/private/DB/MigrationService.php @@ -23,6 +23,7 @@ namespace OC\DB; +use Doctrine\DBAL\Schema\SchemaException; use OC\IntegrityCheck\Helpers\AppLocator; use OC\Migration\SimpleOutput; use OCP\AppFramework\App; @@ -96,9 +97,41 @@ class MigrationService { return false; } - if ($this->connection->tableExists('migrations')) { - $this->migrationTableCreated = true; - return false; + $schema = new SchemaWrapper($this->connection); + + /** + * We drop the table when it has different columns or the definition does not + * match. E.g. ownCloud uses a length of 177 for app and 14 for version. + */ + try { + $table = $schema->getTable('migrations'); + $columns = $table->getColumns(); + + if (count($columns) === 2) { + try { + $column = $table->getColumn('app'); + $schemaMismatch = $column->getLength() !== 255; + + if (!$schemaMismatch) { + $column = $table->getColumn('version'); + $schemaMismatch = $column->getLength() !== 255; + } + } catch (SchemaException $e) { + // One of the columns is missing + $schemaMismatch = true; + } + + if (!$schemaMismatch) { + // Table exists and schema matches: return back! + $this->migrationTableCreated = true; + return false; + } + } + + // Drop the table, when it didn't match our expectations. + $this->connection->dropTable($this->connection->getPrefix() . 'migrations'); + } catch (SchemaException $e) { + // Table not found, no need to panic, we will create it. } $tableName = $this->connection->getPrefix() . 'migrations'; |