if_,err:=a.db.ExecContext(ctx,`UPDATE folders SET uid_validity=? WHERE uid_validity=0`,a.newUIDValidity());err!=nil{
returnerr
}
if_,err:=a.db.ExecContext(ctx,`UPDATE folders SET uid_next=1 WHERE uid_next<1`);err!=nil{
returnerr
}
if_,err:=a.db.ExecContext(ctx,`UPDATE folders SET highest_modseq=1 WHERE highest_modseq<1`);err!=nil{
returnerr
}
iferr:=a.backfillIMAPUIDs(ctx);err!=nil{
returnerr
}
_,err:=a.db.ExecContext(ctx,`CREATE UNIQUE INDEX IF NOT EXISTS idx_messages_folder_imap_uid ON messages(folder_id, imap_uid) WHERE folder_id IS NOT NULL AND imap_uid > 0`)
rows,err:=a.db.QueryContext(ctx,`SELECT id FROM folders WHERE lower(name) NOT IN ('inbox','sent','drafts','archive','spam','trash') ORDER BY mailbox_id, created_at, name, id`)
iferr!=nil{
returnerr
}
varfolderIDs[]string
forrows.Next(){
varidstring
iferr:=rows.Scan(&id);err!=nil{
rows.Close()
returnerr
}
folderIDs=append(folderIDs,id)
}
iferr:=rows.Err();err!=nil{
rows.Close()
returnerr
}
rows.Close()
order:=customFolderDefaultSortOrderBase+1
for_,id:=rangefolderIDs{
if_,err:=a.db.ExecContext(ctx,`UPDATE folders SET sort_order=? WHERE id=? AND sort_order=0`,order,id);err!=nil{
rows,err:=a.db.QueryContext(ctx,`SELECT id FROM messages WHERE folder_id=? AND imap_uid=0 ORDER BY created_at,id`,folderID)
iferr!=nil{
returnerr
}
varmessageIDs[]string
forrows.Next(){
varmessageIDstring
iferr:=rows.Scan(&messageID);err!=nil{
rows.Close()
returnerr
}
messageIDs=append(messageIDs,messageID)
}
iferr:=rows.Err();err!=nil{
rows.Close()
returnerr
}
iferr:=rows.Close();err!=nil{
returnerr
}
for_,messageID:=rangemessageIDs{
meta,err:=a.nextIMAPMetadata(ctx,a.db,folderID)
iferr!=nil{
returnerr
}
if_,err:=a.db.ExecContext(ctx,`UPDATE messages SET imap_uid=?,imap_modseq=? WHERE id=?`,meta.UID,meta.ModSeq,messageID);err!=nil{
returnerr
}
}
varmaxUID,maxModSeqint64
iferr:=a.db.QueryRowContext(ctx,`SELECT COALESCE(MAX(imap_uid),0),COALESCE(MAX(imap_modseq),1) FROM messages WHERE folder_id=?`,folderID).Scan(&maxUID,&maxModSeq);err!=nil{
returnerr
}
_,err=a.db.ExecContext(ctx,`UPDATE folders SET uid_next=MAX(uid_next,?),highest_modseq=MAX(highest_modseq,?) WHERE id=?`,maxUID+1,maxModSeq,folderID)