• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/bitrix24disk/legacy/newdiskstorage.php
  • Класс: BitrixDiskBitrix24DiskLegacyNewDiskStorage
  • Вызов: NewDiskStorage::snapshotDeletedElements
private function snapshotDeletedElements(FixedArray $items, PageState $pageState, $internalVersion, $pageSize = self::SNAPSHOT_PAGE_SIZE)
{
	if($pageState->getStep() !== $pageState::STEP_DELETED_OBJECTS)
	{
		return;
	}

	if ($internalVersion == 0)
	{
		//we don't show deleted files when we send starter snapshot.
		return;
	}

	$hasNextPage = false;
	$nextCursor = $nextId = null;
	$cursor = $pageState->getCursor()?: $internalVersion;
	$expectedFirstId = $pageState->getNextId();

	$deletedLogManager = Driver::getInstance()->getDeletedLogManager();
	$deletedLogTable = $deletedLogManager->getLogTable();

	$query = new InternalsEntityQuery($deletedLogTable::getEntity());
	$query
		->addSelect('*')
		->addFilter('STORAGE_ID', $this->storage->getId())
		->addOrder('CREATE_TIME')
		->addOrder('ID')
		->setLimit($pageSize + 1)
	;

	if($cursor > 0)
	{
		$query->addFilter('>=CREATE_TIME', DateTime::createFromTimestamp($cursor));
	}

	$offset = $pageState->getOffset();
	if ($cursor && $offset)
	{
		//we want to skip values which were on previous page.
		$query->setOffset($offset);
	}

	$count = 0;
	foreach($query->exec() as $item)
	{
		if($count === 0)
		{
			if($expectedFirstId !== null && $item['ID'] != $expectedFirstId)
			{
				throw new UnexpectedNextIdException("{$expectedFirstId} vs {$item['ID']}");
			}
		}

		$count++;
		if($count > $pageSize)
		{
			$nextCursor = $item['CREATE_TIME']->getTimestamp();
			$nextId = $item['ID'];
			$hasNextPage = true;

			break;
		}

		$items->push(
			$this->formatDeletedObjectRowToResponse($item)
		);
	}

	$pageState->reset();
	if($hasNextPage)
	{
		$toSkipOnNextStep = 0;
		if($cursor == $nextCursor)
		{
			$toSkipOnNextStep += $offset;
		}

		$toSkipOnNextStep += $this->countIdsWithSameSyncDate($items, $this->convertToExternalVersion($nextCursor));
		if($toSkipOnNextStep)
		{
			$pageState->setOffset($toSkipOnNextStep);
		}

		$pageState
			->setStep($pageState::STEP_DELETED_OBJECTS)
			->setCursor($nextCursor)
			->setNextId($nextId)
		;
	}
}