aboutsummaryrefslogtreecommitdiff
path: root/src/db/sqlite_adapter.rs
diff options
context:
space:
mode:
authorJulien Kritter <julien.kritter@withings.com>2024-09-12 10:26:28 +0200
committerJulien Kritter <julien.kritter@withings.com>2024-09-12 10:26:28 +0200
commit51ced6036602826ff653c6fc283cbf11fc7b4865 (patch)
treed381b99333b55f58e5a05cbb197712ffd4ab1a43 /src/db/sqlite_adapter.rs
parent586957b4b7261b43e7820d7193516153201b4954 (diff)
downloadgarage-51ced6036602826ff653c6fc283cbf11fc7b4865.tar.gz
garage-51ced6036602826ff653c6fc283cbf11fc7b4865.zip
Don't fetch old values in cross-partition transactional inserts
Diffstat (limited to 'src/db/sqlite_adapter.rs')
-rw-r--r--src/db/sqlite_adapter.rs32
1 files changed, 9 insertions, 23 deletions
diff --git a/src/db/sqlite_adapter.rs b/src/db/sqlite_adapter.rs
index 5a142117..9c9a668d 100644
--- a/src/db/sqlite_adapter.rs
+++ b/src/db/sqlite_adapter.rs
@@ -192,7 +192,7 @@ impl IDb for SqliteDb {
let db = self.db.get()?;
let lock = self.write_lock.lock();
- let n = db.execute(&format!("DELETE FROM {} WHERE k = ?1", tree), params![key])?;
+ db.execute(&format!("DELETE FROM {} WHERE k = ?1", tree), params![key])?;
drop(lock);
Ok(())
@@ -336,31 +336,17 @@ impl<'a> ITx for SqliteTx<'a> {
}
}
- fn insert(&mut self, tree: usize, key: &[u8], value: &[u8]) -> TxOpResult<Option<Value>> {
+ fn insert(&mut self, tree: usize, key: &[u8], value: &[u8]) -> TxOpResult<()> {
let tree = self.get_tree(tree)?;
- let old_val = self.internal_get(tree, key)?;
-
- let sql = match &old_val {
- Some(_) => format!("UPDATE {} SET v = ?2 WHERE k = ?1", tree),
- None => format!("INSERT INTO {} (k, v) VALUES (?1, ?2)", tree),
- };
- let n = self.tx.execute(&sql, params![key, value])?;
- assert_eq!(n, 1);
-
- Ok(old_val)
+ let sql = format!("INSERT OR REPLACE INTO {} (k, v) VALUES (?1, ?2)", tree);
+ self.tx.execute(&sql, params![key, value])?;
+ Ok(())
}
- fn remove(&mut self, tree: usize, key: &[u8]) -> TxOpResult<Option<Value>> {
+ fn remove(&mut self, tree: usize, key: &[u8]) -> TxOpResult<()> {
let tree = self.get_tree(tree)?;
- let old_val = self.internal_get(tree, key)?;
-
- if old_val.is_some() {
- let n = self
- .tx
- .execute(&format!("DELETE FROM {} WHERE k = ?1", tree), params![key])?;
- assert_eq!(n, 1);
- }
-
- Ok(old_val)
+ self.tx
+ .execute(&format!("DELETE FROM {} WHERE k = ?1", tree), params![key])?;
+ Ok(())
}
fn clear(&mut self, tree: usize) -> TxOpResult<()> {
let tree = self.get_tree(tree)?;