• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/integrity/entity/duplicateindexmismatch.php
  • Класс: Bitrix\Crm\Integrity\Entity\DuplicateIndexMismatchTable
  • Вызов: DuplicateIndexMismatchTable::upsert
static function upsert(array $data)
{
	$connection = Main\Application::getConnection();
	$sqlHelper = $connection->getSqlHelper();

	$userID = isset($data['USER_ID']) ? intval($data['USER_ID']) : 0;
	$entityTypeID = isset($data['ENTITY_TYPE_ID']) ? intval($data['ENTITY_TYPE_ID']) : 0;
	$typeID = isset($data['TYPE_ID']) ? intval($data['TYPE_ID']) : 0;
	$matchHash = isset($data['MATCH_HASH']) ? $sqlHelper->forSql($data['MATCH_HASH'], 32) : '';
	$leftEntityID = isset($data['L_ENTITY_ID']) ? intval($data['L_ENTITY_ID']) : 0;
	$rightEntityID = isset($data['R_ENTITY_ID']) ? intval($data['R_ENTITY_ID']) : 0;
	$scope = (isset($data['SCOPE'])
		&& $data['SCOPE'] !== DuplicateIndexType::DEFAULT_SCOPE
		&& DuplicateIndexType::checkScopeValue($data['SCOPE'])) ?
			$sqlHelper->forSql($data['SCOPE'], 6) : DuplicateIndexType::DEFAULT_SCOPE;

	if($connection instanceof Main\DB\MysqlCommonConnection)
	{
		$connection->queryExecute(
			"INSERT INTO b_crm_dp_index_mismatch(USER_ID, ENTITY_TYPE_ID, TYPE_ID, MATCH_HASH, L_ENTITY_ID, R_ENTITY_ID, SCOPE)
				VALUES({$userID}, {$entityTypeID}, {$typeID}, '{$matchHash}', {$leftEntityID}, {$rightEntityID}, '{$scope}')
				ON DUPLICATE KEY UPDATE L_ENTITY_ID = {$leftEntityID}, R_ENTITY_ID = {$rightEntityID}, SCOPE = '{$scope}'"
		);
	}
	elseif($connection instanceof Main\DB\MssqlConnection)
	{
		$dbResult = $connection->query(
			"SELECT 'X' FROM b_crm_dp_index_mismatch WHERE USER_ID = {$userID} AND ENTITY_TYPE_ID = {$entityTypeID} AND TYPE_ID = {$typeID} AND MATCH_HASH = '{$matchHash}' AND L_ENTITY_ID = {$leftEntityID} AND R_ENTITY_ID = {$rightEntityID} AND SCOPE = {$scope}"
		);

		if(!is_array($dbResult->fetch()))
		{
			$connection->queryExecute(
				"INSERT INTO b_crm_dp_index_mismatch(USER_ID, ENTITY_TYPE_ID, TYPE_ID, MATCH_HASH, L_ENTITY_ID, R_ENTITY_ID, SCOPE)
					VALUES({$userID}, {$entityTypeID}, {$typeID}, '{$matchHash}', {$leftEntityID}, {$rightEntityID}, '{$scope}')"
			);
		}
	}
	elseif($connection instanceof Main\DB\OracleConnection)
	{
		$connection->queryExecute("MERGE INTO b_crm_dp_index_mismatch USING (SELECT {$userID} USER_ID, {$entityTypeID} ENTITY_TYPE_ID, {$typeID} TYPE_ID, '{$matchHash}' MATCH_HASH, {$leftEntityID} L_ENTITY_ID, {$rightEntityID} R_ENTITY_ID, {$scope} SCOPE FROM dual)
			source ON
			(
				source.USER_ID = b_crm_dp_index_mismatch.USER_ID
				AND source.ENTITY_TYPE_ID = b_crm_dp_index_mismatch.ENTITY_TYPE_ID
				AND source.TYPE_ID = b_crm_dp_index_mismatch.TYPE_ID
				AND source.MATCH_HASH = b_crm_dp_index_mismatch.MATCH_HASH
				AND source.L_ENTITY_ID = b_crm_dp_index_mismatch.L_ENTITY_ID
				AND source.R_ENTITY_ID = b_crm_dp_index_mismatch.R_ENTITY_ID
				AND source.SCOPE = b_crm_dp_index_mismatch.SCOPE
			)
			WHEN NOT MATCHED THEN
				INSERT (USER_ID, ENTITY_TYPE_ID, TYPE_ID, MATCH_HASH, L_ENTITY_ID, R_ENTITY_ID, SCOPE)
				VALUES({$userID}, {$entityTypeID}, {$typeID}, '{$matchHash}', {$leftEntityID}, {$rightEntityID}, '{$scope}')"
		);
	}
	else
	{
		$dbType = $connection->getType();
		throw new Main\NotSupportedException("The '{$dbType}' is not supported in current context");
	}
}