diff --git a/modules/islandora_core_feature/config/install/field.storage.media.field_file_size.yml b/modules/islandora_core_feature/config/install/field.storage.media.field_file_size.yml index 5c3e67c4..fff956db 100644 --- a/modules/islandora_core_feature/config/install/field.storage.media.field_file_size.yml +++ b/modules/islandora_core_feature/config/install/field.storage.media.field_file_size.yml @@ -11,8 +11,8 @@ field_name: field_file_size entity_type: media type: integer settings: - unsigned: false - size: normal + unsigned: true + size: big module: core locked: false cardinality: 1 diff --git a/modules/islandora_core_feature/islandora_core_feature.install b/modules/islandora_core_feature/islandora_core_feature.install new file mode 100644 index 00000000..3585dafa --- /dev/null +++ b/modules/islandora_core_feature/islandora_core_feature.install @@ -0,0 +1,137 @@ +select($table) + ->countQuery() + ->execute() + ->fetchField(); + if ($sandbox[$table]['size'] > $sandbox['upper_limit']) { + $sandbox['upper_limit'] = $sandbox[$table]['size']; + } + // Move the existing data out of the way. + $database->schema()->renameTable($table, $table . '_o'); + + // Create replacement tables. + $database->schema()->createTable($table, [ + 'fields' => [ + 'bundle' => [ + 'type' => 'varchar', + 'not null' => TRUE, + 'length' => 128, + 'default' => ' ', + ], + 'deleted' => [ + 'type' => 'int', + 'size' => 'tiny', + 'not null' => TRUE, + 'default' => 0, + ], + 'entity_id' => [ + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'length' => 10, + + ], + 'revision_id' => [ + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'length' => 10, + ], + 'langcode' => [ + 'type' => 'varchar', + 'not null' => TRUE, + 'length' => 32, + 'default' => ' ', + ], + 'delta' => [ + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'length' => 10, + ], + 'field_file_size_value' => [ + 'type' => 'int', + 'size' => 'big', + 'unsigned' => TRUE, + 'not null' => TRUE, + ], + ], + 'primary key' => ['entity_id', 'deleted', 'delta', 'langcode'], + 'indexes' => ['bundle' => ['bundle'], 'revision_id' => ['revision_id']], + ]); + + } + + // Update field storage configuration. + $config = \Drupal::configFactory() + ->getEditable("field.storage.{$entity_type}.{$field_name}"); + $config->set('settings.size', 'big'); + $config->set('settings.unsigned', TRUE); + $config->save(TRUE); + + // Make sure the new config persists. + FieldStorageConfig::loadByName($entity_type, $field_name)->save(); + + // Track batch reload progress. + $sandbox['progress'] = 0; + } + + // Arbitrary, hopefully reasonable, batch size per table. + $limit = 500; + + // Reload the data. + foreach ($tables as $table) { + if (!isset($sandbox[$table]['done'])) { + $query = $database->select($table . '_o', 'o')->fields('o') + ->orderBy('o.entity_id', 'ASC') + ->orderBy('o.revision_id', 'ASC') + ->orderBy('o.delta', 'ASC') + ->range($sandbox['progress'], $sandbox['progress'] + $limit); + $database->insert($table)->from($query)->execute(); + } + } + + $sandbox['progress'] = $sandbox['progress'] + $limit; + $sandbox['#finished'] = $sandbox['progress'] >= $sandbox['upper_limit'] ? 1 : $sandbox['progress'] / $sandbox['upper_limit']; + if ($sandbox['#finished'] == 1) { + // Clean up. + foreach ($tables as $table) { + $database->schema()->dropTable($table . '_o'); + if ($sandbox['progress'] + $limit >= $progress[$table]['size']) { + $sandbox[$table]['done'] = TRUE; + } + } + return t('Length of @entity-type.@field-name updated to an unsigned big int', [ + '@entity-type' => $entity_type, + '@field-name' => $field_name, + ]); + } +}