[$id, 'Integer']]; if ($id == 0) { $query .= " OR contact_id IS NULL"; } $dao = CRM_Core_DAO::executeQuery($query, $params); $cache = []; while ($dao->fetch()) { $cache[$dao->acl_id] = 1; } return $cache; } /** * @param int $id * @param array $cache */ public static function store($id, &$cache) { foreach ($cache as $aclID => $data) { $dao = new CRM_ACL_BAO_Cache(); if ($id) { $dao->contact_id = $id; } $dao->acl_id = $aclID; $cache[$aclID] = 1; $dao->save(); } } /** * @param int $id */ public static function deleteEntry($id) { if (self::$_cache && array_key_exists($id, self::$_cache) ) { unset(self::$_cache[$id]); } $query = " DELETE FROM civicrm_acl_cache WHERE contact_id = %1 "; $params = [1 => [$id, 'Integer']]; CRM_Core_DAO::executeQuery($query, $params); } /** * @param int $id */ public static function updateEntry($id) { // rebuilds civicrm_acl_cache self::deleteEntry($id); self::build($id); // rebuilds civicrm_acl_contact_cache CRM_Contact_BAO_Contact_Permission::cache($id, CRM_Core_Permission::VIEW, TRUE); } /** * Deletes all the cache entries. */ public static function resetCache() { if (!CRM_Core_Config::isPermitCacheFlushMode()) { return; } // reset any static caching self::$_cache = NULL; $query = " DELETE FROM civicrm_acl_cache WHERE modified_date IS NULL OR (modified_date <= %1) "; $params = [ 1 => [ CRM_Contact_BAO_GroupContactCache::getCacheInvalidDateTime(), 'String', ], ]; CRM_Core_DAO::singleValueQuery($query, $params); // CRM_Core_DAO::singleValueQuery("TRUNCATE TABLE civicrm_acl_contact_cache"); // No, force-commits transaction // CRM_Core_DAO::singleValueQuery("DELETE FROM civicrm_acl_contact_cache"); // Transaction-safe if (CRM_Core_Transaction::isActive()) { CRM_Core_Transaction::addCallback(CRM_Core_Transaction::PHASE_POST_COMMIT, function () { CRM_Core_DAO::singleValueQuery("TRUNCATE TABLE civicrm_acl_contact_cache"); }); } else { CRM_Core_DAO::singleValueQuery("TRUNCATE TABLE civicrm_acl_contact_cache"); } } }