func (index *bunchRefCache) Add(id, ref int64) error { keyBuf := idToKeyBuf(index.getBunchId(id)) data, err := index.db.Get(index.ro, keyBuf) if err != nil { return err } var idRefs []element.IdRefs if data != nil { idRefs = idRefsPool.get() defer idRefsPool.release(idRefs) idRefs = binary.UnmarshalIdRefsBunch2(data, idRefs) } idRefBunch := idRefBunch{index.getBunchId(id), idRefs} idRef := idRefBunch.getCreate(id) idRef.Add(ref) data = bytePool.get() defer bytePool.release(data) data = binary.MarshalIdRefsBunch2(idRefBunch.idRefs, data) return index.db.Put(index.wo, keyBuf, data) }
func (index *bunchRefCache) Delete(id int64) error { if index.linearImport { panic("programming error: delete not supported in linearImport mode") } keyBuf := idToKeyBuf(index.getBunchId(id)) data, err := index.db.Get(index.ro, keyBuf) if err != nil { return err } if data != nil { idRefs := idRefsPool.get() defer idRefsPool.release(idRefs) idRefs = binary.UnmarshalIdRefsBunch2(data, idRefs) idRefBunch := idRefBunch{index.getBunchId(id), idRefs} idRef := idRefBunch.get(id) if idRef != nil { idRef.Refs = []int64{} data := bytePool.get() defer bytePool.release(data) data = binary.MarshalIdRefsBunch2(idRefs, data) return index.db.Put(index.wo, keyBuf, data) } } return nil }
func (index *bunchRefCache) Get(id int64) []int64 { if index.linearImport { panic("programming error: get not supported in linearImport mode") } keyBuf := idToKeyBuf(index.getBunchId(id)) data, err := index.db.Get(index.ro, keyBuf) if err != nil { panic(err) } if data != nil { idRefs := idRefsPool.get() defer idRefsPool.release(idRefs) for _, idRef := range binary.UnmarshalIdRefsBunch2(data, idRefs) { if idRef.Id == id { return idRef.Refs } } } return nil }
// loadMergeMarshal loads an existing bunch, merges the IdRefs and // marshals the result again. func (index *bunchRefCache) loadMergeMarshal(keyBuf []byte, newBunch []element.IdRefs) []byte { data, err := index.db.Get(index.ro, keyBuf) if err != nil { panic(err) } var bunch []element.IdRefs if data != nil { bunch = idRefsPool.get() defer idRefsPool.release(bunch) bunch = binary.UnmarshalIdRefsBunch2(data, bunch) } if bunch == nil { bunch = newBunch } else { bunch = mergeBunch(bunch, newBunch) } data = bytePool.get() data = binary.MarshalIdRefsBunch2(bunch, data) return data }