diff options
-rw-r--r-- | system/addon/addon.go | 5 | ||||
-rw-r--r-- | system/api/external.go | 2 | ||||
-rw-r--r-- | system/db/index.go | 85 |
3 files changed, 91 insertions, 1 deletions
diff --git a/system/addon/addon.go b/system/addon/addon.go index 51be9dc..5414d6f 100644 --- a/system/addon/addon.go +++ b/system/addon/addon.go @@ -163,6 +163,11 @@ func Disable(key string) error { return nil } +// KeyFromMeta creates a unique string identifier for an addon based on its url and name +func KeyFromMeta(meta Meta) (string, error) { + return reverseDNS(meta) +} + func setStatus(key, status string) error { a, err := db.Addon(key) if err != nil { diff --git a/system/api/external.go b/system/api/external.go index 8790af1..edb730f 100644 --- a/system/api/external.go +++ b/system/api/external.go @@ -128,7 +128,7 @@ func externalContentHandler(res http.ResponseWriter, req *http.Request) { // before saving to DB err = ext.Accept(res, req) if err != nil { - log.Println("[External} error calling Accept:", err) + log.Println("[External] error calling Accept:", err) return } diff --git a/system/db/index.go b/system/db/index.go new file mode 100644 index 0000000..6a2727a --- /dev/null +++ b/system/db/index.go @@ -0,0 +1,85 @@ +package db + +import ( + "bytes" + "encoding/json" + + "github.com/boltdb/bolt" +) + +// Index gets the value from the namespace at the key provided +func Index(namespace, key string) ([]byte, error) { + val := &bytes.Buffer{} + err := store.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(index(namespace))) + if b == nil { + return nil + } + + v := b.Get([]byte(key)) + + _, err := val.Write(v) + if err != nil { + return err + } + + return nil + }) + if err != nil { + return nil, err + } + + return val.Bytes(), nil +} + +// SetIndex sets a key/value pair within the namespace provided and will return +// an error if it fails +func SetIndex(namespace, key string, value interface{}) error { + return store.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte(index(namespace))) + if err != nil { + return err + } + + val, err := json.Marshal(value) + if err != nil { + return err + } + + return b.Put([]byte(key), val) + }) +} + +// DeleteIndex removes the key and value from the namespace provided and will +// return an error if it fails. It will return nil if there was no key/value in +// the index to delete. +func DeleteIndex(namespace, key string) error { + return store.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte(index(namespace))) + if b == nil { + return nil + } + + return b.Delete([]byte(key)) + }) +} + +// DropIndex removes the index and all key/value pairs in the namespace index +func DropIndex(namespace string) error { + return store.Update(func(tx *bolt.Tx) error { + err := tx.DeleteBucket([]byte(index(namespace))) + if err == bolt.ErrBucketNotFound { + return nil + } + + if err != nil { + return err + } + + return nil + }) +} + +func index(namespace string) string { + return "__index_" + namespace +} |