diff --git a/src/sql.rs b/src/sql.rs index 82199c1d3..51b1d422b 100644 --- a/src/sql.rs +++ b/src/sql.rs @@ -572,22 +572,13 @@ impl Sql { pub async fn set_raw_config(&self, key: &str, value: Option<&str>) -> Result<()> { let mut lock = self.config_cache.write().await; if let Some(value) = value { - let exists = self - .exists("SELECT COUNT(*) FROM config WHERE keyname=?;", (key,)) - .await?; - - if exists { - self.execute("UPDATE config SET value=? WHERE keyname=?;", (value, key)) - .await?; - } else { - self.execute( - "INSERT INTO config (keyname, value) VALUES (?, ?);", - (key, value), - ) - .await?; - } + self.execute( + "INSERT OR REPLACE INTO config (keyname, value) VALUES (?, ?)", + (key, value), + ) + .await?; } else { - self.execute("DELETE FROM config WHERE keyname=?;", (key,)) + self.execute("DELETE FROM config WHERE keyname=?", (key,)) .await?; } lock.insert(key.to_string(), value.map(|s| s.to_string())); @@ -608,7 +599,7 @@ impl Sql { let mut lock = self.config_cache.write().await; let value = self - .query_get_value("SELECT value FROM config WHERE keyname=?;", (key,)) + .query_get_value("SELECT value FROM config WHERE keyname=?", (key,)) .await .context(format!("failed to fetch raw config: {key}"))?; lock.insert(key.to_string(), value.clone()); diff --git a/src/sql/migrations.rs b/src/sql/migrations.rs index 77dec99d8..d0cf51b5b 100644 --- a/src/sql/migrations.rs +++ b/src/sql/migrations.rs @@ -785,6 +785,25 @@ CREATE INDEX msgs_status_updates_index2 ON msgs_status_updates (uid); .await?; } + if dbversion < 106 { + // Recreate `config` table with UNIQUE constraint on `keyname`. + sql.execute_migration( + "CREATE TABLE new_config ( + id INTEGER PRIMARY KEY, + keyname TEXT UNIQUE, + value TEXT NOT NULL + ); + INSERT OR IGNORE INTO new_config SELECT + id, keyname, value + FROM config; + DROP TABLE config; + ALTER TABLE new_config RENAME TO config; + CREATE INDEX config_index1 ON config (keyname);", + 106, + ) + .await?; + } + let new_version = sql .get_raw_config_int(VERSION_CFG) .await?