. * */ namespace Friendica\Core\Config\Model; use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\Config\Capability\ISetConfigValuesTransactional; use Friendica\Core\Config\Exception\ConfigPersistenceException; use Friendica\Core\Config\ValueObject\Cache; /** * config class, which sets values into a temporary buffer until "save()" is called */ class TransactionalConfig implements ISetConfigValuesTransactional { /** @var IManageConfigValues */ protected $config; /** @var Cache */ protected $cache; /** @var Cache */ protected $delCache; public function __construct(IManageConfigValues $config) { $this->config = $config; $this->cache = new Cache(); $this->delCache = new Cache(); } /** {@inheritDoc} */ public function get(string $cat, string $key) { return !$this->delCache->get($cat, $key) ? ($this->cache->get($cat, $key) ?? $this->config->get($cat, $key)) : null; } /** {@inheritDoc} */ public function set(string $cat, string $key, $value): ISetConfigValuesTransactional { $this->cache->set($cat, $key, $value, Cache::SOURCE_DATA); return $this; } /** {@inheritDoc} */ public function delete(string $cat, string $key): ISetConfigValuesTransactional { $this->cache->delete($cat, $key); $this->delCache->set($cat, $key, 'deleted'); return $this; } /** {@inheritDoc} */ public function save(): void { try { $newCache = $this->config->getCache()->merge($this->cache); $newCache = $newCache->diff($this->delCache); $this->config->load($newCache); // flush current cache $this->cache = new Cache(); $this->delCache = new Cache(); } catch (\Exception $e) { throw new ConfigPersistenceException('Cannot save config', $e); } } }