diff --git a/core/Command/Db/Migrations/GenerateCommand.php b/core/Command/Db/Migrations/GenerateCommand.php index 307989c845..894c0f4f3e 100644 --- a/core/Command/Db/Migrations/GenerateCommand.php +++ b/core/Command/Db/Migrations/GenerateCommand.php @@ -24,7 +24,6 @@ namespace OC\Core\Command\Db\Migrations; use OC\DB\MigrationService; use OC\Migration\ConsoleOutput; -use OCP\IConfig; use OCP\IDBConnection; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Exception\RuntimeException; @@ -38,56 +37,37 @@ class GenerateCommand extends Command { '; -use OCP\Migration\ISimpleMigration; +use OCP\Migration\SimpleMigrationStep; use OCP\Migration\IOutput; /** * Auto-generated migration step: Please modify to your needs! */ -class Version implements ISimpleMigration { +class Version extends SimpleMigrationStep { - /** - * @param IOutput $out - */ - public function run(IOutput $out) { - // auto-generated - please modify it to your needs - } -} -'; + /** + * @param IOutput $output + * @since 13.0.0 + */ + public function preSchemaChange(IOutput $output) { + } - private static $_templateSchema = - '; + /** + * @param \Closure $schema The `\Closure` returns a `Schema` + * @param array $options + * @return null|Schema + * @since 13.0.0 + */ + public function changeSchema(\Closure $schema, array $options) { + return null; + } -use Doctrine\DBAL\Schema\Schema; -use OCP\Migration\ISchemaMigration; - -/** - * Auto-generated migration step: Please modify to your needs! - */ -class Version implements ISchemaMigration { - - public function changeSchema(Schema $schema, array $options) { - // auto-generated - please modify it to your needs - } -} -'; - - private static $_templateSql = - '; - -use OCP\IDBConnection; -use OCP\Migration\ISqlMigration; - -/** - * Auto-generated migration step: Please modify to your needs! - */ -class Version implements ISqlMigration { - - public function sql(IDBConnection $connection) { - // auto-generated - please modify it to your needs - } + /** + * @param IOutput $output + * @since 13.0.0 + */ + public function postSchemaChange(IOutput $output) { + } } '; @@ -107,7 +87,7 @@ class Version implements ISqlMigration { $this ->setName('migrations:generate') ->addArgument('app', InputArgument::REQUIRED, 'Name of the app this migration command shall work on') - ->addArgument('kind', InputArgument::REQUIRED, 'simple, schema or sql - defines the kind of migration to be generated'); + ; parent::configure(); } @@ -115,10 +95,8 @@ class Version implements ISqlMigration { public function execute(InputInterface $input, OutputInterface $output) { $appName = $input->getArgument('app'); $ms = new MigrationService($appName, $this->connection, new ConsoleOutput($output)); - - $kind = $input->getArgument('kind'); $version = date('YmdHis'); - $path = $this->generateMigration($ms, $version, $kind); + $path = $this->generateMigration($ms, $version); $output->writeln("New migration class has been generated to $path"); @@ -127,10 +105,9 @@ class Version implements ISqlMigration { /** * @param MigrationService $ms * @param string $version - * @param string $kind * @return string */ - private function generateMigration(MigrationService $ms, $version, $kind) { + private function generateMigration(MigrationService $ms, $version) { $placeHolders = [ '', '', @@ -139,7 +116,7 @@ class Version implements ISqlMigration { $ms->getMigrationsNamespace(), $version, ]; - $code = str_replace($placeHolders, $replacements, $this->getTemplate($kind)); + $code = str_replace($placeHolders, $replacements, self::$_templateSimple); $dir = $ms->getMigrationsDirectory(); $path = $dir . '/Version' . $version . '.php'; @@ -150,17 +127,4 @@ class Version implements ISqlMigration { return $path; } - private function getTemplate($kind) { - if ($kind === 'simple') { - return self::$_templateSimple; - } - if ($kind === 'schema') { - return self::$_templateSchema; - } - if ($kind === 'sql') { - return self::$_templateSql; - } - throw new \InvalidArgumentException('Kind can only be one of the following: simple, schema or sql'); - } - } diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php index 8a4980d111..c81fe0f433 100644 --- a/lib/private/DB/MigrationService.php +++ b/lib/private/DB/MigrationService.php @@ -22,10 +22,12 @@ namespace OC\DB; +use Doctrine\DBAL\Schema\Schema; use OC\IntegrityCheck\Helpers\AppLocator; use OC\Migration\SimpleOutput; use OCP\AppFramework\QueryException; use OCP\IDBConnection; +use OCP\Migration\IMigrationStep; use OCP\Migration\IOutput; use OCP\Migration\ISchemaMigration; use OCP\Migration\ISimpleMigration; @@ -373,23 +375,23 @@ class MigrationService { * @param string $version */ public function executeStep($version) { - - // FIXME our interface $instance = $this->createInstance($version); - if ($instance instanceof ISimpleMigration) { - $instance->run($this->output); + if (!$instance instanceof IMigrationStep) { + throw new \RuntimeException('Not a valid migration'); } - if ($instance instanceof ISqlMigration) { - $sqls = $instance->sql($this->connection); - foreach ($sqls as $s) { - $this->connection->executeQuery($s); - } - } - if ($instance instanceof ISchemaMigration) { - $toSchema = $this->connection->createSchema(); - $instance->changeSchema($toSchema, ['tablePrefix' => $this->connection->getPrefix()]); + + $instance->preSchemaChange($this->output); + + $toSchema = $instance->changeSchema(function() { + return $this->connection->createSchema(); + }, ['tablePrefix' => $this->connection->getPrefix()]); + + if ($toSchema instanceof Schema) { $this->connection->migrateToSchema($toSchema); } + + $instance->postSchemaChange($this->output); + $this->markAsExecuted($version); } diff --git a/lib/public/Migration/IMigrationStep.php b/lib/public/Migration/IMigrationStep.php index 3f95eed759..aeb35bc839 100644 --- a/lib/public/Migration/IMigrationStep.php +++ b/lib/public/Migration/IMigrationStep.php @@ -35,11 +35,12 @@ interface IMigrationStep { public function preSchemaChange(IOutput $output); /** - * @param Schema $schema + * @param \Closure $schema The `\Closure` returns a `Schema` * @param array $options + * @return null|Schema * @since 13.0.0 */ - public function changeSchema(Schema $schema, array $options); + public function changeSchema(\Closure $schema, array $options); /** * @param IOutput $output diff --git a/lib/public/Migration/SimpleMigrationStep.php b/lib/public/Migration/SimpleMigrationStep.php new file mode 100644 index 0000000000..681bd5c6b5 --- /dev/null +++ b/lib/public/Migration/SimpleMigrationStep.php @@ -0,0 +1,54 @@ + + * + * @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 OCP\Migration; + +use Doctrine\DBAL\Schema\Schema; + +/** + * @since 13.0.0 + */ +abstract class SimpleMigrationStep implements IMigrationStep { + + /** + * @param IOutput $output + * @since 13.0.0 + */ + public function preSchemaChange(IOutput $output) { + } + + /** + * @param \Closure $schema + * @param array $options + * @return null|Schema + * @since 13.0.0 + */ + public function changeSchema(\Closure $schema, array $options) { + return null; + } + + /** + * @param IOutput $output + * @since 13.0.0 + */ + public function postSchemaChange(IOutput $output) { + } +}