diff --git a/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php b/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php index dc5f5d4..13fce61 100644 --- a/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php +++ b/core/lib/Drupal/Core/Database/Driver/sqlite/Connection.php @@ -2,7 +2,6 @@ namespace Drupal\Core\Database\Driver\sqlite; -use Drupal\Component\Uuid\UuidInterface; use Drupal\Core\Database\Database; use Drupal\Core\Database\DatabaseNotFoundException; use Drupal\Core\Database\Connection as DatabaseConnection; @@ -139,7 +138,6 @@ public static function open(array &$connection_options = array()) { $pdo->sqliteCreateFunction('substring_index', array(__CLASS__, 'sqlFunctionSubstringIndex'), 3); $pdo->sqliteCreateFunction('rand', array(__CLASS__, 'sqlFunctionRand')); $pdo->sqliteCreateFunction('regexp', array(__CLASS__, 'sqlFunctionRegexp')); - $pdo->sqliteCreateFunction('UUID', array(__CLASS__, 'sqlFunctionUUID')); // SQLite does not support the LIKE BINARY operator, so we overload the // non-standard GLOB operator for case-sensitive matching. Another option @@ -331,18 +329,6 @@ public static function sqlFunctionLikeBinary($pattern, $subject) { } /** - * SQLite compatibility implementation for the UUID() SQL function. - * - * @return string - * A UUID string. - */ - public static function sqlFunctionUUID() { - /** @var UuidInterface $generator */ - $generator = \Drupal::service('uuid'); - return $generator->generate(); - } - - /** * {@inheritdoc} */ public function prepare($statement, array $driver_options = array()) { diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php index 8286391..9ead204 100644 --- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php @@ -55,6 +55,13 @@ class SqlContentEntityStorage extends ContentEntityStorageBase implements SqlEnt protected $revisionKey = FALSE; /** + * The entity revision_uuid key. + * + * @var string|bool + */ + protected $revisionUuidKey = FALSE; + + /** * The entity langcode key. * * @var string|bool @@ -170,6 +177,7 @@ protected function initTableLayout() { // are correctly reflected in the table layout. $this->tableMapping = NULL; $this->revisionKey = NULL; + $this->revisionUuidKey = NULL; $this->revisionTable = NULL; $this->dataTable = NULL; $this->revisionDataTable = NULL; @@ -180,6 +188,7 @@ protected function initTableLayout() { $revisionable = $this->entityType->isRevisionable(); if ($revisionable) { $this->revisionKey = $this->entityType->getKey('revision') ?: 'revision_id'; + $this->revisionUuidKey = $this->entityType->getKey('revision_uuid'); $this->revisionTable = $this->entityType->getRevisionTable() ?: $this->entityTypeId . '_revision'; } $translatable = $this->entityType->isTranslatable(); @@ -317,8 +326,8 @@ public function getTableMapping(array $storage_definitions = NULL) { // together with the entity ID and the revision ID as identifiers. $table_mapping->setFieldNames($this->baseTable, array_diff($all_fields, $revision_metadata_fields)); $revision_key_fields = array($this->idKey, $this->revisionKey); - if ($this->entityType->hasKey('revision_uuid')) { - $revision_key_fields[] = $this->entityType->getKey('revision_uuid'); + if (!empty($this->revisionUuidKey)) { + $revision_key_fields[] = $this->revisionUuidKey; } $table_mapping->setFieldNames($this->revisionTable, array_unique(array_merge($revision_key_fields, $revisionable_fields))); } @@ -346,17 +355,17 @@ public function getTableMapping(array $storage_definitions = NULL) { // Like in the multilingual, non-revisionable case the UUID is not // in the data table. Additionally, do not store revision metadata // fields in the data table. - $data_fields = array_values(array_diff($all_fields, array($this->uuidKey), $revision_metadata_fields)); + $data_fields = array_values(array_diff($all_fields, array($this->uuidKey, $this->revisionUuidKey), $revision_metadata_fields)); $table_mapping->setFieldNames($this->dataTable, $data_fields); $revision_base_fields = array_merge(array($this->idKey, $this->revisionKey, $this->langcodeKey), $revision_metadata_fields); - if ($this->entityType->hasKey('revision_uuid')) { - $revision_base_fields[] = $this->entityType->getKey('revision_uuid'); + if (!empty($this->revisionUuidKey)) { + $revision_base_fields[] = $this->revisionUuidKey; } $table_mapping->setFieldNames($this->revisionTable, $revision_base_fields); $revision_data_key_fields = array($this->idKey, $this->revisionKey, $this->langcodeKey); - $revision_data_fields = array_diff($revisionable_fields, $revision_metadata_fields, array($this->langcodeKey)); + $revision_data_fields = array_diff($revisionable_fields, $revision_metadata_fields, array($this->langcodeKey, $this->revisionUuidKey)); $table_mapping->setFieldNames($this->revisionDataTable, array_unique(array_merge($revision_data_key_fields, $revision_data_fields))); } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php index 00389b3..19c758e 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php @@ -45,12 +45,13 @@ public function applyDefaultValue($notify = TRUE) { */ public static function schema(FieldStorageDefinitionInterface $field_definition) { $schema = parent::schema($field_definition); - if (!$field_definition->isRevisionable()) { - $schema['unique keys']['value'] = array('value'); - } - else { - $schema['columns']['value']['initial_from_field'] = 'UUID()'; + $schema['unique keys']['value'] = array('value'); + + $entity_type = \Drupal::entityTypeManager()->getDefinition($field_definition->getTargetEntityTypeId()); + if ($entity_type->hasKey('revision') && $entity_type->getKey('revision_uuid') == $field_definition->getName()) { + $schema['columns']['value']['initial_from_field'] = $entity_type->getKey('revision'); } + return $schema; }