func (txn *dbTxn) Inc(k kv.Key, step int64) (int64, error) { log.Debugf("Inc %q, step %d txn:%d", k, step, txn.tid) k = kv.EncodeKey(k) txn.markOrigin(k) val, err := txn.UnionStore.Get(k) if kv.IsErrNotFound(err) { err = txn.UnionStore.Set(k, []byte(strconv.FormatInt(step, 10))) if err != nil { return 0, errors.Trace(err) } return step, nil } if err != nil { return 0, errors.Trace(err) } intVal, err := strconv.ParseInt(string(val), 10, 0) if err != nil { return intVal, errors.Trace(err) } intVal += step err = txn.UnionStore.Set(k, []byte(strconv.FormatInt(intVal, 10))) if err != nil { return 0, errors.Trace(err) } txn.store.compactor.OnSet(k) return intVal, 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 }
func (txn *hbaseTxn) Inc(k kv.Key, step int64) (int64, error) { log.Debugf("Inc %q, step %d txn:%d", k, step, txn.tid) val, err := txn.UnionStore.Get(k) if kv.IsErrNotFound(err) { err = txn.UnionStore.Set(k, []byte(strconv.FormatInt(step, 10))) if err != nil { return 0, errors.Trace(err) } return step, nil } if err != nil { return 0, errors.Trace(err) } intVal, err := strconv.ParseInt(string(val), 10, 64) if err != nil { return intVal, errors.Trace(err) } intVal += step err = txn.UnionStore.Set(k, []byte(strconv.FormatInt(intVal, 10))) if err != nil { return 0, errors.Trace(err) } return intVal, nil }
func (txn *dbTxn) Inc(k []byte, step int64) (int64, error) { log.Debugf("Inc %s, step %d txn:%d", k, step, txn.tID) k = kv.EncodeKey(k) if err := txn.markOrigin(k); err != nil { return 0, err } val, err := txn.UnionStore.Get(k) if kv.IsErrNotFound(err) { err = txn.UnionStore.Set(k, []byte(strconv.FormatInt(step, 10))) if err != nil { return 0, err } return step, nil } if err != nil { return 0, err } intVal, err := strconv.ParseInt(string(val), 10, 0) if err != nil { return intVal, err } intVal += step err = txn.UnionStore.Set(k, []byte(strconv.FormatInt(intVal, 10))) if err != nil { return 0, err } return intVal, nil }
func (d *ddl) backfillColumnData(t table.Table, columnInfo *model.ColumnInfo, handles []int64, reorgInfo *reorgInfo) error { for _, handle := range handles { log.Info("[ddl] backfill column...", handle) err := kv.RunInNewTxn(d.store, true, func(txn kv.Transaction) error { if err := d.isReorgRunnable(txn); err != nil { return errors.Trace(err) } // First check if row exists. exist, err := checkRowExist(txn, t, handle) if err != nil { return errors.Trace(err) } else if !exist { // If row doesn't exist, skip it. return nil } backfillKey := t.RecordKey(handle, &column.Col{ColumnInfo: *columnInfo}) backfillValue, err := txn.Get(backfillKey) if err != nil && !kv.IsErrNotFound(err) { return errors.Trace(err) } if backfillValue != nil { return nil } value, _, err := tables.GetColDefaultValue(nil, columnInfo) if err != nil { return errors.Trace(err) } // must convert to the column field type. v, err := types.Convert(value, &columnInfo.FieldType) if err != nil { return errors.Trace(err) } err = lockRow(txn, t, handle) if err != nil { return errors.Trace(err) } err = t.SetColValue(txn, backfillKey, v) if err != nil { return errors.Trace(err) } return errors.Trace(reorgInfo.UpdateHandle(txn, handle)) }) if err != nil { return errors.Trace(err) } } return nil }
func (txn *hbaseTxn) Get(k kv.Key) ([]byte, error) { log.Debugf("get key:%q, txn:%d", k, txn.tid) val, err := txn.UnionStore.Get(k) if kv.IsErrNotFound(err) || len(val) == 0 { return nil, errors.Trace(kv.ErrNotExist) } if err != nil { return nil, errors.Trace(err) } return val, nil }
func (txn *dbTxn) GetInt64(k kv.Key) (int64, error) { val, err := txn.UnionStore.Get(k) if kv.IsErrNotFound(err) { return 0, nil } if err != nil { return 0, errors.Trace(err) } intVal, err := strconv.ParseInt(string(val), 10, 0) return intVal, errors.Trace(err) }
func (s *dbSnapshot) BatchGet(keys []kv.Key) (map[string][]byte, error) { m := make(map[string][]byte) for _, k := range keys { v, err := s.Get(k) if err != nil && !kv.IsErrNotFound(err) { return nil, errors.Trace(err) } if len(v) > 0 { m[string(k)] = v } } return m, nil }
func (txn *dbTxn) Get(k kv.Key) ([]byte, error) { log.Debugf("get key:%q, txn:%d", k, txn.tid) k = kv.EncodeKey(k) val, err := txn.UnionStore.Get(k) if kv.IsErrNotFound(err) { return nil, errors.Trace(kv.ErrNotExist) } if err != nil { return nil, errors.Trace(err) } if len(val) == 0 { return nil, errors.Trace(kv.ErrNotExist) } txn.store.compactor.OnGet(k) return val, nil }
func (txn *dbTxn) markOrigin(k []byte) error { keystr := string(k) // Already exist, no nothing if _, ok := txn.snapshotVals[keystr]; ok { return nil } val, err := txn.Snapshot.Get(k) if err != nil && !kv.IsErrNotFound(err) { return err } //log.Debugf("markOrigin, key:%s, value:%s", keystr, val) txn.snapshotVals[keystr] = val return nil }
func (txn *dbTxn) Get(k []byte) ([]byte, error) { log.Debugf("get key:%s, txn:%d", k, txn.tID) k = kv.EncodeKey(k) val, err := txn.UnionStore.Get(k) if kv.IsErrNotFound(err) { return nil, kv.ErrNotExist } if err != nil { return nil, err } if len(val) == 0 { return nil, kv.ErrNotExist } return val, nil }
func newScanner(snapshot *tikvSnapshot, startKey []byte, batchSize int) (*Scanner, error) { // It must be > 1. Otherwise scanner won't skipFirst. if batchSize <= 1 { batchSize = scanBatchSize } scanner := &Scanner{ snapshot: snapshot, batchSize: batchSize, valid: true, nextStartKey: startKey, } err := scanner.Next() if kv.IsErrNotFound(err) { return scanner, nil } return scanner, errors.Trace(err) }
// 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) }