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  }