protected function getSnapshotFromLinks(array $folderLinks, $version) { $response = array(); $sc = $this->storage->getCurrentUserSecurityContext(); foreach ($folderLinks as $link) { $modelLink = FolderLink::buildFromArray(array('ID' => $link['extra']['id'], 'NAME' => $link['name'], 'TYPE' => ObjectTable::TYPE_FOLDER, 'STORAGE_ID' => $link['extra']['iblockId'], 'REAL_OBJECT_ID' => $link['extra']['linkSectionId'], 'PARENT_ID' => $link['extra']['sectionId'], 'UPDATE_TIME' => DateTime::createFromTimestamp(CWebDavDiskDispatcher::convertFromExternalVersion($link['version'])), 'CREATED_BY' => $link['createdBy'], 'UPDATED_BY' => $link['updatedBy'])); $filter = array('TYPE' => ObjectTable::TYPE_FILE); if ($version > 0 && self::compareVersion($link['version'], $version . '000')) { $filter['>=UPDATE_TIME'] = DateTime::createFromTimestamp($version); } $code = Folder::CODE_FOR_UPLOADED_FILES; $parameters = array('filter' => $filter); $parameters['runtime'] = array(new ExpressionField('NOT_UPLOADED', "CASE WHEN NOT EXISTS(SELECT 'x' FROM b_disk_object_path pp INNER JOIN b_disk_object oo ON oo.ID = pp.PARENT_ID AND oo.CODE = '{$code}' WHERE pp.OBJECT_ID = %1\$s AND pp.PARENT_ID = oo.ID AND oo.STORAGE_ID = %2\$s) THEN 1 ELSE 0 END", array('PARENT_ID', 'STORAGE_ID'))); $parameters['filter']['NOT_UPLOADED'] = true; foreach ($modelLink->getDescendants($sc, $parameters) as $item) { /** @var File $item */ $format = $this->formatFileToResponse($item); if ($format) { $response[] = $format; } } unset($item); } return $response; }
public function getSnapshot($version = 0) { CTimeZone::Disable(); /** @var \CWebDavIblock $webdav */ $webdav = $this->init()->getWebDav(); $webdav->disableUFSymlinkMode(); $sections = $webdav->getSectionsTree(array('path' => '/', 'NON_DROPPED_SECTION' => true, 'SET_IS_SHARED' => true)); $webdav->enableUFSymlinkMode(); $realSections = $this->formatSectionsToResponse($sections, false); $elements = $this->getSymlinkSnapshot($version, $realSections); $elements = array_merge($elements, $this->filterSectionByVersion($realSections, $version)); $webdav->disableUFSymlinkMode(); $files = $this->searchFilesByPropFind(CWebDavDiskDispatcher::convertFromExternalVersion($version), '/', array('underSymlink' => false)); $webdav->enableUFSymlinkMode(); CTimeZone::Enable(); return array_merge($elements, $files, $this->getDeletedElements($version)); }