1package sqlite23import (4 "context"5 "database/sql"6 "encoding/json"78 "git.lin.moe/go/mlisting/config"9 "github.com/emersion/go-message/mail"10)1112func 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 err15 }1617 var inreplies = make(map[int64]string)18 rows, err := tx.QueryContext(ctx, "select id, header from message")19 if err != nil {20 return err21 }22 for rows.Next() {23 var id int6424 var rheader []byte25 if err := rows.Scan(&id, &rheader); err != nil {26 return err27 }2829 hmap := make(map[string][]string)30 if err := json.Unmarshal(rheader, &hmap); err != nil {31 return err32 }33 header := mail.HeaderFromMap(hmap)34 replyto, err := header.MsgIDList("In-Reply-To")35 if err != nil {36 continue37 }38 if len(replyto) != 0 {39 inreplies[id] = replyto[0]40 }41 }42 config.FromContext(ctx).NewLogger().Info("in-reply-to map", "value", inreplies)4344 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 err47 }48 }49 return nil50}