2namespace Bitrix\Clouds;
4use Bitrix\Main\Localization\Loc;
5use Bitrix\Main\ORM\Data\DataManager;
6use Bitrix\Main\ORM\Fields\DatetimeField;
7use Bitrix\Main\ORM\Fields\IntegerField;
8use Bitrix\Main\ORM\Fields\StringField;
9use Bitrix\Main\ORM\Fields\Validators\LengthValidator;
10use Bitrix\Main\ORM\Fields\ExpressionField;
12Loc::loadMessages(__FILE__);
49 return 'b_clouds_file_hash';
64 'autocomplete' =>
true,
65 'title' => Loc::getMessage(
'FILE_HASH_ENTITY_ID_FIELD'),
72 'title' => Loc::getMessage(
'FILE_HASH_ENTITY_BUCKET_ID_FIELD'),
79 'validation' => [__CLASS__,
'validateFilePath'],
80 'title' => Loc::getMessage(
'FILE_HASH_ENTITY_FILE_PATH_FIELD'),
86 'title' => Loc::getMessage(
'FILE_HASH_ENTITY_FILE_SIZE_FIELD'),
92 'title' => Loc::getMessage(
'FILE_HASH_ENTITY_FILE_MTIME_FIELD'),
98 'validation' => [__CLASS__,
'validateFileHash'],
99 'title' => Loc::getMessage(
'FILE_HASH_ENTITY_FILE_HASH_FIELD'),
140 $bucketId = intval($bucketId);
144 foreach (
$files[
'file'] as
$i => $file)
146 $fileSize =
$files[
'file_size'][
$i];
148 $fileHash =
$files[
'file_hash'][
$i];
151 .
",'" . $helper->forSql($file) .
"'"
152 .
',' . intval($fileSize)
153 .
",'" . $fileMtime->format(
'Y-m-d h:i:s') .
"'"
154 .
",'" . $helper->forSql($fileHash) .
"'"
159 INSERT INTO ' . static::getTableName() .
'
160 (BUCKET_ID, FILE_PATH, FILE_SIZE, FILE_MTIME, FILE_HASH)
162 ' . implode(
",\n", $values) .
'
181 $bucketId = intval($bucketId);
186 foreach (
$files[
'file'] as
$i => $filePath)
188 $index[
$path . $filePath] =
$i;
192 '=BUCKET_ID' => $bucketId,
202 $fileList = static::getList([
203 'select' => [
'ID',
'FILE_PATH',
'FILE_SIZE',
'FILE_HASH'],
206 while ($fileInfo = $fileList->fetch())
209 array_key_exists($fileInfo[
'FILE_PATH'], $index)
210 && (
$files[
'file_size'][$index[$fileInfo[
'FILE_PATH']]] == $fileInfo[
'FILE_SIZE'])
211 && (
$files[
'file_hash'][$index[$fileInfo[
'FILE_PATH']]] == $fileInfo[
'FILE_HASH'])
214 unset(
$files[
'file'][$index[$fileInfo[
'FILE_PATH']]]);
218 $deleteResult = static::delete($fileInfo[
'ID']);
223 foreach (
$files[
'file'] as
$i => $file)
225 $fileSize =
$files[
'file_size'][
$i];
227 $fileHash =
$files[
'file_hash'][
$i];
230 .
",'" . $helper->forSql(
$path . $file) .
"'"
231 .
',' . intval($fileSize)
232 .
",'" . $fileMtime->format(
'Y-m-d h:i:s') .
"'"
233 .
",'" . $helper->forSql($fileHash) .
"'"
242 INSERT INTO ' . static::getTableName() .
'
243 (BUCKET_ID, FILE_PATH, FILE_SIZE, FILE_MTIME, FILE_HASH)
245 ' . implode(
",\n", array_splice($values, 0, $insertSize)) .
'
265 $bucketId = intval($bucketId);
269 DELETE from ' . static::getTableName() .
'
270 WHERE BUCKET_ID = ' . $bucketId .
'
271 AND FILE_PATH like \'' . $sqlHelper->forSql(
$path) .
'%\'
272 AND FILE_PATH > \'' . $sqlHelper->forSql(
$path . $prevLastKey) .
'\'
274 $result = $connection->query($delete);
288 public static function addFile($bucketId, $path, array $fileInfo)
291 'BUCKET_ID
' => $bucketId,
292 'FILE_PATH
' => $path,
293 'FILE_SIZE
' => $fileInfo['size'],
294 'FILE_MTIME
' => \CCloudUtil::gmtTimeToDateTime($fileInfo['mtime
']),
295 'FILE_HASH
' => $fileInfo['hash
'],
306 public static function getLastKey($bucketId)
308 $bucketId = intval($bucketId);
309 $connection = \Bitrix\Main\Application::getConnection();
310 $sql = 'SELECT max(FILE_PATH) LAST_KEY from
' . static::getTableName() . ' WHERE BUCKET_ID=
' . $bucketId;
311 $last = $connection->query($sql)->fetch();
312 return $last && $last['LAST_KEY
'] ? $last['LAST_KEY
'] : '';
322 public static function deleteAll($bucketId)
324 $bucketId = intval($bucketId);
325 $connection = \Bitrix\Main\Application::getConnection();
326 $delete = 'DELETE from
' . static::getTableName() . ' WHERE BUCKET_ID=
' . $bucketId;
327 $result = $connection->query($delete);
339 public static function deleteByFilePath($bucketId, $filePath)
341 $bucketId = intval($bucketId);
342 $connection = \Bitrix\Main\Application::getConnection();
343 $sqlHelper = $connection->getSqlHelper();
345 DELETE from
' . static::getTableName() . '
346 WHERE BUCKET_ID =
' . $bucketId . "
347 AND FILE_PATH = '" . $sqlHelper->forSql($filePath) . "'
349 $result = $connection->query($delete);
363 public static function dirList($bucketId, $path, $order, $filter)
365 $connection = \Bitrix\Main\Application::getConnection();
366 $sqlHelper = $connection->getSqlHelper();
368 $query = \Bitrix\Clouds\FileHashTable::query();
372 'case when
position(\
'/\' in substring(%s, length(\'' . $sqlHelper->forSql(
$path) .
'\')+1)) > 0 then \
'D\' else \'F\' end',
377 'substring_index(substring(%s, length(\'' . $sqlHelper->forSql(
$path) .
'\')+1), \
'/\', 1)',
396 $filter[
'=BUCKET_ID'] = $bucketId;
399 $query->setGroup([
'FILE_TYPE',
'NAME']);
402 $sql =
$query->getQuery();
422 $query->registerRuntimeField(
'FILE_PATH', [
424 $helper->getConcatFunction(
'%s',
"'/'",
'%s'),
'FILE.SUBDIR',
'FILE.FILE_NAME'
432 'COUNT(distinct %s)',
447 $filter[
'=FILE.HANDLER_ID'] = $bucketId;
450 $query->setGroup([
'FILE_HASH',
'FILE_SIZE']);
457 $sql =
$query->getQuery();
478 '=FILE.HANDLER_ID' => $bucketId,
479 '=FILE_HASH' => $fileHash,
480 '=FILE_SIZE' => $fileSize,
488 while ($fileDuplicate =
$query->fetch())
490 $result[] = $fileDuplicate[
'FILE_ID'];
503 $bucketId = intval($bucketId);
507 select sum(DUP_COUNT) DUP_COUNT, sum(DUP_SIZE) DUP_SIZE
510 b_file_hash.FILE_SIZE
511 ,b_file_hash.FILE_HASH
512 ,count(distinct ' . $helper->getConcatFunction(
'b_file.SUBDIR',
"'/'",
'b_file.FILE_NAME') .
')-1 DUP_COUNT
513 ,(count(distinct ' . $helper->getConcatFunction(
'b_file.SUBDIR',
"'/'",
'b_file.FILE_NAME') .
")-1) * b_file_hash.FILE_SIZE DUP_SIZE
517 b_file.ID = b_file_hash.FILE_ID
519 b_file.HANDLER_ID = '" . $bucketId .
"'
521 b_file_hash.FILE_SIZE, b_file_hash.FILE_HASH
523 count(distinct " . $helper->getConcatFunction(
'b_file.SUBDIR',
"'/'",
'b_file.FILE_NAME') .
') > 1
544 $lastKey = (int)$lastKey;
549 ,b_clouds_file_hash.FILE_SIZE as FILE_SIZE
550 ,b_clouds_file_hash.FILE_HASH as FILE_HASH
553 INNER JOIN b_clouds_file_hash ON
554 b_clouds_file_hash.BUCKET_ID = ' .
$DB->ToNumber(
'b_file.HANDLER_ID') .
'
555 AND b_clouds_file_hash.FILE_PATH = ' . $helper->getConcatFunction(
"'/'",
'b_file.SUBDIR',
"'/'",
'b_file.FILE_NAME') .
'
556 LEFT JOIN b_file_duplicate ON
557 b_file_duplicate.DUPLICATE_ID = b_file.ID
559 b_file.ID > ' . $lastKey .
'
560 AND b_file_duplicate.DUPLICATE_ID is null
567 min(FILE_ID) as FILE_ID_MIN
568 ,max(FILE_ID) as FILE_ID_MAX
569 ,count(FILE_ID) FILE_ID_CNT
570 FROM (' . $sql .
') t
573 if ($fileIds[
'FILE_ID_CNT'] > 0)
575 $sql = $helper->getInsertIgnore(
577 '(FILE_ID, FILE_SIZE, FILE_HASH)',
601 'select' => [
'DUPLICATE_ID'],
603 '=DUPLICATE_ID' => $fileIds,
606 while ($duplicate = $duplicates->fetch())
609 $p = array_search($duplicate[
'DUPLICATE_ID'], $fileIds);
621 'select' => [
'ORIGINAL_ID'],
623 '=ORIGINAL_ID' => $fileIds,
625 'order' => [
'ORIGINAL_ID' =>
'ASC'],
627 while ($original = $originals->fetch())
630 if ($originalId ===
false)
632 $originalId = $original[
'ORIGINAL_ID'];
636 $p = array_search($original[
'ORIGINAL_ID'], $fileIds);
643 if ($originalId ===
false)
645 $originalId = array_shift($fileIds);
static duplicateList($bucketId, $filter, $order, $limit=0)
static prepareDuplicates($bucketId, &$fileIds)
static syncList($bucketId, $path, array $files, $prevLastKey)
static syncEnd($bucketId, $path, $prevLastKey)
static copyToFileHash($lastKey, $pageSize)
static getDuplicatesStat($bucketId)
static getFileDuplicates($bucketId, $fileHash, $fileSize)
static validateFilePath()
static validateFileHash()
static addList($bucketId, array $files)
static getConnection($name="")
static getList(array $parameters=array())
static gmtTimeToDateTime($str)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)