diff --git a/src/Console/Maintenance.php b/src/Console/Maintenance.php index 6a11eb2bb5..076b89db82 100644 --- a/src/Console/Maintenance.php +++ b/src/Console/Maintenance.php @@ -100,7 +100,7 @@ HELP; $enabled = intval($this->getArgument(0)); - $transactionConfig = $this->config->transactional(); + $transactionConfig = $this->config->beginTransaction(); $transactionConfig->set('system', 'maintenance', $enabled); @@ -112,7 +112,7 @@ HELP; $transactionConfig->delete('system', 'maintenance_reason'); } - $transactionConfig->save(); + $transactionConfig->commit(); if ($enabled) { $mode_str = "maintenance mode"; diff --git a/src/Console/Relocate.php b/src/Console/Relocate.php index 7a2ef1d071..c63434cbb7 100644 --- a/src/Console/Relocate.php +++ b/src/Console/Relocate.php @@ -101,9 +101,10 @@ HELP; $old_host = str_replace('http://', '@', Strings::normaliseLink($old_url)); $this->out('Entering maintenance mode'); - $this->config->set('system', 'maintenance', true, false); - $this->config->set('system', 'maintenance_reason', 'Relocating node to ' . $new_url, false); - + $this->config->beginTransaction() + ->set('system', 'maintenance', true) + ->set('system', 'maintenance_reason', 'Relocating node to ' . $new_url) + ->commit(); try { if (!$this->database->transaction()) { throw new \Exception('Unable to start a transaction, please retry later.'); @@ -189,10 +190,10 @@ HELP; return 1; } finally { $this->out('Leaving maintenance mode'); - $this->config->transactional() + $this->config->beginTransaction() ->set('system', 'maintenance', false) ->delete('system', 'maintenance_reason') - ->save(); + ->commit(); } // send relocate diff --git a/src/Core/Config/Capability/IManageConfigValues.php b/src/Core/Config/Capability/IManageConfigValues.php index 42ebea0004..715887ddf3 100644 --- a/src/Core/Config/Capability/IManageConfigValues.php +++ b/src/Core/Config/Capability/IManageConfigValues.php @@ -94,9 +94,9 @@ interface IManageConfigValues * * It relies on the current instance, so after save(), the values of this config class will get altered at once too. * - * @return ISetConfigValuesTransactional + * @return ISetConfigValuesTransactionally */ - public function transactional(): ISetConfigValuesTransactional; + public function beginTransaction(): ISetConfigValuesTransactionally; /** * Deletes the given key from the system configuration. diff --git a/src/Core/Config/Capability/ISetConfigValuesTransactional.php b/src/Core/Config/Capability/ISetConfigValuesTransactionally.php similarity index 95% rename from src/Core/Config/Capability/ISetConfigValuesTransactional.php rename to src/Core/Config/Capability/ISetConfigValuesTransactionally.php index 9c58427a04..ae193f2ce2 100644 --- a/src/Core/Config/Capability/ISetConfigValuesTransactional.php +++ b/src/Core/Config/Capability/ISetConfigValuesTransactionally.php @@ -27,7 +27,7 @@ use Friendica\Core\Config\Exception\ConfigPersistenceException; * Interface for transactional saving of config values * It buffers every set/delete until "save()" is called */ -interface ISetConfigValuesTransactional +interface ISetConfigValuesTransactionally { /** * Get a particular user's config variable given the category name @@ -76,9 +76,9 @@ interface ISetConfigValuesTransactional public function delete(string $cat, string $key): self; /** - * Saves the node specific config values + * Commits the changes of the current transaction * * @throws ConfigPersistenceException In case the persistence layer throws errors */ - public function save(): void; + public function commit(): void; } diff --git a/src/Core/Config/Model/Config.php b/src/Core/Config/Model/Config.php index 24f5fd3b59..29ea6b12d3 100644 --- a/src/Core/Config/Model/Config.php +++ b/src/Core/Config/Model/Config.php @@ -22,7 +22,7 @@ namespace Friendica\Core\Config\Model; use Friendica\Core\Config\Capability\IManageConfigValues; -use Friendica\Core\Config\Capability\ISetConfigValuesTransactional; +use Friendica\Core\Config\Capability\ISetConfigValuesTransactionally; use Friendica\Core\Config\Exception\ConfigFileException; use Friendica\Core\Config\Exception\ConfigPersistenceException; use Friendica\Core\Config\Util\ConfigFileManager; @@ -63,9 +63,9 @@ class Config implements IManageConfigValues } /** {@inheritDoc} */ - public function transactional(): ISetConfigValuesTransactional + public function beginTransaction(): ISetConfigValuesTransactionally { - return new TransactionalConfig($this); + return new ConfigTransaction($this); } /** diff --git a/src/Core/Config/Model/TransactionalConfig.php b/src/Core/Config/Model/ConfigTransaction.php similarity index 90% rename from src/Core/Config/Model/TransactionalConfig.php rename to src/Core/Config/Model/ConfigTransaction.php index e9aa71160f..7ec5784ad2 100644 --- a/src/Core/Config/Model/TransactionalConfig.php +++ b/src/Core/Config/Model/ConfigTransaction.php @@ -22,14 +22,14 @@ namespace Friendica\Core\Config\Model; use Friendica\Core\Config\Capability\IManageConfigValues; -use Friendica\Core\Config\Capability\ISetConfigValuesTransactional; +use Friendica\Core\Config\Capability\ISetConfigValuesTransactionally; 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 + * Transaction class for configurations, which sets values into a temporary buffer until "save()" is called */ -class TransactionalConfig implements ISetConfigValuesTransactional +class ConfigTransaction implements ISetConfigValuesTransactionally { /** @var IManageConfigValues */ protected $config; @@ -54,7 +54,7 @@ class TransactionalConfig implements ISetConfigValuesTransactional } /** {@inheritDoc} */ - public function set(string $cat, string $key, $value): ISetConfigValuesTransactional + public function set(string $cat, string $key, $value): ISetConfigValuesTransactionally { $this->cache->set($cat, $key, $value, Cache::SOURCE_DATA); @@ -63,7 +63,7 @@ class TransactionalConfig implements ISetConfigValuesTransactional /** {@inheritDoc} */ - public function delete(string $cat, string $key): ISetConfigValuesTransactional + public function delete(string $cat, string $key): ISetConfigValuesTransactionally { $this->cache->delete($cat, $key); $this->delCache->set($cat, $key, 'deleted'); @@ -72,7 +72,7 @@ class TransactionalConfig implements ISetConfigValuesTransactional } /** {@inheritDoc} */ - public function save(): void + public function commit(): void { try { $newCache = $this->config->getCache()->merge($this->cache); diff --git a/src/Core/Config/ValueObject/Cache.php b/src/Core/Config/ValueObject/Cache.php index 305c00d330..b5af3280c0 100644 --- a/src/Core/Config/ValueObject/Cache.php +++ b/src/Core/Config/ValueObject/Cache.php @@ -332,10 +332,8 @@ class Cache $keys = array_keys($cache->config[$category]); foreach ($keys as $key) { - if (!is_null($newConfig[$category][$key] ?? null)) { - unset($newConfig[$category][$key]); - unset($newSource[$category][$key]); - } + unset($newConfig[$category][$key]); + unset($newSource[$category][$key]); } } } diff --git a/src/Core/Update.php b/src/Core/Update.php index a026457833..e5ee587dc1 100644 --- a/src/Core/Update.php +++ b/src/Core/Update.php @@ -160,10 +160,10 @@ class Update Logger::warning('Pre update failed', ['version' => $version]); DI::config()->set('system', 'update', Update::FAILED); DI::lock()->release('dbupdate'); - DI::config()->transactional() + DI::config()->beginTransaction() ->set('system', 'maintenance', false) ->delete('system', 'maintenance_reason') - ->save(); + ->commit(); return $r; } else { Logger::notice('Pre update executed.', ['version' => $version]); @@ -183,10 +183,10 @@ class Update Logger::error('Update ERROR.', ['from' => $stored, 'to' => $current, 'retval' => $retval]); DI::config()->set('system', 'update', Update::FAILED); DI::lock()->release('dbupdate'); - DI::config()->transactional() + DI::config()->beginTransaction() ->set('system', 'maintenance', false) ->delete('system', 'maintenance_reason') - ->save(); + ->commit(); return $retval; } else { Logger::notice('Database structure update finished.', ['from' => $stored, 'to' => $current]); @@ -202,10 +202,10 @@ class Update Logger::warning('Post update failed', ['version' => $version]); DI::config()->set('system', 'update', Update::FAILED); DI::lock()->release('dbupdate'); - DI::config()->transactional() + DI::config()->beginTransaction() ->set('system', 'maintenance', false) ->delete('system', 'maintenance_reason') - ->save(); + ->commit(); return $r; } else { DI::config()->set('system', 'build', $version); @@ -216,10 +216,10 @@ class Update DI::config()->set('system', 'build', $current); DI::config()->set('system', 'update', Update::SUCCESS); DI::lock()->release('dbupdate'); - DI::config()->transactional() + DI::config()->beginTransaction() ->set('system', 'maintenance', false) ->delete('system', 'maintenance_reason') - ->save(); + ->commit(); Logger::notice('Update success.', ['from' => $stored, 'to' => $current]); if ($sendMail) { diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index ed2a5e30e7..7b284bf6d5 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -182,10 +182,10 @@ class DBStructure $status = self::update($verbose, true); if ($enable_maintenance_mode) { - DI::config()->transactional() + DI::config()->beginTransaction() ->set('system', 'maintenance', false) ->delete('system', 'maintenance_reason') - ->save(); + ->commit(); } return $status; diff --git a/src/Module/Admin/Site.php b/src/Module/Admin/Site.php index 50a7ee8686..39dc9f26da 100644 --- a/src/Module/Admin/Site.php +++ b/src/Module/Admin/Site.php @@ -144,7 +144,7 @@ class Site extends BaseAdmin $relay_user_tags = !empty($_POST['relay_user_tags']); $active_panel = (!empty($_POST['active_panel']) ? "#" . trim($_POST['active_panel']) : ''); - $transactionConfig = DI::config()->transactional(); + $transactionConfig = DI::config()->beginTransaction(); // Has the directory url changed? If yes, then resubmit the existing profiles there if ($global_directory != DI::config()->get('system', 'directory') && ($global_directory != '')) { @@ -320,7 +320,7 @@ class Site extends BaseAdmin $transactionConfig->set('system', 'relay_deny_tags' , $relay_deny_tags); $transactionConfig->set('system', 'relay_user_tags' , $relay_user_tags); - $transactionConfig->save(); + $transactionConfig->commit(); DI::baseUrl()->redirect('admin/site' . $active_panel); } diff --git a/tests/src/Core/Config/Cache/CacheTest.php b/tests/src/Core/Config/Cache/CacheTest.php index 9d72774c40..2db6196b7b 100644 --- a/tests/src/Core/Config/Cache/CacheTest.php +++ b/tests/src/Core/Config/Cache/CacheTest.php @@ -369,16 +369,20 @@ class CacheTest extends MockedTest $configCache->set('system', 'test_2','with_data', Cache::SOURCE_DATA); $configCache->set('config', 'test_override','with_another_data', Cache::SOURCE_DATA); + $configCache->set('old_category', 'test_45','given category', Cache::SOURCE_DATA); $newCache = new Cache(); $newCache->set('config', 'test_override','override it again', Cache::SOURCE_DATA); $newCache->set('system', 'test_3','new value', Cache::SOURCE_DATA); + $newCache->set('new_category', 'test_23','added category', Cache::SOURCE_DATA); $mergedCache = $configCache->merge($newCache); self::assertEquals('with_data', $mergedCache->get('system', 'test_2')); self::assertEquals('override it again', $mergedCache->get('config', 'test_override')); self::assertEquals('new value', $mergedCache->get('system', 'test_3')); + self::assertEquals('given category', $mergedCache->get('old_category', 'test_45')); + self::assertEquals('added category', $mergedCache->get('new_category', 'test_23')); } /** diff --git a/tests/src/Core/Config/TransactionalConfigTest.php b/tests/src/Core/Config/ConfigTransactionTest.php similarity index 66% rename from tests/src/Core/Config/TransactionalConfigTest.php rename to tests/src/Core/Config/ConfigTransactionTest.php index e2fdc633cb..2eec9b68f3 100644 --- a/tests/src/Core/Config/TransactionalConfigTest.php +++ b/tests/src/Core/Config/ConfigTransactionTest.php @@ -2,15 +2,15 @@ namespace Friendica\Test\src\Core\Config; -use Friendica\Core\Config\Capability\ISetConfigValuesTransactional; +use Friendica\Core\Config\Capability\ISetConfigValuesTransactionally; use Friendica\Core\Config\Model\Config; -use Friendica\Core\Config\Model\TransactionalConfig; +use Friendica\Core\Config\Model\ConfigTransaction; use Friendica\Core\Config\Util\ConfigFileManager; use Friendica\Core\Config\ValueObject\Cache; use Friendica\Test\MockedTest; use Friendica\Test\Util\VFSTrait; -class TransactionalConfigTest extends MockedTest +class ConfigTransactionTest extends MockedTest { use VFSTrait; @@ -37,14 +37,14 @@ class TransactionalConfigTest extends MockedTest public function testInstance() { - $config = new Config($this->configFileManager, new Cache()); - $transactionalConfig = new TransactionalConfig($config); + $config = new Config($this->configFileManager, new Cache()); + $configTransaction = new ConfigTransaction($config); - self::assertInstanceOf(ISetConfigValuesTransactional::class, $transactionalConfig); - self::assertInstanceOf(TransactionalConfig::class, $transactionalConfig); + self::assertInstanceOf(ISetConfigValuesTransactionally::class, $configTransaction); + self::assertInstanceOf(ConfigTransaction::class, $configTransaction); } - public function testTransactionalConfig() + public function testConfigTransaction() { $config = new Config($this->configFileManager, new Cache()); $config->set('config', 'key1', 'value1'); @@ -52,24 +52,24 @@ class TransactionalConfigTest extends MockedTest $config->set('system', 'keyDel', 'valueDel'); $config->set('delete', 'keyDel', 'catDel'); - $transactionalConfig = new TransactionalConfig($config); - self::assertEquals('value1', $transactionalConfig->get('config', 'key1')); - self::assertEquals('value2', $transactionalConfig->get('system', 'key2')); - self::assertEquals('valueDel', $transactionalConfig->get('system', 'keyDel')); - self::assertEquals('catDel', $transactionalConfig->get('delete', 'keyDel')); + $configTransaction = new ConfigTransaction($config); + self::assertEquals('value1', $configTransaction->get('config', 'key1')); + self::assertEquals('value2', $configTransaction->get('system', 'key2')); + self::assertEquals('valueDel', $configTransaction->get('system', 'keyDel')); + self::assertEquals('catDel', $configTransaction->get('delete', 'keyDel')); // the config file knows it as well immediately $tempData = include $this->root->url() . '/config/' . ConfigFileManager::CONFIG_DATA_FILE; self::assertEquals('value1', $tempData['config']['key1'] ?? null); self::assertEquals('value2', $tempData['system']['key2'] ?? null); // new key-value - $transactionalConfig->set('transaction', 'key3', 'value3'); + $configTransaction->set('transaction', 'key3', 'value3'); // overwrite key-value - $transactionalConfig->set('config', 'key1', 'changedValue1'); + $configTransaction->set('config', 'key1', 'changedValue1'); // delete key-value - $transactionalConfig->delete('system', 'keyDel'); + $configTransaction->delete('system', 'keyDel'); // delete last key of category - so the category is gone - $transactionalConfig->delete('delete', 'keyDel'); + $configTransaction->delete('delete', 'keyDel'); // The main config still doesn't know about the change self::assertNull($config->get('transaction', 'key3')); @@ -77,10 +77,10 @@ class TransactionalConfigTest extends MockedTest self::assertEquals('valueDel', $config->get('system', 'keyDel')); self::assertEquals('catDel', $config->get('delete', 'keyDel')); // but the transaction config of course knows it - self::assertEquals('value3', $transactionalConfig->get('transaction', 'key3')); - self::assertEquals('changedValue1', $transactionalConfig->get('config', 'key1')); - self::assertNull($transactionalConfig->get('system', 'keyDel')); - self::assertNull($transactionalConfig->get('delete', 'keyDel')); + self::assertEquals('value3', $configTransaction->get('transaction', 'key3')); + self::assertEquals('changedValue1', $configTransaction->get('config', 'key1')); + self::assertNull($configTransaction->get('system', 'keyDel')); + self::assertNull($configTransaction->get('delete', 'keyDel')); // The config file still doesn't know it either $tempData = include $this->root->url() . '/config/' . ConfigFileManager::CONFIG_DATA_FILE; self::assertEquals('value1', $tempData['config']['key1'] ?? null); @@ -89,16 +89,16 @@ class TransactionalConfigTest extends MockedTest self::assertNull($tempData['transaction']['key3'] ?? null); // save it back! - $transactionalConfig->save(); + $configTransaction->commit(); // Now every config and file knows the change self::assertEquals('changedValue1', $config->get('config', 'key1')); self::assertEquals('value3', $config->get('transaction', 'key3')); self::assertNull($config->get('system', 'keyDel')); self::assertNull($config->get('delete', 'keyDel')); - self::assertEquals('value3', $transactionalConfig->get('transaction', 'key3')); - self::assertEquals('changedValue1', $transactionalConfig->get('config', 'key1')); - self::assertNull($transactionalConfig->get('system', 'keyDel')); + self::assertEquals('value3', $configTransaction->get('transaction', 'key3')); + self::assertEquals('changedValue1', $configTransaction->get('config', 'key1')); + self::assertNull($configTransaction->get('system', 'keyDel')); $tempData = include $this->root->url() . '/config/' . ConfigFileManager::CONFIG_DATA_FILE; self::assertEquals('changedValue1', $tempData['config']['key1'] ?? null); self::assertEquals('value2', $tempData['system']['key2'] ?? null); diff --git a/update.php b/update.php index 7ad6e432fe..1dbf78e06f 100644 --- a/update.php +++ b/update.php @@ -1184,13 +1184,13 @@ function update_1508() { $config = DBA::selectToArray('config'); - $newConfig = DI::config()->transactional(); + $newConfig = DI::config()->beginTransaction(); foreach ($config as $entry) { $newConfig->set($entry['cat'], $entry['k'], $entry['v']); } - $newConfig->save(); + $newConfig->commit(); - DBA::e("DELETE FROM `config`"); + DBA::e("TRUNCATE TABLE `config`"); } diff --git a/view/theme/frio/style.php b/view/theme/frio/style.php index 8feefdc930..479793b596 100644 --- a/view/theme/frio/style.php +++ b/view/theme/frio/style.php @@ -49,7 +49,7 @@ $login_bg_color = ''; $modified = time(); if (DI::mode()->has(\Friendica\App\Mode::MAINTENANCEDISABLED)) { - DI::config()->reload('frio'); + DI::config()->reload(); // Default to hard-coded values for empty settings $scheme = DI::config()->get('frio', 'scheme', DI::config()->get('frio', 'schema'));