fix: ensure the idx cache is cleaned on deletion, only insert if records are inserted (#2841)

This commit is contained in:
Ellie Huxtable
2025-07-24 14:29:37 +02:00
committed by GitHub
parent 0f381dd515
commit cb157f7c40

View File

@ -232,15 +232,28 @@ impl Database for Postgres {
}
async fn delete_store(&self, user: &User) -> DbResult<()> {
let mut tx = self.pool.begin().await.map_err(fix_error)?;
sqlx::query(
"delete from store
where user_id = $1",
)
.bind(user.id)
.execute(&self.pool)
.execute(&mut *tx)
.await
.map_err(fix_error)?;
sqlx::query(
"delete from store_idx_cache
where user_id = $1",
)
.bind(user.id)
.execute(&mut *tx)
.await
.map_err(fix_error)?;
tx.commit().await.map_err(fix_error)?;
Ok(())
}
@ -509,7 +522,7 @@ impl Database for Postgres {
for i in records {
let id = atuin_common::utils::uuid_v7();
sqlx::query(
let result = sqlx::query(
"insert into store
(id, client_id, host, idx, timestamp, version, tag, data, cek, user_id)
values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
@ -530,7 +543,8 @@ impl Database for Postgres {
.await
.map_err(fix_error)?;
// we're already iterating sooooo
// Only update heads if we actually inserted the record
if result.rows_affected() > 0 {
heads
.entry((i.host.id, &i.tag))
.and_modify(|e| {
@ -540,6 +554,7 @@ impl Database for Postgres {
})
.or_insert(i.idx);
}
}
// we've built the map of heads for this push, so commit it to the database
for ((host, tag), idx) in heads {
@ -644,7 +659,7 @@ impl Database for Postgres {
.map_err(fix_error)?;
cached_res.sort();
tx.commit().await.map_err(fix_error)?;
// No need to commit a read-only transaction
let mut status = RecordStatus::new();