diff --git a/core/modules/datetime/datetime.install b/core/modules/datetime/datetime.install new file mode 100644 index 0000000..b87b230 --- /dev/null +++ b/core/modules/datetime/datetime.install @@ -0,0 +1,92 @@ +useCaches(FALSE); + $change_list = []; + + foreach ($entity_manager->getDefinitions() as $entity_type_id => $entity_type) { + if ($entity_manager->getStorage($entity_type_id) instanceof \Drupal\Core\Entity\Schema\DynamicallyFieldableEntityStorageSchemaInterface) { + $field_changes = []; + + $storage_definitions = $entity_manager->getFieldStorageDefinitions($entity_type_id); + $original_storage_definitions = $entity_manager->getLastInstalledFieldStorageDefinitions($entity_type_id); + + // Detect updated field storage definitions. + foreach (array_intersect_key($storage_definitions, $original_storage_definitions) as $field_name => $storage_definition) { + if ($storage_definition->getType() === 'datetime') { + if ($entity_manager->getStorage($entity_type_id)->requiresFieldStorageSchemaChanges($storage_definition, $original_storage_definitions[$field_name])) { + $field_changes[$field_name] = TRUE; + } + } + } + + if ($field_changes) { + $change_list[$entity_type_id] = [ + 'field_storage_definitions' => $field_changes, + 'base_table' => $entity_type->getBaseTable(), + 'revision_table' => $entity_type->getRevisionTable(), + ]; + } + } + } + + $field_spec = [ + 'description' => 'The date value.', + 'type' => 'varchar', + 'length' => 25, + ]; + + $schema = \Drupal::database()->schema(); + + foreach ($change_list as $entity_type_id => $changes) { + foreach (array_keys($changes['field_storage_definitions']) as $field_name) { + $value_field_name = $field_name . '_value'; + + $base_table = $changes['base_table'] . '__' . $field_name; + $schema->changeField($base_table, $value_field_name, $value_field_name, $field_spec); + + $results = \Drupal::database()->query('SELECT * FROM ' . $base_table)->fetchAll(); + foreach ($results as &$result) { + Drupal::database() + ->update($base_table) + ->fields([$value_field_name => $result->{$value_field_name} . '+00:00']) + ->condition('bundle', $result->bundle) + ->condition('deleted', $result->deleted) + ->condition('entity_id', $result->entity_id) + ->condition('revision_id', $result->revision_id) + ->condition('langcode', $result->langcode) + ->condition('delta', $result->delta) + ->execute(); + } + + if ($changes['revision_table']) { + $revision_table = $changes['revision_table'] . '__' . $field_name; + $schema->changeField($revision_table, $value_field_name, $value_field_name, $field_spec); + + $results = \Drupal::database()->query('SELECT * FROM ' . $revision_table)->fetchAll(); + foreach ($results as &$result) { + Drupal::database() + ->update($revision_table) + ->fields([$value_field_name => $result->{$value_field_name} . '+00:00']) + ->condition('bundle', $result->bundle) + ->condition('deleted', $result->deleted) + ->condition('entity_id', $result->entity_id) + ->condition('revision_id', $result->revision_id) + ->condition('langcode', $result->langcode) + ->condition('delta', $result->delta) + ->execute(); + } + } + } + } +} diff --git a/core/modules/datetime_range/datetime_range.install b/core/modules/datetime_range/datetime_range.install new file mode 100644 index 0000000..c9b91ff --- /dev/null +++ b/core/modules/datetime_range/datetime_range.install @@ -0,0 +1,106 @@ +useCaches(FALSE); + $change_list = []; + + foreach ($entity_manager->getDefinitions() as $entity_type_id => $entity_type) { + if ($entity_manager->getStorage($entity_type_id) instanceof \Drupal\Core\Entity\Schema\DynamicallyFieldableEntityStorageSchemaInterface) { + $field_changes = []; + + $storage_definitions = $entity_manager->getFieldStorageDefinitions($entity_type_id); + $original_storage_definitions = $entity_manager->getLastInstalledFieldStorageDefinitions($entity_type_id); + + // Detect updated field storage definitions. + foreach (array_intersect_key($storage_definitions, $original_storage_definitions) as $field_name => $storage_definition) { + if ($storage_definition->getType() === 'daterange') { + if ($entity_manager->getStorage($entity_type_id)->requiresFieldStorageSchemaChanges($storage_definition, $original_storage_definitions[$field_name])) { + $field_changes[$field_name] = TRUE; + } + } + } + + if ($field_changes) { + $change_list[$entity_type_id] = [ + 'field_storage_definitions' => $field_changes, + 'base_table' => $entity_type->getBaseTable(), + 'revision_table' => $entity_type->getRevisionTable(), + ]; + } + } + } + + $field_spec = [ + 'description' => 'The start date value.', + 'type' => 'varchar', + 'length' => 25, + ]; + + $end_field_spec = [ + 'description' => 'The end date value.', + 'type' => 'varchar', + 'length' => 25, + ]; + + $schema = \Drupal::database()->schema(); + + foreach ($change_list as $entity_type_id => $changes) { + foreach (array_keys($changes['field_storage_definitions']) as $field_name) { + $value_field_name = $field_name . '_value'; + $end_value_field_name = $field_name . 'end_value'; + + $base_table = $changes['base_table'] . '__' . $field_name; + $schema->changeField($base_table, $value_field_name, $value_field_name, $field_spec); + $schema->changeField($base_table, $end_value_field_name, $end_value_field_name, $end_field_spec); + + $results = \Drupal::database()->query('SELECT * FROM ' . $base_table)->fetchAll(); + foreach ($results as &$result) { + Drupal::database() + ->update($base_table) + ->fields([ + $value_field_name => $result->{$value_field_name} . '+00:00', + $end_value_field_name => $result->{$value_field_name} . '+00:00', + ]) + ->condition('bundle', $result->bundle) + ->condition('deleted', $result->deleted) + ->condition('entity_id', $result->entity_id) + ->condition('revision_id', $result->revision_id) + ->condition('langcode', $result->langcode) + ->condition('delta', $result->delta) + ->execute(); + } + + if ($changes['revision_table']) { + $revision_table = $changes['revision_table'] . '__' . $field_name; + $schema->changeField($revision_table, $value_field_name, $value_field_name, $field_spec); + + $results = \Drupal::database()->query('SELECT * FROM ' . $revision_table)->fetchAll(); + foreach ($results as &$result) { + Drupal::database() + ->update($revision_table) + ->fields([ + $value_field_name => $result->{$value_field_name} . '+00:00', + $end_value_field_name => $result->{$value_field_name} . '+00:00', + ]) + ->condition('bundle', $result->bundle) + ->condition('deleted', $result->deleted) + ->condition('entity_id', $result->entity_id) + ->condition('revision_id', $result->revision_id) + ->condition('langcode', $result->langcode) + ->condition('delta', $result->delta) + ->execute(); + } + } + } + } +}