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 }
// 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) }