From 715405020154bba3c979652a7985c63a697b3cbb Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 4 Jan 2018 14:58:01 +0100 Subject: [PATCH] Drop the ownCloud migration table instead of reusing it Signed-off-by: Joas Schilling --- lib/private/DB/MigrationService.php | 39 ++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php index a021f00a92..729f9753df 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';