. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\Utils\Metadata; use Espo\Core\InjectableFactory; use Espo\Core\Utils\Config; use Espo\Core\Utils\Database\Orm\Converter; use Espo\Core\Utils\DataCache; use Espo\Core\Utils\Util; class OrmMetadataData { /** @var ?array> */ private $data = null; private string $cacheKey = 'ormMetadata'; private bool $useCache; private ?Converter $converter = null; public function __construct( private DataCache $dataCache, private InjectableFactory $injectableFactory, Config\SystemConfig $systemConfig, ) { $this->useCache = $systemConfig->useCache(); } private function getConverter(): Converter { if (!isset($this->converter)) { $this->converter = $this->injectableFactory->create(Converter::class); } return $this->converter; } /** * Reloads data. */ public function reload(): void { $this->getDataInternal(true); } /** * Get raw data. * * @return array> */ public function getData(): array { return $this->getDataInternal(); } /** * @return array> */ private function getDataInternal(bool $reload = false): array { if (isset($this->data) && !$reload) { return $this->data; } if ($this->useCache && $this->dataCache->has($this->cacheKey) && !$reload) { /** @var array> $data */ $data = $this->dataCache->get($this->cacheKey); $this->data = $data; return $this->data; } $this->data = $this->getConverter()->process(); if ($this->useCache) { $this->dataCache->store($this->cacheKey, $this->data); } return $this->data; } /** * @param string|string[]|null $key * @param mixed $default * @return mixed */ public function get($key = null, $default = null) { return Util::getValueByKey($this->getData(), $key, $default); } }