public function MultiversionStorageSchemaConverter::convertToMultiversionable in Multiversion 8.2
File
- src/Entity/Storage/Sql/MultiversionStorageSchemaConverter.php, line 64
Class
- MultiversionStorageSchemaConverter
Namespace
Drupal\multiversion\Entity\Storage\Sql
Code
public function convertToMultiversionable(array &$sandbox) {
if (isset($sandbox[$this->entityTypeId]['finished']) && $sandbox[$this->entityTypeId]['finished'] == 1 || !empty($sandbox[$this->entityTypeId]['failed'])) {
return;
}
$this
->initializeConversion($sandbox);
if (!isset($sandbox[$this->entityTypeId]['finished']) || $sandbox[$this->entityTypeId]['finished'] < 1) {
$this
->collectOriginalDefinitions($sandbox);
$fields_to_update = $this
->getFieldsToUpdate();
$this
->createTemporaryDefinitions($sandbox, $fields_to_update);
$storage = $this->entityTypeManager
->getStorage($this->entityTypeId);
$storage
->setTemporary(TRUE);
$storage
->setEntityType($sandbox['temporary_entity_type']);
$storage
->onEntityTypeCreate($sandbox['temporary_entity_type']);
}
$this
->copyData($sandbox);
if ($sandbox[$this->entityTypeId]['finished'] == 1) {
$sandbox['current_id'] = 0;
$this->entityTypeManager
->useCaches(FALSE);
$actual_entity_type = $this->entityTypeManager
->getDefinition($this->entityTypeId);
$backup_table_names = array_combine($sandbox['original_table_mapping']
->getTableNames(), $sandbox['backup_table_mapping']
->getTableNames());
foreach ($backup_table_names as $original_table_name => $backup_table_name) {
$this->database
->schema()
->renameTable($original_table_name, $backup_table_name);
}
try {
$storage = $this->entityTypeManager
->createHandlerInstance($actual_entity_type
->getStorageClass(), $actual_entity_type);
$current_table_mapping = $storage
->getCustomTableMapping($actual_entity_type, $sandbox['updated_storage_definitions']);
$table_name_mapping = array_combine($sandbox['temporary_table_mapping']
->getTableNames(), $current_table_mapping
->getTableNames());
foreach ($table_name_mapping as $temp_table_name => $new_table_name) {
$this->database
->schema()
->renameTable($temp_table_name, $new_table_name);
}
$entity_schema_data = $this->installedStorageSchema
->get($this->entityTypeId . '.entity_schema_data', []);
foreach ($entity_schema_data as $temp_table_name => $schema) {
if (isset($table_name_mapping[$temp_table_name])) {
$entity_schema_data[$table_name_mapping[$temp_table_name]] = $schema;
unset($entity_schema_data[$temp_table_name]);
}
}
$this->installedStorageSchema
->set($this->entityTypeId . '.entity_schema_data', $entity_schema_data);
foreach ($sandbox['updated_storage_definitions'] as $storage_definition) {
$field_schema_data = $this->installedStorageSchema
->get($this->entityTypeId . '.field_schema_data.' . $storage_definition
->getName(), []);
foreach ($field_schema_data as $temp_table_name => $schema) {
if (isset($table_name_mapping[$temp_table_name])) {
$field_schema_data[$table_name_mapping[$temp_table_name]] = $schema;
unset($field_schema_data[$temp_table_name]);
}
}
$this->installedStorageSchema
->set($this->entityTypeId . '.field_schema_data.' . $storage_definition
->getName(), $field_schema_data);
}
$actual_entity_type
->set('requires_data_migration', FALSE);
$this->entityDefinitionUpdateManager
->updateEntityType($actual_entity_type);
$this
->updateFieldStorageDefinitionsToRevisionable($actual_entity_type, $sandbox['original_storage_definitions'], $fields_to_update);
$this
->installPublishedStatusField($actual_entity_type);
$this
->installMultiversionFields($actual_entity_type);
$this->entityTypeManager
->clearCachedDefinitions();
$field_definitions = $this->entityFieldManager
->getFieldStorageDefinitions($this->entityTypeId);
foreach ($field_definitions as $field_definition) {
$this->entityDefinitionUpdateManager
->updateFieldStorageDefinition($field_definition);
}
} catch (\Exception $e) {
foreach ($backup_table_names as $original_table_name => $backup_table_name) {
if ($this->database
->schema()
->tableExists($original_table_name)) {
$this->database
->schema()
->dropTable($original_table_name);
}
$this->database
->schema()
->renameTable($backup_table_name, $original_table_name);
}
throw $e;
}
foreach ($backup_table_names as $original_table_name => $backup_table_name) {
$this->database
->schema()
->dropTable($backup_table_name);
}
}
}