tree_store.bak 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package main
  2. import (
  3. "path"
  4. "strings"
  5. )
  6. type store struct {
  7. nodes map[string]node
  8. }
  9. type node struct {
  10. value string
  11. dir bool // just for clearity
  12. nodes map[string]node
  13. }
  14. // set the key to value, return the old value if the key exists
  15. func (s *store) set(key string, value string) string, error {
  16. key = path.Clean(key)
  17. nodeNames := strings.Split(key, "/")
  18. levelNodes := s.nodes
  19. for i = 0; i < len(nodes) - 1; ++i {
  20. node, ok := levelNodes[nodeNames[i]]
  21. // add new dir
  22. if !ok {
  23. node := Node{nodeNames[i], true, make(map[string]node)}
  24. levelNodes[nodeNames[i]] := node
  25. } else if ok && !node.dir {
  26. return nil, errors.New("The key is a directory")
  27. }
  28. else {
  29. levelNodes = levelNodes.nodes
  30. }
  31. }
  32. // add the last node and value
  33. node, ok := levelNodes[nodeNames[i]]
  34. if !ok {
  35. node := Node{nodeNames[i], false, nil}
  36. levelNodes[nodeNames] = node
  37. return nil, nil
  38. } else {
  39. oldValue := node.value
  40. node.value = value
  41. return oldValue ,nil
  42. }
  43. }
  44. // get the node of the key
  45. func (s *store) get(key string) node {
  46. key = path.Clean(key)
  47. nodeNames := strings.Split(key, "/")
  48. levelNodes := s.nodes
  49. for i = 0; i < len(nodes) - 1; ++i {
  50. node, ok := levelNodes[nodeNames[i]]
  51. if !ok || !node.dir {
  52. return nil
  53. }
  54. levelNodes = levelNodes.nodes
  55. }
  56. node, ok := levelNodes[nodeNames[i]]
  57. if ok {
  58. return node
  59. }
  60. return nil
  61. }
  62. // delete the key, return the old value if the key exists
  63. func (s *store) delete(key string) string {
  64. return nil
  65. }
  66. func (n *node) Value() string{
  67. return n.value
  68. }