github.com/rpdict/ponzu@v0.10.1-0.20190226054626-477f29d6bf5e/system/db/index.go (about) 1 package db 2 3 import ( 4 "bytes" 5 "encoding/json" 6 7 "github.com/boltdb/bolt" 8 ) 9 10 // Index gets the value from the namespace at the key provided 11 func Index(namespace, key string) ([]byte, error) { 12 val := &bytes.Buffer{} 13 err := store.View(func(tx *bolt.Tx) error { 14 b := tx.Bucket([]byte(index(namespace))) 15 if b == nil { 16 return nil 17 } 18 19 v := b.Get([]byte(key)) 20 21 _, err := val.Write(v) 22 if err != nil { 23 return err 24 } 25 26 return nil 27 }) 28 if err != nil { 29 return nil, err 30 } 31 32 return val.Bytes(), nil 33 } 34 35 // SetIndex sets a key/value pair within the namespace provided and will return 36 // an error if it fails 37 func SetIndex(namespace, key string, value interface{}) error { 38 return store.Update(func(tx *bolt.Tx) error { 39 b, err := tx.CreateBucketIfNotExists([]byte(index(namespace))) 40 if err != nil { 41 return err 42 } 43 44 val, err := json.Marshal(value) 45 if err != nil { 46 return err 47 } 48 49 return b.Put([]byte(key), val) 50 }) 51 } 52 53 // DeleteIndex removes the key and value from the namespace provided and will 54 // return an error if it fails. It will return nil if there was no key/value in 55 // the index to delete. 56 func DeleteIndex(namespace, key string) error { 57 return store.Update(func(tx *bolt.Tx) error { 58 b := tx.Bucket([]byte(index(namespace))) 59 if b == nil { 60 return nil 61 } 62 63 return b.Delete([]byte(key)) 64 }) 65 } 66 67 // DropIndex removes the index and all key/value pairs in the namespace index 68 func DropIndex(namespace string) error { 69 return store.Update(func(tx *bolt.Tx) error { 70 err := tx.DeleteBucket([]byte(index(namespace))) 71 if err == bolt.ErrBucketNotFound { 72 return nil 73 } 74 75 if err != nil { 76 return err 77 } 78 79 return nil 80 }) 81 } 82 83 func index(namespace string) string { 84 return "__index_" + namespace 85 }