- Модуль: disk
- Путь к файлу: ~/bitrix/modules/disk/lib/volume/cleaner.php
- Класс: BitrixDiskVolumeCleaner
- Вызов: Cleaner::deleteUnnecessaryVersionByFilter
public function deleteUnnecessaryVersionByFilter(VolumeIVolumeIndicator $indicator): bool
{
$subTaskDone = true;
if ($indicator->getFilterValue('STORAGE_ID') > 0)
{
$storage = DiskStorage::loadById($indicator->getFilterValue('STORAGE_ID'));
if (!($storage instanceof DiskStorage))
{
$this->collectError(
new Error('Can not found storage #'.$indicator->getFilterValue('STORAGE_ID'), 'STORAGE_NOT_FOUND'),
false,
true
);
return false;
}
if (!$this->isAllowClearStorage($storage))
{
$this->collectError(
new Error('Access denied to storage #'.$storage->getId(), 'ACCESS_DENIED'),
false,
true
);
return false;
}
}
$task = $this->instanceTask();
$filter = [];
if ($task->getLastFileId() > 0)
{
$filter['>=FILE_ID'] = $task->getLastFileId();
}
$indicator->setLimit(self::MAX_FILE_PER_INTERACTION);
$versionList = $indicator->getCorrespondingUnnecessaryVersionList($filter);
$task->setIterationFileCount($versionList->getSelectedRowsCount());
$versionsPerFile = [];
foreach ($versionList as $row)
{
$fileId = $row['FILE_ID'];
$versionId = $row['VERSION_ID'];
if (!isset($versionsPerFile[$fileId]))
{
$versionsPerFile[$fileId] = [];
}
$versionsPerFile[$fileId][] = $versionId;
}
unset($row, $fileId, $versionId, $versionList);
$countFileErasure = 0;
foreach ($versionsPerFile as $fileId => $versionIds)
{
$file = DiskFile::getById($fileId);
if ($file instanceof DiskFile)
{
$securityContext = $this->getSecurityContext($this->getOwner(), $file);
if($file->canDelete($securityContext))
{
$this->deleteFileUnnecessaryVersion($file, ['=ID' => $versionIds]);
$countFileErasure++;
}
else
{
$this->collectError(new Error("Access denied to file #$fileId", 'ACCESS_DENIED'));
}
}
$task->setLastFileId($fileId);
// fix interval task state
if ($countFileErasure >= self::STATUS_FIX_INTERVAL)
{
$countFileErasure = 0;
if ($task->hasUserCanceled())
{
$subTaskDone = false;
break;
}
$task->fixState();
// count statistic for progress bar
self::countWorker((int)$task->getOwnerId());
}
if (!$this->checkTimeEnd())
{
$subTaskDone = false;
break;
}
}
return $subTaskDone;
}