kv_storage.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package storage
  2. import (
  3. "github.com/cznic/kv"
  4. )
  5. type kvStorage struct {
  6. db *kv.DB
  7. }
  8. func openKVStorage(path string) (Storage, error) {
  9. options := &kv.Options{}
  10. db, errOpen := kv.Open(path, options)
  11. if errOpen != nil {
  12. var errCreate error
  13. db, errCreate = kv.Create(path, options)
  14. if errCreate != nil {
  15. return db, errCreate
  16. }
  17. }
  18. return db, nil
  19. }
  20. func (s *kvStorage) WALName() string {
  21. return s.db.WALName()
  22. }
  23. func (s *kvStorage) Set(k []byte, v []byte) error {
  24. return s.db.Set(k, v)
  25. }
  26. func (s *kvStorage) Get(k []byte) ([]byte, error) {
  27. return s.db.Get(nil, k)
  28. }
  29. func (s *kvStorage) Delete(k []byte) error {
  30. return s.db.Delete(k)
  31. }
  32. func (s *kvStorage) ForEach(fn func(k, v []byte) error) error {
  33. iter, err := s.db.SeekFirst()
  34. if err == io.EOF {
  35. return nil
  36. } else if err != nil {
  37. return err
  38. }
  39. for {
  40. key, value, err := iter.Next()
  41. if err == io.EOF {
  42. break
  43. } else if err != nil {
  44. return err
  45. }
  46. if err := fn(key, value); err != nil {
  47. return err
  48. }
  49. }
  50. return nil
  51. }
  52. func (s *kvStorage) Close() error {
  53. return s.db.Close()
  54. }