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