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.

46 lines
932 B

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. "strings"
  5. )
  6. func IteratePrefix(db DB, prefix []byte) Iterator {
  7. var start, end []byte
  8. if len(prefix) == 0 {
  9. start = BeginningKey()
  10. end = EndingKey()
  11. } else {
  12. start = cp(prefix)
  13. end = cpIncr(prefix)
  14. }
  15. return db.Iterator(start, end)
  16. }
  17. //----------------------------------------
  18. func cp(bz []byte) (ret []byte) {
  19. ret = make([]byte, len(bz))
  20. copy(ret, bz)
  21. return ret
  22. }
  23. // CONTRACT: len(bz) > 0
  24. func cpIncr(bz []byte) (ret []byte) {
  25. ret = cp(bz)
  26. for i := len(bz) - 1; i >= 0; i-- {
  27. if ret[i] < byte(0xFF) {
  28. ret[i] += 1
  29. return
  30. } else {
  31. ret[i] = byte(0x00)
  32. }
  33. }
  34. return EndingKey()
  35. }
  36. func IsKeyInDomain(key string, start, end []byte) bool {
  37. leftCondition := bytes.Equal(start, BeginningKey()) || strings.Compare(key, string(start)) >= 0
  38. rightCondition := bytes.Equal(end, EndingKey()) || strings.Compare(key, string(end)) < 0
  39. return leftCondition && rightCondition
  40. }