blob: cd5a86fcd7dd96f0a04f43eda27d213a05e35aeb [file] [log] [blame]
package client
import (
"encoding/json"
"time"
"github.com/flynn/go-tuf/Godeps/_workspace/src/github.com/boltdb/bolt"
)
func MemoryLocalStore() LocalStore {
return make(memoryLocalStore)
}
type memoryLocalStore map[string]json.RawMessage
func (m memoryLocalStore) GetMeta() (map[string]json.RawMessage, error) {
return m, nil
}
func (m memoryLocalStore) SetMeta(name string, meta json.RawMessage) error {
m[name] = meta
return nil
}
const dbBucket = "tuf-client"
func FileLocalStore(path string) (LocalStore, error) {
db, err := bolt.Open(path, 0600, &bolt.Options{Timeout: time.Second})
if err != nil {
return nil, err
}
if err := db.Update(func(tx *bolt.Tx) error {
_, err := tx.CreateBucketIfNotExists([]byte(dbBucket))
return err
}); err != nil {
return nil, err
}
return &fileLocalStore{db: db}, nil
}
type fileLocalStore struct {
db *bolt.DB
}
func (f *fileLocalStore) GetMeta() (map[string]json.RawMessage, error) {
meta := make(map[string]json.RawMessage)
if err := f.db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte(dbBucket))
b.ForEach(func(k, v []byte) error {
meta[string(k)] = v
return nil
})
return nil
}); err != nil {
return nil, err
}
return meta, nil
}
func (f *fileLocalStore) SetMeta(name string, meta json.RawMessage) error {
return f.db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte(dbBucket))
return b.Put([]byte(name), meta)
})
}