- Модуль: disk
- Путь к файлу: ~/bitrix/modules/disk/lib/typefile.php
- Класс: BitrixDiskTypeFile
- Вызов: TypeFile::reindexTypeFile
static function reindexTypeFile($startFileId = 0)
{
$maxNumberRowsUpdate = 100000;
$connection = BitrixMainApplication::getConnection();
$fileTableName = BitrixMainFileTable::getTableName();
$diskFileTableName = BitrixDiskInternalsObjectTable::getTableName();
$maxFileId = -1;
$row = $connection->query("SELECT MAX(ID) as ID FROM {$fileTableName}")->fetch();
if ($row)
{
$maxFileId = $row['ID'];
}
if ($maxFileId < 0 || $startFileId >= $maxFileId)
{
return '';
}
$extensionList = array_keys(self::getMimeTypeExtensionList());
$updateTypeQuery = "";
foreach ($extensionList as $extension)
{
if (self::getByExtension($extension) != self::UNKNOWN)
{
$updateTypeQuery .= " WHEN '{$extension}' THEN ".self::getByExtension($extension)." n";
}
}
$mimeTypeExtensionList = array_unique(self::getMimeTypeExtensionList());
$updateTypeByContentTypeQuery = "";
foreach ($mimeTypeExtensionList as $extension => $mimeType)
{
if ($mimeType == 'text/plain' || $mimeType == 'application/octet-stream')
{
continue;
}
if (self::getByExtension($extension) != self::UNKNOWN)
{
$updateTypeByContentTypeQuery .= " WHEN '{$mimeType}' THEN ".self::getByExtension($extension)." n";
}
}
// review order:
// 1 - b_disk_object.NAME
// 2 - b_file.ORIGINAL_NAME
// 3 - b_file.FILE_NAME
// 4 - b_file.CONTENT_TYPE
$updateQuery = "
UPDATE {$diskFileTableName} AS o, {$fileTableName} AS f
SET
o.TYPE_FILE = (
CASE lower(substring_index(o.NAME,'.', -1))
{$updateTypeQuery}
ELSE
CASE lower(f.ORIGINAL_NAME)
{$updateTypeQuery}
ELSE
CASE lower(substring_index(f.FILE_NAME,'.', -1))
{$updateTypeQuery}
ELSE
CASE lower(f.CONTENT_TYPE)
{$updateTypeByContentTypeQuery}
ELSE
". self::UNKNOWN. "
END
END
END
END
)
WHERE
o.FILE_ID = f.ID
AND o.ID = o.REAL_OBJECT_ID
AND o.TYPE = ". BitrixDiskInternalsObjectTable::TYPE_FILE. "
AND ifnull(o.TYPE_FILE , 0) IN(0, ". self::KNOWN. ", ". self::UNKNOWN. ")
AND {$startFileId} <= o.ID
AND o.ID < {$startFileId} + {$maxNumberRowsUpdate}
";
$connection->queryExecute($updateQuery);
if ($startFileId + $maxNumberRowsUpdate < $maxFileId)
{
return get_called_class().'::'.__FUNCTION__.'('. ($startFileId + $maxNumberRowsUpdate).');';
}
else
{
return '';
}
}