• Модуль: 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 '';
	}
}