all repos — postern @ fc287763b9ce6b6f9823e11c0b1173da0446ebc5

Modern mail management

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}