forked from tendermint/tm-db
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathremotedb.go
123 lines (103 loc) · 3.01 KB
/
remotedb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package remotedb
import (
"context"
"errors"
"fmt"
db "github.com/tendermint/tm-db"
"github.com/tendermint/tm-db/remotedb/grpcdb"
protodb "github.com/tendermint/tm-db/remotedb/proto"
)
type RemoteDB struct {
ctx context.Context
dc protodb.DBClient
}
func NewRemoteDB(serverAddr string, serverKey string) (*RemoteDB, error) {
return newRemoteDB(grpcdb.NewClient(serverAddr, serverKey))
}
func newRemoteDB(gdc protodb.DBClient, err error) (*RemoteDB, error) {
if err != nil {
return nil, err
}
return &RemoteDB{dc: gdc, ctx: context.Background()}, nil
}
type Init struct {
Dir string
Name string
Type string
}
func (rd *RemoteDB) InitRemote(in *Init) error {
_, err := rd.dc.Init(rd.ctx, &protodb.Init{Dir: in.Dir, Type: in.Type, Name: in.Name})
return err
}
var _ db.DB = (*RemoteDB)(nil)
// Close is a noop currently
func (rd *RemoteDB) Close() error {
return nil
}
func (rd *RemoteDB) Delete(key []byte) error {
if _, err := rd.dc.Delete(rd.ctx, &protodb.Entity{Key: key}); err != nil {
return fmt.Errorf("remoteDB.Delete: %w", err)
}
return nil
}
func (rd *RemoteDB) DeleteSync(key []byte) error {
if _, err := rd.dc.DeleteSync(rd.ctx, &protodb.Entity{Key: key}); err != nil {
return fmt.Errorf("remoteDB.DeleteSync: %w", err)
}
return nil
}
func (rd *RemoteDB) Set(key, value []byte) error {
if _, err := rd.dc.Set(rd.ctx, &protodb.Entity{Key: key, Value: value}); err != nil {
return fmt.Errorf("remoteDB.Set: %w", err)
}
return nil
}
func (rd *RemoteDB) SetSync(key, value []byte) error {
if _, err := rd.dc.SetSync(rd.ctx, &protodb.Entity{Key: key, Value: value}); err != nil {
return fmt.Errorf("remoteDB.SetSync: %w", err)
}
return nil
}
func (rd *RemoteDB) Get(key []byte) ([]byte, error) {
res, err := rd.dc.Get(rd.ctx, &protodb.Entity{Key: key})
if err != nil {
return nil, fmt.Errorf("remoteDB.Get error: %w", err)
}
return res.Value, nil
}
func (rd *RemoteDB) Has(key []byte) (bool, error) {
res, err := rd.dc.Has(rd.ctx, &protodb.Entity{Key: key})
if err != nil {
return false, err
}
return res.Exists, nil
}
func (rd *RemoteDB) ReverseIterator(start, end []byte) (db.Iterator, error) {
dic, err := rd.dc.ReverseIterator(rd.ctx, &protodb.Entity{Start: start, End: end})
if err != nil {
return nil, fmt.Errorf("RemoteDB.Iterator error: %w", err)
}
return makeReverseIterator(dic), nil
}
func (rd *RemoteDB) NewBatch() db.Batch {
return newBatch(rd)
}
// TODO: Implement Print when db.DB implements a method
// to print to a string and not db.Print to stdout.
func (rd *RemoteDB) Print() error {
return errors.New("remoteDB.Print: unimplemented")
}
func (rd *RemoteDB) Stats() map[string]string {
stats, err := rd.dc.Stats(rd.ctx, &protodb.Nothing{})
if err != nil || stats == nil {
return nil
}
return stats.Data
}
func (rd *RemoteDB) Iterator(start, end []byte) (db.Iterator, error) {
dic, err := rd.dc.Iterator(rd.ctx, &protodb.Entity{Start: start, End: end})
if err != nil {
return nil, fmt.Errorf("RemoteDB.Iterator error: %w", err)
}
return makeIterator(dic), nil
}