// 范围扫描 func (d *DB) Enumerate(iter *gorocksdb.Iterator, min, max []byte, direction IterDirection, fn func(i int, key, value []byte, quit *bool)) { found := false if direction == IterBackward { if len(max) == 0 { iter.SeekToLast() } else { iter.Seek(max) } } else { if len(min) == 0 { iter.SeekToFirst() } else { iter.Seek(min) } } found = iter.Valid() if !found { return } i := -1 // 范围判断 if found && between(iter.Key().Data(), min, max) { i++ quit := false fn(i, iter.Key().Data(), iter.Value().Data(), &quit) if quit { return } } for { found = false if direction == IterBackward { iter.Prev() } else { iter.Next() } found = iter.Valid() if found && between(iter.Key().Data(), min, max) { i++ quit := false fn(i, iter.Key().Data(), iter.Value().Data(), &quit) if quit { return } } else { break } } return }
// db helper functions func testIterator(t *testing.T, itr *gorocksdb.Iterator, expectedValues map[string][]byte) { itrResults := make(map[string][]byte) itr.SeekToFirst() for ; itr.Valid(); itr.Next() { key := itr.Key() value := itr.Value() k := makeCopy(key.Data()) v := makeCopy(value.Data()) itrResults[string(k)] = v } if len(itrResults) != len(expectedValues) { t.Fatalf("Expected [%d] results from iterator, found [%d]", len(expectedValues), len(itrResults)) } for k, v := range expectedValues { if !bytes.Equal(itrResults[k], v) { t.Fatalf("Wrong value for key [%s]. Expected [%s], found [%s]", k, itrResults[k], v) } } }