leveldb.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package ezdb
  2. import (
  3. "os"
  4. "github.com/syndtr/goleveldb/leveldb"
  5. "github.com/syndtr/goleveldb/leveldb/opt"
  6. )
  7. type LevelDBCollection[T any] struct {
  8. path string
  9. db *leveldb.DB
  10. m DocumentMarshaler[T, []byte]
  11. optOpen *opt.Options
  12. optRead *opt.ReadOptions
  13. optWrite *opt.WriteOptions
  14. }
  15. func (c *LevelDBCollection[T]) Close() error {
  16. if c.db != nil {
  17. if err := c.db.Close(); err != nil {
  18. return err
  19. }
  20. c.db = nil
  21. }
  22. return nil
  23. }
  24. func (c *LevelDBCollection[T]) Count() int {
  25. iter := c.Iter()
  26. defer iter.Release()
  27. return iter.Count()
  28. }
  29. func (c *LevelDBCollection[T]) Delete(key string) error {
  30. return c.db.Delete([]byte(key), c.optWrite)
  31. }
  32. func (c *LevelDBCollection[T]) DeleteAll() error {
  33. iter := c.Iter()
  34. defer iter.Release()
  35. keys := iter.GetAllKeys()
  36. for _, key := range keys {
  37. if err := c.Delete(key); err != nil {
  38. return err
  39. }
  40. }
  41. return nil
  42. }
  43. // Destroy the database completely, removing it from disk.
  44. func (c *LevelDBCollection[T]) Destroy() error {
  45. if err := c.Close(); err != nil {
  46. return err
  47. }
  48. return os.RemoveAll(c.path)
  49. }
  50. func (c *LevelDBCollection[T]) Get(key string) (T, error) {
  51. dest := c.m.Factory()
  52. src, err := c.db.Get([]byte(key), c.optRead)
  53. if err != nil {
  54. return dest, err
  55. }
  56. err = c.m.Unmarshal(src, dest)
  57. return dest, err
  58. }
  59. func (c *LevelDBCollection[T]) GetAll() (map[string]T, error) {
  60. iter := c.Iter()
  61. defer iter.Release()
  62. return iter.GetAll()
  63. }
  64. func (c *LevelDBCollection[T]) GetAllKeys() []string {
  65. iter := c.Iter()
  66. defer iter.Release()
  67. return iter.GetAllKeys()
  68. }
  69. func (c *LevelDBCollection[T]) Has(key string) (bool, error) {
  70. return c.db.Has([]byte(key), c.optRead)
  71. }
  72. func (c *LevelDBCollection[T]) Iter() Iterator[T] {
  73. i := &LevelDBIterator[T]{
  74. i: c.db.NewIterator(nil, c.optRead),
  75. m: c.m,
  76. }
  77. return i
  78. }
  79. func (c *LevelDBCollection[T]) Open() error {
  80. if c.db == nil {
  81. db, err := leveldb.OpenFile(c.path, c.optOpen)
  82. if err != nil {
  83. return err
  84. }
  85. c.db = db
  86. }
  87. return nil
  88. }
  89. func (c *LevelDBCollection[T]) Put(key string, src T) error {
  90. if err := ValidateKey(key); err != nil {
  91. return err
  92. }
  93. dest, err := c.m.Marshal(src)
  94. if err != nil {
  95. return err
  96. }
  97. return c.db.Put([]byte(key), dest, c.optWrite)
  98. }
  99. // LevelDB creates a new collection using LevelDB storage.
  100. func LevelDB[T any](path string, m DocumentMarshaler[T, []byte], o *LevelDBOptions) *LevelDBCollection[T] {
  101. c := &LevelDBCollection[T]{
  102. path: path,
  103. m: m,
  104. // Unpack options
  105. optOpen: o.GetOpen(),
  106. optRead: o.GetRead(),
  107. optWrite: o.GetWrite(),
  108. }
  109. return c
  110. }