kv_storage.go 1.1 KB

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