• Модуль: translate
  • Путь к файлу: ~/bitrix/modules/translate/lib/Update/PhraseFtsIndexConverter.php
  • Класс: BitrixTranslateUpdatePhraseFtsIndexConverter
  • Вызов: PhraseFtsIndexConverter::execute
public function execute(array &$result)
{
	if (!Loader::includeModule(self::$moduleId))
	{
		return self::FINISH_EXECUTION;
	}

	global $pPERIOD;
	$pPERIOD = 30; /** Increase agent delay. @see CAgent::ExecuteAgents */

	$connection = BitrixMainApplication::getConnection();
	if (!$connection->isTableExists('b_translate_phrase'))
	{
		return self::FINISH_EXECUTION;
	}

	try
	{
		$connection->query("SELECT `PHRASE` FROM `b_translate_phrase` WHERE 1=0");
	}
	catch (SqlException $exception)
	{
		return self::FINISH_EXECUTION;
	}

	$startTime = time();
	$isCronRun =
		!BitrixMainModuleManager::isModuleInstalled('bitrix24')
		&& (php_sapi_name() === 'cli');

	$return = self::FINISH_EXECUTION;

	$params = Option::get(self::$moduleId, self::OPTION_NAME, '');
	$params = $params !== '' ? @unserialize($params, ['allowed_classes' => false]) : [];
	$params = is_array($params) ? $params : [];

	if (empty($params))
	{
		$params = [
			'languages' => [],
			'index' => false,
			'field' => false,
			'number' => 0,
			'count' => LanguageTable::getCount() + 2,
		];
	}

	if ($params['count'] > 0)
	{
		$result['title'] = Loc::getMessage('IM_UPDATE_CHAT_DISK_ACCESS');
		$result['progress'] = 1;
		$result['steps'] = '';
		$result['count'] = $params['count'];

		$filter = [];
		if (!empty($params['languages']))
		{
			$filter['!=ID'] = $params['languages'];
		}
		$found = false;
		$langList = LanguageTable::getList([
			'select' => ['ID'],
			'filter' => $filter,
			'order' => ['SORT' => 'ASC'],
		]);
		while ($row = $langList->fetch())
		{
			$langId = mb_strtolower($row['ID']);
			if (!preg_match("/[a-z]{2}/i", $langId))
			{
				continue;
			}

			try
			{
				IndexInternalsPhraseFts::createTable($langId);
				$partitionTable = IndexInternalsPhraseFts::getPartitionTableName($langId);

				$connection->queryExecute("
					INSERT IGNORE INTO `{$partitionTable}` 
					SELECT `ID`, `FILE_ID`, `PATH_ID`, `CODE`, `PHRASE` FROM `b_translate_phrase` WHERE `LANG_ID` = '{$langId}'
				");
			}
			catch (SqlException $exception)
			{}

			$params['languages'][] = $langId;
			$params['number']++;
			$found = true;
			if (!$isCronRun && (time() - $startTime >= 30))
			{
				break;
			}
		}

		if ($found === false)
		{
			if ($params['index'] === false)
			{
				try
				{
					$connection->queryExecute("ALTER TABLE `b_translate_phrase` DROP INDEX `IXF_TRNSL_PHR`");
				}
				catch (SqlException $exception)
				{}
				$params['index'] = true;
				$params['number']++;
				$found = true;
			}
			elseif ($params['field'] === false)
			{
				try
				{
					$connection->queryExecute("ALTER TABLE `b_translate_phrase` DROP COLUMN `PHRASE`");
				}
				catch (SqlException $exception)
				{}
				$params['field'] = true;
				$params['number']++;
				$found = true;
			}
		}

		if ($found)
		{
			Option::set(self::$moduleId, self::OPTION_NAME, serialize($params));
			$return = self::CONTINUE_EXECUTION;
		}

		$result['progress'] = floor($params['number'] * 100 / $params['count']);
		$result['steps'] = $params['number'];

		if ($found === false)
		{
			Option::delete(self::$moduleId, ['name' => self::OPTION_NAME]);
		}
	}
	
	return $return;
}