Just commit config transactions if something changed
This commit is contained in:
parent
aabe39220d
commit
dce86be58e
3 changed files with 34 additions and 8 deletions
|
@ -175,35 +175,28 @@ class BaseURL
|
||||||
$currUrl = $this->url;
|
$currUrl = $this->url;
|
||||||
|
|
||||||
$configTransaction = $this->config->beginTransaction();
|
$configTransaction = $this->config->beginTransaction();
|
||||||
$savable = false;
|
|
||||||
|
|
||||||
if (!empty($hostname) && $hostname !== $this->hostname) {
|
if (!empty($hostname) && $hostname !== $this->hostname) {
|
||||||
$configTransaction->set('config', 'hostname', $hostname);
|
$configTransaction->set('config', 'hostname', $hostname);
|
||||||
$this->hostname = $hostname;
|
$this->hostname = $hostname;
|
||||||
$savable = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($sslPolicy) && $sslPolicy !== $this->sslPolicy) {
|
if (isset($sslPolicy) && $sslPolicy !== $this->sslPolicy) {
|
||||||
$configTransaction->set('system', 'ssl_policy', $sslPolicy);
|
$configTransaction->set('system', 'ssl_policy', $sslPolicy);
|
||||||
$this->sslPolicy = $sslPolicy;
|
$this->sslPolicy = $sslPolicy;
|
||||||
$savable = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($urlPath) && $urlPath !== $this->urlPath) {
|
if (isset($urlPath) && $urlPath !== $this->urlPath) {
|
||||||
$configTransaction->set('system', 'urlpath', $urlPath);
|
$configTransaction->set('system', 'urlpath', $urlPath);
|
||||||
$this->urlPath = $urlPath;
|
$this->urlPath = $urlPath;
|
||||||
$savable = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->determineBaseUrl();
|
$this->determineBaseUrl();
|
||||||
if ($this->url !== $currUrl) {
|
if ($this->url !== $currUrl) {
|
||||||
$configTransaction->set('system', 'url', $this->url);
|
$configTransaction->set('system', 'url', $this->url);
|
||||||
$savable = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($savable) {
|
$configTransaction->commit();
|
||||||
$configTransaction->commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,8 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
|
||||||
protected $cache;
|
protected $cache;
|
||||||
/** @var Cache */
|
/** @var Cache */
|
||||||
protected $delCache;
|
protected $delCache;
|
||||||
|
/** @var bool field to check if something is to save */
|
||||||
|
protected $changedConfig = false;
|
||||||
|
|
||||||
public function __construct(IManageConfigValues $config)
|
public function __construct(IManageConfigValues $config)
|
||||||
{
|
{
|
||||||
|
@ -70,6 +72,7 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
|
||||||
public function set(string $cat, string $key, $value): ISetConfigValuesTransactionally
|
public function set(string $cat, string $key, $value): ISetConfigValuesTransactionally
|
||||||
{
|
{
|
||||||
$this->cache->set($cat, $key, $value, Cache::SOURCE_DATA);
|
$this->cache->set($cat, $key, $value, Cache::SOURCE_DATA);
|
||||||
|
$this->changedConfig = true;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -80,6 +83,7 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
|
||||||
{
|
{
|
||||||
$this->cache->delete($cat, $key);
|
$this->cache->delete($cat, $key);
|
||||||
$this->delCache->set($cat, $key, 'deleted');
|
$this->delCache->set($cat, $key, 'deleted');
|
||||||
|
$this->changedConfig = true;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -87,6 +91,11 @@ class ConfigTransaction implements ISetConfigValuesTransactionally
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
public function commit(): void
|
public function commit(): void
|
||||||
{
|
{
|
||||||
|
// If nothing changed, just do nothing :)
|
||||||
|
if (!$this->changedConfig) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$newCache = $this->config->getCache()->merge($this->cache);
|
$newCache = $this->config->getCache()->merge($this->cache);
|
||||||
$newCache = $newCache->diff($this->delCache);
|
$newCache = $newCache->diff($this->delCache);
|
||||||
|
|
|
@ -9,6 +9,7 @@ use Friendica\Core\Config\Util\ConfigFileManager;
|
||||||
use Friendica\Core\Config\ValueObject\Cache;
|
use Friendica\Core\Config\ValueObject\Cache;
|
||||||
use Friendica\Test\MockedTest;
|
use Friendica\Test\MockedTest;
|
||||||
use Friendica\Test\Util\VFSTrait;
|
use Friendica\Test\Util\VFSTrait;
|
||||||
|
use Mockery\Exception\InvalidCountException;
|
||||||
|
|
||||||
class ConfigTransactionTest extends MockedTest
|
class ConfigTransactionTest extends MockedTest
|
||||||
{
|
{
|
||||||
|
@ -108,4 +109,27 @@ class ConfigTransactionTest extends MockedTest
|
||||||
// the whole category should be gone
|
// the whole category should be gone
|
||||||
self::assertNull($tempData['delete'] ?? null);
|
self::assertNull($tempData['delete'] ?? null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test asserts that in empty transactions, no saveData is called, thus no config file writing was performed
|
||||||
|
*/
|
||||||
|
public function testNothingToDo()
|
||||||
|
{
|
||||||
|
$this->configFileManager = \Mockery::spy(ConfigFileManager::class);
|
||||||
|
|
||||||
|
$config = new Config($this->configFileManager, new Cache());
|
||||||
|
$configTransaction = new ConfigTransaction($config);
|
||||||
|
|
||||||
|
// commit empty transaction
|
||||||
|
$configTransaction->commit();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->configFileManager->shouldNotHaveReceived('saveData');
|
||||||
|
} catch (InvalidCountException $exception) {
|
||||||
|
self::fail($exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not failed, the test ends successfully :)
|
||||||
|
self::assertTrue(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue