memory.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package ezdb
  2. import "fmt"
  3. type MemoryCollection[T any] struct {
  4. c Collection[T]
  5. m map[string]T
  6. open bool
  7. }
  8. func (c *MemoryCollection[T]) Close() error {
  9. if c.c != nil {
  10. return c.c.Close()
  11. }
  12. c.m = map[string]T{}
  13. c.open = false
  14. return nil
  15. }
  16. func (c *MemoryCollection[T]) Count() int {
  17. iter := c.Iter()
  18. defer iter.Release()
  19. return iter.Count()
  20. }
  21. func (c *MemoryCollection[T]) Delete(key string) error {
  22. if !c.open {
  23. return ErrClosed
  24. }
  25. if c.c != nil {
  26. if err := c.c.Delete(key); err != nil {
  27. return err
  28. }
  29. }
  30. delete(c.m, key)
  31. return nil
  32. }
  33. func (c *MemoryCollection[T]) DeleteAll() error {
  34. iter := c.Iter()
  35. defer iter.Release()
  36. keys := iter.GetAllKeys()
  37. for _, key := range keys {
  38. if err := c.Delete(key); err != nil {
  39. return err
  40. }
  41. }
  42. return nil
  43. }
  44. func (c *MemoryCollection[T]) Get(key string) (T, error) {
  45. if !c.open {
  46. return c.m[""], ErrClosed
  47. }
  48. if value, ok := c.m[key]; ok {
  49. return value, nil
  50. }
  51. return c.m[""], ErrNotFound
  52. }
  53. func (c *MemoryCollection[T]) GetAll() (map[string]T, error) {
  54. iter := c.Iter()
  55. defer iter.Release()
  56. return iter.GetAll()
  57. }
  58. func (c *MemoryCollection[T]) GetAllKeys() []string {
  59. iter := c.Iter()
  60. defer iter.Release()
  61. return iter.GetAllKeys()
  62. }
  63. func (c *MemoryCollection[T]) Has(key string) (bool, error) {
  64. if !c.open {
  65. return false, ErrClosed
  66. }
  67. _, ok := c.m[key]
  68. return ok, nil
  69. }
  70. func (c *MemoryCollection[T]) Iter() Iterator[T] {
  71. m := MemoryIter[T](c.m, nil, nil)
  72. if !c.open {
  73. m.Release()
  74. }
  75. return m
  76. }
  77. func (c *MemoryCollection[T]) Open() error {
  78. if c.c != nil {
  79. if err := c.c.Open(); err != nil {
  80. return err
  81. }
  82. iter := c.c.Iter()
  83. defer iter.Release()
  84. all, err := iter.GetAll()
  85. if err != nil {
  86. return err
  87. }
  88. fmt.Println(all)
  89. c.m = all
  90. } else {
  91. c.m = map[string]T{}
  92. }
  93. c.open = true
  94. return nil
  95. }
  96. func (c *MemoryCollection[T]) Put(key string, value T) error {
  97. if !c.open {
  98. return ErrClosed
  99. }
  100. if err := ValidateKey(key); err != nil {
  101. return err
  102. }
  103. if c.c != nil {
  104. if err := c.c.Put(key, value); err != nil {
  105. return err
  106. }
  107. }
  108. c.m[key] = value
  109. return nil
  110. }
  111. // Memory creates an in-memory collection, which offers fast access without a document marshaler.
  112. //
  113. // If the collection c is non-nil, it will be used as a persistence backend.
  114. //
  115. // If T is a pointer type, the same pointer will be used whenever a document is read from this collection.
  116. // Take care not to modify documents retrieved from a memory collection.
  117. func Memory[T any](c Collection[T]) *MemoryCollection[T] {
  118. return &MemoryCollection[T]{
  119. c: c,
  120. m: map[string]T{},
  121. }
  122. }