Add nonworking riak

master
Bel LaPointe 2019-03-13 15:02:46 -06:00
parent 8a1cf7104c
commit 46e8c15573
5 changed files with 120 additions and 22 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
vendor vendor
*.swp *.swp
*.swo *.swo
testdata

View File

@ -3,6 +3,7 @@ package storage
import ( import (
"bytes" "bytes"
"io/ioutil" "io/ioutil"
"net"
"os" "os"
"path" "path"
"testing" "testing"
@ -37,13 +38,38 @@ func TestImplementations(t *testing.T) {
} }
defer os.RemoveAll(dir) defer os.RemoveAll(dir)
bolt, _ := NewBolt(path.Join(dir, "bolt")) cases := make([]DB, 0)
leveldb, _ := NewLevelDB(path.Join(dir, "leveldb")) cases = append(cases, &mock{m: make(map[string][]byte)})
cases := []DB{ cases = append(cases, NewMap())
&mock{m: make(map[string][]byte)},
NewMap(), if bolt, err := NewBolt(path.Join(dir, "bolt")); err != nil {
bolt, t.Errorf("cannot make bolt: %v", err)
leveldb, } else {
cases = append(cases, bolt)
}
if leveldb, err := NewLevelDB(path.Join(dir, "leveldb")); err != nil {
t.Errorf("cannot make leveldb: %v", err)
} else {
cases = append(cases, leveldb)
}
riakLN, err := net.Listen("tcp", "localhost:8087")
if err == nil {
defer riakLN.Close()
go func() {
for {
conn, err := riakLN.Accept()
if err == nil {
conn.Close()
}
}
}()
}
if riak, err := NewRiak("localhost:8087"); err != nil {
t.Errorf("cannot make riak: %v", err)
} else {
cases = append(cases, riak)
} }
validKey := "key" validKey := "key"
@ -51,12 +77,17 @@ func TestImplementations(t *testing.T) {
for _, db := range cases { for _, db := range cases {
if err := db.Set(validKey, validValue); err != nil { if err := db.Set(validKey, validValue); err != nil {
t.Fatalf("cannot set %T: %v", db, err) t.Errorf("cannot set %T: %v", db, err)
} }
if v, err := db.Get(validKey); err != nil { if v, err := db.Get(validKey); err != nil {
t.Fatalf("cannot get %T: %v", db, err) t.Errorf("cannot get %T: %v", db, err)
} else if !bytes.Equal(v, validValue) { } else if !bytes.Equal(v, validValue) {
t.Fatalf("wrong get %T: %q vs %q", db, v, validValue) t.Errorf("wrong get %T: %q vs %q", db, v, validValue)
} else {
t.Logf("%18T GET: %s", db, v)
}
if err := db.Close(); err != nil {
t.Errorf("cannot close %T: %v", db, err)
} }
} }
} }

View File

@ -5,3 +5,5 @@ import "errors"
var ErrNotFound = errors.New("not found") var ErrNotFound = errors.New("not found")
var ErrNotImpl = errors.New("not implemented") var ErrNotImpl = errors.New("not implemented")
var ErrCantConnect = errors.New("cannot connect")

24
map.go
View File

@ -6,15 +6,15 @@ import (
type Map map[string][]byte type Map map[string][]byte
func NewMap() Map { func NewMap() *Map {
m := make(map[string][]byte) m := make(map[string][]byte)
n := Map(m) n := Map(m)
return n return &n
} }
func (m Map) String() string { func (m *Map) String() string {
s := "" s := ""
for k, v := range m { for k, v := range *m {
if s != "" { if s != "" {
s += ",\n" s += ",\n"
} }
@ -23,25 +23,25 @@ func (m Map) String() string {
return s return s
} }
func (m Map) Close() error { func (m *Map) Close() error {
m = nil m = nil
return nil return nil
} }
func (m Map) Get(key string) ([]byte, error) { func (m *Map) Get(key string) ([]byte, error) {
if _, ok := m[key]; !ok { if _, ok := (*m)[key]; !ok {
return nil, ErrNotFound return nil, ErrNotFound
} }
return m[key], nil return (*m)[key], nil
} }
func (m Map) Set(key string, value []byte) error { func (m *Map) Set(key string, value []byte) error {
if value == nil { if value == nil {
if _, ok := m[key]; ok { if _, ok := (*m)[key]; ok {
delete(m, key) delete(*m, key)
} }
return nil return nil
} }
m[key] = value (*m)[key] = value
return nil return nil
} }

64
riak.go Normal file
View File

@ -0,0 +1,64 @@
package storage
import (
riak "github.com/basho/riak-go-client"
)
type Riak struct {
db *riak.Client
}
func NewRiak(addr string, addrs ...string) (*Riak, error) {
clientOpts := &riak.NewClientOptions{
RemoteAddresses: append(addrs, addr),
}
db, err := riak.NewClient(clientOpts)
if err != nil {
return nil, err
}
ok, err := db.Ping()
if !ok {
return nil, ErrCantConnect
}
return &Riak{
db: db,
}, err
}
func (r *Riak) Get(key string) ([]byte, error) {
obj := &riak.Object{}
cmd, err := riak.NewFetchValueCommandBuilder().
WithBucket(DefaultNamespace).
WithKey(key).
Build()
if err != nil {
return nil, err
}
err = r.db.Execute(cmd)
return obj.Value, err
}
func (r *Riak) Set(key string, value []byte) error {
obj := &riak.Object{
Value: value,
}
cmd, err := riak.NewStoreValueCommandBuilder().
WithBucket(DefaultNamespace).
WithContent(obj).
Build()
if err != nil {
return err
}
return r.db.Execute(cmd)
}
func (r *Riak) Close() error {
return r.db.Stop()
}