Skip to content

Commit

Permalink
Clear static DAO cache when writing to DAO
Browse files Browse the repository at this point in the history
  • Loading branch information
colemanw authored and magnolia61 committed Oct 13, 2019
1 parent ec97799 commit bfc1625
Showing 1 changed file with 29 additions and 7 deletions.
36 changes: 29 additions & 7 deletions CRM/Core/DAO.php
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,7 @@ public function save($hook = TRUE) {
$event = new \Civi\Core\DAO\Event\PostUpdate($this);
\Civi::service('dispatcher')->dispatch("civi.dao.postUpdate", $event);
}
$this->clearDbColumnValueCache();
}
else {
$this->insert();
Expand Down Expand Up @@ -616,6 +617,8 @@ public function delete($useWhere = FALSE) {
\Civi::service('dispatcher')->dispatch("civi.dao.postDelete", $event);
$this->free();

$this->clearDbColumnValueCache();

return $result;
}

Expand Down Expand Up @@ -1192,12 +1195,16 @@ public static function getFieldValue($daoName, $searchValue, $returnColumn = 'na
CRM_Core_Error::fatal();
}

$cacheKey = "{$daoName}:{$searchValue}:{$returnColumn}:{$searchColumn}";
if (self::$_dbColumnValueCache === NULL) {
self::$_dbColumnValueCache = [];
self::$_dbColumnValueCache = self::$_dbColumnValueCache ?? [];

while (strpos($daoName, '_BAO_') !== FALSE) {
$daoName = get_parent_class($daoName);
}

if (!array_key_exists($cacheKey, self::$_dbColumnValueCache) || $force) {
if ($force ||
empty(self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue]) ||
!array_key_exists($returnColumn, self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue])
) {
$object = new $daoName();
$object->$searchColumn = $searchValue;
$object->selectAdd();
Expand All @@ -1207,11 +1214,10 @@ public static function getFieldValue($daoName, $searchValue, $returnColumn = 'na
if ($object->find(TRUE)) {
$result = $object->$returnColumn;
}
$object->free();

self::$_dbColumnValueCache[$cacheKey] = $result;
self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue][$returnColumn] = $result;
}
return self::$_dbColumnValueCache[$cacheKey];
return self::$_dbColumnValueCache[$daoName][$searchColumn][$searchValue][$returnColumn];
}

/**
Expand Down Expand Up @@ -2950,4 +2956,20 @@ public static function getExportableFieldsWithPseudoConstants($baoClass) {
return $fields;
}

/**
* Remove item from static cache during update/delete operations
*/
private function clearDbColumnValueCache() {
$daoName = get_class($this);
while (strpos($daoName, '_BAO_') !== FALSE) {
$daoName = get_parent_class($daoName);
}
if (isset($this->id)) {
unset(self::$_dbColumnValueCache[$daoName]['id'][$this->id]);
}
if (isset($this->name)) {
unset(self::$_dbColumnValueCache[$daoName]['name'][$this->name]);
}
}

}

0 comments on commit bfc1625

Please sign in to comment.