You are here

protected function DefaultTableMapping::generateFieldTableName in Drupal 9

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php \Drupal\Core\Entity\Sql\DefaultTableMapping::generateFieldTableName()

Generates a safe and unambiguous field table name.

The method accounts for a maximum table name length of 64 characters, and takes care of disambiguation.

Parameters

\Drupal\Core\Field\FieldStorageDefinitionInterface $storage_definition: The field storage definition.

bool $revision: TRUE for revision table, FALSE otherwise.

Return value

string The final table name.

2 calls to DefaultTableMapping::generateFieldTableName()
DefaultTableMapping::getDedicatedDataTableName in core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php
Generates a table name for a field data table.
DefaultTableMapping::getDedicatedRevisionTableName in core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php
Generates a table name for a field revision archive table.

File

core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php, line 619

Class

DefaultTableMapping
Defines a default table mapping class.

Namespace

Drupal\Core\Entity\Sql

Code

protected function generateFieldTableName(FieldStorageDefinitionInterface $storage_definition, $revision) {

  // The maximum length of an entity type ID is 32 characters.
  $entity_type_id = substr($storage_definition
    ->getTargetEntityTypeId(), 0, EntityTypeInterface::ID_MAX_LENGTH);
  $separator = $revision ? '_revision__' : '__';
  $table_name = $this->prefix . $entity_type_id . $separator . $storage_definition
    ->getName();

  // Limit the string to 48 characters, keeping a 16 characters margin for db
  // prefixes.
  if (strlen($table_name) > 48) {

    // Use a shorter separator and a hash of the field storage unique
    // identifier.
    $separator = $revision ? '_r__' : '__';
    $field_hash = substr(hash('sha256', $storage_definition
      ->getUniqueStorageIdentifier()), 0, 10);
    $table_name = $this->prefix . $entity_type_id . $separator . $field_hash;

    // If the resulting table name is still longer than 48 characters, use the
    // following pattern:
    // - prefix: max 34 chars;
    // - separator: max 4 chars;
    // - field_hash: max 10 chars.
    if (strlen($table_name) > 48) {
      $prefix = substr($this->prefix, 0, 34);
      $table_name = $prefix . $separator . $field_hash;
    }
  }
  return $table_name;
}