Count account test without fetching bodies

This commit is contained in:
DonVoo 2026-07-14 18:29:37 +02:00
parent a17d2c8a2c
commit 03ce0ad8ea
2 changed files with 16 additions and 6 deletions

View file

@ -48,6 +48,7 @@ type Folder struct {
// 07-migrate.go gegen ein Interface arbeitet. // 07-migrate.go gegen ein Interface arbeitet.
type SourceMailbox interface { type SourceMailbox interface {
Folders() ([]Folder, error) // rekursiver Ordnerbaum Folders() ([]Folder, error) // rekursiver Ordnerbaum
Count(folder string) (int, error)
Headers(folder string, limit, offset int) ([]MessageHeader, error) Headers(folder string, limit, offset int) ([]MessageHeader, error)
FetchOne(folder string, uid uint32) (RawMessage, error) FetchOne(folder string, uid uint32) (RawMessage, error)
Fetch(folder string, fn func(RawMessage) error) error // BODY[] FLAGS INTERNALDATE Fetch(folder string, fn func(RawMessage) error) error // BODY[] FLAGS INTERNALDATE
@ -92,6 +93,10 @@ func (s *imapSource) Fetch(folder string, fn func(RawMessage) error) error {
return s.mailbox.fetchEach(folder, fn) return s.mailbox.fetchEach(folder, fn)
} }
func (s *imapSource) Count(folder string) (int, error) {
return s.mailbox.count(folder)
}
func (s *imapSource) Headers(folder string, limit, offset int) ([]MessageHeader, error) { func (s *imapSource) Headers(folder string, limit, offset int) ([]MessageHeader, error) {
return s.mailbox.fetchHeaders(folder, limit, offset) return s.mailbox.fetchHeaders(folder, limit, offset)
} }
@ -193,6 +198,14 @@ func (m *imapClientMailbox) fetchEach(folder string, fn func(RawMessage) error)
return cmd.Close() return cmd.Close()
} }
func (m *imapClientMailbox) count(folder string) (int, error) {
selected, err := m.c.Select(folder, &imap.SelectOptions{ReadOnly: true}).Wait()
if err != nil {
return 0, err
}
return int(selected.NumMessages), nil
}
func (m *imapClientMailbox) fetchHeaders(folder string, limit, offset int) ([]MessageHeader, error) { func (m *imapClientMailbox) fetchHeaders(folder string, limit, offset int) ([]MessageHeader, error) {
selected, err := m.c.Select(folder, &imap.SelectOptions{ReadOnly: true}).Wait() selected, err := m.c.Select(folder, &imap.SelectOptions{ReadOnly: true}).Wait()
if err != nil { if err != nil {

View file

@ -210,12 +210,9 @@ func CheckAccount(name string) error {
} }
total := 0 total := 0
for _, folder := range folders { for _, folder := range folders {
folderTotal := 0 folderTotal, err := src.Count(folder.Name)
if err := src.Fetch(folder.Name, func(m RawMessage) error { if err != nil {
folderTotal++ return fmt.Errorf("count source %s %s: %w", a.Name, folder.Name, err)
return nil
}); err != nil {
return fmt.Errorf("fetch source %s %s: %w", a.Name, folder.Name, err)
} }
log.Printf("account %s source folder %s messages=%d", a.Name, folder.Name, folderTotal) log.Printf("account %s source folder %s messages=%d", a.Name, folder.Name, folderTotal)
total += folderTotal total += folderTotal