403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/translate/lib/index/internals/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/translate/lib/index/internals/phrasefts.php
<?php

namespace Bitrix\Translate\Index\Internals;

use Bitrix\Main\Application;
use Bitrix\Main\DB\SqlQueryException;
use Bitrix\Main\ORM;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ArgumentException;
use Bitrix\Translate;
use Bitrix\Translate\Index;


abstract class PhraseFts extends DataManager
{
	use Index\Internals\BulkOperation;

	/** @var array<string, ORM\Entity>  */
	protected static array $ftsEntities = [];

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap(): array
	{
		return [
			'ID' => [
				'data_type' => 'integer',
				'primary' => true,
			],
			'FILE_ID' => [
				'data_type' => 'integer',
			],
			'PATH_ID' => [
				'data_type' => 'integer',
			],
			'CODE' => [
				'data_type' => 'string',
			],
			'PHRASE' => [
				'data_type' => 'string',
			],
			'FILE' => [
				'data_type' => Index\Internals\FileIndexTable::class,
				'reference' => [
					'=this.FILE_ID' => 'ref.ID',
				],
				'join_type' => 'INNER',
			],
			'PATH' => [
				'data_type' => Index\Internals\PathIndexTable::class,
				'reference' => [
					'=this.PATH_ID' => 'ref.ID',
				],
				'join_type' => 'INNER',
			],
		];
	}

	/**
	 * Checks and restore FTS tables.
	 * @return void
	 */
	public static function checkTables(): void
	{
		$tables = [];
		$tablesRes = Application::getConnection()->query("SHOW TABLES LIKE 'b_translate_phrase_fts_%'");
		while ($row = $tablesRes->fetch())
		{
			$tableName = array_shift($row);
			$langId = substr($tableName, -2);
			$tables[$langId] = $tableName;
		}
		foreach (Translate\Config::getEnabledLanguages() as $langId)
		{
			if (!preg_match("/[a-z0-9]{2}/i", $langId))
			{
				continue;
			}
			if (!isset($tables[$langId]))
			{
				self::createTable($langId);
			}
			else
			{
				unset($tables[$langId]);
			}
		}
		foreach ($tables as $langId => $table)
		{
			self::dropTable($langId);
		}
	}

	/**
	 * @param string $langId
	 * @return string
	 * @throws ArgumentException
	 */
	public static function getPartitionTableName(string $langId): string
	{
		if (!in_array($langId, Translate\Config::getLanguages(skipCache: true), true))
		{
			throw new ArgumentException('Parameter langId has wrong value');
		}

		return "b_translate_phrase_fts_{$langId}";
	}

	/**
	 * @param string $langId
	 * @return void
	 * @throws ArgumentException
	 * @throws SqlQueryException
	 */
	public static function createTable(string $langId): void
	{
		$partitionTable = self::getPartitionTableName($langId);

		$suffix = mb_strtoupper($langId);

		Application::getConnection()->queryExecute("
			CREATE TABLE IF NOT EXISTS `{$partitionTable}` (
				`ID` int not null,
				`FILE_ID` int not null,
				`PATH_ID` int not null,
				`CODE` varbinary(255) not null,
				`PHRASE` text,
				PRIMARY KEY (`ID`),
				UNIQUE KEY `IXU_TRNSL_FTS_PT_{$suffix}` (`PATH_ID`, `CODE`),
				UNIQUE KEY `IXU_TRNSL_FTS_FL_{$suffix}` (`FILE_ID`, `CODE`),
				FULLTEXT INDEX `IXF_TRNSL_FTS_PH_{$suffix}` (`PHRASE`)
			) DELAY_KEY_WRITE=1
		");
	}

	/**
	 * @param string $langId
	 * @return void
	 * @throws ArgumentException
	 * @throws SqlQueryException
	 */
	public static function dropTable(string $langId): void
	{
		$partitionTable = self::getPartitionTableName($langId);

		Application::getConnection()->queryExecute("DROP TABLE IF EXISTS `{$partitionTable}`");
	}

	/**
	 * @param string $langId
	 * @return DataManager|PhraseFts|string
	 * @throws ArgumentException
	 */
	public static function getFtsEntityClass(string $langId): string
	{
		static $cache = [];
		if (!isset($cache[$langId]))
		{
			$entity = self::getFtsEntity($langId);
			$cache[$langId] = $entity->getDataClass();
		}

		return $cache[$langId];
	}

	/**
	 * @param string $langId
	 * @return ORM\Entity
	 * @throws ArgumentException
	 */
	public static function getFtsEntity(string $langId): ORM\Entity
	{
		if (!in_array($langId, Translate\Config::getEnabledLanguages(), true))
		{
			throw new ArgumentException('Parameter langId has wrong value');
		}
		if (!isset(self::$ftsEntities[$langId]))
		{
			self::$ftsEntities[$langId] = ORM\Entity::compileEntity(
				'PhraseIndexTfsEntity'. mb_strtoupper($langId),
				[],
				[
					'table_name' => self::getPartitionTableName($langId),
					'namespace' => __NAMESPACE__,
					'parent' => Index\Internals\PhraseFts::class
				]
			);
		}

		return self::$ftsEntities[$langId];
	}

	/**
	 * Drop index.
	 *
	 * @param Translate\Filter|null $filter Params to filter file list.
	 *
	 * @return void
	 */
	public static function purge(?Translate\Filter $filter = null): void
	{
		$filterOut = static::processFilter($filter);
		static::bulkDelete($filterOut);
	}

	/**
	 * Processes filter params to convert them into orm type.
	 *
	 * @param Translate\Filter|null $filter Params to filter file list.
	 *
	 * @return array
	 */
	public static function processFilter(?Translate\Filter $filter = null): array
	{
		$filterOut = [];

		if ($filter !== null)
		{
			foreach ($filter as $key => $value)
			{
				if (empty($value) && $value !== '0')
				{
					continue;
				}

				if ($key === 'path')
				{
					$filterOut['=%PATH.PATH'] = $value.'%';
				}
				elseif ($key === 'fileId')
				{
					$filterOut['=FILE_ID'] = $value;
				}
				elseif ($key === 'pathId')
				{
					$filterOut['=PATH_ID'] = $value;
				}
				else
				{
					if (static::getEntity()->hasField(trim($key, '<>!=@~%*')))
					{
						$filterOut[$key] = $value;
					}
				}
			}
		}

		return $filterOut;
	}

	/**
	 * Event handler on language delete.
	 * @event 'main:OnLanguageDelete'
	 * @event 'main:\Bitrix\Main\Localization\Language::OnAfterDelete'
	 * @param $param
	 * @return void
	 */
	public static function onLanguageDelete($param): void
	{
		$langId = null;
		if ($param instanceof \Bitrix\Main\ORM\Event)
		{
			$langId = $param->getParameter('primary')['LID'];
		}
		elseif (is_string($param))
		{
			$langId = $param;
		}
		if ($langId)
		{
			self::dropTable($langId);
		}
	}

	/**
	 * Event handler on language delete.
	 * @event 'main:OnAfterLanguageAdd'
	 * @event 'main:\Bitrix\Main\Localization\Language::OnAfterAdd'
	 * @param $param
	 * @return void
	 */
	public static function onLanguageAdd($param): void
	{
		$langId = null;
		if ($param instanceof \Bitrix\Main\ORM\Event)
		{
			$langId = $param->getParameter('primary')['LID'];
		}
		elseif (is_array($param))
		{
			$langId = $param['LID'];
		}
		if ($langId)
		{
			self::createTable($langId);
		}
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit