Do not delete files if they are still in use (#12)

The clean up task had an issue to clean up to many files.
It didn't check if a file that could be deleted
because one event got deleted, was still in use by another event.

Relates: #10499
This commit is contained in:
Daniel Siepmann 2023-05-15 15:35:48 +02:00 committed by GitHub
parent 53ee309768
commit 9c8e1aa982
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 100 additions and 14 deletions

View file

@ -112,7 +112,9 @@ class Files
{
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_file');
$queryBuilder->getRestrictions()->removeAll();
$queryBuilder->select('file.identifier', 'file.storage', 'file.uid')
$queryBuilder
->select('file.identifier', 'file.storage', 'file.uid')
->addSelectLiteral('SUM(' . $queryBuilder->expr()->eq('reference.deleted', 1) . ') AS deleted_sum')
->from('sys_file', 'file')
->leftJoin(
'file',
@ -120,15 +122,18 @@ class Files
'reference',
'reference.uid_local = file.uid'
)
->where($queryBuilder->expr()->eq(
'reference.deleted',
1
))
->andWhere($queryBuilder->expr()->like(
->where($queryBuilder->expr()->like(
'reference.tablenames',
$queryBuilder->createNamedParameter('tx_events_domain_model_%')
))
;
->groupBy('file.uid')
->having(
$queryBuilder->expr()->eq(
'deleted_sum',
$queryBuilder->expr()->count('*')
)
)
;
/** @var array{int: array{storage: int, identifier: string, uid: int}} $filesToDelete */
$filesToDelete = $queryBuilder->execute()->fetchAll();
@ -160,16 +165,30 @@ class Files
->setParameter(':uids', $uids, Connection::PARAM_INT_ARRAY)
->execute();
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_file_reference');
$queryBuilder->delete('sys_file_reference')
->where('uid_local in (:uids)')
->setParameter(':uids', $uids, Connection::PARAM_INT_ARRAY)
->execute();
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_file_metadata');
$queryBuilder->delete('sys_file_metadata')
->where('file in (:uids)')
->setParameter(':uids', $uids, Connection::PARAM_INT_ARRAY)
->execute();
$this->deleteReferences();
}
private function deleteReferences(): void
{
$queryBuilder = $this->connectionPool->getQueryBuilderForTable('sys_file');
$queryBuilder->getRestrictions()->removeAll();
$queryBuilder
->delete('sys_file_reference')
->where($queryBuilder->expr()->like(
'tablenames',
$queryBuilder->createNamedParameter('tx_events_domain_model_%')
))
->andWhere($queryBuilder->expr()->eq(
'deleted',
1
))
;
$queryBuilder->execute();
}
}

View file

@ -0,0 +1,30 @@
3.4.1
=====
Breaking
--------
Nothing
Features
--------
Nothing
Fixes
-----
* Do not delete files if they are still in use.
The clean up task had an issue to clean up to many files.
It didn't check if a file that could be deleted because one event got deleted,
was still in use by another event.
Tasks
-----
Nothing
Deprecation
-----------
Nothing

View file

@ -264,6 +264,22 @@ return [
'sorting_foreign' => '1',
'table_local' => 'sys_file',
],
[
'uid' => '5',
'pid' => '2',
'tstamp' => '1373537480',
'crdate' => '1371484347',
'cruser_id' => '1',
'deleted' => '0',
'hidden' => '0',
'sys_language_uid' => '0',
'uid_local' => '3',
'uid_foreign' => '3',
'tablenames' => 'tx_events_domain_model_event',
'fieldname' => 'images',
'sorting_foreign' => '1',
'table_local' => 'sys_file',
],
],
'tx_events_domain_model_region' => [
[
@ -334,6 +350,19 @@ return [
'images' => '0',
'categories' => '1',
],
[
'uid' => '3',
'pid' => '2',
'title' => 'Example Event of past',
'subtitle' => 'This event will be removed, but references same image that should be kept for event 2',
'global_id' => '5540-34',
'slug' => '5540-34',
'organizer' => '0',
'partner' => '0',
'region' => '0',
'images' => '1',
'categories' => '0',
],
],
'tx_events_domain_model_date' => [
[
@ -352,5 +381,13 @@ return [
'end' => '9999999999',
'canceled' => 'no',
],
[
'uid' => '4',
'pid' => '2',
'event' => '3',
'start' => '0',
'end' => '10',
'canceled' => 'no',
],
],
];

View file

@ -9,7 +9,7 @@ $EM_CONF['events'] = [
'state' => 'alpha',
'createDirs' => '',
'clearCacheOnLoad' => 0,
'version' => '3.4.0',
'version' => '3.4.1',
'constraints' => [
'depends' => [
'typo3' => '10.4.00-11.5.99',