/** * Run a migration to the current version or the given target version. * * @param string $to The version to migrate to. * * @throws AntiMattr\MongoDB\Migrations\Exception\UnknownVersionException * @throws AntiMattr\MongoDB\Migrations\Exception\NoMigrationsToExecuteException */ public function migrate($to = null) { if ($to === null) { $to = $this->configuration->getLatestVersion(); } $from = $this->configuration->getCurrentVersion(); $from = (string) $from; $to = (string) $to; $migrations = $this->configuration->getMigrations(); if (!isset($migrations[$to]) && $to > 0) { throw new UnknownVersionException($to); } $direction = $from > $to ? 'down' : 'up'; $migrationsToExecute = $this->configuration->getMigrationsToExecute($direction, $to); if ($from === $to && empty($migrationsToExecute) && $migrations) { return; } $this->outputWriter->write(sprintf('Migrating <info>%s</info> to <comment>%s</comment> from <comment>%s</comment>', $direction, $to, $from)); if (empty($migrationsToExecute)) { throw new NoMigrationsToExecuteException('Could not find any migrations to execute.'); } $time = 0; foreach ($migrationsToExecute as $version) { $versionSql = $version->execute($direction); $time += $version->getTime(); } $this->outputWriter->write("\n <comment>------------------------</comment>\n"); $this->outputWriter->write(sprintf(" <info>++</info> finished in %s", $time)); $this->outputWriter->write(sprintf(" <info>++</info> %s migrations executed", count($migrationsToExecute))); }
public function __construct(Version $version) { $this->configuration = $version->getConfiguration(); $this->outputWriter = $this->configuration->getOutputWriter(); $this->connection = $this->configuration->getConnection(); $this->connection = $this->connection->selectDatabase($this->configuration->getMigrationsDatabaseName()); $this->version = $version; }
/** * @param AntiMattr\MongoDB\Migrations\Configuration\Configuration * @param Symfony\Component\Console\Output\OutputInterface */ protected function outputHeader(Configuration $configuration, OutputInterface $output) { $name = $configuration->getName(); $name = $name ? $name : 'AntiMattr Database Migrations'; $name = str_repeat(' ', 20) . $name . str_repeat(' ', 20); $output->writeln('<question>' . str_repeat(' ', strlen($name)) . '</question>'); $output->writeln('<question>' . $name . '</question>'); $output->writeln('<question>' . str_repeat(' ', strlen($name)) . '</question>'); $output->writeln(''); }
public function __construct(Configuration $configuration, $version, $class) { $this->configuration = $configuration; $this->outputWriter = $configuration->getOutputWriter(); $this->class = $class; $this->connection = $configuration->getConnection(); $this->db = $configuration->getDatabase(); $this->migration = $this->createMigration(); $this->version = $version; }
/** * @param Symfony\Component\Console\Input\InputInterface * @param Symfony\Component\Console\Output\OutputInterface */ public function execute(InputInterface $input, OutputInterface $output) { $version = $input->getArgument('version'); $configuration = $this->getMigrationConfiguration($input, $output); $migration = $this->createMigration($configuration); $this->outputHeader($configuration, $output); $noInteraction = !$input->isInteractive(); $executedVersions = $configuration->getMigratedVersions(); $availableVersions = $configuration->getAvailableVersions(); $executedUnavailableVersions = array_diff($executedVersions, $availableVersions); if ($executedUnavailableVersions) { $output->writeln(sprintf('<error>WARNING! You have %s previously executed migrations in the database that are not registered migrations.</error>', count($executedUnavailableVersions))); foreach ($executedUnavailableVersions as $executedUnavailableVersion) { $output->writeln(sprintf(' <comment>>></comment> %s (<comment>%s</comment>)', Configuration::formatVersion($executedUnavailableVersion), $executedUnavailableVersion)); } if (!$noInteraction) { $confirmation = $this->getHelper('dialog')->askConfirmation($output, '<question>Are you sure you wish to continue? (y/n)</question>', false); if (!$confirmation) { $output->writeln('<error>Migration cancelled!</error>'); return 1; } } } // warn the user if no dry run and interaction is on if (!$noInteraction) { $confirmation = $this->getHelper('dialog')->askConfirmation($output, '<question>WARNING! You are about to execute a database migration that could result in data lost. Are you sure you wish to continue? (y/n)</question>', false); if (!$confirmation) { $output->writeln('<error>Migration cancelled!</error>'); return 1; } } $migration->migrate($version); }
public static function configureMigrations(ContainerInterface $container, Configuration $configuration) { $dir = $container->getParameter('mongo_db_migrations.dir_name'); if (!file_exists($dir)) { mkdir($dir, 0777, true); } $configuration->setMigrationsCollectionName($container->getParameter('mongo_db_migrations.collection_name')); $configuration->setMigrationsDatabaseName($container->getParameter('mongo_db_migrations.database_name')); $configuration->setMigrationsDirectory($dir); $configuration->setMigrationsNamespace($container->getParameter('mongo_db_migrations.namespace')); $configuration->setName($container->getParameter('mongo_db_migrations.name')); $configuration->registerMigrationsFromDirectory($dir); $configuration->setMigrationsScriptDirectory($container->getParameter('mongo_db_migrations.script_dir_name')); self::injectContainerToMigrations($container, $configuration->getMigrations()); }
/** * @param Symfony\Component\Console\Input\InputInterface * @param Symfony\Component\Console\Output\OutputInterface */ public function execute(InputInterface $input, OutputInterface $output) { $configuration = $this->getMigrationConfiguration($input, $output); $configMap = $configuration->getDetailsMap(); // Format current version string $currentVersion = $configMap['current_version']; if ($currentVersion) { $currentVersionFormatted = sprintf('%s (<comment>%s</comment>)', Configuration::formatVersion($currentVersion), $currentVersion); } else { $currentVersionFormatted = 0; } // Format latest version string $latestVersion = $configMap['latest_version']; if ($latestVersion) { $latestVersionFormatted = sprintf('%s (<comment>%s</comment>)', Configuration::formatVersion($latestVersion), $latestVersion); } else { $latestVersionFormatted = 0; } $output->writeln("\n <info>==</info> Configuration\n"); $numExecutedUnavailableMigrations = $configMap['num_executed_unavailable_migrations']; $numNewMigrations = $configMap['num_new_migrations']; $info = array('Name' => $configMap['name'], 'Database Driver' => $configMap['database_driver'], 'Database Name' => $configMap['migrations_database_name'], 'Configuration Source' => $configuration instanceof AbstractFileConfiguration ? $configuration->getFile() : 'manually configured', 'Version Collection Name' => $configMap['migrations_collection_name'], 'Migrations Namespace' => $configMap['migrations_namespace'], 'Migrations Directory' => $configMap['migrations_directory'], 'Current Version' => $currentVersionFormatted, 'Latest Version' => $latestVersionFormatted, 'Executed Migrations' => $configMap['num_executed_migrations'], 'Executed Unavailable Migrations' => $numExecutedUnavailableMigrations > 0 ? '<error>' . $numExecutedUnavailableMigrations . '</error>' : 0, 'Available Migrations' => $configMap['num_available_migrations'], 'New Migrations' => $numNewMigrations > 0 ? '<question>' . $numNewMigrations . '</question>' : 0); foreach ($info as $name => $value) { $this->writeInfoLine($output, $name, $value); } $showVersions = $input->getOption('show-versions') ? true : false; if ($showVersions === true) { if ($migrations = $configuration->getMigrations()) { $output->writeln("\n <info>==</info> Available Migration Versions\n"); $migratedVersions = $configuration->getMigratedVersions(); foreach ($migrations as $version) { $isMigrated = in_array($version->getVersion(), $migratedVersions); $status = $isMigrated ? '<info>migrated</info>' : '<error>not migrated</error>'; $output->writeln(' <comment>>></comment> ' . $configuration->formatVersion($version->getVersion()) . ' (<comment>' . $version->getVersion() . '</comment>)' . str_repeat(' ', 30 - strlen($name)) . $status); } } if ($executedUnavailableMigrations) { $output->writeln("\n <info>==</info> Previously Executed Unavailable Migration Versions\n"); foreach ($executedUnavailableMigrations as $executedUnavailableMigration) { $output->writeln(' <comment>>></comment> ' . $configuration->formatVersion($executedUnavailableMigration) . ' (<comment>' . $executedUnavailableMigration . '</comment>)'); } } } }
/** * @param Configuration $configuration * @return string */ protected function getDirectory(Configuration $configuration) { $dir = $configuration->getMigrationsDirectory() ?: getcwd(); return rtrim($dir, '/'); }
public function markNotMigrated() { $this->configuration->createMigrationCollection(); $collection = $this->configuration->getCollection(); $collection->remove(array("v" => $this->version)); }