contractsdk/go/exec/kv_iterator.go

(开头部分) 1KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

package exec

import (
	"github.com/xuperchain/xuperunion/contractsdk/go/code"
	pb "github.com/xuperchain/xuperunion/contractsdk/go/pb"
)

var (
	_ code.Iterator = (*kvIterator)(nil)
)

const MAX_ITERATOR_CAP = 100

// kvIterator is a private struct
type kvIterator struct {
	buf          []*pb.IteratorItem // current buffer of the kv items
	curBuf       *pb.IteratorItem   // pointer of current position
	curIdx       int                // next index
	c            *contractContext   // where we can get the kv items
	err          error
	start, limit []byte
}

// newkvIterator return a code.Iterator
func newKvIterator(c *contractContext, start, limit []byte) code.Iterator {
	return &kvIterator{
		start: start,
		limit: limit,
		c:     c,
	}
}

// load loads the data from xbrigde, called when buf is empty, maintains the curIdx and starter
func (ki *kvIterator) load() {
	//clean the buf at beginning
	ki.buf = ki.buf[0:0]
	req := &pb.IteratorRequest{
		Start:  ki.start,
		Limit:  ki.limit,
		Cap:    MAX_ITERATOR_CAP,
		Header: &ki.c.header,
	}
	resp := new(pb.IteratorResponse)
	if err := ki.c.bridgeCallFunc("NewIterator", req, resp); err != nil {
		ki.err = err
		return
	}
	if len(resp.Items) == 0 {
		ki.start = ki.limit
		return
	}
	ki.curIdx = 0
	ki.buf = resp.Items
	ki.start = resp.Items[len(resp.Items)-1].Key
}

func (ki *kvIterator) Key() []byte {
	return ki.curBuf.Key
}

后面还有 21 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。