bolt_storage.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package storage
  2. import (
  3. "github.com/boltdb/bolt"
  4. "time"
  5. )
  6. var wukong_documents = []byte("wukong_documents")
  7. type boltStorage struct {
  8. db *bolt.DB
  9. }
  10. func openBoltStorage(path string) (Storage, error) {
  11. db, err := bolt.Open(path, 0600, &bolt.Options{Timeout: 3600 * time.Second})
  12. if err != nil {
  13. return nil, err
  14. }
  15. err = db.Update(func(tx *bolt.Tx) error {
  16. _, err := tx.CreateBucketIfNotExists(wukong_documents)
  17. return err
  18. })
  19. if err != nil {
  20. db.Close()
  21. return nil, err
  22. }
  23. return &boltStorage{db}, nil
  24. }
  25. func (s *boltStorage) WAlName() string {
  26. return s.db.Path()
  27. }
  28. func (s *boltStorage) Set(k []byte, v []byte) error {
  29. return s.db.Update(func(tx *bolt.Tx) error {
  30. return tx.Bucket(wukong_documents).Put(k, v)
  31. })
  32. }
  33. func (s *boltStorage) Get(k []byte) (b []byte, err error) {
  34. err = s.db.View(func(tx *bolt.Tx) error {
  35. b = tx.Bucket(wukong_documents).Get(k)
  36. return nil
  37. })
  38. return
  39. }
  40. func (s *boltStorage) Delete(k []byte) error {
  41. return s.db.Update(func(tx *bolt.Tx) error {
  42. return tx.Bucket(wukong_documents).Delete(k)
  43. })
  44. }
  45. func (s *boltStorage) ForEach(fn func(k, v []byte) error) error {
  46. return s.db.View(func(tx *bolt.Tx) error {
  47. b := tx.Bucket(wukong_documents)
  48. c := b.Cursor()
  49. for k, v := c.First(); k != nil; k, v = c.Next() {
  50. if err := fn(k, v); err != nil {
  51. return err
  52. }
  53. }
  54. return nil
  55. })
  56. }
  57. func (s *boltStorage) Close() error {
  58. return s.db.Close()
  59. }