91
journal/journal.go
Normal file
91
journal/journal.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package journal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Journal interface {
|
||||
Write([]byte, []byte) (int, error)
|
||||
Read([]byte, []byte) (int, error)
|
||||
Configure(interface{}) error
|
||||
}
|
||||
|
||||
var journalTypes map[string]Journal
|
||||
|
||||
func init() {
|
||||
journalTypes = make(map[string]Journal)
|
||||
}
|
||||
|
||||
func RegisterJournal(engine string, journal Journal) {
|
||||
journalTypes[engine] = journal
|
||||
}
|
||||
|
||||
func New(ctype string, cfg interface{}) (Journal, error) {
|
||||
var err error
|
||||
|
||||
journal, ok := journalTypes[ctype]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unknown cluster type %s. only %s supported", ctype, strings.Join(JournalTypes(), ","))
|
||||
}
|
||||
|
||||
if cfg == nil {
|
||||
return journal, nil
|
||||
}
|
||||
|
||||
err = journal.Configure(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return journal, nil
|
||||
}
|
||||
|
||||
func JournalTypes() []string {
|
||||
var ctypes []string
|
||||
for ctype, _ := range journalTypes {
|
||||
ctypes = append(ctypes, ctype)
|
||||
}
|
||||
return ctypes
|
||||
}
|
||||
|
||||
type Dummy struct{}
|
||||
|
||||
func (*Dummy) Configure(interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*Dummy) Del(interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*Dummy) Set(interface{}, interface{}) error {
|
||||
return nil
|
||||
}
|
||||
func (*Dummy) Get(interface{}) (interface{}, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (*Dummy) Exists(interface{}) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func (*Dummy) Keys() ([]interface{}, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (*Dummy) OnEvict(func(interface{}, interface{})) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*Dummy) Peek(interface{}) (interface{}, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (*Dummy) Purge() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (*Dummy) Size() int {
|
||||
return 0
|
||||
}
|
76
journal/leveldb/leveldb.go
Normal file
76
journal/leveldb/leveldb.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package leveldb
|
||||
|
||||
import (
|
||||
"github.com/syndtr/goleveldb/leveldb"
|
||||
"github.com/syndtr/goleveldb/leveldb/opt"
|
||||
"github.com/sdstack/storage/cache"
|
||||
)
|
||||
|
||||
type config struct {
|
||||
Store string
|
||||
}
|
||||
|
||||
type LevelDB struct {
|
||||
db *leveldb.DB
|
||||
}
|
||||
|
||||
func init() {
|
||||
cache.RegisterCache("leveldb", &LevelDB{})
|
||||
}
|
||||
|
||||
func (c *LevelDB) Configure(cfg interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *LevelDB) Open() error {
|
||||
var err error
|
||||
c.db, err = leveldb.OpenFile("/srv/store/sc01/db", &opt.Options{
|
||||
Compression: opt.NoCompression,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *LevelDB) Close() error {
|
||||
return c.db.Close()
|
||||
}
|
||||
|
||||
func (c *LevelDB) Set(k interface{}, v interface{}) error {
|
||||
return c.db.Put(k.([]byte), v.([]byte), nil)
|
||||
}
|
||||
|
||||
func (c *LevelDB) Get(k interface{}) (interface{}, error) {
|
||||
return c.db.Get(k.([]byte), nil)
|
||||
}
|
||||
|
||||
func (c *LevelDB) Del(k interface{}) error {
|
||||
return c.db.Delete(k.([]byte), nil)
|
||||
}
|
||||
|
||||
func (c *LevelDB) Exists(k interface{}) (bool, error) {
|
||||
return c.db.Has(k.([]byte), nil)
|
||||
}
|
||||
|
||||
func (c *LevelDB) Keys() ([]interface{}, error) {
|
||||
var keys []interface{}
|
||||
var err error
|
||||
|
||||
iter := c.db.NewIterator(nil, nil)
|
||||
for iter.Next() {
|
||||
keys = append(keys, string(iter.Key()))
|
||||
}
|
||||
|
||||
iter.Release()
|
||||
err = iter.Error()
|
||||
return keys, err
|
||||
}
|
||||
|
||||
func (c *LevelDB) OnEvict(f func(interface{}, interface{})) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *LevelDB) Purge() error {
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user