// Get implements storage.Interface.Get. func (s *store) Get(ctx context.Context, key string, out runtime.Object, ignoreNotFound bool) error { key = keyWithPrefix(s.pathPrefix, key) getResp, err := s.client.KV.Get(ctx, key) if err != nil { return err } if len(getResp.Kvs) == 0 { if ignoreNotFound { return runtime.SetZeroValue(out) } return storage.NewKeyNotFoundError(key, 0) } kv := getResp.Kvs[0] return decode(s.codec, s.versioner, kv.Value, out, kv.ModRevision) }
func (s *store) unconditionalDelete(ctx context.Context, key string, out runtime.Object) error { // We need to do get and delete in single transaction in order to // know the value and revision before deleting it. txnResp, err := s.client.KV.Txn(ctx).If().Then( clientv3.OpGet(key), clientv3.OpDelete(key), ).Commit() if err != nil { return err } getResp := txnResp.Responses[0].GetResponseRange() if len(getResp.Kvs) == 0 { return storage.NewKeyNotFoundError(key, 0) } kv := getResp.Kvs[0] return decode(s.codec, s.versioner, kv.Value, out, kv.ModRevision) }
func (s *store) getState(getResp *clientv3.GetResponse, key string, v reflect.Value, ignoreNotFound bool) (*objState, error) { state := &objState{ obj: reflect.New(v.Type()).Interface().(runtime.Object), meta: &storage.ResponseMeta{}, } if len(getResp.Kvs) == 0 { if !ignoreNotFound { return nil, storage.NewKeyNotFoundError(key, 0) } if err := runtime.SetZeroValue(state.obj); err != nil { return nil, err } } else { state.rev = getResp.Kvs[0].ModRevision state.meta.ResourceVersion = uint64(state.rev) state.data = getResp.Kvs[0].Value if err := decode(s.codec, s.versioner, state.data, state.obj, state.rev); err != nil { return nil, err } } return state, nil }