github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/watcher/dds.go (about) 1 package watcher 2 3 import ( 4 "bytes" 5 "log" 6 "sort" 7 8 tmstate "github.com/fibonacci-chain/fbc/libs/tendermint/state" 9 "github.com/golang/protobuf/proto" 10 ) 11 12 func SetWatchDataManager() { 13 tmstate.SetWasmWatchDataManager(WatchDataManager{}) 14 } 15 16 type WatchDataManager struct{} 17 18 func (w WatchDataManager) CreateWatchDataGenerator() func() ([]byte, error) { 19 data := &WatchData{ 20 Messages: make([]*WatchMessage, 0, len(blockStateCache)), 21 } 22 for _, v := range blockStateCache { 23 data.Messages = append(data.Messages, v) 24 } 25 sort.Sort(data) 26 return func() ([]byte, error) { 27 return proto.Marshal(data) 28 } 29 } 30 31 func (w WatchDataManager) UnmarshalWatchData(b []byte) (interface{}, error) { 32 if len(b) == 0 { 33 return nil, nil 34 } 35 var data WatchData 36 err := proto.Unmarshal(b, &data) 37 if err != nil { 38 return nil, err 39 } 40 return &data, nil 41 } 42 43 func (w WatchDataManager) ApplyWatchData(v interface{}) { 44 data, ok := v.(*WatchData) 45 if !ok { 46 return 47 } 48 task := func() { 49 batch := db.NewBatch() 50 for _, msg := range data.Messages { 51 if msg.IsDelete { 52 batch.Delete(msg.Key) 53 } else { 54 batch.Set(msg.Key, msg.Value) 55 } 56 } 57 if err := batch.Write(); err != nil { 58 log.Println("ApplyWatchData batch write error:" + err.Error()) 59 } 60 } 61 62 tasks <- task 63 } 64 65 func (d *WatchData) Len() int { 66 return len(d.Messages) 67 } 68 69 func (d *WatchData) Less(i, j int) bool { 70 return bytes.Compare(d.Messages[i].Key, d.Messages[j].Key) < 0 71 } 72 73 func (d *WatchData) Swap(i, j int) { 74 d.Messages[i], d.Messages[j] = d.Messages[j], d.Messages[i] 75 }