X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FCore%2FDAO.php;h=83dac3f4333a8f1b76dd8b3a467f3318ce9dabfc;hb=9aef96d165f8012e103624a9e7b3133d77e8e69e;hp=5eb4713b8fe6cb21cf520acaa6b636478e1ec983;hpb=bf6a7dba924fa32932a3a10e3d5f62b0d967f78a;p=civicrm-core.git diff --git a/CRM/Core/DAO.php b/CRM/Core/DAO.php index 5eb4713b8f..83dac3f433 100644 --- a/CRM/Core/DAO.php +++ b/CRM/Core/DAO.php @@ -234,26 +234,22 @@ class CRM_Core_DAO extends DB_DataObject { if ($fkDAO->find(TRUE)) { $this->$dbName = $fkDAO->id; } - $fkDAO->free(); } elseif (in_array($FKClassName, CRM_Core_DAO::$_testEntitiesToSkip)) { $depObject = new $FKClassName(); $depObject->find(TRUE); $this->$dbName = $depObject->id; - $depObject->free(); } elseif ($daoName == 'CRM_Member_DAO_MembershipType' && $fieldName == 'member_of_contact_id') { // FIXME: the fields() metadata is not specific enough $depObject = CRM_Core_DAO::createTestObject($FKClassName, ['contact_type' => 'Organization']); $this->$dbName = $depObject->id; - $depObject->free(); } else { //if it is required we need to generate the dependency object first $depObject = CRM_Core_DAO::createTestObject($FKClassName, CRM_Utils_Array::value($dbName, $params, 1)); $this->$dbName = $depObject->id; - $depObject->free(); } } @@ -567,6 +563,7 @@ class CRM_Core_DAO extends DB_DataObject { $event = new \Civi\Core\DAO\Event\PostUpdate($this); \Civi::service('dispatcher')->dispatch("civi.dao.postUpdate", $event); } + $this->clearDbColumnValueCache(); } else { $this->insert(); @@ -620,6 +617,8 @@ class CRM_Core_DAO extends DB_DataObject { \Civi::service('dispatcher')->dispatch("civi.dao.postDelete", $event); $this->free(); + $this->clearDbColumnValueCache(); + return $result; } @@ -1196,12 +1195,16 @@ FROM civicrm_domain 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(); @@ -1211,11 +1214,10 @@ FROM civicrm_domain 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]; } /** @@ -1512,7 +1514,7 @@ FROM civicrm_domain * @return string * @throws Exception */ - public static function composeQuery($query, $params, $abort = TRUE) { + public static function composeQuery($query, $params = [], $abort = TRUE) { $tr = []; foreach ($params as $key => $item) { if (is_numeric($key)) { @@ -2375,6 +2377,7 @@ SELECT contact_id } } self::appendCustomTablesExtendingContacts($contactReferences); + self::appendCustomContactReferenceFields($contactReferences); // FixME for time being adding below line statically as no Foreign key constraint defined for table 'civicrm_entity_tag' $contactReferences['civicrm_entity_tag'][] = 'entity_id'; @@ -2398,7 +2401,26 @@ SELECT contact_id $customValueTables = CRM_Core_BAO_CustomGroup::getAllCustomGroupsByBaseEntity('Contact'); $customValueTables->find(); while ($customValueTables->fetch()) { - $cidRefs[$customValueTables->table_name] = ['entity_id']; + $cidRefs[$customValueTables->table_name][] = 'entity_id'; + } + } + + /** + * Add custom ContactReference fields to the list of contact references + * + * This includes active and inactive fields/groups + * + * @param array $cidRefs + * + * @throws \CiviCRM_API3_Exception + */ + public static function appendCustomContactReferenceFields(&$cidRefs) { + $fields = civicrm_api3('CustomField', 'get', [ + 'return' => ['column_name', 'custom_group_id.table_name'], + 'data_type' => 'ContactReference', + ])['values']; + foreach ($fields as $field) { + $cidRefs[$field['custom_group_id.table_name']][] = $field['column_name']; } } @@ -2934,4 +2956,20 @@ SELECT contact_id 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]); + } + } + }