From 6cfd94cc692236b359d6bd2023b7862063011747 Mon Sep 17 00:00:00 2001 From: Wen Sun Date: Thu, 11 Jan 2024 22:29:22 +0900 Subject: [PATCH] fix: deleting inbox records that senders have been deleted (#2743) Deleting inbox records that senders have been deleted --- store/db/mysql/inbox.go | 11 +++++++++++ store/db/mysql/mysql.go | 3 +++ store/db/postgres/inbox.go | 11 +++++++++++ store/db/postgres/postgres.go | 3 +++ store/db/sqlite/inbox.go | 20 ++++++++++++++++++++ store/db/sqlite/sqlite.go | 3 +++ 6 files changed, 51 insertions(+) diff --git a/store/db/mysql/inbox.go b/store/db/mysql/inbox.go index ad80e0a8..db8df0d5 100644 --- a/store/db/mysql/inbox.go +++ b/store/db/mysql/inbox.go @@ -2,6 +2,7 @@ package mysql import ( "context" + "database/sql" "strings" "github.com/pkg/errors" @@ -132,3 +133,13 @@ func (d *DB) DeleteInbox(ctx context.Context, delete *store.DeleteInbox) error { } return nil } + +func vacuumInbox(ctx context.Context, tx *sql.Tx) error { + stmt := "DELETE FROM `inbox` WHERE `sender_id` NOT IN (SELECT `id` FROM `user`)" + _, err := tx.ExecContext(ctx, stmt) + if err != nil { + return err + } + + return nil +} diff --git a/store/db/mysql/mysql.go b/store/db/mysql/mysql.go index 2c8da727..6f478e2f 100644 --- a/store/db/mysql/mysql.go +++ b/store/db/mysql/mysql.go @@ -72,6 +72,9 @@ func (d *DB) Vacuum(ctx context.Context) error { if err := vacuumMemoRelations(ctx, tx); err != nil { return err } + if err := vacuumInbox(ctx, tx); err != nil { + return err + } if err := vacuumTag(ctx, tx); err != nil { // Prevent revive warning. return err diff --git a/store/db/postgres/inbox.go b/store/db/postgres/inbox.go index 1191e414..66460d34 100644 --- a/store/db/postgres/inbox.go +++ b/store/db/postgres/inbox.go @@ -2,6 +2,7 @@ package postgres import ( "context" + "database/sql" "strings" "github.com/pkg/errors" @@ -132,3 +133,13 @@ func (d *DB) DeleteInbox(ctx context.Context, delete *store.DeleteInbox) error { } return nil } + +func vacuumInbox(ctx context.Context, tx *sql.Tx) error { + stmt := `DELETE FROM inbox WHERE sender_id NOT IN (SELECT id FROM "user")` + _, err := tx.ExecContext(ctx, stmt) + if err != nil { + return err + } + + return nil +} diff --git a/store/db/postgres/postgres.go b/store/db/postgres/postgres.go index 212b02fa..57951e0c 100644 --- a/store/db/postgres/postgres.go +++ b/store/db/postgres/postgres.go @@ -66,6 +66,9 @@ func (d *DB) Vacuum(ctx context.Context) error { if err := vacuumMemoRelations(ctx, tx); err != nil { return err } + if err := vacuumInbox(ctx, tx); err != nil { + return err + } if err := vacuumTag(ctx, tx); err != nil { // Prevent revive warning. return err diff --git a/store/db/sqlite/inbox.go b/store/db/sqlite/inbox.go index 97331c5d..72865b8f 100644 --- a/store/db/sqlite/inbox.go +++ b/store/db/sqlite/inbox.go @@ -2,6 +2,7 @@ package sqlite import ( "context" + "database/sql" "strings" "github.com/pkg/errors" @@ -123,3 +124,22 @@ func (d *DB) DeleteInbox(ctx context.Context, delete *store.DeleteInbox) error { } return nil } + +func vacuumInbox(ctx context.Context, tx *sql.Tx) error { + stmt := ` + DELETE FROM + inbox + WHERE + sender_id NOT IN ( + SELECT + id + FROM + user + )` + _, err := tx.ExecContext(ctx, stmt) + if err != nil { + return err + } + + return nil +} diff --git a/store/db/sqlite/sqlite.go b/store/db/sqlite/sqlite.go index 28e0390d..981a02c8 100644 --- a/store/db/sqlite/sqlite.go +++ b/store/db/sqlite/sqlite.go @@ -97,6 +97,9 @@ func vacuumImpl(ctx context.Context, tx *sql.Tx) error { if err := vacuumMemoRelations(ctx, tx); err != nil { return err } + if err := vacuumInbox(ctx, tx); err != nil { + return err + } if err := vacuumTag(ctx, tx); err != nil { // Prevent revive warning. return err