-
Notifications
You must be signed in to change notification settings - Fork 211
/
interface.go
111 lines (96 loc) · 3.64 KB
/
interface.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
// Copyright 2014 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
package database
import (
"github.com/spacemeshos/go-spacemesh/log"
"github.com/syndtr/goleveldb/leveldb/iterator"
"path/filepath"
"time"
)
// IdealBatchSize is the best batch size
// Code using batches should try to add this much data to the batch.
// The value was determined empirically.
const IdealBatchSize = 100 * 1024
// Putter wraps the database write operation supported by both batches and regular databases.
type Putter interface {
Put(key []byte, value []byte) error
}
// Deleter wraps the database delete operation supported by both batches and regular databases.
type Deleter interface {
Delete(key []byte) error
}
// Database wraps all database operations. All methods are safe for concurrent use.
type Database interface {
Putter
Deleter
Get(key []byte) ([]byte, error)
Has(key []byte) (bool, error)
Close()
NewBatch() Batch
Find(key []byte) Iterator
}
// Batch is a write-only database that commits changes to its host database
// when Write is called. Batch cannot be used concurrently.
type Batch interface {
Putter
Deleter
ValueSize() int // amount of data in the batch
Write() error
// Reset resets the batch for reuse
Reset()
}
// Iterator defined basic iterator interface
type Iterator interface {
iterator.IteratorSeeker
Key() []byte
Value() []byte
}
// ContextDBCreator is a global structure that toggles creation of real dbs and memory dbs for tests
type ContextDBCreator struct {
Create func(file string, cache int, handles int, logger log.Log) (Database, error)
Path string
Context string
}
// CreateRealDB is a wrapper function that creates a leveldb database
func (c ContextDBCreator) CreateRealDB(file string, cache int, handles int, logger log.Log) (Database, error) {
return NewLDBDatabase(filepath.Join(c.Path+c.Context, file), cache, handles, logger)
}
// CreateMemDB is a wrapper function that creates a memory database to be used only in tests
func (c ContextDBCreator) CreateMemDB(file string, cache int, handles int, logger log.Log) (Database, error) {
return NewMemDatabase(), nil
}
// DBC is the global context that determines what db will be created and at what path.
var DBC = ContextDBCreator{
Path: "../tmp/test/" + time.Now().String(),
Context: "",
}
// Create is the actual function that is used to create a DB without the need to know which DB specifically,
// this can be determined by the context
var Create = DBC.CreateRealDB
// SwitchCreationContext switches real DB creation context to allow creating the same DB for multiple nodes in one process
func SwitchCreationContext(path, context string) {
var c = ContextDBCreator{
Path: path,
Context: context,
}
Create = c.CreateRealDB
}
// SwitchToMemCreationContext switches global DB creation function to create memory DBs (this funciton should be called in
// tests 'init' function
func SwitchToMemCreationContext() {
var c = ContextDBCreator{}
Create = c.CreateMemDB
}