Skip to content

Commit 748d130

Browse files
authored
Merge pull request #16 from ucwong/ha
using nil as return instead of panic
2 parents e633332 + f159d20 commit 748d130

File tree

6 files changed

+174
-97
lines changed

6 files changed

+174
-97
lines changed

badger/badger.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@ type Badger struct {
1414
}
1515

1616
func Open(path string) *Badger {
17-
if len(path) == 0 {
18-
path = ".badger"
19-
}
17+
//if len(path) == 0 {
18+
path = path + ".badger"
19+
//}
2020
b := &Badger{}
2121
//if bg, err := badger.Open(badger.DefaultOptions(path).WithCompression(options.ZSTD)); err == nil {
2222
if bg, err := badger.Open(badger.DefaultOptions(path)); err == nil {
2323
b.engine = bg
2424
} else {
25-
panic(err)
25+
//panic(err)
26+
return nil
2627
}
2728
return b
2829
}

bolt/bolt.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ type Bolt struct {
1919
const GLOBAL = "m41gA7omIWU4s"
2020

2121
func Open(path string) *Bolt {
22-
if len(path) == 0 {
23-
path = ".bolt"
24-
}
22+
//if len(path) == 0 {
23+
path = path + ".bolt"
24+
//}
2525
b := &Bolt{}
2626
if db, err := bolt.Open(path, 0600, nil); err == nil {
2727
b.engine = db
2828
} else {
29-
panic(err)
29+
//panic(err)
30+
return nil
3031
}
3132

3233
options := &ttlmap.Options{

cmd/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import (
88
)
99

1010
func main() {
11-
//bolt()
12-
//badger()
13-
//leveldb()
11+
bolt()
12+
badger()
13+
leveldb()
1414
ha()
1515
}
1616

@@ -97,7 +97,7 @@ func leveldb() {
9797
func ha() {
9898
var db kv.Bucket
9999

100-
db = kv.HA("")
100+
db = kv.HA("", 2)
101101

102102
db.Set([]byte("yx"), []byte("yx"))
103103
db.Set([]byte("yy"), []byte("yy"))

ha/ha.go

Lines changed: 153 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ha
22

33
import (
4+
"fmt"
45
"github.com/ucwong/golang-kv/badger"
56
"github.com/ucwong/golang-kv/bolt"
67
"github.com/ucwong/golang-kv/leveldb"
@@ -15,160 +16,233 @@ type Ha struct {
1516
wg sync.WaitGroup
1617
}
1718

18-
func Open(path string) *Ha {
19+
func Open(path string, level int) *Ha {
1920
if len(path) == 0 {
20-
path = ".ha"
21+
//path = ".ha"
2122
}
2223

2324
ha := &Ha{}
24-
ha.bot = bolt.Open(path + ".bolt")
25-
ha.bgr = badger.Open(path + ".badger")
26-
ha.ldb = leveldb.Open(path + ".leveldb")
25+
switch level {
26+
case 0:
27+
ha.bgr = badger.Open(path)
28+
case 1:
29+
ha.bot = bolt.Open(path)
30+
ha.bgr = badger.Open(path)
31+
case 2:
32+
ha.bot = bolt.Open(path)
33+
ha.bgr = badger.Open(path)
34+
ha.ldb = leveldb.Open(path)
35+
default:
36+
ha.bgr = badger.Open(path)
37+
}
2738

28-
if ha.bot == nil || ha.bgr == nil || ha.ldb == nil {
39+
if ha.bot == nil && ha.bgr == nil && ha.ldb == nil {
40+
// suc when one engine is available
2941
return nil
3042
}
43+
fmt.Printf("bolt:%v badger:%v leveldb:%v\n", ha.bot, ha.bgr, ha.ldb)
3144

3245
return ha
3346
}
3447

3548
func (b *Ha) Get(k []byte) (v []byte) {
36-
v = b.bot.Get(k)
49+
if b.bot != nil {
50+
v = b.bot.Get(k)
51+
}
3752
if v == nil {
38-
v = b.bgr.Get(k)
53+
if b.bgr != nil {
54+
v = b.bgr.Get(k)
55+
}
3956
}
4057

4158
if v == nil {
42-
v = b.ldb.Get(k)
59+
if b.ldb != nil {
60+
v = b.ldb.Get(k)
61+
}
4362
}
4463
return
4564
}
4665

4766
func (b *Ha) Set(k, v []byte) (err error) {
48-
b.wg.Add(3)
49-
go func() {
50-
defer b.wg.Done()
51-
b.bot.Set(k, v)
52-
}()
53-
go func() {
54-
defer b.wg.Done()
55-
b.bgr.Set(k, v)
56-
}()
57-
go func() {
58-
defer b.wg.Done()
59-
b.ldb.Set(k, v)
60-
}()
67+
if b.bot != nil {
68+
b.wg.Add(1)
69+
go func() {
70+
defer b.wg.Done()
71+
b.bot.Set(k, v)
72+
}()
73+
}
74+
if b.bgr != nil {
75+
b.wg.Add(1)
76+
go func() {
77+
defer b.wg.Done()
78+
b.bgr.Set(k, v)
79+
}()
80+
}
81+
82+
if b.ldb != nil {
83+
b.wg.Add(1)
84+
go func() {
85+
defer b.wg.Done()
86+
b.ldb.Set(k, v)
87+
}()
88+
}
6189
b.wg.Wait()
6290
return
6391
}
6492

6593
func (b *Ha) Del(k []byte) (err error) {
66-
b.wg.Add(3)
67-
go func() {
68-
defer b.wg.Done()
69-
b.bot.Del(k)
70-
}()
71-
go func() {
72-
defer b.wg.Done()
73-
b.bgr.Del(k)
74-
}()
75-
go func() {
76-
defer b.wg.Done()
77-
b.ldb.Del(k)
78-
}()
94+
if b.bot != nil {
95+
b.wg.Add(1)
96+
go func() {
97+
defer b.wg.Done()
98+
b.bot.Del(k)
99+
}()
100+
}
101+
102+
if b.bgr != nil {
103+
b.wg.Add(1)
104+
go func() {
105+
defer b.wg.Done()
106+
b.bgr.Del(k)
107+
}()
108+
}
109+
110+
if b.ldb != nil {
111+
b.wg.Add(1)
112+
go func() {
113+
defer b.wg.Done()
114+
b.ldb.Del(k)
115+
}()
116+
}
79117

80118
b.wg.Wait()
81119

82120
return
83121
}
84122

85123
func (b *Ha) Prefix(prefix []byte) (res [][]byte) {
86-
res = b.bot.Prefix(prefix)
124+
if b.bot != nil {
125+
res = b.bot.Prefix(prefix)
126+
}
87127
if res == nil {
88-
res = b.bgr.Prefix(prefix)
128+
if b.bgr != nil {
129+
res = b.bgr.Prefix(prefix)
130+
}
89131
}
90132

91133
if res == nil {
92-
res = b.ldb.Prefix(prefix)
134+
if b.ldb != nil {
135+
res = b.ldb.Prefix(prefix)
136+
}
93137
}
94138
return
95139
}
96140

97141
func (b *Ha) Suffix(suffix []byte) (res [][]byte) {
98-
res = b.bot.Suffix(suffix)
142+
if b.bot != nil {
143+
res = b.bot.Suffix(suffix)
144+
}
99145
if res == nil {
100-
res = b.bgr.Suffix(suffix)
146+
if b.bgr != nil {
147+
res = b.bgr.Suffix(suffix)
148+
}
101149
}
102150
if res == nil {
103-
res = b.ldb.Suffix(suffix)
151+
if b.ldb != nil {
152+
res = b.ldb.Suffix(suffix)
153+
}
104154
}
105155
return
106156
}
107157

108158
func (b *Ha) Scan() (res [][]byte) {
109-
res = b.bot.Scan()
159+
if b.bot != nil {
160+
res = b.bot.Scan()
161+
}
110162
if res == nil {
111-
res = b.bgr.Scan()
163+
if b.bgr != nil {
164+
res = b.bgr.Scan()
165+
}
112166
}
113167
if res == nil {
114-
res = b.ldb.Scan()
168+
if b.ldb != nil {
169+
res = b.ldb.Scan()
170+
}
115171
}
116172
return
117173
}
118174

119175
func (b *Ha) SetTTL(k, v []byte, expire time.Duration) (err error) {
120-
b.wg.Add(3)
121-
122-
go func() {
123-
defer b.wg.Done()
124-
b.bot.SetTTL(k, v, expire)
125-
}()
126-
127-
go func() {
128-
defer b.wg.Done()
129-
b.bgr.SetTTL(k, v, expire)
130-
}()
131-
132-
go func() {
133-
defer b.wg.Done()
134-
b.ldb.SetTTL(k, v, expire)
135-
}()
176+
if b.bot != nil {
177+
b.wg.Add(1)
178+
go func() {
179+
defer b.wg.Done()
180+
b.bot.SetTTL(k, v, expire)
181+
}()
182+
}
183+
if b.bgr != nil {
184+
b.wg.Add(1)
185+
go func() {
186+
defer b.wg.Done()
187+
b.bgr.SetTTL(k, v, expire)
188+
}()
189+
}
190+
if b.ldb != nil {
191+
b.wg.Add(1)
192+
go func() {
193+
defer b.wg.Done()
194+
b.ldb.SetTTL(k, v, expire)
195+
}()
196+
}
136197

137198
b.wg.Wait()
138199

139200
return
140201
}
141202

142203
func (b *Ha) Range(start, limit []byte) (res [][]byte) {
143-
res = b.bot.Range(start, limit)
204+
if b.bot != nil {
205+
res = b.bot.Range(start, limit)
206+
}
144207
if res == nil {
145-
res = b.bgr.Range(start, limit)
208+
if b.bgr != nil {
209+
res = b.bgr.Range(start, limit)
210+
}
146211
}
147212

148213
if res == nil {
149-
res = b.ldb.Range(start, limit)
214+
if b.ldb != nil {
215+
res = b.ldb.Range(start, limit)
216+
}
150217
}
151218

152219
return
153220
}
154221

155222
func (b *Ha) Close() (err error) {
156-
b.wg.Add(3)
157-
158-
go func() {
159-
defer b.wg.Done()
160-
b.bot.Close()
161-
}()
162-
163-
go func() {
164-
defer b.wg.Done()
165-
b.ldb.Close()
166-
}()
167-
168-
go func() {
169-
defer b.wg.Done()
170-
b.bgr.Close()
171-
}()
223+
if b.bot != nil {
224+
b.wg.Add(1)
225+
go func() {
226+
defer b.wg.Done()
227+
b.bot.Close()
228+
}()
229+
}
230+
231+
if b.ldb != nil {
232+
b.wg.Add(1)
233+
go func() {
234+
defer b.wg.Done()
235+
b.ldb.Close()
236+
}()
237+
}
238+
239+
if b.bgr != nil {
240+
b.wg.Add(1)
241+
go func() {
242+
defer b.wg.Done()
243+
b.bgr.Close()
244+
}()
245+
}
172246

173247
b.wg.Wait()
174248

kv.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ func LevelDB(path string) Bucket {
1919
return leveldb.Open(path)
2020
}
2121

22-
func HA(path string) Bucket {
23-
return ha.Open(path)
22+
func HA(path string, level int) Bucket {
23+
return ha.Open(path, level)
2424
}

0 commit comments

Comments
 (0)