From 2d2f14385dd3ceb8671db306c544fea20d4c43cd Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Wed, 27 Jan 2016 23:26:34 -0800 Subject: [PATCH] clientv3: fill in kv ops --- clientv3/kv.go | 61 ++++++++++++++++++++++++++++++++++++++++++++---- clientv3/op.go | 16 +++++++++++++ clientv3/sort.go | 14 +++++++++++ 3 files changed, 86 insertions(+), 5 deletions(-) diff --git a/clientv3/kv.go b/clientv3/kv.go index 39f87888a..f36496cb2 100644 --- a/clientv3/kv.go +++ b/clientv3/kv.go @@ -18,6 +18,7 @@ import ( "github.com/coreos/etcd/Godeps/_workspace/src/golang.org/x/net/context" "github.com/coreos/etcd/Godeps/_workspace/src/google.golang.org/grpc" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" + "github.com/coreos/etcd/lease" ) type ( @@ -34,7 +35,7 @@ type KV interface { // Note that key,value can be plain bytes array and string is // an immutable representation of that bytes array. // To get a string of bytes, do string([]byte(0x10, 0x20)). - Put(key, val string) (*PutResponse, error) + Put(key, val string, leaseID lease.LeaseID) (*PutResponse, error) // Range gets the keys [key, end) in the range at rev. // If revev <=0, range gets the keys at currentRev. @@ -43,7 +44,7 @@ type KV interface { Range(key, end string, limit, rev int64, sort *SortOption) (*RangeResponse, error) // Get is like Range. A shortcut for ranging single key like [key, key+1). - Get(key, rev int64) (*GetResponse, error) + Get(key string, rev int64) (*GetResponse, error) // DeleteRange deletes the given range [key, end). DeleteRange(key, end string) (*DeleteRangeResponse, error) @@ -94,12 +95,44 @@ type kv struct { c *Client } -func (kv *kv) Range(key, end string, limit, rev int64, sort *SortOption) (*pb.RangeResponse, error) { +func (kv *kv) Put(key, val string, leaseID lease.LeaseID) (*PutResponse, error) { + r, err := kv.do(OpPut(key, val, leaseID)) + if err != nil { + return nil, err + } + return (*PutResponse)(r.GetResponsePut()), nil +} + +func (kv *kv) Range(key, end string, limit, rev int64, sort *SortOption) (*RangeResponse, error) { r, err := kv.do(OpRange(key, end, limit, rev, sort)) if err != nil { return nil, err } - return r.GetResponseRange(), nil + return (*RangeResponse)(r.GetResponseRange()), nil +} + +func (kv *kv) Get(key string, rev int64) (*GetResponse, error) { + r, err := kv.do(OpGet(key, rev)) + if err != nil { + return nil, err + } + return (*GetResponse)(r.GetResponseRange()), nil +} + +func (kv *kv) DeleteRange(key, end string) (*DeleteRangeResponse, error) { + r, err := kv.do(OpDeleteRange(key, end)) + if err != nil { + return nil, err + } + return (*DeleteRangeResponse)(r.GetResponseDeleteRange()), nil +} + +func (kv *kv) Delete(key string) (*DeleteResponse, error) { + r, err := kv.do(OpDelete(key)) + if err != nil { + return nil, err + } + return (*DeleteResponse)(r.GetResponseDeleteRange()), nil } func (kv *kv) do(op Op) (*pb.ResponseUnion, error) { @@ -109,12 +142,30 @@ func (kv *kv) do(op Op) (*pb.ResponseUnion, error) { // TODO: handle other ops case tRange: var resp *pb.RangeResponse - // TODO: setup sorting r := &pb.RangeRequest{Key: op.key, RangeEnd: op.end, Limit: op.limit, Revision: op.rev} + if op.sort != nil { + r.SortOrder = pb.RangeRequest_SortOrder(op.sort.Order) + r.SortTarget = pb.RangeRequest_SortTarget(op.sort.Target) + } + resp, err = kv.remote.Range(context.TODO(), r) if err == nil { return &pb.ResponseUnion{Response: &pb.ResponseUnion_ResponseRange{resp}}, nil } + case tPut: + var resp *pb.PutResponse + r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID)} + resp, err = kv.remote.Put(context.TODO(), r) + if err == nil { + return &pb.ResponseUnion{Response: &pb.ResponseUnion_ResponsePut{resp}}, nil + } + case tDeleteRange: + var resp *pb.DeleteRangeResponse + r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end} + resp, err = kv.remote.DeleteRange(context.TODO(), r) + if err == nil { + return &pb.ResponseUnion{Response: &pb.ResponseUnion_ResponseDeleteRange{resp}}, nil + } default: panic("Unknown op") } diff --git a/clientv3/op.go b/clientv3/op.go index d702c5e48..82d9c3156 100644 --- a/clientv3/op.go +++ b/clientv3/op.go @@ -14,6 +14,8 @@ package clientv3 +import "github.com/coreos/etcd/lease" + type opType int const ( @@ -33,6 +35,10 @@ type Op struct { limit int64 rev int64 sort *SortOption + + // for put + val []byte + leaseID lease.LeaseID } func OpRange(key, end string, limit, rev int64, sort *SortOption) Op { @@ -70,3 +76,13 @@ func OpDelete(key string) Op { key: []byte(key), } } + +func OpPut(key, val string, leaseID lease.LeaseID) Op { + return Op{ + t: tPut, + key: []byte(key), + + val: []byte(val), + leaseID: leaseID, + } +} diff --git a/clientv3/sort.go b/clientv3/sort.go index 897d9a13f..e5ba1e955 100644 --- a/clientv3/sort.go +++ b/clientv3/sort.go @@ -17,6 +17,20 @@ package clientv3 type SortTarget int type SortOrder int +const ( + SortNone SortOrder = iota + SortAscend + SortDescend +) + +const ( + SortByKey SortTarget = iota + SortByVersion + SortByCreatedRev + SortByModifiedRev + SortByValue +) + type SortOption struct { Target SortTarget Order SortOrder