function system_update_8901

Same name and namespace in other branches
  1. 8.9.x core/modules/system/system.install \system_update_8901()

Update the stored schema data for entity identifier fields.

File

core/modules/system/system.install, line 1550

Code

function system_update_8901() {
    $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
    $entity_type_manager = \Drupal::entityTypeManager();
    $installed_storage_schema = \Drupal::keyValue('entity.storage_schema.sql');
    foreach ($definition_update_manager->getEntityTypes() as $entity_type_id => $entity_type) {
        // Ensure that we are dealing with a non-deleted entity type that uses the
        // default SQL storage.
        if (!$entity_type_manager->hasDefinition($entity_type_id)) {
            continue;
        }
        $storage = $entity_type_manager->getStorage($entity_type_id);
        if (!$storage instanceof SqlContentEntityStorage) {
            continue;
        }
        foreach ([
            'id',
            'revision',
        ] as $key) {
            if (!$entity_type->hasKey($key)) {
                continue;
            }
            $field_name = $entity_type->getKey($key);
            $field_storage_definition = $definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id);
            if (!$field_storage_definition) {
                continue;
            }
            if ($field_storage_definition->getType() !== 'integer') {
                continue;
            }
            // Retrieve the storage schema in order to use its own method for updating
            // the identifier schema - ::processIdentifierSchema(). This is needed
            // because some storage schemas might not use serial identifiers.
            // @see \Drupal\user\UserStorageSchema::processIdentifierSchema()
            $ref_get_storage_schema = new \ReflectionMethod($storage, 'getStorageSchema');
            $ref_get_storage_schema->setAccessible(TRUE);
            $storage_schema = $ref_get_storage_schema->invoke($storage);
            if ($storage_schema instanceof SqlContentEntityStorageSchema) {
                $field_schema_data = $installed_storage_schema->get($entity_type_id . '.field_schema_data.' . $field_storage_definition->getName(), []);
                $table = $key === 'id' ? $entity_type->getBaseTable() : $entity_type->getRevisionTable();
                $ref_process_identifier_schema = new \ReflectionMethod($storage_schema, 'processIdentifierSchema');
                $ref_process_identifier_schema->setAccessible(TRUE);
                $ref_process_identifier_schema->invokeArgs($storage_schema, [
                    &$field_schema_data[$table],
                    $field_name,
                ]);
                $installed_storage_schema->set($entity_type_id . '.field_schema_data.' . $field_storage_definition->getName(), $field_schema_data);
            }
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.