leveldb_iter.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package leveldb
  2. import (
  3. "bytes"
  4. "github.com/kellegous/go/internal"
  5. "github.com/syndtr/goleveldb/leveldb/iterator"
  6. )
  7. // RouteIterator allows iteration of the named routes in the store.
  8. type RouteIterator struct {
  9. it iterator.Iterator
  10. name string
  11. rt *internal.Route
  12. err error
  13. }
  14. func (i *RouteIterator) decode() error {
  15. rt := &internal.Route{}
  16. if err := rt.Read(bytes.NewBuffer(i.it.Value())); err != nil {
  17. return err
  18. }
  19. i.name = string(i.it.Key())
  20. i.rt = rt
  21. return nil
  22. }
  23. // Valid indicates whether the current values of the iterator are valid.
  24. func (i *RouteIterator) Valid() bool {
  25. return i.it.Valid() && i.err == nil
  26. }
  27. // Next advances the iterator to the next value.
  28. func (i *RouteIterator) Next() bool {
  29. i.name = ""
  30. i.rt = nil
  31. if !i.it.Next() {
  32. return false
  33. }
  34. if err := i.decode(); err != nil {
  35. i.err = err
  36. return false
  37. }
  38. return true
  39. }
  40. // Seek ...
  41. func (i *RouteIterator) Seek(cur string) bool {
  42. i.name = ""
  43. i.rt = nil
  44. v := i.it.Seek([]byte(cur))
  45. if !i.it.Valid() {
  46. return v
  47. }
  48. if err := i.decode(); err != nil {
  49. i.err = err
  50. }
  51. return v
  52. }
  53. // Error returns any active error that has stopped the iterator.
  54. func (i *RouteIterator) Error() error {
  55. if err := i.it.Error(); err != nil {
  56. return err
  57. }
  58. return i.err
  59. }
  60. // Name is the name of the current route.
  61. func (i *RouteIterator) Name() string {
  62. return i.name
  63. }
  64. // Route is the current route.
  65. func (i *RouteIterator) Route() *internal.Route {
  66. return i.rt
  67. }
  68. // Release disposes of the resources in the iterator.
  69. func (i *RouteIterator) Release() {
  70. i.it.Release()
  71. }