mlisting

Mailing list service

git clone git://git.lin.moe/go/mlisting.git

 1package sqlite
 2
 3import (
 4	"context"
 5	"database/sql"
 6	"encoding/json"
 7
 8	"git.lin.moe/go/mlisting/config"
 9	"github.com/emersion/go-message/mail"
10)
11
12func migrateAddMessageInReplyTo(ctx context.Context, tx *sql.Tx) error {
13	if _, err := tx.ExecContext(ctx, "ALTER TABLE message ADD column in_reply_to TEXT DEFAULT NULL"); err != nil {
14		return err
15	}
16
17	var inreplies = make(map[int64]string)
18	rows, err := tx.QueryContext(ctx, "select id, header from message")
19	if err != nil {
20		return err
21	}
22	for rows.Next() {
23		var id int64
24		var rheader []byte
25		if err := rows.Scan(&id, &rheader); err != nil {
26			return err
27		}
28
29		hmap := make(map[string][]string)
30		if err := json.Unmarshal(rheader, &hmap); err != nil {
31			return err
32		}
33		header := mail.HeaderFromMap(hmap)
34		replyto, err := header.MsgIDList("In-Reply-To")
35		if err != nil {
36			continue
37		}
38		if len(replyto) != 0 {
39			inreplies[id] = replyto[0]
40		}
41	}
42	config.FromContext(ctx).NewLogger().Info("in-reply-to map", "value", inreplies)
43
44	for id, reply := range inreplies {
45		if _, err := tx.ExecContext(ctx, "UPDATE message SET in_reply_to=? WHERE id=?", reply, id); err != nil {
46			return err
47		}
48	}
49	return nil
50}