internal/db/prune.go (view raw)
1package db
2
3import (
4 "context"
5 "database/sql"
6)
7
8// PrunableTarget holds the data needed to delete the file and clean the database.
9type PrunableTarget struct {
10 MessageID int64
11 BlobHash string
12}
13
14// GetPrunableTargets reports whether it is safe to remove a file from the db perspective
15func (db *DB) GetPrunableTargets(ctx context.Context) ([]PrunableTarget, error) {
16 rows, err := db.read.QueryContext(
17 ctx, `SELECT id, blob_address
18FROM messages
19WHERE id NOT IN (SELECT message_id FROM mailbox_messages)`)
20
21 if err != nil {
22 return nil, err
23 }
24
25 defer func(rows *sql.Rows) {
26 _ = rows.Close()
27 }(rows)
28
29 out := make([]PrunableTarget, 0)
30 for rows.Next() {
31 var pt PrunableTarget
32 if err := rows.Scan(&pt.MessageID, &pt.BlobHash); err != nil {
33 return nil, err
34 }
35 out = append(out, pt)
36 }
37
38 return out, nil
39}
40
41// DeleteMessage deletes the message which is usually part of the pruning process
42func (db *DB) DeleteMessage(ctx context.Context, id int64) error {
43 _, err := db.read.ExecContext(ctx, `DELETE FROM messages WHERE id = ?`, id)
44 return err
45}