diff --git a/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607104347.php b/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607104347.php index 18d614f0b5..a7823c5b7a 100644 --- a/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607104347.php +++ b/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607104347.php @@ -39,10 +39,9 @@ class Version1002Date20170607104347 extends SimpleMigrationStep { public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { /** @var Schema $schema */ $schema = $schemaClosure(); - $prefix = $options['tablePrefix']; - if (!$schema->hasTable($prefix . 'twofactor_backupcodes')) { - $table = $schema->createTable($prefix . 'twofactor_backupcodes'); + if (!$schema->hasTable('twofactor_backupcodes')) { + $table = $schema->createTable('twofactor_backupcodes'); $table->addColumn('id', Type::INTEGER, [ 'autoincrement' => true, diff --git a/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607113030.php b/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607113030.php index 1feae57896..dae9e01178 100644 --- a/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607113030.php +++ b/apps/twofactor_backupcodes/lib/Migration/Version1002Date20170607113030.php @@ -50,9 +50,8 @@ class Version1002Date20170607113030 extends SimpleMigrationStep { public function preSchemaChange(IOutput $output, \Closure $schemaClosure, array $options) { /** @var Schema $schema */ $schema = $schemaClosure(); - $prefix = $options['tablePrefix']; - if (!$schema->hasTable($prefix . 'twofactor_backup_codes')) { + if (!$schema->hasTable('twofactor_backup_codes')) { // Legacy table does not exist return; } @@ -96,10 +95,9 @@ class Version1002Date20170607113030 extends SimpleMigrationStep { public function changeSchema(IOutput $output, \Closure $schemaClosure, array $options) { /** @var Schema $schema */ $schema = $schemaClosure(); - $prefix = $options['tablePrefix']; - if ($schema->hasTable($prefix . 'twofactor_backup_codes')) { - $schema->dropTable($prefix . 'twofactor_backup_codes'); + if ($schema->hasTable('twofactor_backup_codes')) { + $schema->dropTable('twofactor_backup_codes'); return $schema; } return null; diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php index 912166988c..e4a001c6d9 100644 --- a/lib/private/DB/MigrationService.php +++ b/lib/private/DB/MigrationService.php @@ -395,11 +395,12 @@ class MigrationService { }, ['tablePrefix' => $this->connection->getPrefix()]); $toSchema = $instance->changeSchema($this->output, function() { - return $this->connection->createSchema(); + return new SchemaWrapper($this->connection); }, ['tablePrefix' => $this->connection->getPrefix()]); - if ($toSchema instanceof Schema) { - $this->connection->migrateToSchema($toSchema); + if ($toSchema instanceof SchemaWrapper) { + $this->connection->migrateToSchema($toSchema->getWrappedSchema()); + $toSchema->performDropTableCalls(); } $instance->postSchemaChange($this->output, function() { diff --git a/lib/private/DB/SchemaWrapper.php b/lib/private/DB/SchemaWrapper.php new file mode 100644 index 0000000000..0be45d8d3f --- /dev/null +++ b/lib/private/DB/SchemaWrapper.php @@ -0,0 +1,139 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\DB; + +use Doctrine\DBAL\DBALException; +use Doctrine\DBAL\Schema\Schema; +use OCP\IDBConnection; + +class SchemaWrapper { + + /** @var IDBConnection|Connection */ + protected $connection; + + /** @var Schema */ + protected $schema; + + /** @var array */ + protected $tablesToDelete; + + /** + * @param IDBConnection $connection + */ + public function __construct(IDBConnection $connection) { + $this->connection = $connection; + $this->schema = $this->connection->createSchema(); + } + + public function getWrappedSchema() { + return $this->schema; + } + + public function performDropTableCalls() { + foreach ($this->tablesToDelete as $tableName => $true) { + $this->connection->dropTable($tableName); + unset($this->tablesToDelete[$tableName]); + } + } + + /** + * Gets all table names + * + * @return array + */ + public function getTableNamesWithoutPrefix() { + $tableNames = $this->schema->getTableNames(); + return array_map(function($tableName) { + if (strpos($tableName, $this->connection->getPrefix()) === 0) { + return substr($tableName, strlen($this->connection->getPrefix())); + } + + return $tableName; + }, $tableNames); + } + + // Overwritten methods + + /** + * @param string $tableName + * + * @return \Doctrine\DBAL\Schema\Table + * @throws \Doctrine\DBAL\Schema\SchemaException + */ + public function getTable($tableName) { + return $this->schema->getTable($this->connection->getPrefix() . $tableName); + } + + /** + * Does this schema have a table with the given name? + * + * @param string $tableName + * + * @return boolean + */ + public function hasTable($tableName) { + return $this->schema->hasTable($this->connection->getPrefix() . $tableName); + } + + /** + * Creates a new table. + * + * @param string $tableName + * @return \Doctrine\DBAL\Schema\Table + */ + public function createTable($tableName) { + return $this->schema->createTable($this->connection->getPrefix() . $tableName); + } + + /** + * Renames a table. + * + * @param string $oldTableName + * @param string $newTableName + * + * @return \Doctrine\DBAL\Schema\Schema + * @throws DBALException + */ + public function renameTable($oldTableName, $newTableName) { + throw new DBALException('Renaming tables is not supported. Please create and drop the tables manually.'); + } + + /** + * Drops a table from the schema. + * + * @param string $tableName + * @return \Doctrine\DBAL\Schema\Schema + */ + public function dropTable($tableName) { + $this->tablesToDelete[$tableName] = true; + return $this->schema->dropTable($this->connection->getPrefix() . $tableName); + } + + /** + * @param string $name + * @param array $arguments + * @return mixed + */ + public function __call($name, $arguments) { + return call_user_func_array([$this->schema, $name], $arguments); + } +}