// ConditionalPut sets the value for a specified key only if // the expected value matches. If not, the return value contains // the actual value. func (r *Range) ConditionalPut(args *proto.ConditionalPutRequest, reply *proto.ConditionalPutResponse) { // Handle check for non-existence of key. val, err := r.engine.Get(args.Key) if err != nil { reply.SetGoError(err) return } if args.ExpValue.Bytes == nil && val != nil { reply.SetGoError(util.Errorf("key %q already exists", args.Key)) return } else if args.ExpValue.Bytes != nil { // Handle check for existence when there is no key. if val == nil { reply.SetGoError(util.Errorf("key %q does not exist", args.Key)) return } else if !bytes.Equal(args.ExpValue.Bytes, val) { // TODO(Jiang-Ming): provide the correct timestamp once switch to use MVCC reply.ActualValue = &proto.Value{Bytes: val} reply.SetGoError(util.Errorf("key %q does not match existing", args.Key)) return } } reply.SetGoError(r.internalPut(args.Key, args.Value)) }
// ConditionalPut sets the value for a specified key only if // the expected value matches. If not, the return value contains // the actual value. func (r *Range) ConditionalPut(args *proto.ConditionalPutRequest, reply *proto.ConditionalPutResponse) { val, err := r.mvcc.ConditionalPut(args.Key, args.Timestamp, args.Value, args.ExpValue, args.Txn) if err == nil { r.updateGossipConfigs(args.Key) } reply.ActualValue = val reply.SetGoError(err) }