leveldb.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package ezdb
  2. import (
  3. "os"
  4. "github.com/syndtr/goleveldb/leveldb"
  5. )
  6. type LevelDBCollection[T any] struct {
  7. path string
  8. db *leveldb.DB
  9. m DocumentMarshaler[T, []byte]
  10. }
  11. func (c *LevelDBCollection[T]) Close() error {
  12. if c.db != nil {
  13. if err := c.db.Close(); err != nil {
  14. return err
  15. }
  16. c.db = nil
  17. }
  18. return nil
  19. }
  20. func (c *LevelDBCollection[T]) Delete(key string) error {
  21. return c.db.Delete([]byte(key), nil)
  22. }
  23. // Destroy the database completely, removing it from disk.
  24. func (c *LevelDBCollection[T]) Destroy() error {
  25. if err := c.Close(); err != nil {
  26. return err
  27. }
  28. return os.RemoveAll(c.path)
  29. }
  30. func (c *LevelDBCollection[T]) Get(key string) (T, error) {
  31. dest := c.m.Factory()
  32. src, err := c.db.Get([]byte(key), nil)
  33. if err != nil {
  34. return dest, err
  35. }
  36. err = c.m.Unmarshal(src, dest)
  37. return dest, err
  38. }
  39. func (c *LevelDBCollection[T]) Has(key string) (bool, error) {
  40. return c.db.Has([]byte(key), nil)
  41. }
  42. func (c *LevelDBCollection[T]) Iter() Iterator[T] {
  43. i := &LevelDBIterator[T]{
  44. i: c.db.NewIterator(nil, nil),
  45. m: c.m,
  46. }
  47. return i
  48. }
  49. func (c *LevelDBCollection[T]) Open() error {
  50. if c.db == nil {
  51. db, err := leveldb.OpenFile(c.path, nil)
  52. if err != nil {
  53. return err
  54. }
  55. c.db = db
  56. }
  57. return nil
  58. }
  59. func (c *LevelDBCollection[T]) Put(key string, src T) error {
  60. if err := ValidateKey(key); err != nil {
  61. return err
  62. }
  63. dest, err := c.m.Marshal(src)
  64. if err != nil {
  65. return err
  66. }
  67. return c.db.Put([]byte(key), dest, nil)
  68. }
  69. // LevelDB creates a new collection using LevelDB storage.
  70. func LevelDB[T any](path string, m DocumentMarshaler[T, []byte]) *LevelDBCollection[T] {
  71. c := &LevelDBCollection[T]{
  72. path: path,
  73. m: m,
  74. }
  75. return c
  76. }