aboutsummaryrefslogtreecommitdiffstats
path: root/worker/jmap/cache/cache.go
diff options
context:
space:
mode:
Diffstat (limited to 'worker/jmap/cache/cache.go')
-rw-r--r--worker/jmap/cache/cache.go79
1 files changed, 79 insertions, 0 deletions
diff --git a/worker/jmap/cache/cache.go b/worker/jmap/cache/cache.go
new file mode 100644
index 00000000..ab264744
--- /dev/null
+++ b/worker/jmap/cache/cache.go
@@ -0,0 +1,79 @@
+package cache
+
+import (
+ "errors"
+ "os"
+ "path"
+
+ "github.com/mitchellh/go-homedir"
+ "github.com/syndtr/goleveldb/leveldb"
+)
+
+type JMAPCache struct {
+ mem map[string][]byte
+ file *leveldb.DB
+ blobsDir string
+}
+
+func NewJMAPCache(state, blobs bool, accountName string) (*JMAPCache, error) {
+ c := new(JMAPCache)
+ cacheDir, err := os.UserCacheDir()
+ if err != nil {
+ cacheDir, err = homedir.Expand("~/.cache")
+ if err != nil {
+ return nil, err
+ }
+ }
+ if state {
+ dir := path.Join(cacheDir, "aerc", accountName, "state")
+ _ = os.MkdirAll(dir, 0o700)
+ c.file, err = leveldb.OpenFile(dir, nil)
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ c.mem = make(map[string][]byte)
+ }
+ if blobs {
+ c.blobsDir = path.Join(cacheDir, "aerc", accountName, "blobs")
+ }
+ return c, nil
+}
+
+var notfound = errors.New("key not found")
+
+func (c *JMAPCache) get(key string) ([]byte, error) {
+ switch {
+ case c.file != nil:
+ return c.file.Get([]byte(key), nil)
+ case c.mem != nil:
+ value, ok := c.mem[key]
+ if !ok {
+ return nil, notfound
+ }
+ return value, nil
+ }
+ panic("jmap cache with no backend")
+}
+
+func (c *JMAPCache) put(key string, value []byte) error {
+ switch {
+ case c.file != nil:
+ return c.file.Put([]byte(key), value, nil)
+ case c.mem != nil:
+ c.mem[key] = value
+ return nil
+ }
+ panic("jmap cache with no backend")
+}
+
+func (c *JMAPCache) delete(key string) error {
+ switch {
+ case c.file != nil:
+ return c.file.Delete([]byte(key), nil)
+ case c.mem != nil:
+ delete(c.mem, key)
+ return nil
+ }
+ panic("jmap cache with no backend")
+}