select('system', 's', [ 'fetch' => \PDO::FETCH_ASSOC, ]) ->fields('s') ->execute(); foreach ($results as $result) { $system_data[$result['type']][$result['name']] = $result; } } catch (\Exception $e) { // The table might not exist for example in tests. } return $system_data; } /** * Creates the necessary state entries for SqlBase::getDatabase() to work. * * The state entities created here have to exist before migration plugin * instances are created so that derivers such as * \Drupal\taxonomy\Plugin\migrate\D6TermNodeDeriver can access the source * database. * * @param array $database * The source database settings. * @param string $drupal_version * The Drupal version. * * @see \Drupal\migrate\Plugin\migrate\source\SqlBase::getDatabase() */ protected function createDatabaseStateSettings(array $database, $drupal_version) { $database_state['key'] = 'upgrade'; $database_state['database'] = $database; $database_state_key = 'migrate_drupal_' . $drupal_version; \Drupal::state()->set($database_state_key, $database_state); \Drupal::state()->set('migrate.fallback_state_key', $database_state_key); } /** * Gets the migrations for import. * * @param string $database_state_key * The state key. * @param int $drupal_version * The version of Drupal we're getting the migrations for. * * @return \Drupal\migrate\Plugin\MigrationInterface[] * The migrations for import. */ protected function getMigrations($database_state_key, $drupal_version) { $version_tag = 'Drupal ' . $drupal_version; $plugin_manager = \Drupal::service('plugin.manager.migration'); /** @var \Drupal\migrate\Plugin\Migration[] $all_migrations */ $all_migrations = $plugin_manager->createInstancesByTag($version_tag); $migrations = []; foreach ($all_migrations as $migration) { // Skip migrations tagged with any of the follow-up migration tags. They // will be derived and executed after the migrations on which they depend // have been successfully executed. // @see Drupal\migrate_drupal\Plugin\MigrationWithFollowUpInterface if (!empty(array_intersect($migration->getMigrationTags(), $this->getFollowUpMigrationTags()))) { continue; } // Multilingual migrations require migrate_drupal_multilingual. $tags = $migration->getMigrationTags() ?: []; if (in_array('Multilingual', $tags, TRUE) && (!\Drupal::service('module_handler')->moduleExists('migrate_drupal_multilingual'))) { throw new RequirementsException(sprintf("Install migrate_drupal_multilingual to run migration '%s'.", $migration->getPluginId())); } try { // @todo https://drupal.org/node/2681867 We should be able to validate // the entire migration at this point. $source_plugin = $migration->getSourcePlugin(); if ($source_plugin instanceof RequirementsInterface) { $source_plugin->checkRequirements(); } $destination_plugin = $migration->getDestinationPlugin(); if ($destination_plugin instanceof RequirementsInterface) { $destination_plugin->checkRequirements(); } $migrations[] = $migration; } catch (RequirementsException $e) { // Migrations which are not applicable given the source and destination // site configurations (e.g., what modules are enabled) will be silently // ignored. } } return $migrations; } /** * Returns the follow-up migration tags. * * @return string[] */ protected function getFollowUpMigrationTags() { if ($this->followUpMigrationTags === NULL) { $this->followUpMigrationTags = \Drupal::configFactory() ->get('migrate_drupal.settings') ->get('follow_up_migration_tags') ?: []; } return $this->followUpMigrationTags; } /** * Determines what version of Drupal the source database contains. * * @param \Drupal\Core\Database\Connection $connection * The database connection object. * * @return string|false * A string representing the major branch of Drupal core (e.g. '6' for * Drupal 6.x), or FALSE if no valid version is matched. */ protected function getLegacyDrupalVersion(Connection $connection) { // Don't assume because a table of that name exists, that it has the columns // we're querying. Catch exceptions and report that the source database is // not Drupal. // Drupal 5/6/7 can be detected by the schema_version in the system table. if ($connection->schema()->tableExists('system')) { try { $version_string = $connection ->query('SELECT schema_version FROM {system} WHERE name = :module', [':module' => 'system']) ->fetchField(); if ($version_string && $version_string[0] == '1') { if ((int) $version_string >= 1000) { $version_string = '5'; } else { $version_string = FALSE; } } } catch (\PDOException $e) { $version_string = FALSE; } } // For Drupal 8 (and we're predicting beyond) the schema version is in the // key_value store. elseif ($connection->schema()->tableExists('key_value')) { $result = $connection ->query("SELECT value FROM {key_value} WHERE collection = :system_schema and name = :module", [':system_schema' => 'system.schema', ':module' => 'system']) ->fetchField(); $version_string = unserialize($result); } else { $version_string = FALSE; } return $version_string ? substr($version_string, 0, 1) : FALSE; } }