...
1 package client
2
3 import (
4 "encoding/json"
5
6 "github.com/syndtr/goleveldb/leveldb"
7 "github.com/syndtr/goleveldb/leveldb/errors"
8 "github.com/syndtr/goleveldb/leveldb/storage"
9
10 tuf_client "github.com/theupdateframework/go-tuf/client"
11 )
12
13 func FileLocalStore(path string) (tuf_client.LocalStore, error) {
14 fd, err := storage.OpenFile(path, false)
15 if err != nil {
16 return nil, err
17 }
18
19 db, err := leveldb.Open(fd, nil)
20 if err != nil && errors.IsCorrupted(err) {
21 db, err = leveldb.Recover(fd, nil)
22 }
23
24 return &fileLocalStore{fd: fd, db: db}, err
25 }
26
27 type fileLocalStore struct {
28 fd storage.Storage
29 db *leveldb.DB
30 }
31
32 func (f *fileLocalStore) GetMeta() (map[string]json.RawMessage, error) {
33 meta := make(map[string]json.RawMessage)
34 db_itr := f.db.NewIterator(nil, nil)
35 for db_itr.Next() {
36 vcopy := make([]byte, len(db_itr.Value()))
37 copy(vcopy, db_itr.Value())
38 meta[string(db_itr.Key())] = vcopy
39 }
40 db_itr.Release()
41 return meta, db_itr.Error()
42 }
43
44 func (f *fileLocalStore) SetMeta(name string, meta json.RawMessage) error {
45 return f.db.Put([]byte(name), []byte(meta), nil)
46 }
47
48 func (f *fileLocalStore) DeleteMeta(name string) error {
49 return f.db.Delete([]byte(name), nil)
50 }
51
52 func (f *fileLocalStore) Close() error {
53
54 dbCloseErr := f.db.Close()
55 fdCloseErr := f.fd.Close()
56 if dbCloseErr != nil {
57 return dbCloseErr
58 }
59 return fdCloseErr
60 }
61
View as plain text