X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FBAO%2FPrevNextCache.php;h=165b130e9297c38e1632267480d776638b7a4356;hb=e1c519d764c556d5bc38ec1c8031a7900eca930e;hp=3cc23eb3017e1b051a54a052f2097437b0c686d5;hpb=92b75b73e8d3e99d082eefae98a5c02041f1657b;p=civicrm-core.git diff --git a/CRM/Core/BAO/PrevNextCache.php b/CRM/Core/BAO/PrevNextCache.php index 3cc23eb301..165b130e92 100644 --- a/CRM/Core/BAO/PrevNextCache.php +++ b/CRM/Core/BAO/PrevNextCache.php @@ -170,10 +170,12 @@ WHERE cachekey = %3 AND * @param int $id2 * @param string $cacheKey * @param array $conflicts + * @param string $mode * * @return bool + * @throws CRM_Core_Exception */ - public static function markConflict($id1, $id2, $cacheKey, $conflicts) { + public static function markConflict($id1, $id2, $cacheKey, $conflicts, $mode) { if (empty($cacheKey) || empty($conflicts)) { return FALSE; } @@ -191,11 +193,32 @@ WHERE cachekey = %3 AND ]; $pncFind = CRM_Core_DAO::executeQuery($sql, $params); + $conflictTexts = []; + + foreach ($conflicts as $entity => $entityConflicts) { + if ($entity === 'contact') { + foreach ($entityConflicts as $conflict) { + $conflictTexts[] = "{$conflict['title']}: '{$conflict[$id1]}' vs. '{$conflict[$id2]}'"; + } + } + else { + foreach ($entityConflicts as $locationConflict) { + if (!is_array($locationConflict)) { + continue; + } + $displayField = CRM_Dedupe_Merger::getLocationBlockInfo()[$entity]['displayField']; + $conflictTexts[] = "{$locationConflict['title']}: '{$locationConflict[$displayField][$id1]}' vs. '{$locationConflict[$displayField][$id2]}'"; + } + } + } + $conflictString = implode(', ', $conflictTexts); + while ($pncFind->fetch()) { $data = $pncFind->data; if (!empty($data)) { - $data = unserialize($data); - $data['conflicts'] = implode(",", array_values($conflicts)); + $data = CRM_Core_DAO::unSerializeField($data, CRM_Core_DAO::SERIALIZE_PHP); + $data['conflicts'] = $conflictString; + $data[$mode]['conflicts'] = $conflicts; $pncUp = new CRM_Core_DAO_PrevNextCache(); $pncUp->id = $pncFind->id; @@ -315,14 +338,46 @@ FROM civicrm_prevnext_cache pn } /** - * @param $values + * @param string $sqlValues string of SQLValues to insert + * @return array */ - public static function setItem($values) { - $insert = "INSERT INTO civicrm_prevnext_cache ( entity_table, entity_id1, entity_id2, cachekey, data ) VALUES \n"; - $query = $insert . implode(",\n ", $values); + public static function convertSetItemValues($sqlValues) { + $closingBrace = strpos($sqlValues, ')') - strlen($sqlValues); + $valueArray = array_map('trim', explode(', ', substr($sqlValues, strpos($sqlValues, '(') + 1, $closingBrace - 1))); + foreach ($valueArray as $key => &$value) { + // remove any quotes from values. + if (substr($value, 0, 1) == "'") { + $valueArray[$key] = substr($value, 1, -1); + } + } + return $valueArray; + } - //dump the dedupe matches in the prevnext_cache table - CRM_Core_DAO::executeQuery($query); + /** + * @param array|string $entity_table + * @param int $entity_id1 + * @param int $entity_id2 + * @param string $cacheKey + * @param string $data + */ + public static function setItem($entity_table = NULL, $entity_id1 = NULL, $entity_id2 = NULL, $cacheKey = NULL, $data = NULL) { + // If entity table is an array we are passing in an older format where this function only had 1 param $values. We put a deprecation warning. + if (!empty($entity_table) && is_array($entity_table)) { + Civi::log()->warning('Deprecated code path. Values should not be set this is going away in the future in favour of specific function params for each column.', array('civi.tag' => 'deprecated')); + foreach ($values as $value) { + $valueArray = self::convertSetItemValues($value); + self::setItem($valueArray[0], $valueArray[1], $valueArray[2], $valueArray[3], $valueArray[4]); + } + } + else { + CRM_Core_DAO::executeQuery("INSERT INTO civicrm_prevnext_cache (entity_table, entity_id1, entity_id2, cacheKey, data) VALUES + (%1, %2, %3, %4, '{$data}')", [ + 1 => [$entity_table, 'String'], + 2 => [$entity_id1, 'Integer'], + 3 => [$entity_id2, 'Integer'], + 4 => [$cacheKey, 'String'], + ]); + } } /** @@ -424,7 +479,7 @@ WHERE c.group_name = %1 AND c.created_date < date_sub( NOW( ), INTERVAL %2 day ) "; $params = [ - 1 => [CRM_Core_BAO_Cache::cleanKey('CiviCRM Search PrevNextCache'), 'String'], + 1 => [CRM_Utils_Cache::cleanKey('CiviCRM Search PrevNextCache'), 'String'], 2 => [$cacheTimeIntervalDays, 'Integer'], ]; CRM_Core_DAO::executeQuery($sql, $params);