func copyColl(srcColl *gkvlite.Collection, dstColl *gkvlite.Collection, writeEvery int) (numItems uint64, lastItem *gkvlite.Item, err error) { minItem, err := srcColl.MinItem(true) if err != nil { return 0, nil, err } if minItem == nil { return 0, nil, nil } var errVisit error = nil err = srcColl.VisitItemsAscend(minItem.Key, true, func(i *gkvlite.Item) bool { if errVisit = dstColl.SetItem(i); errVisit != nil { return false } numItems++ lastItem = i if writeEvery > 0 && numItems%uint64(writeEvery) == 0 { if errVisit = dstColl.Write(); errVisit != nil { return false } } return true }) if err != nil { return 0, nil, err } if errVisit != nil { return 0, nil, errVisit } return numItems, lastItem, nil }
func (p *partitionstore) visit(coll *gkvlite.Collection, start []byte, withValue bool, v func(*gkvlite.Item) bool) (err error) { if start == nil { i, err := coll.MinItem(false) if err != nil { return err } if i == nil { return nil } start = i.Key } return coll.VisitItemsAscend(start, withValue, v) }
func rangeCopy(srcColl *gkvlite.Collection, dstColl *gkvlite.Collection, minKeyInclusive []byte, maxKeyExclusive []byte) (hasItems bool, err error) { minItem, err := srcColl.MinItem(false) if err != nil { return false, err } // TODO: What if we flush between the keys update and changes // update? That could result in an inconsistent db file? // Solution idea #1 is to have load-time fixup, that // incorporates changes into the key-index. if minItem != nil { if err := collRangeCopy(srcColl, dstColl, minItem.Key, minKeyInclusive, maxKeyExclusive); err != nil { return false, err } return true, nil } return false, nil }