(seekToKey []byte)
| 301 | } |
| 302 | |
| 303 | func (iter *iterator) SeekTo(seekToKey []byte) error { |
| 304 | key, _, err := iter.Current() |
| 305 | if err != nil && err != ErrIteratorDone { |
| 306 | return err |
| 307 | } |
| 308 | |
| 309 | if key != nil { |
| 310 | cmp := bytes.Compare(seekToKey, key) |
| 311 | if cmp == 0 { |
| 312 | return nil |
| 313 | } |
| 314 | |
| 315 | if cmp > 0 { |
| 316 | // Try a loop of naive Next()'s for several attempts. |
| 317 | err = naiveSeekTo(iter, seekToKey, DefaultNaiveSeekToMaxTries) |
| 318 | if err != ErrMaxTries { |
| 319 | return err |
| 320 | } |
| 321 | } |
| 322 | } |
| 323 | |
| 324 | // The seekToKey is before our current position, or we gave up on |
| 325 | // the naiveSeekTo(), so start a brand new iterator to replace our |
| 326 | // current iterator, bounded by the startKeyInclusive. |
| 327 | // |
| 328 | if bytes.Compare(seekToKey, iter.startKeyInclusive) < 0 { |
| 329 | seekToKey = iter.startKeyInclusive |
| 330 | } |
| 331 | |
| 332 | iterNew, err := iter.ss.startIterator(seekToKey, |
| 333 | iter.endKeyExclusive, iter.iteratorOptions) |
| 334 | if err != nil { |
| 335 | return err |
| 336 | } |
| 337 | |
| 338 | iterOld := *iter // Clone current iterator before overwriting it. |
| 339 | iterOld.closer = nil |
| 340 | |
| 341 | iter.cursors = iterNew.cursors |
| 342 | iter.lowerLevelIter = iterNew.lowerLevelIter |
| 343 | |
| 344 | iterOld.Close() |
| 345 | |
| 346 | _, _, err = iter.Current() |
| 347 | |
| 348 | return err |
| 349 | } |
| 350 | |
| 351 | func naiveSeekTo(iter Iterator, seekToKey []byte, maxTries int) error { |
| 352 | for i := 0; maxTries <= 0 || i < maxTries; i++ { |
nothing calls this directly
no test coverage detected