Add nonworking riak
parent
8a1cf7104c
commit
46e8c15573
|
|
@ -2,3 +2,4 @@
|
||||||
vendor
|
vendor
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
|
testdata
|
||||||
|
|
|
||||||
51
db_test.go
51
db_test.go
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
24
map.go
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue