Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.70 KB | None | 0 0
  1. diff --git a/pkg/keyvalue/leveldb.go b/pkg/keyvalue/leveldb.go
  2. index 981df56..e141956 100644
  3. --- a/pkg/keyvalue/leveldb.go
  4. +++ b/pkg/keyvalue/leveldb.go
  5. @@ -8,22 +8,40 @@ import (
  6.     "github.com/syndtr/goleveldb/leveldb/util"
  7.  )
  8.  
  9. +type pair struct {
  10. +   key      []byte
  11. +   value    []byte
  12. +   deletion bool
  13. +}
  14. +
  15.  type batch struct {
  16. -   leveldbBatch *leveldb.Batch
  17. -   filter       *bloomFilter
  18. +   filter *bloomFilter
  19. +   pairs  []pair
  20.  }
  21.  
  22.  func (b *batch) Delete(key []byte) {
  23. -   b.leveldbBatch.Delete(key)
  24. +   b.pairs = append(b.pairs, pair{key: key, deletion: true})
  25.  }
  26.  
  27.  func (b *batch) Put(key, val []byte) {
  28. -   b.leveldbBatch.Put(key, val)
  29. +   b.pairs = append(b.pairs, pair{key: key, value: val, deletion: false})
  30.     b.filter.add(key)
  31.  }
  32.  
  33. +func (b *batch) leveldbBatch() *leveldb.Batch {
  34. +   leveldbBatch := new(leveldb.Batch)
  35. +   for _, pair := range b.pairs {
  36. +       if pair.deletion {
  37. +           leveldbBatch.Delete(pair.key)
  38. +       } else {
  39. +           leveldbBatch.Put(pair.key, pair.value)
  40. +       }
  41. +   }
  42. +   return leveldbBatch
  43. +}
  44. +
  45.  func (b *batch) Reset() {
  46. -   b.leveldbBatch.Reset()
  47. +   b.pairs = nil
  48.  }
  49.  
  50.  type KeyVal struct {
  51. @@ -67,7 +85,7 @@ func NewKeyVal(path string, params BloomFilterParams) (*KeyVal, error) {
  52.  }
  53.  
  54.  func (k *KeyVal) NewBatch() (Batch, error) {
  55. -   return &batch{new(leveldb.Batch), k.filter}, nil
  56. +   return &batch{filter: k.filter}, nil
  57.  }
  58.  
  59.  func (k *KeyVal) Get(key []byte) ([]byte, error) {
  60. @@ -105,7 +123,7 @@ func (k *KeyVal) Flush(b1 Batch) error {
  61.     if !ok {
  62.         return errors.New("can't convert batch interface to leveldb's batch")
  63.     }
  64. -   if err := k.db.Write(b.leveldbBatch, nil); err != nil {
  65. +   if err := k.db.Write(b.leveldbBatch(), nil); err != nil {
  66.         return err
  67.     }
  68.     b.Reset()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement