Commit af4f3531 authored by liuyuhang's avatar liuyuhang Committed by 33cn

add db table to poard

parent a624910f
...@@ -14,7 +14,7 @@ import ( ...@@ -14,7 +14,7 @@ import (
func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) { func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
var set []*types.KeyValue table := NewBoardTable(a.GetLocalDB())
for _, log := range receiptData.Logs { for _, log := range receiptData.Logs {
switch log.Ty { switch log.Ty {
case auty.TyLogPropBoard, case auty.TyLogPropBoard,
...@@ -27,14 +27,23 @@ func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalD ...@@ -27,14 +27,23 @@ func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalD
if err != nil { if err != nil {
return nil, err return nil, err
} }
kv := saveBoardHeightIndex(&receipt)
set = append(set, kv...) err = table.Replace(receipt.Current)
if err != nil {
return nil, err
}
} }
default: default:
break break
} }
} }
dbSet.KV = append(dbSet.KV, set...)
kvs, err := table.Save()
if err != nil {
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil return dbSet, nil
} }
...@@ -56,27 +65,41 @@ func saveBoardHeightIndex(res *auty.ReceiptProposalBoard) (kvs []*types.KeyValue ...@@ -56,27 +65,41 @@ func saveBoardHeightIndex(res *auty.ReceiptProposalBoard) (kvs []*types.KeyValue
func (a *Autonomy) execDelLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) { func (a *Autonomy) execDelLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{} dbSet := &types.LocalDBSet{}
var set []*types.KeyValue table := NewBoardTable(a.GetLocalDB())
for _, log := range receiptData.Logs { for _, log := range receiptData.Logs {
var receipt auty.ReceiptProposalBoard
err := types.Decode(log.Log, &receipt)
if err != nil {
return nil, err
}
switch log.Ty { switch log.Ty {
case auty.TyLogPropBoard, case auty.TyLogPropBoard:
auty.TyLogRvkPropBoard, {
heightIndex := dapp.HeightIndexStr(receipt.Current.Height, int64(receipt.Current.Index))
err = table.Del([]byte(heightIndex))
if err != nil {
return nil, err
}
}
case auty.TyLogRvkPropBoard,
auty.TyLogVotePropBoard, auty.TyLogVotePropBoard,
auty.TyLogTmintPropBoard: auty.TyLogTmintPropBoard:
{ {
var receipt auty.ReceiptProposalBoard err = table.Replace(receipt.Prev)
err := types.Decode(log.Log, &receipt)
if err != nil { if err != nil {
return nil, err return nil, err
} }
kv := delBoardHeightIndex(&receipt)
set = append(set, kv...)
} }
default: default:
break break
} }
} }
dbSet.KV = append(dbSet.KV, set...) kvs, err := table.Save()
if err != nil {
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil return dbSet, nil
} }
...@@ -117,38 +140,54 @@ func (a *Autonomy) listProposalBoard(req *auty.ReqQueryProposalBoard) (types.Mes ...@@ -117,38 +140,54 @@ func (a *Autonomy) listProposalBoard(req *auty.ReqQueryProposalBoard) (types.Mes
if req == nil { if req == nil {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
var key []byte
var values [][]byte
var err error
localDb := a.GetLocalDB() localDb := a.GetLocalDB()
if req.GetIndex() == -1 { query := NewBoardTable(localDb).GetQuery(localDb)
key = nil var primary []byte
} else { //翻页查找指定的txhash列表 if req.Height > 0 {
heightstr := genHeightIndexStr(req.GetIndex()) primary = []byte(dapp.HeightIndexStr(req.Height, int64(req.Index)))
key = calcBoardKey4StatusHeight(req.Status, heightstr) }
} indexName := ""
prefix := calcBoardKey4StatusHeight(req.Status, "") if req.Status > 0 && req.Addr != "" {
values, err = localDb.List(prefix, key, req.Count, req.GetDirection()) indexName = "addr_status"
} else if req.Status > 0 {
indexName = "status"
} else if req.Addr != "" {
indexName = "addr"
}
cur := &BoardRow{
AutonomyProposalBoard: &auty.AutonomyProposalBoard{},
}
cur.Address = req.Addr
cur.Status = req.Status
cur.Height = req.Height
cur.Index = req.Index
prefix, err := cur.Get(indexName)
rows, err := query.ListIndex(indexName, prefix, primary, req.Count, req.Direction)
if err != nil { if err != nil {
alog.Error("query List failed", "indexName", indexName, "prefix", "prefix", "key", string(primary), "err", err)
return nil, err return nil, err
} }
if len(values) == 0 { if len(rows) == 0 {
return nil, types.ErrNotFound return nil, types.ErrNotFound
} }
var rep auty.ReplyQueryProposalBoard var rep auty.ReplyQueryProposalBoard
for _, value := range values { for _, row := range rows {
prop := &auty.AutonomyProposalBoard{} r, ok := row.Data.(*auty.AutonomyProposalBoard)
err = types.Decode(value, prop) if !ok {
if err != nil { alog.Error("listProposalBoard", "err", "bad row type")
return nil, err return nil, types.ErrDecode
} }
rep.PropBoards = append(rep.PropBoards, prop) rep.PropBoards = append(rep.PropBoards, r)
} }
return &rep, nil return &rep, nil
} }
func genHeightIndexStr(index int64) string { func genHeightIndexStr(index int64) string {
return fmt.Sprintf("%018d", index) return fmt.Sprintf("%018d", index)
} }
...@@ -15,7 +15,9 @@ import ( ...@@ -15,7 +15,9 @@ import (
) )
func TestExecLocalBoard(t *testing.T) { func TestExecLocalBoard(t *testing.T) {
_, _, kvdb := util.CreateTestDB()
au := &Autonomy{} au := &Autonomy{}
au.SetLocalDB(kvdb)
//TyLogPropBoard //TyLogPropBoard
cur := &auty.AutonomyProposalBoard{ cur := &auty.AutonomyProposalBoard{
PropBoard: &auty.ProposalBoard{}, PropBoard: &auty.ProposalBoard{},
...@@ -247,12 +249,12 @@ func TestListProposalBoard(t *testing.T) { ...@@ -247,12 +249,12 @@ func TestListProposalBoard(t *testing.T) {
require.Equal(t, height, testcase2[2].height) require.Equal(t, height, testcase2[2].height)
require.Equal(t, index, int32(testcase2[2].index)) require.Equal(t, index, int32(testcase2[2].index))
// //
Index := height*types.MaxTxsPerBlock + int64(index)
req = &auty.ReqQueryProposalBoard{ req = &auty.ReqQueryProposalBoard{
Status: auty.AutonomyStatusProposalBoard, Status: auty.AutonomyStatusProposalBoard,
Count: 10, Count: 10,
Direction: 0, Direction: 0,
Index: Index, Height: height,
Index: index,
} }
rsp, err = au.listProposalBoard(req) rsp, err = au.listProposalBoard(req)
require.NoError(t, err) require.NoError(t, err)
......
package executor
import (
"fmt"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
"github.com/33cn/chain33/system/dapp"
)
/*
table struct
data: autonomy board
index: status, addr
*/
var opt = &table.Option{
Prefix: "LODB-autonomy",
Name: "board",
Primary: "heightindex",
Index: []string{"addr", "status", "addr_status"},
}
//NewTable 新建表
func NewBoardTable(kvdb db.KV) *table.Table {
rowmeta := NewBoardRow()
table, err := table.NewTable(rowmeta, kvdb, opt)
if err != nil {
panic(err)
}
return table
}
//BoardRow table meta 结构
type BoardRow struct {
*auty.AutonomyProposalBoard
}
//NewBoardRow 新建一个meta 结构
func NewBoardRow() *BoardRow {
return &BoardRow{AutonomyProposalBoard: &auty.AutonomyProposalBoard{}}
}
//CreateRow 新建数据行(注意index 数据一定也要保存到数据中,不能就保存heightindex)
func (r *BoardRow) CreateRow() *table.Row {
return &table.Row{Data: &auty.AutonomyProposalBoard{}}
}
//SetPayload 设置数据
func (r *BoardRow) SetPayload(data types.Message) error {
if d, ok := data.(*auty.AutonomyProposalBoard); ok {
r.AutonomyProposalBoard = d
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (r *BoardRow) Get(key string) ([]byte, error) {
if key == "heightindex" {
return []byte(dapp.HeightIndexStr(r.Height, int64(r.Index))), nil
} else if key == "status" {
return []byte(fmt.Sprintf("%2d", r.Status)), nil
} else if key == "addr" {
return []byte(r.Address), nil
} else if key == "addr_status" {
return []byte(fmt.Sprintf("%s:%2d", r.Address, r.Status)), nil
}
return nil, types.ErrNotFound
}
...@@ -117,34 +117,34 @@ func (a *Autonomy) listProposalProject(req *auty.ReqQueryProposalProject) (types ...@@ -117,34 +117,34 @@ func (a *Autonomy) listProposalProject(req *auty.ReqQueryProposalProject) (types
if req == nil { if req == nil {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
var key []byte //var key []byte
var values [][]byte //var values [][]byte
var err error //var err error
//
localDb := a.GetLocalDB() //localDb := a.GetLocalDB()
if req.GetIndex() == -1 { //if req.GetIndex() == -1 {
key = nil // key = nil
} else { //翻页查找指定的txhash列表 //} else { //翻页查找指定的txhash列表
heightstr := genHeightIndexStr(req.GetIndex()) // heightstr := genHeightIndexStr(req.GetIndex())
key = calcProjectKey4StatusHeight(req.Status, heightstr) // key = calcProjectKey4StatusHeight(req.Status, heightstr)
} //}
prefix := calcProjectKey4StatusHeight(req.Status, "") //prefix := calcProjectKey4StatusHeight(req.Status, "")
values, err = localDb.List(prefix, key, req.Count, req.GetDirection()) //values, err = localDb.List(prefix, key, req.Count, req.GetDirection())
if err != nil { //if err != nil {
return nil, err // return nil, err
} //}
if len(values) == 0 { //if len(values) == 0 {
return nil, types.ErrNotFound // return nil, types.ErrNotFound
} //}
var rep auty.ReplyQueryProposalProject var rep auty.ReplyQueryProposalProject
for _, value := range values { //for _, value := range values {
prop := &auty.AutonomyProposalProject{} // prop := &auty.AutonomyProposalProject{}
err = types.Decode(value, prop) // err = types.Decode(value, prop)
if err != nil { // if err != nil {
return nil, err // return nil, err
} // }
rep.PropProjects = append(rep.PropProjects, prop) // rep.PropProjects = append(rep.PropProjects, prop)
} //}
return &rep, nil return &rep, nil
} }
...@@ -253,12 +253,12 @@ func TestListProposalProject(t *testing.T) { ...@@ -253,12 +253,12 @@ func TestListProposalProject(t *testing.T) {
require.Equal(t, height, testcase2[2].height) require.Equal(t, height, testcase2[2].height)
require.Equal(t, index, int32(testcase2[2].index)) require.Equal(t, index, int32(testcase2[2].index))
// //
Index := height*types.MaxTxsPerBlock + int64(index)
req = &auty.ReqQueryProposalProject{ req = &auty.ReqQueryProposalProject{
Status: auty.AutonomyStatusProposalProject, Status: auty.AutonomyStatusProposalProject,
Count: 10, Count: 10,
Direction: 0, Direction: 0,
Index: Index, Height: height,
Index: index,
} }
rsp, err = au.listProposalProject(req) rsp, err = au.listProposalProject(req)
require.NoError(t, err) require.NoError(t, err)
......
...@@ -115,35 +115,35 @@ func (a *Autonomy) listProposalRule(req *auty.ReqQueryProposalRule) (types.Messa ...@@ -115,35 +115,35 @@ func (a *Autonomy) listProposalRule(req *auty.ReqQueryProposalRule) (types.Messa
if req == nil { if req == nil {
return nil, types.ErrInvalidParam return nil, types.ErrInvalidParam
} }
var key []byte //var key []byte
var values [][]byte //var values [][]byte
var err error //var err error
//
localDb := a.GetLocalDB() //localDb := a.GetLocalDB()
if req.GetIndex() == -1 { //if req.GetIndex() == -1 {
key = nil // key = nil
} else { //翻页查找指定的txhash列表 //} else { //翻页查找指定的txhash列表
heightstr := genHeightIndexStr(req.GetIndex()) // heightstr := genHeightIndexStr(req.GetIndex())
key = calcRuleKey4StatusHeight(req.Status, heightstr) // key = calcRuleKey4StatusHeight(req.Status, heightstr)
} //}
prefix := calcRuleKey4StatusHeight(req.Status, "") //prefix := calcRuleKey4StatusHeight(req.Status, "")
values, err = localDb.List(prefix, key, req.Count, req.GetDirection()) //values, err = localDb.List(prefix, key, req.Count, req.GetDirection())
if err != nil { //if err != nil {
return nil, err // return nil, err
} //}
if len(values) == 0 { //if len(values) == 0 {
return nil, types.ErrNotFound // return nil, types.ErrNotFound
} //}
var rep auty.ReplyQueryProposalRule var rep auty.ReplyQueryProposalRule
for _, value := range values { //for _, value := range values {
prop := &auty.AutonomyProposalRule{} // prop := &auty.AutonomyProposalRule{}
err = types.Decode(value, prop) // err = types.Decode(value, prop)
if err != nil { // if err != nil {
return nil, err // return nil, err
} // }
rep.PropRules = append(rep.PropRules, prop) // rep.PropRules = append(rep.PropRules, prop)
} //}
return &rep, nil return &rep, nil
} }
......
...@@ -247,12 +247,12 @@ func TestListProposalRule(t *testing.T) { ...@@ -247,12 +247,12 @@ func TestListProposalRule(t *testing.T) {
require.Equal(t, height, testcase2[2].height) require.Equal(t, height, testcase2[2].height)
require.Equal(t, index, int32(testcase2[2].index)) require.Equal(t, index, int32(testcase2[2].index))
// //
Index := height*types.MaxTxsPerBlock + int64(index)
req = &auty.ReqQueryProposalRule{ req = &auty.ReqQueryProposalRule{
Status: auty.AutonomyStatusProposalRule, Status: auty.AutonomyStatusProposalRule,
Count: 10, Count: 10,
Direction: 0, Direction: 0,
Index: Index, Height: height,
Index: index,
} }
rsp, err = au.listProposalRule(req) rsp, err = au.listProposalRule(req)
require.NoError(t, err) require.NoError(t, err)
......
...@@ -65,11 +65,12 @@ message LocalProposalBoard { ...@@ -65,11 +65,12 @@ message LocalProposalBoard {
// query // query
message ReqQueryProposalBoard { message ReqQueryProposalBoard {
//优先根据status查询 int32 count = 1;
int32 status = 1; int32 direction = 2;
int32 count = 2; int64 height = 3;
int32 direction = 3; int32 index = 4;
int64 index = 4; int32 status = 5;
string addr = 6;
} }
message ReplyQueryProposalBoard { message ReplyQueryProposalBoard {
......
...@@ -82,11 +82,12 @@ message LocalProposalProject { ...@@ -82,11 +82,12 @@ message LocalProposalProject {
// query // query
message ReqQueryProposalProject { message ReqQueryProposalProject {
//优先根据status查询 int32 count = 1;
int32 status = 1; int32 direction = 2;
int32 count = 2; int64 height = 3;
int32 direction = 3; int32 index = 4;
int64 index = 4; int32 status = 5;
string addr = 6;
} }
message ReplyQueryProposalProject { message ReplyQueryProposalProject {
......
...@@ -61,11 +61,12 @@ message LocalProposalRule { ...@@ -61,11 +61,12 @@ message LocalProposalRule {
// query // query
message ReqQueryProposalRule { message ReqQueryProposalRule {
//优先根据status查询 int32 count = 1;
int32 status = 1; int32 direction = 2;
int32 count = 2; int64 height = 3;
int32 direction = 3; int32 index = 4;
int64 index = 4; int32 status = 5;
string addr = 6;
} }
message ReplyQueryProposalRule { message ReplyQueryProposalRule {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment