storage.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package chord
  2. import (
  3. // "errors"
  4. "hash"
  5. "trial/achord/models"
  6. // "math/big"
  7. )
  8. type Storage interface {
  9. Get(string) ([]byte, error)
  10. Set(string, string) error
  11. Delete(string) error
  12. Between([]byte, []byte) ([]*models.KV, error)
  13. MDelete(...string) error
  14. }
  15. func NewMapStore(hashFunc func() hash.Hash) Storage {
  16. return &mapStore{
  17. data: make(map[string]string),
  18. Hash: hashFunc,
  19. }
  20. }
  21. type mapStore struct {
  22. data map[string]string
  23. Hash func() hash.Hash // Hash function to use
  24. }
  25. func (a *mapStore) hashKey(key string) ([]byte, error) {
  26. h := a.Hash()
  27. if _, err := h.Write([]byte(key)); err != nil {
  28. return nil, err
  29. }
  30. val := h.Sum(nil)
  31. return val, nil
  32. }
  33. func (a *mapStore) Get(key string) ([]byte, error) {
  34. val, ok := a.data[key]
  35. if !ok {
  36. return nil, ERR_KEY_NOT_FOUND
  37. }
  38. return []byte(val), nil
  39. }
  40. func (a *mapStore) Set(key, value string) error {
  41. a.data[key] = value
  42. return nil
  43. }
  44. func (a *mapStore) Delete(key string) error {
  45. delete(a.data, key)
  46. return nil
  47. }
  48. func (a *mapStore) Between(from []byte, to []byte) ([]*models.KV, error) {
  49. vals := make([]*models.KV, 0, 10)
  50. for k, v := range a.data {
  51. hashedKey, err := a.hashKey(k)
  52. if err != nil {
  53. continue
  54. }
  55. if betweenRightIncl(hashedKey, from, to) {
  56. pair := &models.KV{
  57. Key: k,
  58. Value: v,
  59. }
  60. vals = append(vals, pair)
  61. }
  62. }
  63. return vals, nil
  64. }
  65. func (a *mapStore) MDelete(keys ...string) error {
  66. for _, k := range keys {
  67. delete(a.data, k)
  68. }
  69. return nil
  70. }