Commit 4da6c484 authored by 张振华's avatar 张振华

table refactor

parent 55e2f303
......@@ -6,13 +6,12 @@ package commands
import (
"fmt"
"strings"
jsonrpc "github.com/33cn/chain33/rpc/jsonclient"
rpctypes "github.com/33cn/chain33/rpc/types"
"github.com/33cn/chain33/types"
gty "github.com/33cn/plugin/plugin/dapp/guess/types"
"github.com/spf13/cobra"
"strings"
)
//GuessCmd Guess合约命令行
......@@ -250,6 +249,8 @@ func addGuessQueryFlags(cmd *cobra.Command) {
cmd.Flags().Int32P("status", "s", 0, "status")
cmd.Flags().StringP("gameIDs", "d", "", "gameIDs")
cmd.Flags().StringP("category", "c", "default", "game category")
cmd.Flags().StringP("primary", "p", "", "the primary to query from")
}
func guessQuery(cmd *cobra.Command, args []string) {
......@@ -262,6 +263,12 @@ func guessQuery(cmd *cobra.Command, args []string) {
index, _ := cmd.Flags().GetInt64("index")
gameIDs, _ := cmd.Flags().GetString("gameIDs")
category, _ := cmd.Flags().GetString("category")
primary, _ := cmd.Flags().GetString("primary")
var primaryKey []byte
if len(primary) > 0 {
primaryKey = []byte(primary)
}
var params rpctypes.Query4Jrpc
params.Execer = gty.GuessX
......@@ -301,6 +308,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
req := &gty.QueryGuessGameInfo{
Addr: addr,
Index: index,
PrimaryKey: primaryKey,
}
params.FuncName = gty.FuncNameQueryGameByAddr
params.Payload = types.MustPBToJSON(req)
......@@ -312,6 +320,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
req := &gty.QueryGuessGameInfo{
Status: status,
Index: index,
PrimaryKey: primaryKey,
}
params.FuncName = gty.FuncNameQueryGameByStatus
params.Payload = types.MustPBToJSON(req)
......@@ -323,6 +332,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
req := &gty.QueryGuessGameInfo{
AdminAddr: adminAddr,
Index: index,
PrimaryKey: primaryKey,
}
params.FuncName = gty.FuncNameQueryGameByAdminAddr
params.Payload = types.MustPBToJSON(req)
......@@ -335,6 +345,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
Addr: addr,
Status: status,
Index: index,
PrimaryKey: primaryKey,
}
params.FuncName = gty.FuncNameQueryGameByAddrStatus
params.Payload = types.MustPBToJSON(req)
......@@ -347,6 +358,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
AdminAddr: adminAddr,
Status: status,
Index: index,
PrimaryKey: primaryKey,
}
params.FuncName = gty.FuncNameQueryGameByAdminStatus
params.Payload = types.MustPBToJSON(req)
......@@ -359,6 +371,7 @@ func guessQuery(cmd *cobra.Command, args []string) {
Category: category,
Status: status,
Index: index,
PrimaryKey: primaryKey,
}
params.FuncName = gty.FuncNameQueryGameByCategoryStatus
params.Payload = types.MustPBToJSON(req)
......
......@@ -5,52 +5,104 @@
package executor
import (
"fmt"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
gty "github.com/33cn/plugin/plugin/dapp/guess/types"
)
func (g *Guess) rollbackIndex(log *gty.ReceiptGuessGame) (kvs []*types.KeyValue) {
//新创建游戏,将增加的记录都删除掉
if log.Status == gty.GuessGameStatusStart {
//kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, delGuessGameStatusIndexKey(log.Status, log.Index))
kvs = append(kvs, delGuessGameAdminIndexKey(log.AdminAddr, log.Index))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.Index))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.Index))
} else if log.Status == gty.GuessGameStatusBet {
//如果是下注状态,则有用户进行了下注操作,对这些记录进行删除
kvs = append(kvs, delGuessGameAddrIndexKey(log.Addr, log.Index))
kvs = append(kvs, delGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.Index))
func (g *Guess) rollbackGame(game *gty.GuessGame, log *gty.ReceiptGuessGame){
if game == nil || log == nil {
return
}
//如果发生了状态变化,恢复老状态的记录,删除新添加的状态记录
//如果状态发生了变化,则需要将游戏状态恢复到前一状态
if log.StatusChange {
kvs = append(kvs, addGuessGameStatusIndexKey(log.PreStatus, log.GameID, log.PreIndex))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.GameID, log.PreIndex))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.GameID, log.PreIndex))
game.Status = log.PreStatus
game.Index = log.PreIndex
kvs = append(kvs, delGuessGameStatusIndexKey(log.Status, log.Index))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.Index))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.Index))
//玩家信息中的index回滚
for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i]
player.Bet.Index = player.Bet.PreIndex
}
} else if log.StatusChange {
//其他状态时的状态发生变化的情况,要将老状态对应的记录恢复,同时删除新加的状态记录;对于每个地址的下注记录也需要遍历处理。
kvs = append(kvs, addGuessGameStatusIndexKey(log.PreStatus, log.GameID, log.PreIndex))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.GameID, log.PreIndex))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.GameID, log.PreIndex))
kvs = append(kvs, delGuessGameStatusIndexKey(log.Status, log.Index))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.Index))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.Index))
//从game中遍历每个地址的记录进行删除新增记录,回复老记录
game, err := readGame(g.GetStateDB(), log.GameID)
if err == nil {
}
//如果下注了,则需要把下注回滚
if log.Bet {
//统计信息回滚
game.BetStat.TotalBetTimes--
game.BetStat.TotalBetsNumber -= log.BetsNumber
for i := 0; i < len(game.BetStat.Items); i++ {
item := game.BetStat.Items[i]
if item.Option == log.Option{
item.BetsTimes--
item.BetsNumber -= log.BetsNumber
break
}
}
//玩家下注信息回滚
for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i]
kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.PreStatus, player.Addr, log.GameID, player.Bet.PreIndex))
kvs = append(kvs, delGuessGameAddrStatusIndexKey(log.Status, player.Addr, log.Index))
if player.Addr == log.Addr && player.Bet.Index == log.Index {
game.Plays = append(game.Plays[:i], game.Plays[i+1:]...)
break
}
}
}
}
func (g *Guess) rollbackIndex(log *gty.ReceiptGuessGame) (kvs []*types.KeyValue) {
userTable := gty.NewGuessUserTable(g.GetLocalDB())
gameTable := gty.NewGuessGameTable(g.GetLocalDB())
tablejoin, err := table.NewJoinTable(userTable, gameTable, []string{"addr#status"})
if err != nil {
return nil
}
if log.Status == gty.GuessGameStatusStart {
//新创建游戏回滚,game表删除记录
err = tablejoin.MustGetTable("game").Del([]byte(fmt.Sprintf("%018d", log.StartIndex)))
if err != nil {
return nil
}
kvs, _ = tablejoin.Save()
return kvs
} else if log.Status == gty.GuessGameStatusBet {
//下注阶段,需要更新游戏信息,回滚下注信息
game := log.Game
log.Game = nil
//先回滚游戏信息,再进行更新
g.rollbackGame(game, log)
err = tablejoin.MustGetTable("game").Replace(game)
if err != nil {
return nil
}
err = tablejoin.MustGetTable("user").Del([]byte(fmt.Sprintf("%018d", log.Index)))
if err != nil {
return nil
}
kvs, _ = tablejoin.Save()
} else if log.StatusChange {
//如果是其他状态下仅发生了状态变化,则需要恢复游戏状态,并更新游戏记录。
game := log.Game
log.Game = nil
//先回滚游戏信息,再进行更新
g.rollbackGame(game, log)
err = tablejoin.MustGetTable("game").Replace(game)
if err != nil {
return nil
}
kvs, _ = tablejoin.Save()
}
return kvs
......@@ -62,8 +114,7 @@ func (g *Guess) execDelLocal(receipt *types.ReceiptData) (*types.LocalDBSet, err
return dbSet, nil
}
/*
for _, log := range receiptData.Logs {
for _, log := range receipt.Logs {
switch log.GetTy() {
case gty.TyLogGuessGameStart, gty.TyLogGuessGameBet, gty.TyLogGuessGameStopBet, gty.TyLogGuessGameAbort, gty.TyLogGuessGamePublish, gty.TyLogGuessGameTimeout:
receiptGame := &gty.ReceiptGuessGame{}
......@@ -73,28 +124,8 @@ func (g *Guess) execDelLocal(receipt *types.ReceiptData) (*types.LocalDBSet, err
kv := g.rollbackIndex(receiptGame)
dbSet.KV = append(dbSet.KV, kv...)
}
}*/
table := gty.NewTable(g.GetLocalDB())
for _, item := range receipt.Logs {
var gameLog gty.ReceiptGuessGame
err := types.Decode(item.Log, &gameLog)
if err != nil {
return nil, err
}
gameLog.Status = gameLog.PreStatus
gameLog.Index = gameLog.PreIndex
err = table.Replace(&gameLog)
if err != nil {
return nil, err
}
kvs, err := table.Save()
if err != nil {
return nil, err
}
dbSet.KV = append(dbSet.KV, kvs...)
}
return dbSet, nil
}
......
......@@ -5,51 +5,75 @@
package executor
import (
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
gty "github.com/33cn/plugin/plugin/dapp/guess/types"
)
func (g *Guess) getUserBet(log *gty.ReceiptGuessGame) (userBet *gty.UserBet) {
userBet = &gty.UserBet{}
userBet.StartIndex = log.StartIndex
userBet.Index = log.Index
userBet.GameID = log.GameID
userBet.Addr = log.Addr
if log.Bet {
userBet.Option = log.Option
userBet.BetsNumber = log.BetsNumber
}
return userBet
}
func (g *Guess) updateIndex(log *gty.ReceiptGuessGame) (kvs []*types.KeyValue) {
//新创建游戏
userTable := gty.NewGuessUserTable(g.GetLocalDB())
gameTable := gty.NewGuessGameTable(g.GetLocalDB())
tablejoin, err := table.NewJoinTable(userTable, gameTable, []string{"addr#status"})
if err != nil {
return nil
}
if log.Status == gty.GuessGameStatusStart {
//kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, log.Addr, log.GameId, log.Index))
kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameID, log.Index))
kvs = append(kvs, addGuessGameAdminIndexKey(log.Status, log.AdminAddr, log.GameID, log.Index))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameID, log.Index))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameID, log.Index))
//新创建游戏,game表新增记录
game := log.Game
log.Game = nil
err = tablejoin.MustGetTable("game").Replace(game)
if err != nil {
return nil
}
kvs, _ = tablejoin.Save()
return kvs
} else if log.Status == gty.GuessGameStatusBet {
//如果是下注状态,则有用户进行了下注操作
kvs = append(kvs, addGuessGameAddrIndexKey(log.Status, log.Addr, log.GameID, log.Index))
kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, log.Addr, log.GameID, log.Index))
//如果发生了状态变化,则是从start->bet,对于老状态的记录进行删除操作,并增加新状态记录
if log.StatusChange {
kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameID, log.Index))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameID, log.Index))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameID, log.Index))
kvs = append(kvs, delGuessGameStatusIndexKey(log.PreStatus, log.PreIndex))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.PreIndex))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.PreIndex))
//用户下注,game表发生更新(game中下注信息有更新),user表新增下注记录
game := log.Game
log.Game = nil
userBet := g.getUserBet(log)
err = tablejoin.MustGetTable("game").Replace(game)
if err != nil {
return nil
}
} else if log.StatusChange {
//其他状态时的状态发生变化,要将老状态对应的记录删除,同时加入新状态记录;对于每个地址的下注记录也需要遍历处理。
kvs = append(kvs, addGuessGameStatusIndexKey(log.Status, log.GameID, log.Index))
kvs = append(kvs, addGuessGameAdminStatusIndexKey(log.Status, log.AdminAddr, log.GameID, log.Index))
kvs = append(kvs, addGuessGameCategoryStatusIndexKey(log.Status, log.Category, log.GameID, log.Index))
kvs = append(kvs, delGuessGameStatusIndexKey(log.PreStatus, log.PreIndex))
kvs = append(kvs, delGuessGameAdminStatusIndexKey(log.PreStatus, log.AdminAddr, log.PreIndex))
kvs = append(kvs, delGuessGameCategoryStatusIndexKey(log.PreStatus, log.Category, log.PreIndex))
//从game中遍历每个地址的记录进行新状态记录的增和老状态记录的删除
game, err := readGame(g.GetStateDB(), log.GameID)
if err == nil {
for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i]
kvs = append(kvs, addGuessGameAddrStatusIndexKey(log.Status, player.Addr, log.GameID, log.Index))
kvs = append(kvs, delGuessGameAddrStatusIndexKey(log.PreStatus, player.Addr, player.Bet.PreIndex))
err = tablejoin.MustGetTable("user").Replace(userBet)
if err != nil {
return nil
}
kvs, _ = tablejoin.Save()
return kvs
} else if log.StatusChange {
//其他状态,游戏状态变化,只需要更新game表
game := log.Game
log.Game = nil
err = tablejoin.MustGetTable("game").Replace(game)
if err != nil {
return nil
}
kvs, _ = tablejoin.Save()
return kvs
}
return kvs
......@@ -61,22 +85,6 @@ func (g *Guess) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, error)
return dbSet, nil
}
/*
for i := 0; i < len(receipt.Logs); i++ {
item := receipt.Logs[i]
if item.Ty >= gty.TyLogGuessGameStart && item.Ty <= gty.TyLogGuessGameTimeout {
var Gamelog gty.ReceiptGuessGame
err := types.Decode(item.Log, &Gamelog)
if err != nil {
panic(err) //数据错误了,已经被修改了
}
kv := g.updateIndex(&Gamelog)
dbSet.KV = append(dbSet.KV, kv...)
}
}
*/
table := gty.NewTable(g.GetLocalDB())
for _, item := range receipt.Logs {
if item.Ty >= gty.TyLogGuessGameStart && item.Ty <= gty.TyLogGuessGameTimeout {
var gameLog gty.ReceiptGuessGame
......@@ -84,14 +92,7 @@ func (g *Guess) execLocal(receipt *types.ReceiptData) (*types.LocalDBSet, error)
if err != nil {
return nil, err
}
err = table.Replace(&gameLog)
if err != nil {
return nil, err
}
kvs, err := table.Save()
if err != nil {
return nil, err
}
kvs := g.updateIndex(&gameLog)
dbSet.KV = append(dbSet.KV, kvs...)
}
}
......
......@@ -7,6 +7,8 @@ package executor
import (
"context"
"fmt"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/db/table"
"strings"
"time"
......@@ -62,7 +64,7 @@ type Action struct {
blocktime int64
height int64
execaddr string
localDB dbm.Lister
localDB dbm.KVDB
index int
api client.QueueProtocolAPI
conn *grpc.ClientConn
......@@ -120,184 +122,117 @@ func Key(id string) (key []byte) {
return key
}
func readGame(db dbm.KV, id string) (*gty.GuessGame, error) {
data, err := db.Get(Key(id))
if err != nil {
logger.Error("query data have err:", err.Error())
return nil, err
}
var game gty.GuessGame
//decode
err = types.Decode(data, &game)
if err != nil {
logger.Error("decode game have err:", err.Error())
return nil, err
}
return &game, nil
}
//Infos 根据游戏id列表查询多个游戏详情信息
func Infos(db dbm.KV, infos *gty.QueryGuessGameInfos) (types.Message, error) {
func QueryGameInfos(kvdb db.KVDB, infos *gty.QueryGuessGameInfos) (types.Message, error) {
var games []*gty.GuessGame
gameTable := gty.NewGuessGameTable(kvdb)
query := gameTable.GetQuery(kvdb)
for i := 0; i < len(infos.GameIDs); i++ {
id := infos.GameIDs[i]
game, err := readGame(db, id)
rows, err := query.ListIndex("gameid", []byte(infos.GameIDs[i]), nil, 1, 0)
if err != nil {
return nil, err
}
game := rows[0].Data.(*gty.GuessGame)
games = append(games, game)
}
return &gty.ReplyGuessGameInfos{Games: games}, nil
}
func getGameListByAddr(db dbm.Lister, addr string, index int64) (types.Message, error) {
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcGuessGameAddrPrefix(addr), nil, DefaultCount, ListDESC)
} else {
values, err = db.List(calcGuessGameAddrPrefix(addr), calcGuessGameAddrKey(addr, index), DefaultCount, ListDESC)
}
//QueryGameInfo 根据gameid查询game信息
func QueryGameInfo(kvdb db.KVDB, gameID []byte) (*gty.GuessGame, error) {
gameTable := gty.NewGuessGameTable(kvdb)
query := gameTable.GetQuery(kvdb)
rows, err := query.ListIndex("gameid", gameID, nil, 1, 0)
if err != nil {
return nil, err
}
var records []*gty.GuessGameRecord
for _, value := range values {
var record gty.GuessGameRecord
err := types.Decode(value, &record)
if err != nil {
continue
}
records = append(records, &record)
}
game := rows[0].Data.(*gty.GuessGame)
return &gty.GuessGameRecords{Records: records}, nil
return game, nil
}
func getGameListByAdminAddr(db dbm.Lister, addr string, index int64) (types.Message, error) {
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcGuessGameAdminPrefix(addr), nil, DefaultCount, ListDESC)
} else {
values, err = db.List(calcGuessGameAdminPrefix(addr), calcGuessGameAdminKey(addr, index), DefaultCount, ListDESC)
}
//QueryUserTableData 查询user表数据
func QueryUserTableData(query *table.Query, indexName string, prefix, primaryKey []byte) (types.Message, error) {
rows, err := query.ListIndex(indexName, prefix, primaryKey, DefaultCount, 0)
if err != nil {
return nil, err
}
var records []*gty.GuessGameRecord
for _, value := range values {
for i := 0; i < len(rows); i++ {
userBet := rows[i].Data.(*gty.UserBet)
var record gty.GuessGameRecord
err := types.Decode(value, &record)
if err != nil {
continue
}
record.GameID = userBet.GameID
record.StartIndex = userBet.StartIndex
records = append(records, &record)
}
return &gty.GuessGameRecords{Records: records}, nil
}
func getGameListByStatus(db dbm.Lister, status int32, index int64) (types.Message, error) {
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcGuessGameStatusPrefix(status), nil, DefaultCount, ListDESC)
var primary []byte
if len(rows) == int(DefaultCount) {
primary = rows[len(rows)-1].Primary
} else {
values, err = db.List(calcGuessGameStatusPrefix(status), calcGuessGameStatusKey(status, index), DefaultCount, ListDESC)
}
if err != nil {
return nil, err
}
var records []*gty.GuessGameRecord
for _, value := range values {
var record gty.GuessGameRecord
err := types.Decode(value, &record)
if err != nil {
continue
}
records = append(records, &record)
primary = nil
}
return &gty.GuessGameRecords{Records: records}, nil
return &gty.GuessGameRecords{Records: records, PrimaryKey: primary}, nil
}
func getGameListByAddrStatus(db dbm.Lister, addr string, status int32, index int64) (types.Message, error) {
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcGuessGameAddrStatusPrefix(addr, status), nil, DefaultCount, ListDESC)
} else {
values, err = db.List(calcGuessGameAddrStatusPrefix(addr, status), calcGuessGameAddrStatusKey(addr, status, index), DefaultCount, ListDESC)
}
//QueryGameTableData 查询game表数据
func QueryGameTableData(query *table.Query, indexName string, prefix, primaryKey []byte) (types.Message, error) {
rows, err := query.ListIndex(indexName, prefix, primaryKey, DefaultCount, 0)
if err != nil {
return nil, err
}
var records []*gty.GuessGameRecord
for _, value := range values {
for i := 0; i < len(rows); i++ {
game := rows[i].Data.(*gty.GuessGame)
var record gty.GuessGameRecord
err := types.Decode(value, &record)
if err != nil {
continue
}
record.GameID = game.GameID
record.StartIndex = game.StartIndex
records = append(records, &record)
}
return &gty.GuessGameRecords{Records: records}, nil
}
func getGameListByAdminStatus(db dbm.Lister, admin string, status int32, index int64) (types.Message, error) {
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcGuessGameAdminStatusPrefix(admin, status), nil, DefaultCount, ListDESC)
var primary []byte
if len(rows) == int(DefaultCount) {
primary = rows[len(rows)-1].Primary
} else {
values, err = db.List(calcGuessGameAdminStatusPrefix(admin, status), calcGuessGameAdminStatusKey(admin, status, index), DefaultCount, ListDESC)
}
if err != nil {
return nil, err
}
var records []*gty.GuessGameRecord
for _, value := range values {
var record gty.GuessGameRecord
err := types.Decode(value, &record)
if err != nil {
continue
}
records = append(records, &record)
primary = nil
}
return &gty.GuessGameRecords{Records: records}, nil
return &gty.GuessGameRecords{Records: records, PrimaryKey: primary}, nil
}
func getGameListByCategoryStatus(db dbm.Lister, category string, status int32, index int64) (types.Message, error) {
var values [][]byte
var err error
if index == 0 {
values, err = db.List(calcGuessGameCategoryStatusPrefix(category, status), nil, DefaultCount, ListDESC)
} else {
values, err = db.List(calcGuessGameCategoryStatusPrefix(category, status), calcGuessGameCategoryStatusKey(category, status, index), DefaultCount, ListDESC)
}
//QueryJoinTableData 查询join表数据
func QueryJoinTableData(talbeJoin *table.JoinTable, indexName string, prefix, primaryKey []byte) (types.Message, error) {
rows, err := talbeJoin.ListIndex(indexName, prefix, primaryKey, DefaultCount, 0)
if err != nil {
return nil, err
}
var records []*gty.GuessGameRecord
for _, value := range values {
for i := 0; i < len(rows); i++ {
game := rows[i].Data.(*table.JoinData).Right.(*gty.GuessGame)
var record gty.GuessGameRecord
err := types.Decode(value, &record)
if err != nil {
continue
}
record.GameID = game.GameID
record.StartIndex = game.StartIndex
records = append(records, &record)
}
return &gty.GuessGameRecords{Records: records}, nil
var primary []byte
if len(rows) == int(DefaultCount) {
primary = rows[len(rows)-1].Primary
} else {
primary = nil
}
return &gty.GuessGameRecords{Records: records, PrimaryKey: primary}, nil
}
func (action *Action) saveGame(game *gty.GuessGame) (kvset []*types.KeyValue) {
......@@ -311,8 +246,8 @@ func (action *Action) getIndex() int64 {
return action.height*types.MaxTxsPerBlock + int64(action.index)
}
//GetReceiptLog 根据游戏信息生成收据记录
func (action *Action) GetReceiptLog(game *gty.GuessGame, statusChange bool) *types.ReceiptLog {
//getReceiptLog 根据游戏信息生成收据记录
func (action *Action) getReceiptLog(game *gty.GuessGame, statusChange bool, bet *gty.GuessGameBet) *types.ReceiptLog {
log := &types.ReceiptLog{}
r := &gty.ReceiptGuessGame{}
r.Addr = action.fromaddr
......@@ -330,7 +265,8 @@ func (action *Action) GetReceiptLog(game *gty.GuessGame, statusChange bool) *typ
log.Ty = gty.TyLogGuessGameTimeout
}
r.Index = game.Index
r.StartIndex = game.StartIndex
r.Index = action.getIndex()
r.GameID = game.GameID
r.Status = game.Status
r.AdminAddr = game.AdminAddr
......@@ -338,6 +274,12 @@ func (action *Action) GetReceiptLog(game *gty.GuessGame, statusChange bool) *typ
r.StatusChange = statusChange
r.PreIndex = game.PreIndex
r.Category = game.Category
if nil != bet {
r.Bet = true
r.Option = bet.Option
r.BetsNumber = bet.BetsNum
}
r.Game = game
log.Log = types.Encode(r)
return log
}
......@@ -412,14 +354,14 @@ func (action *Action) GameStart(start *gty.GuessGameStart) (*types.Receipt, erro
return nil, types.ErrInvalidParam
}
options, ok := GetOptions(start.Options)
options, ok := getOptions(start.Options)
if !ok {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr,
"err", fmt.Sprintf("The options is illegal:%s", start.Options))
return nil, types.ErrInvalidParam
}
if !action.CheckTime(start) {
if !action.checkTime(start) {
logger.Error("GameStart", "addr", action.fromaddr, "execaddr", action.execaddr,
"err", fmt.Sprintf("The height and time parameters are illegal:MaxHeight %d ,ExpireHeight %d", start.MaxBetHeight, start.ExpireHeight))
return nil, types.ErrInvalidParam
......@@ -449,6 +391,7 @@ func (action *Action) GameStart(start *gty.GuessGameStart) (*types.Receipt, erro
game.AdminAddr = action.fromaddr
game.PreIndex = 0
game.Index = action.getIndex()
game.StartIndex = game.Index
game.Status = gty.GuessGameStatusStart
game.BetStat = &gty.GuessBetStat{TotalBetTimes: 0, TotalBetsNumber: 0}
for i := 0; i < len(options); i++ {
......@@ -456,8 +399,10 @@ func (action *Action) GameStart(start *gty.GuessGameStart) (*types.Receipt, erro
game.BetStat.Items = append(game.BetStat.Items, item)
}
receiptLog := action.GetReceiptLog(game, false)
receiptLog := action.getReceiptLog(game, false, nil)
logs = append(logs, receiptLog)
//对于写入statedb中的信息,去除下注信息,只记录主要信息,因为参与用户量大时在不同区块中反复记录这些数据会占用比较多的存储空间,意义不大
game.Plays = nil
kv = append(kv, action.saveGame(game)...)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
......@@ -468,8 +413,8 @@ func (action *Action) GameBet(pbBet *gty.GuessGameBet) (*types.Receipt, error) {
var logs []*types.ReceiptLog
var kv []*types.KeyValue
game, err := action.readGame(pbBet.GetGameID())
if err != nil {
game, err := QueryGameInfo(action.localDB, []byte(pbBet.GetGameID()))
if err != nil || game == nil{
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed",
pbBet.GetGameID(), "err", err)
return nil, err
......@@ -482,16 +427,16 @@ func (action *Action) GameBet(pbBet *gty.GuessGameBet) (*types.Receipt, error) {
return nil, gty.ErrGuessStatus
}
canBet := action.RefreshStatusByTime(game)
canBet := action.refreshStatusByTime(game)
if !canBet {
var receiptLog *types.ReceiptLog
if prevStatus != game.Status {
//状态发生了变化,且是变到了不可下注的状态,那么对于所有下注的addr来说,其addr:status主键的数据都需要更新
action.ChangeAllAddrIndex(game)
receiptLog = action.GetReceiptLog(game, true)
action.changeAllAddrIndex(game)
receiptLog = action.getReceiptLog(game, true, nil)
} else {
receiptLog = action.GetReceiptLog(game, false)
receiptLog = action.getReceiptLog(game, false, nil)
}
logs = append(logs, receiptLog)
......@@ -501,14 +446,14 @@ func (action *Action) GameBet(pbBet *gty.GuessGameBet) (*types.Receipt, error) {
}
//检查竞猜选项是否合法
options, legal := GetOptions(game.GetOptions())
options, legal := getOptions(game.GetOptions())
if !legal || len(options) == 0 {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Game Options illegal",
game.GetOptions())
return nil, types.ErrInvalidParam
}
if !IsLegalOption(options, pbBet.GetOption()) {
if !isLegalOption(options, pbBet.GetOption()) {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Option illegal",
pbBet.GetOption())
return nil, types.ErrInvalidParam
......@@ -519,7 +464,7 @@ func (action *Action) GameBet(pbBet *gty.GuessGameBet) (*types.Receipt, error) {
pbBet.BetsNum = game.GetMaxBetsOneTime()
}
if game.BetsNumber+pbBet.GetBetsNum() > game.MaxBetsNumber {
if game.BetsNumber + pbBet.GetBetsNum() > game.MaxBetsNumber {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "MaxBetsNumber over limit",
game.MaxBetsNumber, "current Bets Number", game.BetsNumber)
return nil, types.ErrInvalidParam
......@@ -543,15 +488,17 @@ func (action *Action) GameBet(pbBet *gty.GuessGameBet) (*types.Receipt, error) {
var receiptLog *types.ReceiptLog
if prevStatus != gty.GuessGameStatusBet {
action.ChangeStatus(game, gty.GuessGameStatusBet)
action.AddGuessBet(game, pbBet)
receiptLog = action.GetReceiptLog(game, true)
action.changeStatus(game, gty.GuessGameStatusBet)
action.addGuessBet(game, pbBet)
receiptLog = action.getReceiptLog(game, true, pbBet)
} else {
action.AddGuessBet(game, pbBet)
receiptLog = action.GetReceiptLog(game, false)
action.addGuessBet(game, pbBet)
receiptLog = action.getReceiptLog(game, false, pbBet)
}
logs = append(logs, receiptLog)
//对于写入statedb中的信息,去除下注信息,只记录主要信息,因为参与用户量大时在不同区块中反复记录这些数据会占用比较多的存储空间,意义不大
game.Plays = nil
kv = append(kv, action.saveGame(game)...)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
......@@ -562,8 +509,8 @@ func (action *Action) GameStopBet(pbBet *gty.GuessGameStopBet) (*types.Receipt,
var logs []*types.ReceiptLog
var kv []*types.KeyValue
game, err := action.readGame(pbBet.GetGameID())
if err != nil {
game, err := QueryGameInfo(action.localDB, []byte(pbBet.GetGameID()))
if err != nil || game == nil{
logger.Error("GameStopBet", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed",
pbBet.GetGameID(), "err", err)
return nil, err
......@@ -582,22 +529,24 @@ func (action *Action) GameStopBet(pbBet *gty.GuessGameStopBet) (*types.Receipt,
return nil, gty.ErrNoPrivilege
}
action.ChangeStatus(game, gty.GuessGameStatusStopBet)
action.changeStatus(game, gty.GuessGameStatusStopBet)
var receiptLog *types.ReceiptLog
//状态发生变化,更新所有addr对应记录的index
action.ChangeAllAddrIndex(game)
receiptLog = action.GetReceiptLog(game, true)
action.changeAllAddrIndex(game)
receiptLog = action.getReceiptLog(game, true, nil)
logs = append(logs, receiptLog)
//对于写入statedb中的信息,去除下注信息,只记录主要信息,因为参与用户量大时在不同区块中反复记录这些数据会占用比较多的存储空间,意义不大
game.Plays = nil
kv = append(kv, action.saveGame(game)...)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
}
//AddGuessBet 向游戏结构中加入下注信息
func (action *Action) AddGuessBet(game *gty.GuessGame, pbBet *gty.GuessGameBet) {
bet := &gty.GuessBet{Option: pbBet.GetOption(), BetsNumber: pbBet.BetsNum, Index: game.Index}
//addGuessBet 向游戏结构中加入下注信息
func (action *Action) addGuessBet(game *gty.GuessGame, pbBet *gty.GuessGameBet) {
bet := &gty.GuessBet{Option: pbBet.GetOption(), BetsNumber: pbBet.BetsNum, Index: action.getIndex()}
player := &gty.GuessPlayer{Addr: action.fromaddr, Bet: bet}
game.Plays = append(game.Plays, player)
......@@ -622,8 +571,8 @@ func (action *Action) GamePublish(publish *gty.GuessGamePublish) (*types.Receipt
var logs []*types.ReceiptLog
var kv []*types.KeyValue
game, err := action.readGame(publish.GetGameID())
if err != nil {
game, err := QueryGameInfo(action.localDB, []byte(publish.GetGameID()))
if err != nil || game == nil{
logger.Error("GamePublish", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed",
publish.GetGameID(), "err", err)
return nil, err
......@@ -643,14 +592,14 @@ func (action *Action) GamePublish(publish *gty.GuessGamePublish) (*types.Receipt
}
//检查竞猜选项是否合法
options, legal := GetOptions(game.GetOptions())
options, legal := getOptions(game.GetOptions())
if !legal || len(options) == 0 {
logger.Error("GamePublish", "addr", action.fromaddr, "execaddr", action.execaddr, "Game Options illegal",
game.GetOptions())
return nil, types.ErrInvalidParam
}
if !IsLegalOption(options, publish.GetResult()) {
if !isLegalOption(options, publish.GetResult()) {
logger.Error("GamePublish", "addr", action.fromaddr, "execaddr", action.execaddr, "Option illegal",
publish.GetResult())
return nil, types.ErrInvalidParam
......@@ -682,7 +631,7 @@ func (action *Action) GamePublish(publish *gty.GuessGamePublish) (*types.Receipt
kv = append(kv, receipt.KV...)
}
action.ChangeStatus(game, gty.GuessGameStatusPublish)
action.changeStatus(game, gty.GuessGameStatusPublish)
//计算竞猜正确的筹码总数
totalBetsNumber := game.BetStat.TotalBetsNumber
winBetsNumber := int64(0)
......@@ -752,10 +701,12 @@ func (action *Action) GamePublish(publish *gty.GuessGamePublish) (*types.Receipt
}
var receiptLog *types.ReceiptLog
action.ChangeAllAddrIndex(game)
receiptLog = action.GetReceiptLog(game, true)
action.changeAllAddrIndex(game)
receiptLog = action.getReceiptLog(game, true, nil)
logs = append(logs, receiptLog)
//对于写入statedb中的信息,去除下注信息,只记录主要信息,因为参与用户量大时在不同区块中反复记录这些数据会占用比较多的存储空间,意义不大
game.Plays = nil
kv = append(kv, action.saveGame(game)...)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
......@@ -766,8 +717,8 @@ func (action *Action) GameAbort(pbend *gty.GuessGameAbort) (*types.Receipt, erro
var logs []*types.ReceiptLog
var kv []*types.KeyValue
game, err := action.readGame(pbend.GetGameID())
if err != nil {
game, err := QueryGameInfo(action.localDB, []byte(pbend.GetGameID()))
if err != nil || game == nil{
logger.Error("GameAbort", "addr", action.fromaddr, "execaddr", action.execaddr, "get game failed",
pbend.GetGameID(), "err", err)
return nil, err
......@@ -782,7 +733,7 @@ func (action *Action) GameAbort(pbend *gty.GuessGameAbort) (*types.Receipt, erro
preStatus := game.Status
//根据区块链高度或时间刷新游戏状态。
action.RefreshStatusByTime(game)
action.refreshStatusByTime(game)
//如果游戏超时,则任何地址都可以Abort,否则只有创建游戏的地址可以Abort
if game.Status != gty.GuessGameStatusTimeOut {
......@@ -814,20 +765,22 @@ func (action *Action) GameAbort(pbend *gty.GuessGameAbort) (*types.Receipt, erro
//说明action.RefreshStatusByTime(game)调用时已经更新过状态和index了,这里直接再改状态就行了。
game.Status = gty.GuessGameStatusAbort
} else {
action.ChangeStatus(game, gty.GuessGameStatusAbort)
action.changeStatus(game, gty.GuessGameStatusAbort)
}
//状态发生变化,统一更新所有addr记录的index
action.ChangeAllAddrIndex(game)
action.changeAllAddrIndex(game)
receiptLog := action.GetReceiptLog(game, true)
receiptLog := action.getReceiptLog(game, true, nil)
logs = append(logs, receiptLog)
//对于写入statedb中的信息,去除下注信息,只记录主要信息,因为参与用户量大时在不同区块中反复记录这些数据会占用比较多的存储空间,意义不大
game.Plays = nil
kv = append(kv, action.saveGame(game)...)
return &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}, nil
}
//GetOptions 获得竞猜选项,并判断是否符合约定格式,类似"A:xxxx;B:xxxx;C:xxx",“:”前为选项名称,不能重复,":"后为选项说明。
func GetOptions(strOptions string) (options []string, legal bool) {
//getOptions 获得竞猜选项,并判断是否符合约定格式,类似"A:xxxx;B:xxxx;C:xxx",“:”前为选项名称,不能重复,":"后为选项说明。
func getOptions(strOptions string) (options []string, legal bool) {
legal = true
items := strings.Split(strOptions, ";")
for i := 0; i < len(items); i++ {
......@@ -845,8 +798,8 @@ func GetOptions(strOptions string) (options []string, legal bool) {
return options, legal
}
//IsLegalOption 判断选项是否为合法选项
func IsLegalOption(options []string, option string) bool {
//isLegalOption 判断选项是否为合法选项
func isLegalOption(options []string, option string) bool {
for i := 0; i < len(options); i++ {
if options[i] == option {
return true
......@@ -856,8 +809,8 @@ func IsLegalOption(options []string, option string) bool {
return false
}
//ChangeStatus 修改游戏状态,同步更新历史记录
func (action *Action) ChangeStatus(game *gty.GuessGame, destStatus int32) {
//changeStatus 修改游戏状态,同步更新历史记录
func (action *Action) changeStatus(game *gty.GuessGame, destStatus int32) {
if game.Status != destStatus {
game.PreStatus = game.Status
game.PreIndex = game.Index
......@@ -866,17 +819,17 @@ func (action *Action) ChangeStatus(game *gty.GuessGame, destStatus int32) {
}
}
//ChangeAllAddrIndex 状态更新时,更新下注记录的历史信息
func (action *Action) ChangeAllAddrIndex(game *gty.GuessGame) {
//changeAllAddrIndex 状态更新时,更新下注记录的历史信息
func (action *Action) changeAllAddrIndex(game *gty.GuessGame) {
for i := 0; i < len(game.Plays); i++ {
player := game.Plays[i]
player.Bet.PreIndex = player.Bet.Index
player.Bet.Index = game.Index
player.Bet.Index = action.getIndex()
}
}
//RefreshStatusByTime 检测游戏是否过期,是否可以下注
func (action *Action) RefreshStatusByTime(game *gty.GuessGame) (canBet bool) {
//refreshStatusByTime 检测游戏是否过期,是否可以下注
func (action *Action) refreshStatusByTime(game *gty.GuessGame) (canBet bool) {
var mainHeight int64
if types.IsPara() {
......@@ -893,7 +846,7 @@ func (action *Action) RefreshStatusByTime(game *gty.GuessGame) (canBet bool) {
if game.DrivenByAdmin {
if (mainHeight - game.StartHeight) >= game.ExpireHeight {
action.ChangeStatus(game, gty.GuessGameStatusTimeOut)
action.changeStatus(game, gty.GuessGameStatusTimeOut)
canBet = false
return canBet
}
......@@ -907,9 +860,9 @@ func (action *Action) RefreshStatusByTime(game *gty.GuessGame) (canBet bool) {
logger.Error("GameBet", "addr", action.fromaddr, "execaddr", action.execaddr, "Height over limit",
mainHeight, "startHeight", game.StartHeight, "MaxHeightDiff", game.GetMaxBetHeight())
if game.ExpireHeight > heightDiff {
action.ChangeStatus(game, gty.GuessGameStatusStopBet)
action.changeStatus(game, gty.GuessGameStatusStopBet)
} else {
action.ChangeStatus(game, gty.GuessGameStatusTimeOut)
action.changeStatus(game, gty.GuessGameStatusTimeOut)
}
canBet = false
......@@ -920,8 +873,8 @@ func (action *Action) RefreshStatusByTime(game *gty.GuessGame) (canBet bool) {
return canBet
}
//CheckTime 检测游戏的过期设置。
func (action *Action) CheckTime(start *gty.GuessGameStart) bool {
//checkTime 检测游戏的过期设置。
func (action *Action) checkTime(start *gty.GuessGameStart) bool {
if start.MaxBetHeight == 0 && start.ExpireHeight == 0 {
//如果上述字段都不携带,则认为完全由admin的指令驱动。
start.DrivenByAdmin = true
......
package executor
import (
"fmt"
"github.com/33cn/chain33/types"
gty "github.com/33cn/plugin/plugin/dapp/guess/types"
)
//addr prefix
func calcGuessGameAddrPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-guess-addr:%s:", addr)
return []byte(key)
}
//addr index
func calcGuessGameAddrKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-guess-addr:%s:%018d", addr, index)
return []byte(key)
}
//status prefix
func calcGuessGameStatusPrefix(status int32) []byte {
key := fmt.Sprintf("LODB-guess-status-index:%d:", status)
return []byte(key)
}
//status index
func calcGuessGameStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-status-index:%d:%018d", status, index)
return []byte(key)
}
//addr status prefix
func calcGuessGameAddrStatusPrefix(addr string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-addr-status-index:%s:%d:", addr, status)
return []byte(key)
}
//addr status index
func calcGuessGameAddrStatusKey(addr string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-addr-status-index:%s:%d:%018d", addr, status, index)
return []byte(key)
}
//admin prefix
func calcGuessGameAdminPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-guess-admin:%s:", addr)
return []byte(key)
}
//admin index
func calcGuessGameAdminKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-guess-admin:%s:%018d", addr, index)
return []byte(key)
}
//admin status prefix
func calcGuessGameAdminStatusPrefix(admin string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-admin-status-index:%s:%d:", admin, status)
return []byte(key)
}
//admin status index
func calcGuessGameAdminStatusKey(admin string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-admin-status-index:%s:%d:%018d", admin, status, index)
return []byte(key)
}
func calcGuessGameCategoryStatusPrefix(category string, status int32) []byte {
key := fmt.Sprintf("LODB-guess-category-status-index:%s:%d:", category, status)
return []byte(key)
}
func calcGuessGameCategoryStatusKey(category string, status int32, index int64) []byte {
key := fmt.Sprintf("LODB-guess-category-status-index:%s:%d:%018d", category, status, index)
return []byte(key)
}
func addGuessGameAddrIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
record := &gty.GuessGameRecord{
GameID: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAddrIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrKey(addr, index)
kv.Value = nil
return kv
}
func addGuessGameStatusIndexKey(status int32, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusKey(status, index)
record := &gty.GuessGameRecord{
GameID: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameStatusIndexKey(status int32, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameStatusKey(status, index)
kv.Value = nil
return kv
}
func addGuessGameAddrStatusIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrStatusKey(addr, status, index)
record := &gty.GuessGameRecord{
GameID: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAddrStatusIndexKey(status int32, addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAddrStatusKey(addr, status, index)
kv.Value = nil
return kv
}
func addGuessGameAdminIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminKey(addr, index)
record := &gty.GuessGameRecord{
GameID: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAdminIndexKey(addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminKey(addr, index)
kv.Value = nil
return kv
}
func addGuessGameAdminStatusIndexKey(status int32, addr, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminStatusKey(addr, status, index)
record := &gty.GuessGameRecord{
GameID: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameAdminStatusIndexKey(status int32, addr string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameAdminStatusKey(addr, status, index)
kv.Value = nil
return kv
}
func addGuessGameCategoryStatusIndexKey(status int32, category, gameID string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameCategoryStatusKey(category, status, index)
record := &gty.GuessGameRecord{
GameID: gameID,
Status: status,
Index: index,
}
kv.Value = types.Encode(record)
return kv
}
func delGuessGameCategoryStatusIndexKey(status int32, category string, index int64) *types.KeyValue {
kv := &types.KeyValue{}
kv.Key = calcGuessGameCategoryStatusKey(category, status, index)
kv.Value = nil
return kv
}
......@@ -5,80 +5,79 @@
package executor
import (
"fmt"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
gty "github.com/33cn/plugin/plugin/dapp/guess/types"
)
//Query_QueryGamesByIDs method
func (g *Guess) Query_QueryGamesByIDs(in *gty.QueryGuessGameInfos) (types.Message, error) {
return Infos(g.GetStateDB(), in)
return QueryGameInfos(g.GetLocalDB(), in)
}
//Query_QueryGameByID method
func (g *Guess) Query_QueryGameByID(in *gty.QueryGuessGameInfo) (types.Message, error) {
game, err := readGame(g.GetStateDB(), in.GetGameID())
game, err := QueryGameInfo(g.GetLocalDB(), []byte(in.GetGameID()))
if err != nil {
return nil, err
}
return &gty.ReplyGuessGameInfo{Game: game}, nil
}
//Query_QueryGamesByAddr method
func (g *Guess) Query_QueryGamesByAddr(in *gty.QueryGuessGameInfo) (types.Message, error) {
records, err := getGameListByAddr(g.GetLocalDB(), in.Addr, in.Index)
if err != nil {
return nil, err
}
gameTable := gty.NewGuessUserTable(g.GetLocalDB())
query := gameTable.GetQuery(g.GetLocalDB())
return records, nil
return QueryUserTableData(query, "addr", []byte(in.Addr), in.PrimaryKey)
}
//Query_QueryGamesByStatus method
func (g *Guess) Query_QueryGamesByStatus(in *gty.QueryGuessGameInfo) (types.Message, error) {
records, err := getGameListByStatus(g.GetLocalDB(), in.Status, in.Index)
if err != nil {
return nil, err
}
gameTable := gty.NewGuessGameTable(g.GetLocalDB())
query := gameTable.GetQuery(g.GetLocalDB())
return records, nil
return QueryGameTableData(query, "status", []byte(fmt.Sprintf("%2d", in.Status)), in.PrimaryKey)
}
//Query_QueryGamesByAdminAddr method
func (g *Guess) Query_QueryGamesByAdminAddr(in *gty.QueryGuessGameInfo) (types.Message, error) {
records, err := getGameListByAdminAddr(g.GetLocalDB(), in.AdminAddr, in.Index)
if err != nil {
return nil, err
}
return records, nil
gameTable := gty.NewGuessGameTable(g.GetLocalDB())
query := gameTable.GetQuery(g.GetLocalDB())
prefix := []byte(in.AdminAddr)
return QueryGameTableData(query, "admin", prefix, in.PrimaryKey)
}
//Query_QueryGamesByAddrStatus method
func (g *Guess) Query_QueryGamesByAddrStatus(in *gty.QueryGuessGameInfo) (types.Message, error) {
records, err := getGameListByAddrStatus(g.GetLocalDB(), in.Addr, in.Status, in.Index)
userTable := gty.NewGuessUserTable(g.GetLocalDB())
gameTable := gty.NewGuessGameTable(g.GetLocalDB())
tableJoin, err := table.NewJoinTable(userTable, gameTable, []string{"addr#status"})
if err != nil {
return nil, err
}
return records, nil
prefix := table.JoinKey([]byte(fmt.Sprintf("%s", in.Addr)), []byte(fmt.Sprintf("%2d", in.Status)))
return QueryJoinTableData(tableJoin, "addr#status", prefix, in.PrimaryKey)
}
//Query_QueryGamesByAdminStatus method
func (g *Guess) Query_QueryGamesByAdminStatus(in *gty.QueryGuessGameInfo) (types.Message, error) {
records, err := getGameListByAdminStatus(g.GetLocalDB(), in.AdminAddr, in.Status, in.Index)
if err != nil {
return nil, err
}
gameTable := gty.NewGuessGameTable(g.GetLocalDB())
query := gameTable.GetQuery(g.GetLocalDB())
prefix := []byte(fmt.Sprintf("%s:%2d", in.AdminAddr, in.Status))
return records, nil
return QueryGameTableData(query, "admin_status", prefix, in.PrimaryKey)
}
//Query_QueryGamesByCategoryStatus method
func (g *Guess) Query_QueryGamesByCategoryStatus(in *gty.QueryGuessGameInfo) (types.Message, error) {
records, err := getGameListByCategoryStatus(g.GetLocalDB(), in.Category, in.Status, in.Index)
if err != nil {
return nil, err
}
gameTable := gty.NewGuessGameTable(g.GetLocalDB())
query := gameTable.GetQuery(g.GetLocalDB())
prefix := []byte(fmt.Sprintf("%s:%2d", in.Category, in.Status))
return records, nil
return QueryGameTableData(query, "category_status", prefix, in.PrimaryKey)
}
......@@ -12,25 +12,26 @@ message GuessGame {
int64 startTime = 4; //创建游戏的时间
int64 startHeight = 5; //创建游戏的时间
string startTxHash = 6; //创建游戏的交易hash
string topic = 7; //主题
string category = 8; //分类
string options = 9; //选项
int64 maxBetHeight = 10; //截止下注的块高
int64 maxBetsOneTime = 11; //单次可以下多少注,默认100
int64 maxBetsNumber = 12; //最多可以下多少注
int64 devFeeFactor = 13; //开发者抽成比例
string devFeeAddr = 14; //开发者地址
int64 platFeeFactor = 15; //平台抽成比例
string platFeeAddr = 16; //平台地址
int64 expireHeight = 17; //游戏过期区块高度
string adminAddr = 18; //游戏创建者地址,只有该地址可以开奖
int64 betsNumber = 19; //已下注数,如果数量达到maxBetsNumber,则不允许再下注
repeated GuessPlayer plays = 20; //参与游戏下注的玩家投注信息
string result = 21; //公布的中奖结果
GuessBetStat betStat = 22;
int64 index = 23;
int64 preIndex = 24;
bool drivenByAdmin = 25;
int64 startIndex = 7; //创建游戏的交易index
string topic = 8; //主题
string category = 9; //分类
string options = 10; //选项
int64 maxBetHeight = 11; //截止下注的块高
int64 maxBetsOneTime = 12; //单次可以下多少注,默认100
int64 maxBetsNumber = 13; //最多可以下多少注
int64 devFeeFactor = 14; //开发者抽成比例
string devFeeAddr = 15; //开发者地址
int64 platFeeFactor = 16; //平台抽成比例
string platFeeAddr = 17; //平台地址
int64 expireHeight = 18; //游戏过期区块高度
string adminAddr = 19; //游戏创建者地址,只有该地址可以开奖
int64 betsNumber = 20; //已下注数,如果数量达到maxBetsNumber,则不允许再下注
repeated GuessPlayer plays = 21; //参与游戏下注的玩家投注信息
string result = 22; //公布的中奖结果
GuessBetStat betStat = 23;
int64 index = 24;
int64 preIndex = 25;
bool drivenByAdmin = 26;
}
//GuessPlayer 竞猜玩家信息
......@@ -129,6 +130,7 @@ message QueryGuessGameInfo {
int64 index = 4;
string adminAddr = 5;
string category = 6;
bytes primaryKey = 7;
}
//ReplyGuessGameInfo 游戏信息查询响应消息
......@@ -148,15 +150,30 @@ message ReplyGuessGameInfos {
//ReceiptGuessGame 竞猜游戏收据信息
message ReceiptGuessGame {
string gameID = 1;
int32 preStatus = 2;
int32 status = 3;
int64 startIndex = 1;
string gameID = 2;
int32 preStatus = 3;
int32 status = 4;
string addr = 5;
string adminAddr = 6;
int64 preIndex = 7;
int64 index = 8;
string category = 9;
bool statusChange = 10;
bool bet = 11;
string option = 12;
int64 betsNumber = 13;
GuessGame game = 14;
}
//UserBet 用户下注信息
message UserBet {
int64 startIndex = 1;
int64 index = 2;
string gameID = 3;
string addr = 4;
string adminAddr = 5;
int64 preIndex = 6;
int64 index = 7;
string category = 8;
bool statusChange = 9;
string option = 5;
int64 betsNumber = 6;
}
//GuessStartTxReq 构造start交易的请求
......@@ -206,13 +223,13 @@ message GuessPublishTxReq {
// GuessGameRecord game信息查询记录
message GuessGameRecord {
string gameID = 1;
int32 status = 2;
int64 index = 3;
int64 startIndex = 2;
}
// GuessGameRecords game信息查询记录集
message GuessGameRecords {
repeated GuessGameRecord records = 1;
bytes primaryKey = 2;
}
......
......@@ -11,4 +11,8 @@ var (
ErrNoPrivilege = errors.New("ErrNoPrivilege")
ErrGuessStatus = errors.New("ErrGuessStatus")
ErrOverBetsLimit = errors.New("ErrOverBetsLimit")
ErrParamStatusInvalid = errors.New("ErrParamStatusInvalid")
ErrParamAddressMustnotEmpty = errors.New("ErrParamAddressMustnotEmpty")
ErrGameNotExist = errors.New("ErrGameNotExist")
ErrSaveTable = errors.New("ErrSaveTable")
)
......@@ -6,11 +6,10 @@ package types
import (
context "context"
fmt "fmt"
math "math"
types "github.com/33cn/chain33/types"
proto "github.com/golang/protobuf/proto"
grpc "google.golang.org/grpc"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
......@@ -32,25 +31,26 @@ type GuessGame struct {
StartTime int64 `protobuf:"varint,4,opt,name=startTime,proto3" json:"startTime,omitempty"`
StartHeight int64 `protobuf:"varint,5,opt,name=startHeight,proto3" json:"startHeight,omitempty"`
StartTxHash string `protobuf:"bytes,6,opt,name=startTxHash,proto3" json:"startTxHash,omitempty"`
Topic string `protobuf:"bytes,7,opt,name=topic,proto3" json:"topic,omitempty"`
Category string `protobuf:"bytes,8,opt,name=category,proto3" json:"category,omitempty"`
Options string `protobuf:"bytes,9,opt,name=options,proto3" json:"options,omitempty"`
MaxBetHeight int64 `protobuf:"varint,10,opt,name=maxBetHeight,proto3" json:"maxBetHeight,omitempty"`
MaxBetsOneTime int64 `protobuf:"varint,11,opt,name=maxBetsOneTime,proto3" json:"maxBetsOneTime,omitempty"`
MaxBetsNumber int64 `protobuf:"varint,12,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"`
DevFeeFactor int64 `protobuf:"varint,13,opt,name=devFeeFactor,proto3" json:"devFeeFactor,omitempty"`
DevFeeAddr string `protobuf:"bytes,14,opt,name=devFeeAddr,proto3" json:"devFeeAddr,omitempty"`
PlatFeeFactor int64 `protobuf:"varint,15,opt,name=platFeeFactor,proto3" json:"platFeeFactor,omitempty"`
PlatFeeAddr string `protobuf:"bytes,16,opt,name=platFeeAddr,proto3" json:"platFeeAddr,omitempty"`
ExpireHeight int64 `protobuf:"varint,17,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"`
AdminAddr string `protobuf:"bytes,18,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
BetsNumber int64 `protobuf:"varint,19,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
Plays []*GuessPlayer `protobuf:"bytes,20,rep,name=plays,proto3" json:"plays,omitempty"`
Result string `protobuf:"bytes,21,opt,name=result,proto3" json:"result,omitempty"`
BetStat *GuessBetStat `protobuf:"bytes,22,opt,name=betStat,proto3" json:"betStat,omitempty"`
Index int64 `protobuf:"varint,23,opt,name=index,proto3" json:"index,omitempty"`
PreIndex int64 `protobuf:"varint,24,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
DrivenByAdmin bool `protobuf:"varint,25,opt,name=drivenByAdmin,proto3" json:"drivenByAdmin,omitempty"`
StartIndex int64 `protobuf:"varint,7,opt,name=startIndex,proto3" json:"startIndex,omitempty"`
Topic string `protobuf:"bytes,8,opt,name=topic,proto3" json:"topic,omitempty"`
Category string `protobuf:"bytes,9,opt,name=category,proto3" json:"category,omitempty"`
Options string `protobuf:"bytes,10,opt,name=options,proto3" json:"options,omitempty"`
MaxBetHeight int64 `protobuf:"varint,11,opt,name=maxBetHeight,proto3" json:"maxBetHeight,omitempty"`
MaxBetsOneTime int64 `protobuf:"varint,12,opt,name=maxBetsOneTime,proto3" json:"maxBetsOneTime,omitempty"`
MaxBetsNumber int64 `protobuf:"varint,13,opt,name=maxBetsNumber,proto3" json:"maxBetsNumber,omitempty"`
DevFeeFactor int64 `protobuf:"varint,14,opt,name=devFeeFactor,proto3" json:"devFeeFactor,omitempty"`
DevFeeAddr string `protobuf:"bytes,15,opt,name=devFeeAddr,proto3" json:"devFeeAddr,omitempty"`
PlatFeeFactor int64 `protobuf:"varint,16,opt,name=platFeeFactor,proto3" json:"platFeeFactor,omitempty"`
PlatFeeAddr string `protobuf:"bytes,17,opt,name=platFeeAddr,proto3" json:"platFeeAddr,omitempty"`
ExpireHeight int64 `protobuf:"varint,18,opt,name=expireHeight,proto3" json:"expireHeight,omitempty"`
AdminAddr string `protobuf:"bytes,19,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
BetsNumber int64 `protobuf:"varint,20,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
Plays []*GuessPlayer `protobuf:"bytes,21,rep,name=plays,proto3" json:"plays,omitempty"`
Result string `protobuf:"bytes,22,opt,name=result,proto3" json:"result,omitempty"`
BetStat *GuessBetStat `protobuf:"bytes,23,opt,name=betStat,proto3" json:"betStat,omitempty"`
Index int64 `protobuf:"varint,24,opt,name=index,proto3" json:"index,omitempty"`
PreIndex int64 `protobuf:"varint,25,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
DrivenByAdmin bool `protobuf:"varint,26,opt,name=drivenByAdmin,proto3" json:"drivenByAdmin,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -123,6 +123,13 @@ func (m *GuessGame) GetStartTxHash() string {
return ""
}
func (m *GuessGame) GetStartIndex() int64 {
if m != nil {
return m.StartIndex
}
return 0
}
func (m *GuessGame) GetTopic() string {
if m != nil {
return m.Topic
......@@ -1151,6 +1158,7 @@ type QueryGuessGameInfo struct {
Index int64 `protobuf:"varint,4,opt,name=index,proto3" json:"index,omitempty"`
AdminAddr string `protobuf:"bytes,5,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
Category string `protobuf:"bytes,6,opt,name=category,proto3" json:"category,omitempty"`
PrimaryKey []byte `protobuf:"bytes,7,opt,name=primaryKey,proto3" json:"primaryKey,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1223,6 +1231,13 @@ func (m *QueryGuessGameInfo) GetCategory() string {
return ""
}
func (m *QueryGuessGameInfo) GetPrimaryKey() []byte {
if m != nil {
return m.PrimaryKey
}
return nil
}
//ReplyGuessGameInfo 游戏信息查询响应消息
type ReplyGuessGameInfo struct {
Game *GuessGame `protobuf:"bytes,1,opt,name=game,proto3" json:"game,omitempty"`
......@@ -1345,15 +1360,20 @@ func (m *ReplyGuessGameInfos) GetGames() []*GuessGame {
//ReceiptGuessGame 竞猜游戏收据信息
type ReceiptGuessGame struct {
GameID string `protobuf:"bytes,1,opt,name=gameID,proto3" json:"gameID,omitempty"`
PreStatus int32 `protobuf:"varint,2,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
Status int32 `protobuf:"varint,3,opt,name=status,proto3" json:"status,omitempty"`
Addr string `protobuf:"bytes,4,opt,name=addr,proto3" json:"addr,omitempty"`
AdminAddr string `protobuf:"bytes,5,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
PreIndex int64 `protobuf:"varint,6,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
Index int64 `protobuf:"varint,7,opt,name=index,proto3" json:"index,omitempty"`
Category string `protobuf:"bytes,8,opt,name=category,proto3" json:"category,omitempty"`
StatusChange bool `protobuf:"varint,9,opt,name=statusChange,proto3" json:"statusChange,omitempty"`
StartIndex int64 `protobuf:"varint,1,opt,name=startIndex,proto3" json:"startIndex,omitempty"`
GameID string `protobuf:"bytes,2,opt,name=gameID,proto3" json:"gameID,omitempty"`
PreStatus int32 `protobuf:"varint,3,opt,name=preStatus,proto3" json:"preStatus,omitempty"`
Status int32 `protobuf:"varint,4,opt,name=status,proto3" json:"status,omitempty"`
Addr string `protobuf:"bytes,5,opt,name=addr,proto3" json:"addr,omitempty"`
AdminAddr string `protobuf:"bytes,6,opt,name=adminAddr,proto3" json:"adminAddr,omitempty"`
PreIndex int64 `protobuf:"varint,7,opt,name=preIndex,proto3" json:"preIndex,omitempty"`
Index int64 `protobuf:"varint,8,opt,name=index,proto3" json:"index,omitempty"`
Category string `protobuf:"bytes,9,opt,name=category,proto3" json:"category,omitempty"`
StatusChange bool `protobuf:"varint,10,opt,name=statusChange,proto3" json:"statusChange,omitempty"`
Bet bool `protobuf:"varint,11,opt,name=bet,proto3" json:"bet,omitempty"`
Option string `protobuf:"bytes,12,opt,name=option,proto3" json:"option,omitempty"`
BetsNumber int64 `protobuf:"varint,13,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
Game *GuessGame `protobuf:"bytes,14,opt,name=game,proto3" json:"game,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1384,6 +1404,13 @@ func (m *ReceiptGuessGame) XXX_DiscardUnknown() {
var xxx_messageInfo_ReceiptGuessGame proto.InternalMessageInfo
func (m *ReceiptGuessGame) GetStartIndex() int64 {
if m != nil {
return m.StartIndex
}
return 0
}
func (m *ReceiptGuessGame) GetGameID() string {
if m != nil {
return m.GameID
......@@ -1447,6 +1474,114 @@ func (m *ReceiptGuessGame) GetStatusChange() bool {
return false
}
func (m *ReceiptGuessGame) GetBet() bool {
if m != nil {
return m.Bet
}
return false
}
func (m *ReceiptGuessGame) GetOption() string {
if m != nil {
return m.Option
}
return ""
}
func (m *ReceiptGuessGame) GetBetsNumber() int64 {
if m != nil {
return m.BetsNumber
}
return 0
}
func (m *ReceiptGuessGame) GetGame() *GuessGame {
if m != nil {
return m.Game
}
return nil
}
//UserBet 用户下注信息
type UserBet struct {
StartIndex int64 `protobuf:"varint,1,opt,name=startIndex,proto3" json:"startIndex,omitempty"`
Index int64 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"`
GameID string `protobuf:"bytes,3,opt,name=gameID,proto3" json:"gameID,omitempty"`
Addr string `protobuf:"bytes,4,opt,name=addr,proto3" json:"addr,omitempty"`
Option string `protobuf:"bytes,5,opt,name=option,proto3" json:"option,omitempty"`
BetsNumber int64 `protobuf:"varint,6,opt,name=betsNumber,proto3" json:"betsNumber,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *UserBet) Reset() { *m = UserBet{} }
func (m *UserBet) String() string { return proto.CompactTextString(m) }
func (*UserBet) ProtoMessage() {}
func (*UserBet) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{17}
}
func (m *UserBet) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UserBet.Unmarshal(m, b)
}
func (m *UserBet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_UserBet.Marshal(b, m, deterministic)
}
func (m *UserBet) XXX_Merge(src proto.Message) {
xxx_messageInfo_UserBet.Merge(m, src)
}
func (m *UserBet) XXX_Size() int {
return xxx_messageInfo_UserBet.Size(m)
}
func (m *UserBet) XXX_DiscardUnknown() {
xxx_messageInfo_UserBet.DiscardUnknown(m)
}
var xxx_messageInfo_UserBet proto.InternalMessageInfo
func (m *UserBet) GetStartIndex() int64 {
if m != nil {
return m.StartIndex
}
return 0
}
func (m *UserBet) GetIndex() int64 {
if m != nil {
return m.Index
}
return 0
}
func (m *UserBet) GetGameID() string {
if m != nil {
return m.GameID
}
return ""
}
func (m *UserBet) GetAddr() string {
if m != nil {
return m.Addr
}
return ""
}
func (m *UserBet) GetOption() string {
if m != nil {
return m.Option
}
return ""
}
func (m *UserBet) GetBetsNumber() int64 {
if m != nil {
return m.BetsNumber
}
return 0
}
//GuessStartTxReq 构造start交易的请求
type GuessStartTxReq struct {
Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"`
......@@ -1471,7 +1606,7 @@ func (m *GuessStartTxReq) Reset() { *m = GuessStartTxReq{} }
func (m *GuessStartTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessStartTxReq) ProtoMessage() {}
func (*GuessStartTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{17}
return fileDescriptor_7574406c5d3430e8, []int{18}
}
func (m *GuessStartTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1598,7 +1733,7 @@ func (m *GuessBetTxReq) Reset() { *m = GuessBetTxReq{} }
func (m *GuessBetTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessBetTxReq) ProtoMessage() {}
func (*GuessBetTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{18}
return fileDescriptor_7574406c5d3430e8, []int{19}
}
func (m *GuessBetTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1660,7 +1795,7 @@ func (m *GuessStopBetTxReq) Reset() { *m = GuessStopBetTxReq{} }
func (m *GuessStopBetTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessStopBetTxReq) ProtoMessage() {}
func (*GuessStopBetTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{19}
return fileDescriptor_7574406c5d3430e8, []int{20}
}
func (m *GuessStopBetTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1708,7 +1843,7 @@ func (m *GuessAbortTxReq) Reset() { *m = GuessAbortTxReq{} }
func (m *GuessAbortTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessAbortTxReq) ProtoMessage() {}
func (*GuessAbortTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{20}
return fileDescriptor_7574406c5d3430e8, []int{21}
}
func (m *GuessAbortTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1757,7 +1892,7 @@ func (m *GuessPublishTxReq) Reset() { *m = GuessPublishTxReq{} }
func (m *GuessPublishTxReq) String() string { return proto.CompactTextString(m) }
func (*GuessPublishTxReq) ProtoMessage() {}
func (*GuessPublishTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{21}
return fileDescriptor_7574406c5d3430e8, []int{22}
}
func (m *GuessPublishTxReq) XXX_Unmarshal(b []byte) error {
......@@ -1802,8 +1937,7 @@ func (m *GuessPublishTxReq) GetFee() int64 {
// GuessGameRecord game信息查询记录
type GuessGameRecord struct {
GameID string `protobuf:"bytes,1,opt,name=gameID,proto3" json:"gameID,omitempty"`
Status int32 `protobuf:"varint,2,opt,name=status,proto3" json:"status,omitempty"`
Index int64 `protobuf:"varint,3,opt,name=index,proto3" json:"index,omitempty"`
StartIndex int64 `protobuf:"varint,2,opt,name=startIndex,proto3" json:"startIndex,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1813,7 +1947,7 @@ func (m *GuessGameRecord) Reset() { *m = GuessGameRecord{} }
func (m *GuessGameRecord) String() string { return proto.CompactTextString(m) }
func (*GuessGameRecord) ProtoMessage() {}
func (*GuessGameRecord) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{22}
return fileDescriptor_7574406c5d3430e8, []int{23}
}
func (m *GuessGameRecord) XXX_Unmarshal(b []byte) error {
......@@ -1841,16 +1975,9 @@ func (m *GuessGameRecord) GetGameID() string {
return ""
}
func (m *GuessGameRecord) GetStatus() int32 {
func (m *GuessGameRecord) GetStartIndex() int64 {
if m != nil {
return m.Status
}
return 0
}
func (m *GuessGameRecord) GetIndex() int64 {
if m != nil {
return m.Index
return m.StartIndex
}
return 0
}
......@@ -1858,6 +1985,7 @@ func (m *GuessGameRecord) GetIndex() int64 {
// GuessGameRecords game信息查询记录集
type GuessGameRecords struct {
Records []*GuessGameRecord `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"`
PrimaryKey []byte `protobuf:"bytes,2,opt,name=primaryKey,proto3" json:"primaryKey,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1867,7 +1995,7 @@ func (m *GuessGameRecords) Reset() { *m = GuessGameRecords{} }
func (m *GuessGameRecords) String() string { return proto.CompactTextString(m) }
func (*GuessGameRecords) ProtoMessage() {}
func (*GuessGameRecords) Descriptor() ([]byte, []int) {
return fileDescriptor_7574406c5d3430e8, []int{23}
return fileDescriptor_7574406c5d3430e8, []int{24}
}
func (m *GuessGameRecords) XXX_Unmarshal(b []byte) error {
......@@ -1895,6 +2023,13 @@ func (m *GuessGameRecords) GetRecords() []*GuessGameRecord {
return nil
}
func (m *GuessGameRecords) GetPrimaryKey() []byte {
if m != nil {
return m.PrimaryKey
}
return nil
}
func init() {
proto.RegisterType((*GuessGame)(nil), "types.GuessGame")
proto.RegisterType((*GuessPlayer)(nil), "types.GuessPlayer")
......@@ -1913,6 +2048,7 @@ func init() {
proto.RegisterType((*QueryGuessGameInfos)(nil), "types.QueryGuessGameInfos")
proto.RegisterType((*ReplyGuessGameInfos)(nil), "types.ReplyGuessGameInfos")
proto.RegisterType((*ReceiptGuessGame)(nil), "types.ReceiptGuessGame")
proto.RegisterType((*UserBet)(nil), "types.UserBet")
proto.RegisterType((*GuessStartTxReq)(nil), "types.GuessStartTxReq")
proto.RegisterType((*GuessBetTxReq)(nil), "types.GuessBetTxReq")
proto.RegisterType((*GuessStopBetTxReq)(nil), "types.GuessStopBetTxReq")
......@@ -1925,86 +2061,93 @@ func init() {
func init() { proto.RegisterFile("guess.proto", fileDescriptor_7574406c5d3430e8) }
var fileDescriptor_7574406c5d3430e8 = []byte{
// 1254 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xcd, 0x6e, 0xdb, 0x46,
0x10, 0xb6, 0x48, 0x51, 0x3f, 0x23, 0xf9, 0x6f, 0x9d, 0x38, 0xac, 0x61, 0x14, 0x2a, 0x11, 0xa4,
0x42, 0x81, 0xb8, 0x85, 0x02, 0x14, 0x45, 0x8a, 0x1c, 0xac, 0x1a, 0x89, 0x7d, 0x69, 0x53, 0xda,
0x41, 0x7a, 0xa5, 0xa4, 0xb5, 0x4c, 0x40, 0x22, 0x19, 0x72, 0x65, 0x48, 0xf7, 0x5e, 0xfb, 0x14,
0xed, 0xa1, 0xb7, 0xf6, 0x39, 0xfa, 0x54, 0xc5, 0xcc, 0x2e, 0xc5, 0x25, 0x45, 0x59, 0x72, 0xd1,
0x1b, 0xe7, 0x67, 0x67, 0x66, 0x67, 0x67, 0xbe, 0x19, 0x09, 0x5a, 0xe3, 0x19, 0x4f, 0x92, 0xb3,
0x28, 0x0e, 0x45, 0xc8, 0x2c, 0xb1, 0x88, 0x78, 0x72, 0x72, 0x28, 0x62, 0x2f, 0x48, 0xbc, 0xa1,
0xf0, 0xc3, 0x40, 0x4a, 0x9c, 0xbf, 0x6b, 0xd0, 0x7c, 0x87, 0x9a, 0xef, 0xbc, 0x29, 0x67, 0xc7,
0x50, 0x1b, 0x7b, 0x53, 0x7e, 0x75, 0x61, 0x57, 0x3a, 0x95, 0x6e, 0xd3, 0x55, 0x14, 0xf2, 0x13,
0xe1, 0x89, 0x59, 0x62, 0x1b, 0x9d, 0x4a, 0xd7, 0x72, 0x15, 0xc5, 0x4e, 0xa1, 0x19, 0xc5, 0xfc,
0x5a, 0x8a, 0x4c, 0x12, 0x65, 0x0c, 0x94, 0x26, 0xc2, 0x8b, 0xc5, 0x8d, 0x3f, 0xe5, 0x76, 0xb5,
0x53, 0xe9, 0x9a, 0x6e, 0xc6, 0x60, 0x1d, 0x68, 0x11, 0x71, 0xc9, 0xfd, 0xf1, 0x9d, 0xb0, 0x2d,
0x92, 0xeb, 0xac, 0xa5, 0xc6, 0xcd, 0xfc, 0xd2, 0x4b, 0xee, 0xec, 0x1a, 0x85, 0xa4, 0xb3, 0xd8,
0x13, 0xb0, 0x44, 0x18, 0xf9, 0x43, 0xbb, 0x4e, 0x32, 0x49, 0xb0, 0x13, 0x68, 0x0c, 0x3d, 0xc1,
0xc7, 0x61, 0xbc, 0xb0, 0x1b, 0x24, 0x58, 0xd2, 0xcc, 0x86, 0x7a, 0x18, 0xe1, 0xfd, 0x13, 0xbb,
0x49, 0xa2, 0x94, 0x64, 0x0e, 0xb4, 0xa7, 0xde, 0xbc, 0xcf, 0xd3, 0x80, 0x80, 0x02, 0xca, 0xf1,
0xd8, 0x0b, 0xd8, 0x93, 0x74, 0xf2, 0x53, 0xc0, 0xe9, 0x5a, 0x2d, 0xd2, 0x2a, 0x70, 0xd9, 0x73,
0xd8, 0x55, 0x9c, 0x1f, 0x67, 0xd3, 0x01, 0x8f, 0xed, 0x36, 0xa9, 0xe5, 0x99, 0xe8, 0x71, 0xc4,
0xef, 0xdf, 0x72, 0xfe, 0xd6, 0x1b, 0x8a, 0x30, 0xb6, 0x77, 0xa5, 0x47, 0x9d, 0xc7, 0x3e, 0x07,
0x90, 0xf4, 0xf9, 0x68, 0x14, 0xdb, 0x7b, 0x14, 0xb2, 0xc6, 0x41, 0x4f, 0xd1, 0xc4, 0x13, 0x99,
0x91, 0x7d, 0xe9, 0x29, 0xc7, 0xc4, 0x4c, 0x2a, 0x06, 0x99, 0x39, 0x90, 0x99, 0xd4, 0x58, 0x18,
0x0b, 0x9f, 0x47, 0x7e, 0xcc, 0xd5, 0xed, 0x0f, 0x65, 0x2c, 0x3a, 0x0f, 0xdf, 0xd3, 0x1b, 0x4d,
0xfd, 0x80, 0x6c, 0x30, 0xb2, 0x91, 0x31, 0x30, 0xd2, 0x41, 0x76, 0xe1, 0x23, 0x3a, 0xaf, 0x71,
0x58, 0x17, 0xac, 0x68, 0xe2, 0x2d, 0x12, 0xfb, 0x49, 0xc7, 0xec, 0xb6, 0x7a, 0xec, 0x8c, 0x6a,
0xf2, 0x8c, 0x8a, 0xef, 0xfd, 0xc4, 0x5b, 0xf0, 0xd8, 0x95, 0x0a, 0x58, 0x6d, 0x31, 0x4f, 0x66,
0x13, 0x61, 0x3f, 0x95, 0x55, 0x28, 0x29, 0xf6, 0x12, 0xea, 0x03, 0x2e, 0xb0, 0xb8, 0xec, 0xe3,
0x4e, 0xa5, 0xdb, 0xea, 0x1d, 0xe9, 0x36, 0xfa, 0x52, 0xe4, 0xa6, 0x3a, 0x58, 0x1c, 0x7e, 0x30,
0xe2, 0x73, 0xfb, 0x19, 0xc5, 0x22, 0x09, 0x2c, 0x8e, 0x28, 0xe6, 0x57, 0x24, 0xb0, 0x49, 0xb0,
0xa4, 0x31, 0x99, 0xa3, 0xd8, 0xbf, 0xe7, 0x41, 0x7f, 0x71, 0x8e, 0xf7, 0xb2, 0x3f, 0xeb, 0x54,
0xba, 0x0d, 0x37, 0xcf, 0x74, 0x2e, 0xa0, 0xa5, 0x05, 0xcd, 0x18, 0x54, 0x3d, 0x4c, 0x88, 0xec,
0x18, 0xfa, 0x66, 0x5f, 0x80, 0x39, 0xe0, 0x82, 0x9a, 0xa5, 0xd5, 0xdb, 0x2f, 0x44, 0xe9, 0xa2,
0xcc, 0xf9, 0xb3, 0x02, 0x8d, 0x94, 0x83, 0x37, 0x96, 0x65, 0x98, 0xf6, 0x9d, 0xa4, 0x0a, 0x39,
0x35, 0x56, 0x72, 0x7a, 0x02, 0x0d, 0x3f, 0xf9, 0xe8, 0x07, 0x01, 0x8f, 0xa9, 0xfd, 0x1a, 0xee,
0x92, 0x46, 0x9b, 0x51, 0x1c, 0xde, 0xfa, 0x42, 0xb5, 0x9e, 0xa2, 0xb2, 0xb4, 0x58, 0xeb, 0xd2,
0x52, 0xcb, 0xa7, 0xc5, 0xf9, 0xad, 0x02, 0x6d, 0x3d, 0xc5, 0x98, 0x27, 0x11, 0x0a, 0x6f, 0xd2,
0xe7, 0xd4, 0xca, 0x09, 0x45, 0x6d, 0xba, 0x79, 0x26, 0xeb, 0xc2, 0x7e, 0xca, 0xc8, 0xdf, 0xa0,
0xc8, 0x66, 0x2f, 0xc1, 0xf2, 0x05, 0x9f, 0x22, 0x84, 0x60, 0x69, 0x3c, 0x2b, 0x79, 0xd6, 0x2b,
0xc1, 0xa7, 0xae, 0xd4, 0x72, 0xee, 0xe0, 0xa0, 0x28, 0xfa, 0xcf, 0x19, 0x3c, 0x85, 0x26, 0x52,
0xf2, 0x1a, 0xa6, 0xc4, 0xa8, 0x25, 0xc3, 0xf9, 0xc7, 0x80, 0xfd, 0x25, 0x3a, 0x9e, 0x13, 0x6e,
0x62, 0xb0, 0x04, 0x41, 0xe4, 0xa8, 0xd5, 0x7b, 0xaa, 0x07, 0x8b, 0x6a, 0xd7, 0x84, 0x60, 0x3b,
0xae, 0xd4, 0x62, 0x5f, 0xea, 0xa5, 0x70, 0x54, 0x54, 0x46, 0x68, 0xd9, 0xa1, 0x82, 0x60, 0xaf,
0xa0, 0x9e, 0x88, 0x30, 0xea, 0x73, 0x41, 0x71, 0x14, 0xd2, 0x20, 0x2d, 0x93, 0xf8, 0x72, 0xc7,
0x4d, 0x35, 0x31, 0x18, 0x6f, 0x10, 0xc6, 0xf2, 0x8d, 0x4b, 0x82, 0x39, 0x47, 0x21, 0x06, 0x43,
0x5a, 0xe8, 0x23, 0x9a, 0x0d, 0x26, 0x7e, 0x72, 0x47, 0xaf, 0x5f, 0xe2, 0xe3, 0xbd, 0x14, 0xa3,
0x0f, 0xa5, 0x89, 0x3e, 0x3e, 0xcd, 0x78, 0xbc, 0xa0, 0xba, 0x28, 0xf1, 0xf1, 0x33, 0x0a, 0xd1,
0x07, 0x69, 0xb1, 0x3d, 0x30, 0xc4, 0x82, 0x00, 0xd9, 0x72, 0x0d, 0xb1, 0xe8, 0xd7, 0xc1, 0xba,
0xf7, 0x26, 0x33, 0xee, 0xfc, 0x61, 0xc2, 0x5e, 0x3e, 0x4b, 0x19, 0x7e, 0x57, 0x74, 0xfc, 0xd6,
0x30, 0xda, 0xc8, 0x63, 0xb4, 0x8e, 0xec, 0x66, 0x01, 0xd9, 0x8b, 0xf8, 0x5d, 0xdd, 0x0a, 0xbf,
0xad, 0xed, 0xf0, 0xbb, 0xb6, 0x0d, 0x7e, 0xd7, 0x37, 0xe2, 0x77, 0x63, 0x33, 0x7e, 0x37, 0xb7,
0xc0, 0x6f, 0xd8, 0x8c, 0xdf, 0xad, 0x12, 0xfc, 0x5e, 0x81, 0xb7, 0x76, 0x19, 0xbc, 0xfd, 0xa2,
0x9a, 0x5d, 0x95, 0xe7, 0x43, 0x3b, 0x81, 0xea, 0x38, 0x23, 0xd7, 0x71, 0x36, 0xa1, 0x34, 0xe6,
0x48, 0xf5, 0x53, 0x4a, 0x3a, 0x5f, 0xa9, 0xbe, 0xd5, 0x6a, 0x79, 0x9d, 0x75, 0xa7, 0xab, 0xd5,
0x0a, 0x15, 0xf1, 0x5a, 0xcd, 0xbe, 0x66, 0x55, 0x55, 0xef, 0x43, 0x31, 0xab, 0xc9, 0x62, 0xe8,
0x93, 0xc5, 0xf9, 0x4e, 0xf3, 0x46, 0xe5, 0xbc, 0xd6, 0x82, 0xac, 0x6e, 0x3c, 0xbd, 0x8b, 0xd5,
0x8d, 0x30, 0xce, 0xe8, 0xc4, 0xf2, 0xfc, 0x55, 0x70, 0x1b, 0xae, 0x3d, 0x9e, 0x0e, 0x0b, 0x43,
0x1b, 0x16, 0xd9, 0x72, 0x65, 0xe6, 0x96, 0xab, 0x25, 0x50, 0x57, 0x75, 0xa0, 0xce, 0x0d, 0x61,
0xab, 0x38, 0x84, 0xf5, 0x06, 0xa9, 0xe5, 0x1b, 0xc4, 0x79, 0x0d, 0xcc, 0xe5, 0xd1, 0xa4, 0x10,
0xe9, 0x73, 0xa8, 0x62, 0x6c, 0x0a, 0xcd, 0x0e, 0x8a, 0xcd, 0xed, 0x92, 0xd4, 0xf9, 0x1a, 0x8e,
0x56, 0x6f, 0x99, 0xe0, 0x5b, 0xcb, 0x8b, 0xe1, 0x08, 0x30, 0xb1, 0x53, 0x15, 0xe9, 0xbc, 0x81,
0xa3, 0x55, 0x67, 0x09, 0x7b, 0x01, 0x16, 0x6a, 0x48, 0xf5, 0x32, 0x77, 0x52, 0xec, 0xfc, 0x6a,
0xc0, 0x81, 0xcb, 0x87, 0xdc, 0x8f, 0xc4, 0xe6, 0xed, 0x34, 0xb7, 0x85, 0x1a, 0xc5, 0x2d, 0x74,
0x5d, 0x7a, 0xd3, 0xa7, 0xa8, 0x6a, 0x4f, 0xb1, 0x31, 0xb9, 0xeb, 0x66, 0x64, 0xf6, 0x58, 0xf5,
0xc2, 0x54, 0x5d, 0xbb, 0x89, 0x3a, 0xd0, 0x96, 0x91, 0xfc, 0x70, 0xe7, 0x05, 0x63, 0x4e, 0x8d,
0xdf, 0x70, 0x73, 0x3c, 0xe7, 0x2f, 0x53, 0xcd, 0x9f, 0x6b, 0xb9, 0xf4, 0xba, 0xfc, 0xd3, 0xff,
0x8a, 0x99, 0xa7, 0xd0, 0x9c, 0x7a, 0xf3, 0x1c, 0x60, 0x66, 0x8c, 0x15, 0x44, 0xb5, 0xb6, 0x42,
0xd4, 0xda, 0x76, 0x88, 0x5a, 0xdf, 0x06, 0x51, 0x1b, 0x1b, 0x11, 0xb5, 0xb9, 0x19, 0x51, 0x61,
0x0b, 0x44, 0x6d, 0x6d, 0x46, 0xd4, 0x76, 0x09, 0xa2, 0x1e, 0x80, 0x79, 0xcb, 0xb9, 0x5a, 0xdc,
0xf1, 0xd3, 0xe1, 0xb0, 0x9b, 0xee, 0x26, 0xf2, 0xb9, 0x1e, 0x0b, 0x9f, 0x0c, 0xaa, 0x88, 0x97,
0x0a, 0x3b, 0xe9, 0x3b, 0x75, 0x53, 0xcd, 0xdc, 0xbc, 0x81, 0x43, 0x55, 0x17, 0x04, 0xa3, 0x0f,
0xbb, 0x52, 0xc7, 0x8d, 0xec, 0xf8, 0xf7, 0xaa, 0xac, 0x08, 0x59, 0x1f, 0x7b, 0xf8, 0x83, 0xf2,
0xad, 0xc0, 0x76, 0xe3, 0x35, 0xcb, 0x10, 0x37, 0x35, 0x6b, 0x66, 0x66, 0x3f, 0x6a, 0xab, 0x96,
0xcb, 0x87, 0x61, 0x3c, 0x7a, 0xf4, 0xcf, 0xd1, 0x65, 0x13, 0x9a, 0x5a, 0x13, 0x3a, 0x17, 0xda,
0x80, 0x90, 0x86, 0x13, 0xf6, 0x0d, 0xd4, 0x63, 0xf9, 0xa9, 0x90, 0xe8, 0x78, 0x05, 0x89, 0x48,
0xec, 0xa6, 0x6a, 0xbd, 0xdf, 0x0d, 0xb0, 0xe8, 0x27, 0x35, 0xfb, 0x16, 0x20, 0xeb, 0x49, 0x56,
0xbe, 0xff, 0x9d, 0xa4, 0x4b, 0xff, 0x87, 0x20, 0xf1, 0xc7, 0xc1, 0xcd, 0xdc, 0xd9, 0x61, 0x3d,
0x6d, 0xe1, 0x2f, 0x5b, 0x04, 0xcb, 0xce, 0xbc, 0x56, 0xc3, 0x38, 0x1d, 0x97, 0xeb, 0x76, 0xc2,
0xb2, 0xb3, 0x69, 0x9c, 0x72, 0x7c, 0x96, 0xaf, 0x86, 0x0f, 0xf9, 0x4c, 0x87, 0xe9, 0xba, 0x1d,
0xb1, 0xe4, 0xec, 0xa0, 0x46, 0xff, 0x2a, 0xbc, 0xfa, 0x37, 0x00, 0x00, 0xff, 0xff, 0x98, 0xe5,
0x9a, 0x47, 0x7e, 0x10, 0x00, 0x00,
// 1367 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xc9, 0x8e, 0xdb, 0x46,
0x13, 0x1e, 0x92, 0xa2, 0x96, 0x92, 0x66, 0x46, 0xee, 0xf1, 0xc2, 0x7f, 0x60, 0x18, 0xfa, 0x09,
0xc3, 0x11, 0x02, 0xd8, 0x09, 0x64, 0x20, 0x08, 0x1c, 0xf8, 0x30, 0x8a, 0x61, 0x7b, 0x10, 0x20,
0x71, 0x68, 0x1b, 0xc9, 0x95, 0x92, 0x7a, 0x34, 0x04, 0x24, 0x92, 0x26, 0x5b, 0x03, 0xe9, 0x21,
0x72, 0xcb, 0x1b, 0x38, 0x87, 0xdc, 0xf2, 0x1a, 0x41, 0x4e, 0x79, 0xa4, 0xa0, 0xaa, 0x9b, 0x62,
0x93, 0xa2, 0x16, 0x07, 0xb9, 0xb1, 0x96, 0xee, 0xaa, 0xae, 0xed, 0x2b, 0x09, 0xda, 0xd3, 0x05,
0x4f, 0xd3, 0x27, 0x71, 0x12, 0x89, 0x88, 0xd9, 0x62, 0x15, 0xf3, 0xf4, 0xfc, 0x96, 0x48, 0xfc,
0x30, 0xf5, 0xc7, 0x22, 0x88, 0x42, 0x29, 0x71, 0xff, 0xae, 0x43, 0xeb, 0x15, 0x6a, 0xbe, 0xf2,
0xe7, 0x9c, 0xdd, 0x85, 0xfa, 0xd4, 0x9f, 0xf3, 0xcb, 0x17, 0x8e, 0xd1, 0x33, 0xfa, 0x2d, 0x4f,
0x51, 0xc8, 0x4f, 0x85, 0x2f, 0x16, 0xa9, 0x63, 0xf6, 0x8c, 0xbe, 0xed, 0x29, 0x8a, 0xdd, 0x87,
0x56, 0x9c, 0xf0, 0xb7, 0x52, 0x64, 0x91, 0x28, 0x67, 0xa0, 0x34, 0x15, 0x7e, 0x22, 0xde, 0x05,
0x73, 0xee, 0xd4, 0x7a, 0x46, 0xdf, 0xf2, 0x72, 0x06, 0xeb, 0x41, 0x9b, 0x88, 0xd7, 0x3c, 0x98,
0x5e, 0x0b, 0xc7, 0x26, 0xb9, 0xce, 0x5a, 0x6b, 0xbc, 0x5b, 0xbe, 0xf6, 0xd3, 0x6b, 0xa7, 0x4e,
0x2e, 0xe9, 0x2c, 0xf6, 0x00, 0x80, 0xc8, 0xcb, 0x70, 0xc2, 0x97, 0x4e, 0x83, 0xae, 0xd0, 0x38,
0xec, 0x36, 0xd8, 0x22, 0x8a, 0x83, 0xb1, 0xd3, 0xa4, 0xb3, 0x92, 0x60, 0xe7, 0xd0, 0x1c, 0xfb,
0x82, 0x4f, 0xa3, 0x64, 0xe5, 0xb4, 0x48, 0xb0, 0xa6, 0x99, 0x03, 0x8d, 0x28, 0xc6, 0xf8, 0xa4,
0x0e, 0x90, 0x28, 0x23, 0x99, 0x0b, 0x9d, 0xb9, 0xbf, 0x1c, 0xf2, 0xcc, 0xe1, 0x36, 0x59, 0x2b,
0xf0, 0xd8, 0x23, 0x38, 0x91, 0x74, 0xfa, 0x43, 0xc8, 0xe9, 0xd9, 0x1d, 0xd2, 0x2a, 0x71, 0xd9,
0x43, 0x38, 0x56, 0x9c, 0xef, 0x17, 0xf3, 0x11, 0x4f, 0x9c, 0x63, 0x52, 0x2b, 0x32, 0xd1, 0xe2,
0x84, 0xdf, 0xbc, 0xe4, 0xfc, 0xa5, 0x3f, 0x16, 0x51, 0xe2, 0x9c, 0x48, 0x8b, 0x3a, 0x0f, 0x23,
0x20, 0xe9, 0x8b, 0xc9, 0x24, 0x71, 0x4e, 0xc9, 0x65, 0x8d, 0x83, 0x96, 0xe2, 0x99, 0x2f, 0xf2,
0x4b, 0xba, 0xd2, 0x52, 0x81, 0x89, 0x91, 0x56, 0x0c, 0xba, 0xe6, 0x96, 0x8c, 0xb4, 0xc6, 0x42,
0x5f, 0xf8, 0x32, 0x0e, 0x12, 0xae, 0x5e, 0xcf, 0xa4, 0x2f, 0x3a, 0x0f, 0xf3, 0xed, 0x4f, 0xe6,
0x41, 0x48, 0x77, 0x9c, 0xd1, 0x1d, 0x39, 0x03, 0x3d, 0x1d, 0xe5, 0x0f, 0xbe, 0x2d, 0x73, 0x95,
0x73, 0x58, 0x1f, 0xec, 0x78, 0xe6, 0xaf, 0x52, 0xe7, 0x4e, 0xcf, 0xea, 0xb7, 0x07, 0xec, 0x09,
0xd5, 0xec, 0x13, 0x2a, 0xce, 0x37, 0x33, 0x7f, 0xc5, 0x13, 0x4f, 0x2a, 0x60, 0x35, 0x26, 0x3c,
0x5d, 0xcc, 0x84, 0x73, 0x57, 0x56, 0xa9, 0xa4, 0xd8, 0x63, 0x68, 0x8c, 0xb8, 0xc0, 0xe2, 0x73,
0xee, 0xf5, 0x8c, 0x7e, 0x7b, 0x70, 0xa6, 0xdf, 0x31, 0x94, 0x22, 0x2f, 0xd3, 0xc1, 0xe2, 0x08,
0xa8, 0x6e, 0x1c, 0xf2, 0x45, 0x12, 0x58, 0x1c, 0x71, 0xc2, 0x65, 0x41, 0xfd, 0x8f, 0x04, 0x6b,
0x1a, 0x83, 0x39, 0x49, 0x82, 0x1b, 0x1e, 0x0e, 0x57, 0x17, 0xf8, 0x2e, 0xe7, 0xbc, 0x67, 0xf4,
0x9b, 0x5e, 0x91, 0xe9, 0xbe, 0x80, 0xb6, 0xe6, 0x34, 0x63, 0x50, 0xf3, 0x31, 0x20, 0xb2, 0xa3,
0xe8, 0x9b, 0xfd, 0x1f, 0xac, 0x11, 0x17, 0xd4, 0x4c, 0xed, 0xc1, 0x69, 0xc9, 0x4b, 0x0f, 0x65,
0xee, 0xef, 0x06, 0x34, 0x33, 0x0e, 0xbe, 0x58, 0x96, 0x61, 0xd6, 0x97, 0x92, 0x2a, 0xc5, 0xd4,
0xdc, 0x88, 0xe9, 0x39, 0x34, 0x83, 0xf4, 0xa7, 0x20, 0x0c, 0x79, 0x42, 0xed, 0xd9, 0xf4, 0xd6,
0x34, 0xde, 0x19, 0x27, 0xd1, 0x55, 0x20, 0x54, 0x6b, 0x2a, 0x2a, 0x0f, 0x8b, 0xbd, 0x2d, 0x2c,
0xf5, 0x62, 0x58, 0xdc, 0x5f, 0x0c, 0xe8, 0xe8, 0x21, 0xc6, 0x38, 0x89, 0x48, 0xf8, 0xb3, 0x21,
0xa7, 0x56, 0x4f, 0xc9, 0x6b, 0xcb, 0x2b, 0x32, 0x59, 0x1f, 0x4e, 0x33, 0x46, 0xf1, 0x05, 0x65,
0x36, 0x7b, 0x0c, 0x76, 0x20, 0xf8, 0x1c, 0x47, 0x0c, 0x96, 0xc6, 0xbd, 0x8a, 0xb4, 0x5e, 0x0a,
0x3e, 0xf7, 0xa4, 0x96, 0x7b, 0x0d, 0xdd, 0xb2, 0xe8, 0x5f, 0x47, 0xf0, 0x3e, 0xb4, 0x90, 0x92,
0xcf, 0xb0, 0xe4, 0x0c, 0x5b, 0x33, 0xdc, 0xbf, 0x4c, 0x38, 0x5d, 0x4f, 0xcf, 0x0b, 0x9a, 0xab,
0xe8, 0x2c, 0x4d, 0x20, 0x32, 0xd4, 0x1e, 0xdc, 0xd1, 0x9d, 0x45, 0xb5, 0xb7, 0x34, 0xe1, 0x8e,
0x3c, 0xa9, 0xc5, 0x3e, 0xd3, 0x4b, 0xe1, 0xac, 0xac, 0x8c, 0xa3, 0xe5, 0x88, 0x0a, 0x82, 0x3d,
0x85, 0x46, 0x2a, 0xa2, 0x78, 0xc8, 0x05, 0xf9, 0x51, 0x0a, 0x83, 0xbc, 0x99, 0xc4, 0xaf, 0x8f,
0xbc, 0x4c, 0x13, 0x9d, 0xf1, 0x47, 0x51, 0x22, 0x73, 0x5c, 0xe1, 0xcc, 0x05, 0x0a, 0xd1, 0x19,
0xd2, 0x42, 0x1b, 0xf1, 0x62, 0x34, 0x0b, 0xd2, 0x6b, 0xca, 0x7e, 0x85, 0x8d, 0x37, 0x52, 0x8c,
0x36, 0x94, 0x26, 0xda, 0xf8, 0xb0, 0xe0, 0xc9, 0x8a, 0xea, 0xa2, 0xc2, 0xc6, 0x8f, 0x28, 0x44,
0x1b, 0xa4, 0xc5, 0x4e, 0xc0, 0x14, 0x2b, 0x9a, 0xd5, 0xb6, 0x67, 0x8a, 0xd5, 0xb0, 0x01, 0xf6,
0x8d, 0x3f, 0x5b, 0x70, 0xf7, 0x37, 0x0b, 0x4e, 0x8a, 0x51, 0xca, 0xe7, 0xb7, 0xa1, 0xcf, 0x6f,
0x6d, 0x46, 0x9b, 0xc5, 0x19, 0xad, 0x4f, 0x76, 0xab, 0x34, 0xd9, 0xcb, 0xf3, 0xbb, 0x76, 0xd0,
0xfc, 0xb6, 0x0f, 0x9b, 0xdf, 0xf5, 0x43, 0xe6, 0x77, 0x63, 0xef, 0xfc, 0x6e, 0xee, 0x9f, 0xdf,
0xad, 0x03, 0xe6, 0x37, 0xec, 0x9f, 0xdf, 0xed, 0x8a, 0xf9, 0xbd, 0x31, 0xde, 0x3a, 0x55, 0xe3,
0xed, 0x67, 0xd5, 0xec, 0xaa, 0x3c, 0x77, 0xed, 0x0c, 0xaa, 0xe3, 0xcc, 0x42, 0xc7, 0x39, 0x34,
0xa5, 0x31, 0x46, 0xaa, 0x9f, 0x32, 0xd2, 0xfd, 0x5c, 0xf5, 0xad, 0x56, 0xcb, 0xdb, 0x6e, 0x77,
0xfb, 0x5a, 0xad, 0x50, 0x11, 0x6f, 0xd5, 0x1c, 0x6a, 0xb7, 0xaa, 0xea, 0xdd, 0xe5, 0xb3, 0x42,
0x16, 0x53, 0x47, 0x16, 0xf7, 0x6b, 0xcd, 0x1a, 0x95, 0xf3, 0xd6, 0x1b, 0x64, 0x75, 0xe3, 0xe9,
0x63, 0xac, 0x6e, 0xf7, 0x4f, 0x03, 0x18, 0x9d, 0x58, 0x9f, 0xbf, 0x0c, 0xaf, 0xa2, 0xad, 0xc7,
0x33, 0xb0, 0x30, 0x35, 0xb0, 0xc8, 0x97, 0x2f, 0xab, 0xb0, 0x7c, 0xad, 0x07, 0x75, 0x4d, 0x1f,
0xd4, 0x05, 0x10, 0xb6, 0xcb, 0x20, 0xac, 0x37, 0x48, 0xbd, 0xd4, 0x20, 0x0f, 0x00, 0xe2, 0x24,
0x98, 0xfb, 0xc9, 0xea, 0x3b, 0x2e, 0x1b, 0xb4, 0xe3, 0x69, 0x1c, 0xf7, 0x19, 0x30, 0x8f, 0xc7,
0xb3, 0xd2, 0x4b, 0x1e, 0x42, 0x0d, 0x7d, 0x57, 0xd3, 0xae, 0x5b, 0x6e, 0x7e, 0x8f, 0xa4, 0xee,
0x17, 0x70, 0xb6, 0x19, 0x85, 0x14, 0x6b, 0x41, 0x3e, 0x1c, 0x21, 0xc2, 0xc2, 0x4e, 0x56, 0xa4,
0xfb, 0x1c, 0xce, 0x36, 0x8d, 0xa5, 0xec, 0x11, 0xd8, 0xa8, 0x21, 0xd5, 0xab, 0xcc, 0x49, 0xb1,
0xfb, 0xab, 0x05, 0x5d, 0x8f, 0x8f, 0x79, 0x10, 0x8b, 0x7c, 0xbb, 0x2d, 0x6e, 0x8b, 0xc6, 0xc6,
0xb6, 0x98, 0x27, 0xc5, 0x2c, 0x24, 0x65, 0xf7, 0x96, 0x9b, 0xa7, 0xa7, 0x56, 0x48, 0x4f, 0x96,
0x4a, 0x5b, 0x4b, 0x65, 0x21, 0x39, 0xf5, 0x8a, 0xe4, 0xac, 0x31, 0xb6, 0x51, 0x5a, 0x3d, 0xd6,
0xc9, 0x6e, 0x96, 0x50, 0x79, 0xeb, 0x26, 0xeb, 0x42, 0x47, 0x7a, 0xf2, 0xed, 0xb5, 0x1f, 0x4e,
0x39, 0x0d, 0x85, 0xa6, 0x57, 0xe0, 0xb1, 0xae, 0x04, 0x9f, 0x36, 0x89, 0x08, 0x65, 0xf2, 0xae,
0xed, 0xec, 0xc0, 0xc9, 0xe3, 0x0d, 0x9c, 0xcc, 0xca, 0xe0, 0x64, 0x67, 0x19, 0x7c, 0x34, 0xa0,
0xf1, 0x3e, 0xe5, 0x09, 0x76, 0xf6, 0xbe, 0x6c, 0xac, 0x5f, 0x6c, 0xea, 0x2f, 0xce, 0x73, 0x64,
0x55, 0x36, 0x4e, 0xad, 0xd8, 0x38, 0xea, 0x2d, 0xf6, 0x8e, 0xb7, 0xd4, 0xcb, 0x6f, 0x71, 0xff,
0xb0, 0x14, 0xaa, 0xbf, 0x95, 0x3f, 0x35, 0x3c, 0xfe, 0xe1, 0x3f, 0x45, 0xa2, 0xfb, 0xd0, 0x9a,
0xfb, 0xcb, 0x02, 0x0c, 0xe5, 0x8c, 0x0d, 0x9c, 0xb2, 0x0f, 0xc2, 0xa9, 0xfa, 0x61, 0x38, 0xd5,
0x38, 0x04, 0xa7, 0x9a, 0x7b, 0x71, 0xaa, 0xb5, 0x1f, 0xa7, 0xe0, 0x00, 0x9c, 0x6a, 0xef, 0xc7,
0xa9, 0x4e, 0x05, 0x4e, 0x75, 0xc1, 0xba, 0xe2, 0x5c, 0x15, 0x21, 0x7e, 0xba, 0x1c, 0x8e, 0xb3,
0x8d, 0x4f, 0xa6, 0xeb, 0x53, 0x41, 0x89, 0x41, 0x0d, 0x0b, 0x40, 0x21, 0x12, 0x7d, 0x67, 0x66,
0x6a, 0xb9, 0x99, 0xe7, 0x70, 0x4b, 0xd5, 0x05, 0x81, 0xd3, 0x6e, 0x53, 0xea, 0xb8, 0x99, 0x1f,
0xff, 0x46, 0x95, 0x15, 0xe1, 0xd5, 0xa7, 0x1e, 0x7e, 0xaf, 0x6c, 0x2b, 0x08, 0xdb, 0xfb, 0xcc,
0x2a, 0x1c, 0xcb, 0xae, 0xb5, 0xf2, 0x6b, 0x2f, 0xb5, 0x05, 0xd6, 0xe3, 0xe3, 0x28, 0x99, 0x6c,
0xbd, 0xb4, 0xd8, 0xb0, 0x66, 0xb9, 0x61, 0xdd, 0x89, 0x06, 0xb4, 0xf2, 0xaa, 0x94, 0x7d, 0x09,
0x8d, 0x44, 0x7e, 0xaa, 0x89, 0x7d, 0x77, 0x63, 0x32, 0x90, 0xd8, 0xcb, 0xd4, 0x4a, 0x28, 0x64,
0x96, 0x51, 0x68, 0xf0, 0xd1, 0x04, 0x9b, 0xfe, 0xda, 0x60, 0x5f, 0x01, 0xe4, 0x5d, 0xca, 0xaa,
0xf7, 0xec, 0xf3, 0xec, 0xc7, 0xd5, 0xfb, 0x30, 0x0d, 0xa6, 0xe1, 0xbb, 0xa5, 0x7b, 0xc4, 0x06,
0xda, 0x0f, 0xab, 0xaa, 0x85, 0xbb, 0xea, 0xcc, 0x33, 0xb5, 0xf4, 0x64, 0x6b, 0xc9, 0xb6, 0xdd,
0xbb, 0xea, 0x6c, 0xe6, 0xa7, 0x5c, 0x53, 0xaa, 0x57, 0xf0, 0x5d, 0x36, 0xb3, 0xa5, 0x65, 0xdb,
0x2e, 0x5e, 0x71, 0x76, 0x54, 0xa7, 0x7f, 0x77, 0x9e, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0xcf,
0xa9, 0x8e, 0x1b, 0x06, 0x12, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -15,17 +15,17 @@ data: guess
index: addr,status,addr_status,admin,admin_status,category_status
*/
var opt = &table.Option{
Prefix: "LODB",
Name: "guess",
Primary: "gameid",
Index: []string{"addr", "status", "addr_status", "admin", "admin_status", "category_status"},
var opt_guess_user = &table.Option{
Prefix: "LODB_guess",
Name: "user",
Primary: "index",
Index: []string{"addr", "startindex"},
}
//NewTable 新建表
func NewTable(kvdb db.KV) *table.Table {
rowmeta := NewGuessRow()
table, err := table.NewTable(rowmeta, kvdb, opt)
func NewGuessUserTable(kvdb db.KV) *table.Table {
rowmeta := NewGuessUserRow()
table, err := table.NewTable(rowmeta, kvdb, opt_guess_user)
if err != nil {
panic(err)
}
......@@ -33,39 +33,91 @@ func NewTable(kvdb db.KV) *table.Table {
}
//OracleRow table meta 结构
type GuessRow struct {
*ReceiptGuessGame
type GuessUserRow struct {
*UserBet
}
//NewOracleRow 新建一个meta 结构
func NewGuessRow() *GuessRow {
return &GuessRow{ReceiptGuessGame: &ReceiptGuessGame{}}
func NewGuessUserRow() *GuessUserRow {
return &GuessUserRow{UserBet: &UserBet{}}
}
//CreateRow 新建数据行(注意index 数据一定也要保存到数据中,不能就保存eventid)
func (tx *GuessRow) CreateRow() *table.Row {
func (tx *GuessUserRow) CreateRow() *table.Row {
return &table.Row{Data: &ReceiptGuessGame{}}
}
//SetPayload 设置数据
func (tx *GuessRow) SetPayload(data types.Message) error {
if txdata, ok := data.(*ReceiptGuessGame); ok {
tx.ReceiptGuessGame = txdata
func (tx *GuessUserRow) SetPayload(data types.Message) error {
if txdata, ok := data.(*UserBet); ok {
tx.UserBet = txdata
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (tx *GuessRow) Get(key string) ([]byte, error) {
if key == "gameid" {
return []byte(tx.GameID), nil
func (tx *GuessUserRow) Get(key string) ([]byte, error) {
if key == "index" {
return []byte(fmt.Sprintf("%018d", tx.Index)), nil
} else if key == "addr" {
return []byte(fmt.Sprintf("%s", tx.Addr)), nil
} else if key == "startindex" {
return []byte(fmt.Sprintf("%018d", tx.StartIndex)), nil
}
return nil, types.ErrNotFound
}
var opt_guess_game = &table.Option{
Prefix: "LODB_guess",
Name: "game",
Primary: "startindex",
Index: []string{"gameid", "status","admin","admin_status", "category_status"},
}
//NewTable 新建表
func NewGuessGameTable(kvdb db.KV) *table.Table {
rowmeta := NewGuessGameRow()
table, err := table.NewTable(rowmeta, kvdb, opt_guess_game)
if err != nil {
panic(err)
}
return table
}
//OracleRow table meta 结构
type GuessGameRow struct {
*GuessGame
}
//NewOracleRow 新建一个meta 结构
func NewGuessGameRow() *GuessGameRow {
return &GuessGameRow{GuessGame: &GuessGame{}}
}
//CreateRow 新建数据行(注意index 数据一定也要保存到数据中,不能就保存eventid)
func (tx *GuessGameRow) CreateRow() *table.Row {
return &table.Row{Data: &GuessGame{}}
}
//SetPayload 设置数据
func (tx *GuessGameRow) SetPayload(data types.Message) error {
if txdata, ok := data.(*GuessGame); ok {
tx.GuessGame = txdata
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (tx *GuessGameRow) Get(key string) ([]byte, error) {
if key == "startindex"{
return []byte(fmt.Sprintf("%018d", tx.StartIndex)), nil
}else if key == "gameid" {
return []byte(fmt.Sprintf("%s", tx.GameID)), nil
} else if key == "status" {
return []byte(fmt.Sprintf("%2d", tx.Status)), nil
} else if key == "addr" {
return []byte(tx.Addr), nil
} else if key == "addr_status" {
return []byte(fmt.Sprintf("%s:%2d", tx.Addr, tx.Status)), nil
} else if key == "admin" {
return []byte(tx.AdminAddr), nil
}else if key == "admin_status" {
......@@ -73,5 +125,6 @@ func (tx *GuessRow) Get(key string) ([]byte, error) {
} else if key == "category_status" {
return []byte(fmt.Sprintf("%s:%2d", tx.Category, tx.Status)), nil
}
return nil, types.ErrNotFound
}
\ No newline at end of file
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