本站源代码
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

145 Zeilen
2.9KB

  1. package nodb
  2. import (
  3. "bytes"
  4. "errors"
  5. "regexp"
  6. "github.com/lunny/nodb/store"
  7. )
  8. var errDataType = errors.New("error data type")
  9. var errMetaKey = errors.New("error meta key")
  10. // Seek search the prefix key
  11. func (db *DB) Seek(key []byte) (*store.Iterator, error) {
  12. return db.seek(KVType, key)
  13. }
  14. func (db *DB) seek(dataType byte, key []byte) (*store.Iterator, error) {
  15. var minKey []byte
  16. var err error
  17. if len(key) > 0 {
  18. if err = checkKeySize(key); err != nil {
  19. return nil, err
  20. }
  21. if minKey, err = db.encodeMetaKey(dataType, key); err != nil {
  22. return nil, err
  23. }
  24. } else {
  25. if minKey, err = db.encodeMinKey(dataType); err != nil {
  26. return nil, err
  27. }
  28. }
  29. it := db.bucket.NewIterator()
  30. it.Seek(minKey)
  31. return it, nil
  32. }
  33. func (db *DB) MaxKey() ([]byte, error) {
  34. return db.encodeMaxKey(KVType)
  35. }
  36. func (db *DB) Key(it *store.Iterator) ([]byte, error) {
  37. return db.decodeMetaKey(KVType, it.Key())
  38. }
  39. func (db *DB) scan(dataType byte, key []byte, count int, inclusive bool, match string) ([][]byte, error) {
  40. var minKey, maxKey []byte
  41. var err error
  42. var r *regexp.Regexp
  43. if len(match) > 0 {
  44. if r, err = regexp.Compile(match); err != nil {
  45. return nil, err
  46. }
  47. }
  48. if len(key) > 0 {
  49. if err = checkKeySize(key); err != nil {
  50. return nil, err
  51. }
  52. if minKey, err = db.encodeMetaKey(dataType, key); err != nil {
  53. return nil, err
  54. }
  55. } else {
  56. if minKey, err = db.encodeMinKey(dataType); err != nil {
  57. return nil, err
  58. }
  59. }
  60. if maxKey, err = db.encodeMaxKey(dataType); err != nil {
  61. return nil, err
  62. }
  63. if count <= 0 {
  64. count = defaultScanCount
  65. }
  66. v := make([][]byte, 0, count)
  67. it := db.bucket.NewIterator()
  68. it.Seek(minKey)
  69. if !inclusive {
  70. if it.Valid() && bytes.Equal(it.RawKey(), minKey) {
  71. it.Next()
  72. }
  73. }
  74. for i := 0; it.Valid() && i < count && bytes.Compare(it.RawKey(), maxKey) < 0; it.Next() {
  75. if k, err := db.decodeMetaKey(dataType, it.Key()); err != nil {
  76. continue
  77. } else if r != nil && !r.Match(k) {
  78. continue
  79. } else {
  80. v = append(v, k)
  81. i++
  82. }
  83. }
  84. it.Close()
  85. return v, nil
  86. }
  87. func (db *DB) encodeMinKey(dataType byte) ([]byte, error) {
  88. return db.encodeMetaKey(dataType, nil)
  89. }
  90. func (db *DB) encodeMaxKey(dataType byte) ([]byte, error) {
  91. k, err := db.encodeMetaKey(dataType, nil)
  92. if err != nil {
  93. return nil, err
  94. }
  95. k[len(k)-1] = dataType + 1
  96. return k, nil
  97. }
  98. func (db *DB) encodeMetaKey(dataType byte, key []byte) ([]byte, error) {
  99. switch dataType {
  100. case KVType:
  101. return db.encodeKVKey(key), nil
  102. case LMetaType:
  103. return db.lEncodeMetaKey(key), nil
  104. case HSizeType:
  105. return db.hEncodeSizeKey(key), nil
  106. case ZSizeType:
  107. return db.zEncodeSizeKey(key), nil
  108. case BitMetaType:
  109. return db.bEncodeMetaKey(key), nil
  110. case SSizeType:
  111. return db.sEncodeSizeKey(key), nil
  112. default:
  113. return nil, errDataType
  114. }
  115. }
  116. func (db *DB) decodeMetaKey(dataType byte, ek []byte) ([]byte, error) {
  117. if len(ek) < 2 || ek[0] != db.index || ek[1] != dataType {
  118. return nil, errMetaKey
  119. }
  120. return ek[2:], nil
  121. }
上海开阖软件有限公司 沪ICP备12045867号-1