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/bulkoperation.php
<?php

namespace Bitrix\Translate\Index\Internals;

use Bitrix\Main;


trait BulkOperation
{
	/** @var array */
	private static $tableFields;

	/**
	 * Multiple inserts rows.
	 *
	 * @param array $rows Data to add.
	 * @param string|string[] $primary Primary key field name.
	 *
	 * @return void
	 */
	public static function bulkAdd(array $rows, $primary = null): void
	{
		if (empty($rows))
		{
			return;
		}
		$tableName = static::getTableName();
		$connection = Main\Application::getConnection();
		$sqlHelper = $connection->getSqlHelper();

		if (empty(static::$tableFields))
		{
			static::$tableFields = $connection->getTableFields($tableName);
		}

		$columns0 = \array_keys($rows[0]);
		$columns = [];
		foreach ($columns0 as $c)
		{
			$columns[$c] = $sqlHelper->quote(\mb_strtoupper($c));
		}

		$sqlValues = [];
		foreach ($rows as $data)
		{
			foreach ($data as $columnName => $value)
			{
				$data[$columnName] = $sqlHelper->convertToDb($value, static::$tableFields[$columnName]);
			}
			$sqlValues[] = '('.\implode(', ', $data).')';
		}
		unset($data);

		$tableName = $sqlHelper->quote($tableName);
		$sql = "INSERT INTO {$tableName} (".\implode(', ', $columns).") VALUES ".\implode(', ', $sqlValues);

		$checkPrimary = false;
		if (!empty($primary))
		{
			if (!\is_array($primary))
			{
				$primary = array($primary);
			}
			if (\count(\array_intersect($primary, $columns0)) > 0)
			{
				$checkPrimary = true;
			}
		}
		if ($checkPrimary)
		{
			$sqlUpdate = array();
			foreach (\array_diff($columns0, $primary) as $columnName)
			{
				$sqlUpdate[] = "{$columns[$columnName]} = VALUES({$columns[$columnName]})";
			}
			$sql .= " ON DUPLICATE KEY UPDATE ".\implode(', ', $sqlUpdate);
		}

		$connection->queryExecute($sql);
	}

	/**
	 * Updates rows by filter.
	 *
	 * @param array $fields Values for update.
	 * @param array $filter Filter what to update.
	 *
	 * @return void
	 */
	public static function bulkUpdate(array $fields, array $filter = []): void
	{
		if (empty($fields))
		{
			return;
		}
		$tableName = static::getTableName();
		$connection = Main\Application::getConnection();
		$helper = $connection->getSqlHelper();

		$update = $helper->prepareUpdate($tableName, $fields);
		$valuesSql = $update[0];

		if (!empty($valuesSql))
		{
			$tableName = $helper->quote($tableName);
			if (!empty($filter))
			{
				$hasSubQuery = false;
				foreach ($filter as $field => $value)
				{
					if (\mb_strpos($field, '.') !== false)
					{
						$hasSubQuery = true;
						break;
					}
				}
				if ($hasSubQuery)
				{
					$whereSql = (static::query())
						->setSelect(['ID' => 'ID'])
						->setFilter($filter)
						->getQuery();

					$querySql = "UPDATE {$tableName} target INNER JOIN ({$whereSql}) source ON target.ID = source.ID SET {$valuesSql}  ";
				}
				else
				{
					$whereSql = Main\ORM\Query\Query::buildFilterSql(static::getEntity(), $filter);
					$querySql = "UPDATE {$tableName} SET {$valuesSql} WHERE {$whereSql}";
				}
			}
			else
			{
				$querySql = "UPDATE {$tableName} SET {$valuesSql}";
			}

			$connection->queryExecute($querySql);
		}
	}

