$now = CRM_Utils_Date::getUTCTime();
$refreshTime = CRM_Utils_Date::getUTCTime($smartGroupCacheTimeout * 60);
+ // HACK: Hardcoded delete limit.
+ $deleteLimit = 1000;
if (!isset($groupID)) {
if ($smartGroupCacheTimeout == 0) {
$query = "
-TRUNCATE civicrm_group_contact_cache
+DELETE FROM civicrm_group_contact_cache LIMIT $deleteLimit
";
$update = "
UPDATE civicrm_group g
else {
$query = "
DELETE gc
-FROM civicrm_group_contact_cache gc
-INNER JOIN civicrm_group g ON g.id = gc.group_id
-WHERE TIMESTAMPDIFF(MINUTE, g.cache_date, $now) >= $smartGroupCacheTimeout
+FROM civicrm_group_contact_cache AS gc
+INNER JOIN (
+ SELECT id
+ FROM civicrm_group
+ WHERE TIMESTAMPDIFF(MINUTE, cache_date, $now) >= $smartGroupCacheTimeout
+ LIMIT $deleteLimit
+ ) AS g
+ON g.id=gc.group_id
";
$update = "
UPDATE civicrm_group g
DELETE g
FROM civicrm_group_contact_cache g
WHERE g.group_id IN ( $groupIDs )
+LIMIT $deleteLimit
";
$update = "
UPDATE civicrm_group g
}
else {
$query = "
-DELETE g
-FROM civicrm_group_contact_cache g
-WHERE g.group_id = %1
+DELETE
+FROM civicrm_group_contact_cache
+WHERE group_id = %1
+LIMIT $deleteLimit
";
$update = "
UPDATE civicrm_group g
$params = array(1 => array($groupID, 'Integer'));
}
- CRM_Core_DAO::executeQuery($query, $params);
+ // Nibble at the rows, don't try to delete everything at once!
+ do {
+ $dao = CRM_Core_DAO::executeQuery($query, $params);
+ } while($dao->affectedRows() != 0);
if ($refresh) {
CRM_Core_DAO::executeQuery($refresh, $params);
}
}
-