Fix archive reindex and add target dedup
This commit is contained in:
parent
e612896e06
commit
c83225f5ad
9 changed files with 796 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue