镜像自地址
https://github.com/tuna/tunasync.git
已同步 2025-12-07 06:56:47 +00:00
Add leveldb to db backend and fix error wrapping
这个提交包含在:
@@ -9,6 +9,8 @@ import (
|
||||
"github.com/boltdb/bolt"
|
||||
"github.com/dgraph-io/badger/v2"
|
||||
"github.com/go-redis/redis/v8"
|
||||
"github.com/pkg/errors"
|
||||
"github.com/syndtr/goleveldb/leveldb"
|
||||
|
||||
. "github.com/tuna/tunasync/internal"
|
||||
)
|
||||
@@ -86,6 +88,19 @@ func makeDBAdapter(dbType string, dbFile string) (dbAdapter, error) {
|
||||
}
|
||||
err = kv.Init()
|
||||
return &kv, err
|
||||
} else if dbType == "leveldb" {
|
||||
innerDB, err := leveldb.OpenFile(dbFile, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
db := leveldbAdapter{
|
||||
db: innerDB,
|
||||
}
|
||||
kv := kvDBAdapter{
|
||||
db: &db,
|
||||
}
|
||||
err = kv.Init()
|
||||
return &kv, err
|
||||
}
|
||||
// unsupported db-type
|
||||
return nil, fmt.Errorf("unsupported db-type: %s", dbType)
|
||||
@@ -116,7 +131,7 @@ func (b *kvDBAdapter) ListWorkers() (ws []WorkerStatus, err error) {
|
||||
for _, v := range workers {
|
||||
jsonErr := json.Unmarshal(v, &w)
|
||||
if jsonErr != nil {
|
||||
err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
|
||||
err = errors.Wrap(err, jsonErr.Error())
|
||||
continue
|
||||
}
|
||||
ws = append(ws, w)
|
||||
@@ -193,7 +208,7 @@ func (b *kvDBAdapter) ListMirrorStatus(workerID string) (ms []MirrorStatus, err
|
||||
var m MirrorStatus
|
||||
jsonErr := json.Unmarshal(v, &m)
|
||||
if jsonErr != nil {
|
||||
err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
|
||||
err = errors.Wrap(err, jsonErr.Error())
|
||||
continue
|
||||
}
|
||||
ms = append(ms, m)
|
||||
@@ -213,7 +228,7 @@ func (b *kvDBAdapter) ListAllMirrorStatus() (ms []MirrorStatus, err error) {
|
||||
var m MirrorStatus
|
||||
jsonErr := json.Unmarshal(v, &m)
|
||||
if jsonErr != nil {
|
||||
err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
|
||||
err = errors.Wrap(err, jsonErr.Error())
|
||||
continue
|
||||
}
|
||||
ms = append(ms, m)
|
||||
@@ -232,13 +247,13 @@ func (b *kvDBAdapter) FlushDisabledJobs() (err error) {
|
||||
var m MirrorStatus
|
||||
jsonErr := json.Unmarshal(v, &m)
|
||||
if jsonErr != nil {
|
||||
err = fmt.Errorf("%s; %s", err.Error(), jsonErr)
|
||||
err = errors.Wrap(err, jsonErr.Error())
|
||||
continue
|
||||
}
|
||||
if m.Status == Disabled || len(m.Name) == 0 {
|
||||
deleteErr := b.db.Delete(_statusBucketKey, k)
|
||||
if deleteErr != nil {
|
||||
err = fmt.Errorf("%s; %s", err.Error(), deleteErr)
|
||||
err = errors.Wrap(err, deleteErr.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
51
manager/db_leveldb.go
普通文件
51
manager/db_leveldb.go
普通文件
@@ -0,0 +1,51 @@
|
||||
package manager
|
||||
|
||||
import (
|
||||
"github.com/syndtr/goleveldb/leveldb"
|
||||
"github.com/syndtr/goleveldb/leveldb/util"
|
||||
)
|
||||
|
||||
// implement kv interface backed by leveldb
|
||||
type leveldbAdapter struct {
|
||||
db *leveldb.DB
|
||||
}
|
||||
|
||||
func (b *leveldbAdapter) InitBucket(bucket string) (err error) {
|
||||
// no-op
|
||||
return
|
||||
}
|
||||
|
||||
func (b *leveldbAdapter) Get(bucket string, key string) (v []byte, err error) {
|
||||
v, err = b.db.Get([]byte(bucket+key), nil)
|
||||
return
|
||||
}
|
||||
|
||||
func (b *leveldbAdapter) GetAll(bucket string) (m map[string][]byte, err error) {
|
||||
it := b.db.NewIterator(util.BytesPrefix([]byte(bucket)), nil)
|
||||
defer it.Release()
|
||||
m = make(map[string][]byte)
|
||||
for it.Next() {
|
||||
k := string(it.Key())
|
||||
actualKey := k[len(bucket):]
|
||||
// it.Value() changes on next iteration
|
||||
val := it.Value()
|
||||
v := make([]byte, len(val))
|
||||
copy(v, it.Value())
|
||||
m[actualKey] = v
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (b *leveldbAdapter) Put(bucket string, key string, value []byte) error {
|
||||
err := b.db.Put([]byte(bucket+key), []byte(value), nil)
|
||||
return err
|
||||
}
|
||||
|
||||
func (b *leveldbAdapter) Delete(bucket string, key string) error {
|
||||
err := b.db.Delete([]byte(bucket+key), nil)
|
||||
return err
|
||||
}
|
||||
|
||||
func (b *leveldbAdapter) Close() error {
|
||||
return b.db.Close()
|
||||
}
|
||||
@@ -216,4 +216,22 @@ func TestDBAdapter(t *testing.T) {
|
||||
|
||||
DBAdapterTest(badgerDB)
|
||||
})
|
||||
|
||||
Convey("leveldbAdapter should work", t, func() {
|
||||
tmpDir, err := ioutil.TempDir("", "tunasync")
|
||||
defer os.RemoveAll(tmpDir)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
dbType, dbFile := "leveldb", filepath.Join(tmpDir, "leveldb.db")
|
||||
leveldbDB, err := makeDBAdapter(dbType, dbFile)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
defer func() {
|
||||
// close leveldbDB
|
||||
err := leveldbDB.Close()
|
||||
So(err, ShouldBeNil)
|
||||
}()
|
||||
|
||||
DBAdapterTest(leveldbDB)
|
||||
})
|
||||
}
|
||||
|
||||
在新工单中引用
屏蔽一个用户