func (txn *Txn) Get(key []byte) (item *Item, rerr error) {
	if len(key) == 0 {
		return nil, ErrEmptyKey
	} else if txn.discarded {
		return nil, ErrDiscardedTxn
	}

	item = new(Item)
	if txn.update {
		if e, has := txn.pendingWrites[string(key)]; has && bytes.Equal(key, e.Key) {
			if isDeletedOrExpired(e.meta, e.ExpiresAt) {
				return nil, ErrKeyNotFound
			}
			// Fulfill from cache.
			item.meta = e.meta
			item.val = e.Value
			item.userMeta = e.UserMeta
			item.key = key
			item.status = prefetched
			item.version = txn.readTs
			item.expiresAt = e.ExpiresAt
			// We probably don't need to set db on item here.
			return item, nil
		}
		// Only track reads if this is update txn. No need to track read if txn serviced it
		// internally.
		txn.addReadKey(key)
	}

	seek := y.KeyWithTs(key, txn.readTs)
	vs, err := txn.db.get(seek)
	if err != nil {
		return nil, errors.Wrapf(err, "DB::Get key: %q", key)
	}
	if vs.Value == nil && vs.Meta == 0 {
		return nil, ErrKeyNotFound
	}
	if isDeletedOrExpired(vs.Meta, vs.ExpiresAt) {
		return nil, ErrKeyNotFound
	}

	item.key = key
	item.version = vs.Version
	item.meta = vs.Meta
	item.userMeta = vs.UserMeta
	item.db = txn.db
	item.vptr = vs.Value // TODO: Do we need to copy this over?
	item.txn = txn
	item.expiresAt = vs.ExpiresAt
	return item, nil
}
func (txn *Txn) Get(key []byte) (item *Item, rerr error) {
	if len(key) == 0 {
		return nil, ErrEmptyKey
	} else if txn.discarded {
		return nil, ErrDiscardedTxn
	}

	item = new(Item)
	if txn.update {
		if e, has := txn.pendingWrites[string(key)]; has && bytes.Equal(key, e.Key) {
			if isDeletedOrExpired(e.meta, e.ExpiresAt) {
				return nil, ErrKeyNotFound
			}
			
			item.meta = e.meta
			item.val = e.Value
			item.userMeta = e.UserMeta
			item.key = key
			item.status = prefetched
			item.version = txn.readTs
			item.expiresAt = e.ExpiresAt
			
			return item, nil
		}
		
		
		txn.addReadKey(key)
	}

	seek := y.KeyWithTs(key, txn.readTs)
	vs, err := txn.db.get(seek)
	if err != nil {
		return nil, errors.Wrapf(err, "DB::Get key: %q", key)
	}
	if vs.Value == nil && vs.Meta == 0 {
		return nil, ErrKeyNotFound
	}
	if isDeletedOrExpired(vs.Meta, vs.ExpiresAt) {
		return nil, ErrKeyNotFound
	}

	item.key = key
	item.version = vs.Version
	item.meta = vs.Meta
	item.userMeta = vs.UserMeta
	item.db = txn.db
	item.vptr = vs.Value 
	item.txn = txn
	item.expiresAt = vs.ExpiresAt
	return item, nil
}
func ( txn * Txn ) Get ( key [ ] byte ) ( item * Item , rerr error ) { if len ( key ) == 0 { return nil , ErrEmptyKey } else if txn . discarded { return nil , ErrDiscardedTxn } item = new ( Item ) if txn . update { if e , has := txn . pendingWrites [ string ( key ) ] ; has && bytes . Equal ( key , e . Key ) { if isDeletedOrExpired ( e . meta , e . ExpiresAt ) { return nil , ErrKeyNotFound } // Fulfill from cache. item . meta = e . meta item . val = e . Value item . userMeta = e . UserMeta item . key = key item . status = prefetched item . version = txn . readTs item . expiresAt = e . ExpiresAt // We probably don't need to set db on item here. return item , nil } // Only track reads if this is update txn. No need to track read if txn serviced it // internally. txn . addReadKey ( key ) } seek := y . KeyWithTs ( key , txn . readTs ) vs , err := txn . db . get ( seek ) if err != nil { return nil , errors . Wrapf ( err , " " , key ) } if vs . Value == nil && vs . Meta == 0 { return nil , ErrKeyNotFound } if isDeletedOrExpired ( vs . Meta , vs . ExpiresAt ) { return nil , ErrKeyNotFound } item . key = key item . version = vs . Version item . meta = vs . Meta item . userMeta = vs . UserMeta item . db = txn . db item . vptr = vs . Value // TODO: Do we need to copy this over? item . txn = txn item . expiresAt = vs . ExpiresAt return item , nil }
// Get looks for key and returns corresponding Item.
// If key is not found, ErrKeyNotFound is returned.
Get looks for key and returns corresponding Item . If key is not found ErrKeyNotFound is returned .