90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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() error
 | 
						|
	ForceSetCurrentBlockHeight(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(dir string) *SteemDataStore {
 | 
						|
	self := new(SteemDataStore)
 | 
						|
	self.kv = NewRedisKVStore()
 | 
						|
	return self
 | 
						|
}
 | 
						|
 | 
						|
func (self *SteemDataStore) ForceSetCurrentBlockHeight(blockNum BlockNumber) error {
 | 
						|
	keyname := fmt.Sprintf("%s.global.CurrentBlockHeight", appPrefix)
 | 
						|
	value := fmt.Sprintf("%d", blockNum)
 | 
						|
	return self.kv.Put(&keyname, &value)
 | 
						|
}
 | 
						|
 | 
						|
// this function searches for the highest contiguously stored blocknum
 | 
						|
// and updates the memo in the db
 | 
						|
func (self *SteemDataStore) SetCurrentBlockHeight() error {
 | 
						|
	nextVal := self.FindHighestContiguousBlockInDb(self.CurrentBlockHeight())
 | 
						|
	keyname := fmt.Sprintf("%s.global.CurrentBlockHeight", appPrefix)
 | 
						|
	value := fmt.Sprintf("%d", nextVal)
 | 
						|
	log.Infof("updating our current highest block in db to %d", nextVal)
 | 
						|
	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.global.CurrentBlockHeight", appPrefix)
 | 
						|
	val, err := self.kv.Get(&keyname)
 | 
						|
	if err != nil {
 | 
						|
		// assume this is key not found, initialize key to default
 | 
						|
		self.ForceSetCurrentBlockHeight(0)
 | 
						|
		// retry
 | 
						|
		return self.CurrentBlockHeight()
 | 
						|
	}
 | 
						|
	intval, err := strconv.ParseUint(*val, 10, 64)
 | 
						|
	return BlockNumber(intval)
 | 
						|
}
 |