package db import ( "context" "database/sql" ) // PrunableTarget holds the data needed to delete the file and clean the database. type PrunableTarget struct { MessageID int64 BlobHash string } // GetPrunableTargets reports whether it is safe to remove a file from the db perspective func (db *DB) GetPrunableTargets(ctx context.Context) ([]PrunableTarget, error) { rows, err := db.read.QueryContext( ctx, `SELECT id, blob_address FROM messages WHERE id NOT IN (SELECT message_id FROM mailbox_messages)`) if err != nil { return nil, err } defer func(rows *sql.Rows) { _ = rows.Close() }(rows) out := make([]PrunableTarget, 0) for rows.Next() { var pt PrunableTarget if err := rows.Scan(&pt.MessageID, &pt.BlobHash); err != nil { return nil, err } out = append(out, pt) } return out, nil } // DeleteMessage deletes the message which is usually part of the pruning process func (db *DB) DeleteMessage(ctx context.Context, id int64) error { _, err := db.read.ExecContext(ctx, `DELETE FROM messages WHERE id = ?`, id) return err }