Horrible hack for bad architecture

This commit is contained in:
2018-06-27 02:38:46 +01:00
parent a3c2508160
commit 22f6eeacd7
2 changed files with 48 additions and 13 deletions

View File

@@ -143,7 +143,10 @@ func (l *List) Append(filenames ...string) error {
log.Printf("Adding entry: %#v", entry) log.Printf("Adding entry: %#v", entry)
l.entries = append(l.entries, entry) l.entries = append(l.entries, entry)
l.header.NextUID = l.header.NextUID + 1
log.Printf("NextUID: %v", l.header.NextUID)
l.header.NextUID++
log.Printf("NextUID: %v", l.header.NextUID)
// Try to write them all, at least // Try to write them all, at least
// FIXME: we don't bubble up errors when we should // FIXME: we don't bubble up errors when we should
@@ -191,6 +194,9 @@ func (l *List) parse() error {
l.mutex.Lock() l.mutex.Lock()
defer l.mutex.Unlock() defer l.mutex.Unlock()
log.Printf("Parsing %v", l.filename)
defer func() { log.Printf("Finished parsing %v", l.filename) }()
file, err := os.Open(l.filename) file, err := os.Open(l.filename)
if err != nil { if err != nil {
return err return err
@@ -212,6 +218,7 @@ func (l *List) parse() error {
// Now parse each additional line // Now parse each additional line
entries := []Entry{} entries := []Entry{}
for r.Scan() { for r.Scan() {
entry, err := ParseEntry(r.Text()) entry, err := ParseEntry(r.Text())
if err != nil { if err != nil {
@@ -221,13 +228,17 @@ func (l *List) parse() error {
// If NextUID is out of date in the file, ignore it. We never want to // If NextUID is out of date in the file, ignore it. We never want to
// re-use a seen UID // re-use a seen UID
log.Printf("l.header.NextUID: %v", l.header.NextUID)
if entry.UID >= l.header.NextUID { if entry.UID >= l.header.NextUID {
l.header.NextUID++ log.Printf("Incrementing as entry with UID %v is greater", entry.UID)
l.header.NextUID = entry.UID + 1
} }
log.Printf("l.header.NextUID: %v", l.header.NextUID)
} }
l.header = header l.header = header
l.entries = entries l.entries = entries
log.Printf("list: %#v", l)
return nil return nil
} }

View File

@@ -5,6 +5,7 @@ import (
"net/mail" "net/mail"
"os" "os"
"path/filepath" "path/filepath"
"sync"
"github.com/luksen/maildir" "github.com/luksen/maildir"
@@ -55,21 +56,38 @@ func (c *concrete) CreateMaildir(m *Maildir) error {
} }
if m.uids == nil { if m.uids == nil {
uids, err := uidlist.Create(m.directory) uidsLock.Lock()
if err != nil { defer uidsLock.Unlock()
// FIXME: this leaves a dangling Maildir
return err if uidsCache[m.Rel()] == nil {
uids, err := uidlist.Create(m.directory)
if err != nil {
// FIXME: this leaves a dangling Maildir
return err
}
uidsCache[m.Rel()] = uids
} }
m.uids = uids m.uids = uidsCache[m.Rel()]
} }
return nil return nil
} }
// Ugh
// FIXME: multiple sessions get different Maildir instances, so breaking any
// hope at locking (sigh)
var (
uidsLock sync.Mutex
uidsCache map[string]*uidlist.List
)
func init() {
uidsCache = make(map[string]*uidlist.List)
}
func (c *concrete) FindMaildir(account Account, name string) (Maildir, error) { func (c *concrete) FindMaildir(account Account, name string) (Maildir, error) {
// FIXME: multiple IMAP sessions get different Maildir instances, so breaking
// any hope at locking (sigh)
m := Maildir{ m := Maildir{
Account: account, Account: account,
Name: name, Name: name,
@@ -81,11 +99,17 @@ func (c *concrete) FindMaildir(account Account, name string) (Maildir, error) {
return Maildir{}, errors.New("not found") return Maildir{}, errors.New("not found")
} }
uids, err := uidlist.Open(m.directory) uidsLock.Lock()
if err != nil { defer uidsLock.Unlock()
return Maildir{}, err if uidsCache[m.Rel()] == nil {
uids, err := uidlist.Open(m.directory)
if err != nil {
return Maildir{}, err
}
uidsCache[m.Rel()] = uids
} }
m.uids = uids
m.uids = uidsCache[m.Rel()]
return m, nil return m, nil
} }