智能合约最基础的函数GetState(key),PutState(key,bytes),kv方式存储数据;
- stub CreateCompositeKey 创建混合key
虽然key可以自己定,但是官方推荐此方法;
eg:
creditkey, err:= stub.CreateCompositeKey("data_credit_info", []string{credit.Agent_code,credit.credit_code})
创建一个类型为"data_credit_info",包含两个索引的key:credit.Agent_code,credit.credit_code;
这样做的好处是,官方提供了根据部分key查询的数据的函数,详见函数3.
- stub GetQueryResult 函数
参数:queryString string 查询条件
eg. queryString := "{ \"selector\":{\"Object_type\":\"userinfo\"} }"
selector是固定格式;
Object_type为要查询json的的一个字段,后面可增加更多字段过滤;
resultsIterator, err := stub.GetQueryResult(queryString)
返回数据后需要手动关闭:
defer resultsIterator.Close()
for resultsIterator.HasNext() {
queryResponse, err := resultsIterator.Next()
if err != nil {
return shim.Error(err.Error())
}
// Record is a JSON object, so we write as-is
result := struct {
UUID string `json:"uuid"`
Object_type string `json:"object_type"`
}{}
err = json.Unmarshal(queryResponse.Value, &result)
if err != nil {
return shim.Error(err.Error())
}
}
- stub GetStateByPartialCompositeKey 数据查询函数
resultsIterator, err = stub.GetStateByPartialCompositeKey("data_credit_info", []string{credit.Agent_code})
or
resultsIterator, err = stub.GetStateByPartialCompositeKey("data_credit_info", []string{})
这个函数返回的结果跟GetQueryResult类似
这个函数要跟putstate设置的key结合使用,查询类型为"data_credit_info",agent_code为credit.Agent_code的所有数据;
注意!!!!
这里其实是一种对Key进行前缀匹配的查询,也就是说,我们虽然是部分复合键的查询,但是不允许拿后面部分的复合键进行匹配,必须是前面部分。
其他函数
/*
判断结构体是否为空,int未处理
*/
func CheckStructIsEmpty(data interface{}) (int , string){
t := reflect.TypeOf(data)
v := reflect.ValueOf(data)
b := bytes.Buffer{}
isEmpty := 0
for k := 0; k < t.NumField(); k++ {
//fmt.Printf("%s -- %v \n", t.Field(k).Name, v.Field(k).Interface())
switch v.Field(k).Interface().(type) {
case string:
if len(v.Field(k).String()) == 0 {
isEmpty = 1
b.WriteString(t.Field(k).Name)
b.WriteString(" 参数不能为空!")
}
case int:
// TODO: deal for int
}
}
return isEmpty,b.String()
}
整理中……
网友评论