	/**
	 * Deletes rows by filter.
	 *
	 * @param array $filter Filter looks like filter in getList.
	 *
	 * @return void
	 */
	public static function bulkDelete(array $filter = []): void
	{
		$connection = Main\Application::getConnection();
		$tableName = $connection->getSqlHelper()->quote(static::getTableName());

		if (!empty($filter))
		{
			$hasSubQuery = false;
			foreach ($filter as $field => $value)
			{
				if (\mb_strpos($field, '.') !== false)
				{
					$hasSubQuery = true;
					break;
				}
			}
			if ($hasSubQuery)
			{
				$whereSql = (static::query())
					->setSelect(['ID' => 'ID'])
					->setFilter($filter)
					->getQuery();

				$querySql = "DELETE target FROM {$tableName} target INNER JOIN ({$whereSql}) source ON target.ID = source.ID";
			}
			else
			{
				$whereSql = Main\ORM\Query\Query::buildFilterSql(static::getEntity(), $filter);
				$querySql = "DELETE FROM {$tableName} WHERE {$whereSql}";
			}
		}
		else
		{
			$querySql = "TRUNCATE TABLE {$tableName}";
		}

		$connection->queryExecute($querySql);
	}


	/**
	 * Get filter parameters as SQL code.
	 *
	 * @param array $filterFields Gets filter parameters.
	 * @param array $filterAlias Aliases for the filter fields.
	 *
	 * @return string
	 */
	private static function prepareWhere(array $filterFields, array $filterAlias = []): string
	{
		$sqlHelper = Main\Application::getConnection()->getSqlHelper();

		$where = array();
		$logic = 'AND';
		foreach ($filterFields as $key => $val)
		{
			if ($key === 'LOGIC')
			{
				$logic = $val;
				continue;
			}
			$operator = '=';
			if (!\is_numeric($key))
			{
				if (\preg_match("/^([=<>!@%]+)([^=<>!@%]+)$/", $key, $parts))
				{
					[, $operator, $key] = $parts;
				}
				if (\is_array($val) && !isset($val['LOGIC']))
				{
					if ($operator === '=')
					{
						$operator = '@';
					}
					elseif ($operator === '!')
					{
						$operator = '!@';
					}
				}
				if (isset($filterAlias[$key]))
				{
					$key = $filterAlias[$key];
				}
			}
			switch ($operator)
			{
				case '!':
					$where[] = "$key != '". $sqlHelper->forSql($val). "'";
					break;

				case '%':
					$where[] = "$key LIKE '%". $sqlHelper->forSql($val). "%'";
					break;

				case '!%':
					$where[] = "$key NOT LIKE '%". $sqlHelper->forSql($val). "%'";
					break;

				case '@':
				{
					if (\is_array($val) && \count($val) > 0)
					{
						$val = \array_map(array($sqlHelper, 'forSql'), $val);
						$where[] = "$key IN('".\implode("', '", $val)."')";
					}
					elseif (\is_string($val) && $val <> '')
					{
						$where[] = "$key IN(".$val.')';
					}
					break;
				}

				case '!@':
				{
					if (\is_array($val) && \count($val) > 0)
					{
						$val = \array_map(array($sqlHelper, 'forSql'), $val);
						$where[] = "$key NOT IN('".\implode("', '", $val)."')";
					}
					elseif (\is_string($val) && $val <> '')
					{
						$where[] = "$key NOT IN(".$val.')';
					}
					break;
				}

				default:
				{
					if (\is_array($val))
					{
						$subLogic = 'AND';
						if (isset($val['LOGIC']) && $val['LOGIC'] === 'OR')
						{
							$subLogic = 'OR';
							unset($val['LOGIC']);
						}

						$condition = array();
						foreach ($val as $k => $v)
						{
							$subOperator = '=';
							if (\preg_match("/^([=<>!@%]+)([^=<>!@%]+)$/", $k, $parts))
							{
								[, $subOperator, $k] = $parts;
							}
							if (isset($filterAlias[$k]))
							{
								$k = $filterAlias[$k];
							}
							switch ($subOperator)
							{
								case '!':
									$condition[] = "$k != '".$sqlHelper->forSql($v)."'";
									break;
								case '%':
									$condition[] = "$k LIKE '%".$sqlHelper->forSql($v)."%'";
									break;
								case '!%':
									$condition[] = "$k NOT LIKE '%".$sqlHelper->forSql($v)."%'";
									break;
								default:
									$condition[] = "$k $subOperator '".$sqlHelper->forSql($v)."'";
							}
						}
						$where[] = '('.\implode(" $subLogic ", $condition).')';
					}
					else
					{
						$where[] = "$key $operator '".$sqlHelper->forSql($val)."'";
					}
					break;
				}
			}
		}

		$whereSql = '';
		if (\count($where))
		{
			$whereSql = ' AND '. \implode(" $logic ", $where);
		}

		return $whereSql;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit