Support for IMAP MOVE

This commit is contained in:
Neil Alexander
2025-12-02 19:23:49 +00:00
parent d2093e00bf
commit 8385ac78da
6 changed files with 46 additions and 6 deletions

View File

@@ -30,6 +30,7 @@ type TableMails struct {
updateMailFlags *sql.Stmt
deleteMail *sql.Stmt
expungeMail *sql.Stmt
moveMail *sql.Stmt
}
const mailsSchema = `
@@ -94,7 +95,7 @@ const selectIDForSeqStmt = `
const selectMailNextID = `
SELECT IFNULL(MAX(id)+1,1) AS id FROM mails
WHERE mailbox = $1
WHERE mailbox = $1
`
const updateMailFlagsStmt = `
@@ -109,6 +110,10 @@ const expungeMailStmt = `
DELETE FROM mails WHERE mailbox = $1 AND deleted = 1
`
const moveMailStmt = `
UPDATE mails SET mailbox = $1 WHERE mailbox = $2 AND id = $3
`
func NewTableMails(db *sql.DB, writer *Writer) (*TableMails, error) {
t := &TableMails{
db: db,
@@ -162,6 +167,10 @@ func NewTableMails(db *sql.DB, writer *Writer) (*TableMails, error) {
if err != nil {
return nil, fmt.Errorf("db.Prepare(selectMailUnseenStmt): %w", err)
}
t.moveMail, err = db.Prepare(moveMailStmt)
if err != nil {
return nil, fmt.Errorf("db.Prepare(moveMailStmt): %w", err)
}
return t, nil
}
@@ -246,3 +255,10 @@ func (t *TableMails) MailCount(mailbox string) (int, error) {
err := t.countMails.QueryRow(mailbox).Scan(&count)
return count, err
}
func (t *TableMails) MailMove(mailbox string, id int, destination string) error {
return t.writer.Do(t.db, nil, func(txn *sql.Tx) error {
_, err := t.moveMail.Exec(destination, mailbox, id)
return err
})
}