The rest of the files needed to pass Redis tests

This commit is contained in:
cpb8010 2013-08-31 01:17:12 -04:00
parent eb8e5b33a9
commit 999a268ca8
3 changed files with 17 additions and 3 deletions

1
cache/cache.go vendored
View file

@ -17,6 +17,7 @@ import (
var ( var (
drivers = make(map[string]Driver) drivers = make(map[string]Driver)
ErrTxDone = errors.New("cache: Transaction has already been committed or rolled back") ErrTxDone = errors.New("cache: Transaction has already been committed or rolled back")
ErrTxConflict = errors.New("cache: Commit interrupted, update transaction and repeat")
) )
type Driver interface { type Driver interface {

13
cache/redis/redis.go vendored
View file

@ -106,6 +106,7 @@ func (tx *Tx) initiateWrite() error {
return cache.ErrTxDone return cache.ErrTxDone
} }
if tx.multi != true { if tx.multi != true {
tx.multi = true
return tx.Send("MULTI") return tx.Send("MULTI")
} }
return nil return nil
@ -126,7 +127,11 @@ func (tx *Tx) Commit() error {
return cache.ErrTxDone return cache.ErrTxDone
} }
if tx.multi == true { if tx.multi == true {
_, err := tx.Do("EXEC") execResponse, err := tx.Do("EXEC")
if execResponse == nil {
tx.multi = false
return cache.ErrTxConflict
}
if err != nil { if err != nil {
return err return err
} }
@ -139,7 +144,11 @@ func (tx *Tx) Rollback() error {
if tx.done { if tx.done {
return cache.ErrTxDone return cache.ErrTxDone
} }
// Redis doesn't need to do anything. Exec is atomic. // Undoes watches and multi
if _, err := tx.Do("DISCARD") ; err != nil {
return err
}
tx.multi = false
tx.close() tx.close()
return nil return nil
} }

View file

@ -12,7 +12,11 @@
"prefix": "test:", "prefix": "test:",
"max_idle_conn": 3, "max_idle_conn": 3,
"idle_timeout": "240s" "idle_timeout": "240s",
"network": "tcp",
"schema": "schema",
"encoding": "encoding"
}, },
"storage": { "storage": {