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

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