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  }