forked from coinbase/mesh-sdk-go
/
storage.go
74 lines (64 loc) · 2.56 KB
/
storage.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
// Copyright 2020 Coinbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package storage
import (
"context"
)
// Database is an interface that provides transactional
// access to a KV store.
type Database interface {
// Transaction acquires an exclusive write lock on the database.
// This ensures all other calls to Transaction and WriteTransaction
// will block until the returned DatabaseTransaction is committed or
// discarded. This is useful for making changes across
// multiple prefixes but incurs a large performance overhead.
Transaction(context.Context) DatabaseTransaction
// ReadTransaction allows for consistent, read-only access
// to the database. This does not acquire any lock
// on the database.
ReadTransaction(context.Context) DatabaseTransaction
// WriteTransaction acquires a granular write lock for a particular
// identifier. All subsequent calls to WriteTransaction with the same
// identifier will block until the DatabaseTransaction returned is either
// committed or discarded.
WriteTransaction(ctx context.Context, identifier string, priority bool) DatabaseTransaction
// Close shuts down the database.
Close(context.Context) error
// Encoder returns the *Encoder used to store/read data
// in the database. This *Encoder often performs some
// form of compression on data.
Encoder() *Encoder
}
// DatabaseTransaction is an interface that provides
// access to a KV store within some transaction
// context provided by a Database.
//
// When a DatabaseTransaction is committed or discarded,
// all memory utilized is reclaimed. If you want to persist
// any data retrieved, make sure to make a copy!
type DatabaseTransaction interface {
Set(context.Context, []byte, []byte, bool) error
Get(context.Context, []byte) (bool, []byte, error)
Delete(context.Context, []byte) error
Scan(
context.Context,
[]byte, // prefix restriction
[]byte, // seek start
func([]byte, []byte) error,
bool, // log entries
bool, // reverse == true means greatest to least
) (int, error)
Commit(context.Context) error
Discard(context.Context)
}