@@ -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