Horrible hack for bad architecture
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user