package main import log "github.com/sirupsen/logrus" //import "io/ioutil" import "fmt" import "strconv" //steem block fetcher const appPrefix = "sbf" type SteemDataStorer interface { SetCurrentBlockHeight(BlockNumber) error CurrentBlockHeight() BlockNumber HaveOpsForBlock(BlockNumber) bool StoreBlockOps(BlockNumber, *[]byte) error } // SteemDataStore is the object with which the rest of this tool interacts type SteemDataStore struct { kv KVStorer } func NewSteemDataStore(hostname string) SteemDataStorer { self := new(SteemDataStore) self.kv = NewRedisKVStore(hostname) return self } func (self *SteemDataStore) SetCurrentBlockHeight(blockNum BlockNumber) error { keyname := fmt.Sprintf("%s.meta.CurrentBlockHeight", appPrefix) value := fmt.Sprintf("%d", blockNum) return self.kv.Put(&keyname, &value) } func (self *SteemDataStore) FindHighestContiguousBlockInDb(from BlockNumber) BlockNumber { last := from var keyname string var try BlockNumber for { try = BlockNumber(uint64(last) + 1) keyname = fmt.Sprintf("%s.ops_in_block.%d", appPrefix, try) exists, _ := self.kv.Exists(&keyname) if exists == false { log.Debugf("cannot find block %d in db, highest found is %d", try, last) return last } else { last = try } } } func (self *SteemDataStore) StoreBlockOps(blockNum BlockNumber, blockOps *[]byte) error { keyname := fmt.Sprintf("%s.ops_in_block.%d", appPrefix, blockNum) value := string(*blockOps) return self.kv.Put(&keyname, &value) } func (self *SteemDataStore) HaveOpsForBlock(blockNum BlockNumber) bool { keyname := fmt.Sprintf("%s.ops_in_block.%d", appPrefix, blockNum) exists, _ := self.kv.Exists(&keyname) return exists } func (self *SteemDataStore) CurrentBlockHeight() BlockNumber { keyname := fmt.Sprintf("%s.meta.CurrentBlockHeight", appPrefix) val, err := self.kv.Get(&keyname) if err != nil { // assume this is key not found, initialize key to default self.SetCurrentBlockHeight(0) // retry return self.CurrentBlockHeight() } intval, err := strconv.ParseUint(*val, 10, 64) return BlockNumber(intval) }