}
/**
- * @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'],
+ ]);
+ }
}
/**
$this->quickCleanup(array('civicrm_prevnext_cache'));
}
+ public function testSetItem() {
+ $cacheKeyString = 'TestCacheKeyString';
+ $data = '1234afgbghh';
+ $values = [];
+ $values[] = " ( 'civicrm_contact', 0, 0, '{$cacheKeyString}_stats', '$data' ) ";
+ $valueArray = CRM_Core_BAO_PrevNextCache::convertSetItemValues($values[0]);
+ // verify as SetItem would do that it converts the original values style into a sensible array format
+ $this->assertEquals(['civicrm_contact', 0, 0, 'TestCacheKeyString_stats', '1234afgbghh'], $valueArray);
+ CRM_Core_BAO_PrevNextCache::setItem($valueArray[0], $valueArray[1], $valueArray[2], $valueArray[3], $valueArray[4]);
+ $dao = new CRM_Core_BAO_PrevNextCache();
+ $dao->cacheKey = 'TestCacheKeyString_stats';
+ $dao->find(TRUE);
+ $this->assertEquals('1234afgbghh', $dao->data);
+ $this->assertEquals(0, $dao->entity_id1);
+ $this->assertEquals(0, $dao->entity_id2);
+ $this->assertEquals('civicrm_contact', $dao->entity_table);
+ }
+
}