leveldb.go 2.6 KB

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