Skip to content

Commit

Permalink
Working example with Middlewares
Browse files Browse the repository at this point in the history
  • Loading branch information
zegl committed Feb 12, 2017
1 parent eed821f commit b236d16
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 27 deletions.
22 changes: 8 additions & 14 deletions middleware.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
package goriak

type SetMiddlewarer interface {
GetValue() ([]byte, error)
SetValue([]byte) error

//GetMapOperation() (*riak.MapOperation, error)
//SetMapOperation(*riak.MapOperation) error

type ExecMiddlewarer interface {
GetKey() string
SetKey(string)
}

type SetMiddleware func(SetMiddlewarer, SetMiddleware)
type ExecuteMiddleware func(cmd ExecMiddlewarer, next func() (*Result, error)) (*Result, error)

var globalSetMiddleware []SetMiddleware

type NextMiddlewareFunc func()
func (c *SetRawCommand) AddMiddleware(mid ExecuteMiddleware) *SetRawCommand {
c.execMiddleware = append(c.execMiddleware, mid)
return c
}

func RegisterSetMiddleware(middleware SetMiddleware) {
globalSetMiddleware = append(globalSetMiddleware, middleware)
func (c *SetRawCommand) GetKey() string {
return c.key
}
18 changes: 15 additions & 3 deletions middleware_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,28 @@ package goriak

import (
//riak "github.com/basho/riak-go-client"
"errors"
"log"
"testing"
)

func TestMiddlewareSet(t *testing.T) {

RegisterSetMiddleware(func(item SetMiddlewarer, next NextMiddlewareFunc) {
m := func(cmd ExecMiddlewarer, next func() (*Result, error)) (*Result, error) {
log.Println("Middleware BEFORE:", cmd.GetKey())
return nil, errors.New("abort!")

})
res, err := next()
log.Println("Middleware After:", cmd.GetKey())
return res, err
}

Bucket("middleware", "raw").
res, err := Bucket("middleware", "tests").
SetRaw([]byte{1, 2, 3, 4, 5}).
///Key("abc123").
AddMiddleware(m).
AddMiddleware(m).
Run(con())

t.Log(res, err)
}
39 changes: 33 additions & 6 deletions query_store_value.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package goriak
import (
"errors"
riak "github.com/basho/riak-go-client"
"log"
)

type SetRawCommand struct {
Expand All @@ -14,6 +15,8 @@ type SetRawCommand struct {
storeValueCommandBuilder *riak.StoreValueCommandBuilder
storeValueObject *riak.Object

execMiddleware []ExecuteMiddleware

key string

err error
Expand Down Expand Up @@ -62,12 +65,37 @@ func (c *SetRawCommand) Run(session *Session) (*Result, error) {
// Set object
c.storeValueCommandBuilder.WithContent(c.storeValueObject)

// Keep track of whick middleware that we should execute next
middlewareI := 0

// Needed so that next can call itself
var next2 func() (*Result, error)

next := func() (*Result, error) {
if middlewareI == len(c.execMiddleware) {
return c.riakExecute(session)
}

middlewareI++

return c.execMiddleware[middlewareI-1](c, next2)
}

next2 = next

return next()
}

func (c *SetRawCommand) riakExecute(session *Session) (*Result, error) {

// Build it!
cmd, err := c.storeValueCommandBuilder.Build()
if err != nil {
return nil, err
}

log.Println("Riak Execute")

err = session.riak.Execute(cmd)
if err != nil {
return nil, err
Expand All @@ -79,15 +107,14 @@ func (c *SetRawCommand) Run(session *Session) (*Result, error) {
return nil, errors.New("Not successful")
}

var key string
log.Println("Key:", c.key)

if c.key != "" {
key = c.key
} else {
key = storeCmd.Response.GeneratedKey
if c.key == "" {
log.Println("Added GeneratedKey")
c.key = storeCmd.Response.GeneratedKey
}

return &Result{
Key: key,
Key: c.key,
}, nil
}
4 changes: 0 additions & 4 deletions raw.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,6 @@ import (
// SetRaw gives you full control of the data stored, compared to SetJSON and Set.
func (c *Command) SetRaw(value []byte) *SetRawCommand {

if len(GlobalSetMiddleware) > 0 {
globalSetMiddleware[0]()
}

object := &riak.Object{
Value: value,
}
Expand Down

0 comments on commit b236d16

Please sign in to comment.