func (d *dataStoreData) canApplyTxn(obj memContextObj) bool { // TODO(riannucci): implement with Flush/FlushRevert for persistance. txn := obj.(*txnDataStoreData) for rk, muts := range txn.muts { if len(muts) == 0 { // read-only continue } prop, err := serialize.ReadProperty(bytes.NewBufferString(rk), serialize.WithContext, "", "") memoryCorruption(err) k := prop.Value().(*ds.Key) entKey := "ents:" + k.Namespace() mkey := groupMetaKey(k) entsHead := d.head.GetCollection(entKey) entsSnap := txn.snap.GetCollection(entKey) vHead := curVersion(entsHead, mkey) vSnap := curVersion(entsSnap, mkey) if vHead != vSnap { return false } } return true }
func parseSuffix(aid, ns string, suffixFormat []ds.IndexColumn, suffix []byte, count int) (raw [][]byte, decoded []ds.Property) { buf := serialize.Invertible(bytes.NewBuffer(suffix)) decoded = make([]ds.Property, len(suffixFormat)) raw = make([][]byte, len(suffixFormat)) err := error(nil) for i := range decoded { if count >= 0 && i >= count { break } needInvert := suffixFormat[i].Descending buf.SetInvert(needInvert) decoded[i], err = serialize.ReadProperty(buf, serialize.WithoutContext, aid, ns) memoryCorruption(err) offset := len(suffix) - buf.Len() raw[i] = suffix[:offset] suffix = suffix[offset:] if needInvert { raw[i] = serialize.Invert(raw[i]) } } return }
func addIndexes(store *memStore, aid, ns string, compIdx []*ds.IndexDefinition) { normalized := make([]*ds.IndexDefinition, len(compIdx)) idxColl := store.SetCollection("idx", nil) for i, idx := range compIdx { normalized[i] = idx.Normalize() idxColl.Set(serialize.ToBytes(*normalized[i].PrepForIdxTable()), []byte{}) } if allEnts := store.GetCollection("ents:" + ns); allEnts != nil { allEnts.VisitItemsAscend(nil, true, func(i *gkvlite.Item) bool { pm, err := rpm(i.Val) memoryCorruption(err) prop, err := serialize.ReadProperty(bytes.NewBuffer(i.Key), serialize.WithoutContext, aid, ns) memoryCorruption(err) k := prop.Value().(*ds.Key) sip := serialize.PropertyMapPartially(k, pm) mergeIndexes(ns, store, newMemStore(), indexEntries(sip, ns, normalized)) return true }) } }