Skip to content

Commit 56bfd2c

Browse files
committed
no insert statement if data already exist
Signed-off-by: Maxence Lange <[email protected]>
1 parent 250084f commit 56bfd2c

1 file changed

Lines changed: 34 additions & 23 deletions

File tree

lib/private/AppConfig.php

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -731,32 +731,43 @@ private function setTypedValue(
731731
$this->loadConfig($lazy);
732732

733733
$sensitive = $this->isTyped(self::VALUE_SENSITIVE, $type);
734+
$inserted = $refreshCache = false;
734735

735-
/*
736-
* no update if key is already known with set lazy status, or value is
737-
* different, or sensitivity switched from false to true.
738-
*/
739-
if ($this->hasKey($app, $key, $lazy)
740-
&& $value === $this->getTypedValue($app, $key, $value, $lazy, $type)
741-
&& (!$sensitive || $this->isSensitive($app, $key, $lazy))) {
742-
return false;
743-
}
744-
745-
$refreshCache = false;
746-
$insert = $this->connection->getQueryBuilder();
747-
$insert->insert('appconfig')
748-
->setValue('appid', $insert->createNamedParameter($app))
749-
->setValue('lazy', $insert->createNamedParameter(($lazy) ? 1 : 0, IQueryBuilder::PARAM_INT))
750-
->setValue('type', $insert->createNamedParameter($type, IQueryBuilder::PARAM_INT))
751-
->setValue('configkey', $insert->createNamedParameter($key))
752-
->setValue('configvalue', $insert->createNamedParameter($value));
753-
try {
754-
$insert->executeStatement();
755-
} catch (DBException $e) {
756-
if ($e->getReason() !== DBException::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
757-
throw $e; // TODO: throw exception or just log and returns false !?
736+
if ($this->hasKey($app, $key, $lazy)) {
737+
/**
738+
* no update if key is already known with set lazy status and value is
739+
* not different, unless sensitivity is switched from false to true.
740+
*/
741+
if ($value === $this->getTypedValue($app, $key, $value, $lazy, $type)
742+
&& (!$sensitive || $this->isSensitive($app, $key, $lazy))) {
743+
return false;
758744
}
745+
} else {
746+
/**
747+
* if key is not known yet, we try to insert.
748+
* It might fail if the key exists with a different lazy flag.
749+
*/
750+
try {
751+
$insert = $this->connection->getQueryBuilder();
752+
$insert->insert('appconfig')
753+
->setValue('appid', $insert->createNamedParameter($app))
754+
->setValue('lazy', $insert->createNamedParameter(($lazy) ? 1 : 0, IQueryBuilder::PARAM_INT))
755+
->setValue('type', $insert->createNamedParameter($type, IQueryBuilder::PARAM_INT))
756+
->setValue('configkey', $insert->createNamedParameter($key))
757+
->setValue('configvalue', $insert->createNamedParameter($value));
758+
$insert->executeStatement();
759+
$inserted = true;
760+
} catch (DBException $e) {
761+
if ($e->getReason() !== DBException::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
762+
throw $e; // TODO: throw exception or just log and returns false !?
763+
}
764+
}
765+
}
759766

767+
/**
768+
* We cannot insert a new row, meaning we need to update an already existing one
769+
*/
770+
if (!$inserted) {
760771
$currType = $this->valueTypes[$app][$key] ?? 0;
761772
if ($currType === 0) { // this might happen when switching lazy loading status
762773
$this->loadConfigAll();

0 commit comments

Comments
 (0)