Skip to content

Commit

Permalink
CAS API go-couchbase
Browse files Browse the repository at this point in the history
  • Loading branch information
manik committed Apr 14, 2014
1 parent a38e9af commit ac173b2
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
42 changes: 42 additions & 0 deletions client.go
Expand Up @@ -433,6 +433,48 @@ func (b *Bucket) Write(k string, flags, exp int, v interface{},
return err
}

func (b *Bucket) WriteCas(k string, flags, exp int, cas uint64, v interface{},
opt WriteOptions) (err error) {

if ClientOpCallback != nil {
defer func(t time.Time) {
ClientOpCallback(fmt.Sprintf("Write(%v)", opt), k, t, err)
}(time.Now())
}

var data []byte
if opt&Raw == 0 {
data, err = json.Marshal(v)
if err != nil {
return err
}
} else if v != nil {
data = v.([]byte)
}

var res *gomemcached.MCResponse
err = b.Do(k, func(mc *memcached.Client, vb uint16) error {
res, err = mc.SetCas(vb, k, flags, exp, cas, data)
return err
})

if err == nil && (opt&(Persist|Indexable) != 0) {
err = b.WaitForPersistence(k, res.Cas, data == nil)
}

return err
}

// Set a value in this bucket with Cas
func (b *Bucket) Cas(k string, exp int, cas uint64, v interface{}) error {
return b.WriteCas(k, 0, exp, cas, v, 0)
}

// Set a value in this bucket with Cas without json encoding it
func (b *Bucket) CasRaw(k string, exp int, cas uint64, v interface{}) error {
return b.WriteCas(k, 0, exp, cas, v, Raw)
}

// Set a value in this bucket.
// The value will be serialized into a JSON document.
func (b *Bucket) Set(k string, exp int, v interface{}) error {
Expand Down
33 changes: 33 additions & 0 deletions examples/hello/hello.go
Expand Up @@ -34,6 +34,38 @@ func doOps(b *couchbase.Bucket) {
total*3, time.Now().Sub(start).String())
}

func doMoreOps(b *couchbase.Bucket) {
fmt.Printf("Doing some Cas ops on %s\n", b.Name)
start := time.Now()
total := 2048
for i := 0; i < total; i++ {
k := fmt.Sprintf("k2%d", i)
maybeFatal(b.Set(k, 0, []string{"a", "b", "c"}))
rv := make([]string, 0, 10)
var cas uint64
maybeFatal(b.Gets(k, &rv, &cas))
if fmt.Sprintf("%#v", rv) != `[]string{"a", "b", "c"}` {
log.Fatalf("Expected %#v, got %#v",
[]string{"a", "b", "c"}, rv)
}
maybeFatal(b.Cas(k, 0, cas, []string{"a", "b", "d"}))
maybeFatal(b.Get(k, &rv))
if fmt.Sprintf("%#v", rv) != `[]string{"a", "b", "d"}` {
log.Fatalf("Expected %#v, got %#v",
[]string{"a", "b", "c"}, rv)
}
// this should fail since we don't know the latest cas value
err := b.Cas(k, 0, cas, []string{"a", "b", "x"})
if err == nil {
log.Fatalf("Expected \"Data exists for key\"")
}

maybeFatal(b.Delete(k))
}
fmt.Printf("Did %d ops in %s\n",
total*6, time.Now().Sub(start).String())
}

func exploreBucket(bucket *couchbase.Bucket) {
vbm := bucket.VBServerMap()
fmt.Printf(" %v uses %s\n", bucket.Name, vbm.HashAlgorithm)
Expand All @@ -48,6 +80,7 @@ func exploreBucket(bucket *couchbase.Bucket) {
}

doOps(bucket)
doMoreOps(bucket)

}

Expand Down

0 comments on commit ac173b2

Please sign in to comment.