You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.0 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. package db
  2. import (
  3. "bytes"
  4. )
  5. func IteratePrefix(db DB, prefix []byte) Iterator {
  6. var start, end []byte
  7. if len(prefix) == 0 {
  8. start = nil
  9. end = nil
  10. } else {
  11. start = cp(prefix)
  12. end = cpIncr(prefix)
  13. }
  14. return db.Iterator(start, end)
  15. }
  16. //----------------------------------------
  17. func cp(bz []byte) (ret []byte) {
  18. ret = make([]byte, len(bz))
  19. copy(ret, bz)
  20. return ret
  21. }
  22. // CONTRACT: len(bz) > 0
  23. func cpIncr(bz []byte) (ret []byte) {
  24. ret = cp(bz)
  25. for i := len(bz) - 1; i >= 0; i-- {
  26. if ret[i] < byte(0xFF) {
  27. ret[i] += 1
  28. return
  29. } else {
  30. ret[i] = byte(0x00)
  31. }
  32. }
  33. return nil
  34. }
  35. // See DB interface documentation for more information.
  36. func IsKeyInDomain(key, start, end []byte, isReverse bool) bool {
  37. if !isReverse {
  38. if bytes.Compare(key, start) < 0 {
  39. return false
  40. }
  41. if end != nil && bytes.Compare(end, key) <= 0 {
  42. return false
  43. }
  44. return true
  45. } else {
  46. if start != nil && bytes.Compare(start, key) < 0 {
  47. return false
  48. }
  49. if end != nil && bytes.Compare(key, end) <= 0 {
  50. return false
  51. }
  52. return true
  53. }
  54. }