// DelKeyWithPrefix deletes keys with prefix. func DelKeyWithPrefix(rm kv.RetrieverMutator, prefix kv.Key) error { var keys []kv.Key iter, err := rm.Seek(prefix) if err != nil { return errors.Trace(err) } defer iter.Close() for { if err != nil { return errors.Trace(err) } if iter.Valid() && iter.Key().HasPrefix(prefix) { keys = append(keys, iter.Key().Clone()) err = iter.Next() if err != nil { return errors.Trace(err) } } else { break } } for _, key := range keys { err := rm.Delete(key) if err != nil { return errors.Trace(err) } } return nil }
func (c *index) Exist(rm kv.RetrieverMutator, indexedValues []types.Datum, h int64) (bool, int64, error) { key, distinct, err := c.GenIndexKey(indexedValues, h) if err != nil { return false, 0, errors.Trace(err) } value, err := rm.Get(key) if kv.IsErrNotFound(err) { return false, 0, nil } if err != nil { return false, 0, errors.Trace(err) } // For distinct index, the value of key is handle. if distinct { handle, err := decodeHandle(value) if err != nil { return false, 0, errors.Trace(err) } if handle != h { return true, handle, errors.Trace(kv.ErrKeyExists) } return true, handle, nil } return true, h, nil }
// SetColValue implements table.Table SetColValue interface. func (t *Table) SetColValue(rm kv.RetrieverMutator, key []byte, data interface{}) error { v, err := t.EncodeValue(data) if err != nil { return errors.Trace(err) } if err := rm.Set(key, v); err != nil { return errors.Trace(err) } return nil }
// SetColValue implements table.Table SetColValue interface. func SetColValue(rm kv.RetrieverMutator, key []byte, data types.Datum) error { v, err := EncodeValue(data) if err != nil { return errors.Trace(err) } if err := rm.Set(key, v); err != nil { return errors.Trace(err) } return nil }
// Drop removes the KV index from store. func (c *index) Drop(rm kv.RetrieverMutator) error { it, err := rm.Seek(c.prefix) if err != nil { return errors.Trace(err) } defer it.Close() // remove all indices for it.Valid() { if !it.Key().HasPrefix(c.prefix) { break } err := rm.Delete(it.Key()) if err != nil { return errors.Trace(err) } err = it.Next() if err != nil { return errors.Trace(err) } } return nil }
// Create creates a new entry in the kvIndex data. // If the index is unique and there is an existing entry with the same key, Create will return ErrKeyExists. func (c *index) Create(rm kv.RetrieverMutator, indexedValues []types.Datum, h int64) error { key, distinct, err := c.GenIndexKey(indexedValues, h) if err != nil { return errors.Trace(err) } if !distinct { // TODO: reconsider value err = rm.Set(key, []byte("timestamp?")) return errors.Trace(err) } _, err = rm.Get(key) if kv.IsErrNotFound(err) { err = rm.Set(key, encodeHandle(h)) return errors.Trace(err) } return errors.Trace(kv.ErrKeyExists) }
// Create creates a new entry in the kvIndex data. // If the index is unique and there is an existing entry with the same key, // Create will return the existing entry's handle as the first return value, ErrKeyExists as the second return value. func (c *index) Create(rm kv.RetrieverMutator, indexedValues []types.Datum, h int64) (int64, error) { key, distinct, err := c.GenIndexKey(indexedValues, h) if err != nil { return 0, errors.Trace(err) } if !distinct { // non-unique index doesn't need store value, write a '0' to reduce space err = rm.Set(key, []byte{'0'}) return 0, errors.Trace(err) } value, err := rm.Get(key) if kv.IsErrNotFound(err) { err = rm.Set(key, encodeHandle(h)) return 0, errors.Trace(err) } handle, err := decodeHandle(value) if err != nil { return 0, errors.Trace(err) } return handle, errors.Trace(kv.ErrKeyExists) }