Fix archive reindex and add target dedup

This commit is contained in:
DonVoo 2026-07-14 20:57:09 +02:00
parent e612896e06
commit c83225f5ad
9 changed files with 796 additions and 6 deletions

View file

@ -132,6 +132,12 @@ func ConnectDB(initDB bool) error {
inner_len INTEGER NOT NULL,
UNIQUE(account_id, folder, message_id)
)`,
`CREATE TABLE IF NOT EXISTS mbox_index_state(
account_id INTEGER NOT NULL,
folder TEXT NOT NULL,
indexed_bytes INTEGER NOT NULL DEFAULT 0,
UNIQUE(account_id, folder)
)`,
`CREATE TABLE IF NOT EXISTS jobs(
id INTEGER PRIMARY KEY AUTOINCREMENT,
account_id INTEGER NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
@ -442,6 +448,23 @@ func DeleteAccount(name string) error {
return err
}
func FolderMap(accountID int64) (map[string]string, error) {
rows, err := DB.Query(`SELECT src_folder, dst_folder FROM folder_map WHERE account_id=?`, accountID)
if err != nil {
return nil, err
}
defer rows.Close()
out := map[string]string{}
for rows.Next() {
var src, dst string
if err := rows.Scan(&src, &dst); err != nil {
return nil, err
}
out[src] = dst
}
return out, rows.Err()
}
func ListArchiveMailboxes() ([]string, error) {
rows, err := DB.Query(`SELECT name FROM archive_mailboxes ORDER BY lower(name), name`)
if err != nil {
@ -544,6 +567,64 @@ func SaveMboxIndex(e MboxIndexEntry) error {
return err
}
func ReplaceMboxIndex(accountID int64, folder string, entries []MboxIndexEntry, indexedBytes int64) error {
if DB == nil || accountID == 0 {
return nil
}
tx, err := DB.Begin()
if err != nil {
return err
}
defer tx.Rollback()
if _, err := tx.Exec(`DELETE FROM mbox_index WHERE account_id=? AND folder=?`, accountID, folder); err != nil {
return err
}
for i, entry := range entries {
entry.AccountID = accountID
entry.Folder = folder
entry.Seq = i
if entry.MessageID == "" {
continue
}
if _, err := tx.Exec(`INSERT INTO mbox_index(account_id, folder, seq, message_id, subject, from_addr, date, file_offset, frame_len, inner_offset, inner_len)
VALUES(?,?,?,?,?,?,?,?,?,?,?)`,
entry.AccountID, entry.Folder, entry.Seq, entry.MessageID, entry.Subject, entry.From, entry.Date,
entry.FileOffset, entry.FrameLen, entry.InnerOffset, entry.InnerLen); err != nil {
return err
}
}
if _, err := tx.Exec(`INSERT INTO mbox_index_state(account_id, folder, indexed_bytes)
VALUES(?,?,?)
ON CONFLICT(account_id, folder) DO UPDATE SET indexed_bytes=excluded.indexed_bytes`,
accountID, folder, indexedBytes); err != nil {
return err
}
return tx.Commit()
}
func UpdateMboxIndexState(accountID int64, folder string, indexedBytes int64) error {
if DB == nil || accountID == 0 {
return nil
}
_, err := DB.Exec(`INSERT INTO mbox_index_state(account_id, folder, indexed_bytes)
VALUES(?,?,?)
ON CONFLICT(account_id, folder) DO UPDATE SET indexed_bytes=excluded.indexed_bytes`,
accountID, folder, indexedBytes)
return err
}
func MboxIndexedBytes(accountID int64, folder string) (int64, error) {
if DB == nil || accountID == 0 {
return 0, sql.ErrNoRows
}
var n int64
err := DB.QueryRow(`SELECT indexed_bytes FROM mbox_index_state WHERE account_id=? AND folder=?`, accountID, folder).Scan(&n)
if errors.Is(err, sql.ErrNoRows) {
return 0, nil
}
return n, err
}
func ListMboxIndex(accountID int64, folder string) ([]MboxIndexEntry, error) {
if DB == nil || accountID == 0 {
return nil, sql.ErrNoRows