From 03ce0ad8eaba75280a5be55ec21ee4814c939a7c Mon Sep 17 00:00:00 2001 From: DonVoo Date: Tue, 14 Jul 2026 18:29:37 +0200 Subject: [PATCH] Count account test without fetching bodies --- backend/04-imap-source.go | 13 +++++++++++++ backend/07-migrate.go | 9 +++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/backend/04-imap-source.go b/backend/04-imap-source.go index 0711627..0a48b99 100644 --- a/backend/04-imap-source.go +++ b/backend/04-imap-source.go @@ -48,6 +48,7 @@ type Folder struct { // 07-migrate.go gegen ein Interface arbeitet. type SourceMailbox interface { Folders() ([]Folder, error) // rekursiver Ordnerbaum + Count(folder string) (int, error) Headers(folder string, limit, offset int) ([]MessageHeader, error) FetchOne(folder string, uid uint32) (RawMessage, error) 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) } +func (s *imapSource) Count(folder string) (int, error) { + return s.mailbox.count(folder) +} + func (s *imapSource) Headers(folder string, limit, offset int) ([]MessageHeader, error) { return s.mailbox.fetchHeaders(folder, limit, offset) } @@ -193,6 +198,14 @@ func (m *imapClientMailbox) fetchEach(folder string, fn func(RawMessage) error) 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) { selected, err := m.c.Select(folder, &imap.SelectOptions{ReadOnly: true}).Wait() if err != nil { diff --git a/backend/07-migrate.go b/backend/07-migrate.go index 8190ac2..4bc7e01 100644 --- a/backend/07-migrate.go +++ b/backend/07-migrate.go @@ -210,12 +210,9 @@ func CheckAccount(name string) error { } total := 0 for _, folder := range folders { - folderTotal := 0 - if err := src.Fetch(folder.Name, func(m RawMessage) error { - folderTotal++ - return nil - }); err != nil { - return fmt.Errorf("fetch source %s %s: %w", a.Name, folder.Name, err) + folderTotal, err := src.Count(folder.Name) + if err != nil { + return fmt.Errorf("count source %s %s: %w", a.Name, folder.Name, err) } log.Printf("account %s source folder %s messages=%d", a.Name, folder.Name, folderTotal) total += folderTotal