From d357f225f281a0862b67a60d027c703ed2292f8b Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Thu, 18 Jun 2020 12:21:54 -0400 Subject: [PATCH] Use sensible caching for current domain --- CRM/Core/BAO/Domain.php | 56 ++++++++++------------ CRM/Core/BAO/FinancialTrxn.php | 2 +- CRM/Core/BAO/Location.php | 5 +- CRM/Core/I18n.php | 13 ++--- CRM/Financial/BAO/FinancialTypeAccount.php | 2 +- CRM/Financial/Form/FinancialAccount.php | 2 +- CRM/Utils/Token.php | 4 +- Civi/Core/Container.php | 1 + tests/phpunit/CRM/Core/DAOTest.php | 4 +- 9 files changed, 40 insertions(+), 49 deletions(-) diff --git a/CRM/Core/BAO/Domain.php b/CRM/Core/BAO/Domain.php index 264e3ad4af..d65de0c187 100644 --- a/CRM/Core/BAO/Domain.php +++ b/CRM/Core/BAO/Domain.php @@ -20,18 +20,22 @@ */ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain { - /** - * Cache for the current domain object. - * @var object - */ - public static $_domain = NULL; - /** * Cache for a domain's location array * @var array */ private $_location = NULL; + /** + * Flushes the cache set by getDomain. + * + * @see CRM_Core_BAO_Domain::getDomain() + * @param CRM_Core_DAO_Domain $domain + */ + public static function onPostSave($domain) { + Civi::$statics[__CLASS__]['current'] = NULL; + } + /** * Fetch object based on array of properties. * @@ -47,21 +51,20 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain { } /** - * Get the domain BAO. - * - * @param bool $reset + * Get the current domain. * * @return \CRM_Core_BAO_Domain * @throws \CRM_Core_Exception */ - public static function getDomain($reset = NULL) { - static $domain = NULL; - if (!$domain || $reset) { + public static function getDomain() { + $domain = Civi::$statics[__CLASS__]['current'] ?? NULL; + if (!$domain) { $domain = new CRM_Core_BAO_Domain(); $domain->id = CRM_Core_Config::domainID(); if (!$domain->find(TRUE)) { throw new CRM_Core_Exception('No domain in DB'); } + Civi::$statics[__CLASS__]['current'] = $domain; } return $domain; } @@ -69,17 +72,16 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain { /** * @param bool $skipUsingCache * - * @return null|string + * @return string * * @throws \CRM_Core_Exception */ public static function version($skipUsingCache = FALSE) { - return CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain', - CRM_Core_Config::domainID(), - 'version', - 'id', - $skipUsingCache - ); + if ($skipUsingCache) { + Civi::$statics[__CLASS__]['current'] = NULL; + } + + return self::getDomain()->version; } /** @@ -90,7 +92,7 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain { * @throws \CRM_Core_Exception */ public static function isDBUpdateRequired() { - $dbVersion = CRM_Core_BAO_Domain::version(); + $dbVersion = self::version(); $codeVersion = CRM_Utils_System::version(); return version_compare($dbVersion, $codeVersion) < 0; } @@ -108,16 +110,12 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain { /** * Get the location values of a domain. * - * @return array - * Location::getValues - * - * @throws \CRM_Core_Exception + * @return CRM_Core_BAO_Location[]|NULL */ - public function &getLocationValues() { + public function getLocationValues() { if ($this->_location == NULL) { - $domain = self::getDomain(NULL); $params = [ - 'contact_id' => $domain->contact_id, + 'contact_id' => $this->contact_id, ]; $this->_location = CRM_Core_BAO_Location::getValues($params, TRUE); @@ -242,9 +240,7 @@ class CRM_Core_BAO_Domain extends CRM_Core_DAO_Domain { } elseif ($multisite) { // create a group with that of domain name - $title = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain', - CRM_Core_Config::domainID(), 'name' - ); + $title = self::getDomain()->name; $groupID = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Group', $title, 'id', 'title', TRUE ); diff --git a/CRM/Core/BAO/FinancialTrxn.php b/CRM/Core/BAO/FinancialTrxn.php index e4aeae7bd2..0e1499e208 100644 --- a/CRM/Core/BAO/FinancialTrxn.php +++ b/CRM/Core/BAO/FinancialTrxn.php @@ -415,7 +415,7 @@ WHERE ceft.entity_id = %1"; $fItemParams = [ 'financial_account_id' => $financialAccount, - 'contact_id' => CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain', CRM_Core_Config::domainID(), 'contact_id'), + 'contact_id' => CRM_Core_BAO_Domain::getDomain()->contact_id, 'created_date' => date('YmdHis'), 'transaction_date' => $params['trxnParams']['trxn_date'], 'amount' => $amount, diff --git a/CRM/Core/BAO/Location.php b/CRM/Core/BAO/Location.php index e2d393976c..6af1d85bc8 100644 --- a/CRM/Core/BAO/Location.php +++ b/CRM/Core/BAO/Location.php @@ -226,10 +226,9 @@ WHERE e.id = %1"; * @param array $entityBlock * @param bool $microformat * - * @return array - * array of objects(CRM_Core_BAO_Location) + * @return CRM_Core_BAO_Location[]|NULL */ - public static function &getValues($entityBlock, $microformat = FALSE) { + public static function getValues($entityBlock, $microformat = FALSE) { if (empty($entityBlock)) { return NULL; } diff --git a/CRM/Core/I18n.php b/CRM/Core/I18n.php index 546802dd8b..0c560c8723 100644 --- a/CRM/Core/I18n.php +++ b/CRM/Core/I18n.php @@ -590,10 +590,8 @@ class CRM_Core_I18n { * True if CiviCRM is in multilingual mode. */ public static function isMultilingual() { - return (bool) CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain', - CRM_Core_Config::domainID(), - 'locales' - ); + $domain = CRM_Core_BAO_Domain::getDomain(); + return (bool) $domain->locales; } /** @@ -602,11 +600,8 @@ class CRM_Core_I18n { * @return array|bool */ public static function getMultilingual() { - $locales = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain', - CRM_Core_Config::domainID(), - 'locales' - ); - return $locales ? CRM_Core_DAO::unSerializeField($locales, CRM_Core_DAO::SERIALIZE_SEPARATOR_TRIMMED) : FALSE; + $domain = CRM_Core_BAO_Domain::getDomain(); + return $domain->locales ? CRM_Core_DAO::unSerializeField($domain->locales, CRM_Core_DAO::SERIALIZE_SEPARATOR_TRIMMED) : FALSE; } /** diff --git a/CRM/Financial/BAO/FinancialTypeAccount.php b/CRM/Financial/BAO/FinancialTypeAccount.php index 87ff4c19ac..17be41a408 100644 --- a/CRM/Financial/BAO/FinancialTypeAccount.php +++ b/CRM/Financial/BAO/FinancialTypeAccount.php @@ -190,7 +190,7 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin if (!$dao->N) { $params = [ 'name' => $financialType->name, - 'contact_id' => CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain', CRM_Core_Config::domainID(), 'contact_id'), + 'contact_id' => CRM_Core_BAO_Domain::getDomain()->contact_id, 'financial_account_type_id' => array_search('Revenue', $financialAccountTypeID), 'description' => $financialType->description, 'account_type_code' => 'INC', diff --git a/CRM/Financial/Form/FinancialAccount.php b/CRM/Financial/Form/FinancialAccount.php index a99ed8f997..860d210037 100644 --- a/CRM/Financial/Form/FinancialAccount.php +++ b/CRM/Financial/Form/FinancialAccount.php @@ -160,7 +160,7 @@ class CRM_Financial_Form_FinancialAccount extends CRM_Contribute_Form { public function setDefaultValues() { $defaults = parent::setDefaultValues(); if ($this->_action & CRM_Core_Action::ADD) { - $defaults['contact_id'] = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Domain', CRM_Core_Config::domainID(), 'contact_id'); + $defaults['contact_id'] = CRM_Core_BAO_Domain::getDomain()->contact_id; } return $defaults; } diff --git a/CRM/Utils/Token.php b/CRM/Utils/Token.php index 7439473c7a..d3774f5d68 100644 --- a/CRM/Utils/Token.php +++ b/CRM/Utils/Token.php @@ -250,7 +250,7 @@ class CRM_Utils_Token { /** * @param $token - * @param $domain + * @param CRM_Core_BAO_Domain $domain * @param bool $html * @param bool $escapeSmarty * @@ -261,7 +261,7 @@ class CRM_Utils_Token { // we have to do this because this function is // called only when we find a token in the string - $loc = &$domain->getLocationValues(); + $loc = $domain->getLocationValues(); if (!in_array($token, self::$_tokens['domain'])) { $value = "{domain.$token}"; diff --git a/Civi/Core/Container.php b/Civi/Core/Container.php index 9b0d6848c8..617b6dee2c 100644 --- a/Civi/Core/Container.php +++ b/Civi/Core/Container.php @@ -356,6 +356,7 @@ class Container { $dispatcher->addListener('civi.dao.postInsert', ['\CRM_Core_BAO_RecurringEntity', 'triggerInsert']); $dispatcher->addListener('civi.dao.postUpdate', ['\CRM_Core_BAO_RecurringEntity', 'triggerUpdate']); $dispatcher->addListener('civi.dao.postDelete', ['\CRM_Core_BAO_RecurringEntity', 'triggerDelete']); + $dispatcher->addListener('hook_civicrm_postSave_civicrm_domain', ['\CRM_Core_BAO_Domain', 'onPostSave']); $dispatcher->addListener('hook_civicrm_unhandled_exception', [ 'CRM_Core_LegacyErrorHandler', 'handleException', diff --git a/tests/phpunit/CRM/Core/DAOTest.php b/tests/phpunit/CRM/Core/DAOTest.php index d1eb22eaa5..ed008287ed 100644 --- a/tests/phpunit/CRM/Core/DAOTest.php +++ b/tests/phpunit/CRM/Core/DAOTest.php @@ -518,14 +518,14 @@ class CRM_Core_DAOTest extends CiviUnitTestCase { public function testSupportedFields() { // Hack a different db version which will trigger getSupportedFields to filter out newer fields - \CRM_Core_DAO::$_dbColumnValueCache['CRM_Core_DAO_Domain']['id'][1]['version'] = '5.26.0'; + CRM_Core_BAO_Domain::getDomain()->version = '5.26.0'; $customGroupFields = CRM_Core_DAO_CustomGroup::getSupportedFields(); // 'icon' was added in 5.28 $this->assertArrayNotHasKey('icon', $customGroupFields); // Remove domain version override: - \CRM_Core_DAO::$_dbColumnValueCache = NULL; + CRM_Core_BAO_Domain::version(TRUE); $activityFields = CRM_Activity_DAO_Activity::getSupportedFields(); // Fields should be indexed by name not unique_name (which is "activity_id") -- 2.25.1