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