summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--system/addon/addon.go5
-rw-r--r--system/api/external.go2
-rw-r--r--system/db/index.go85
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
+}