Commit 4a057142 authored by pengjun's avatar pengjun

#627 add table to issuance & collateralize

parent 8cbc6018
......@@ -54,111 +54,6 @@ func (c *Collateralize) GetDriverName() string {
return pty.CollateralizeX
}
func (c *Collateralize) addCollateralizeID(collateralizeID string, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeKey(collateralizeID, index)
record := &pty.CollateralizeRecord{
CollateralizeId: collateralizeID,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) deleteCollateralizeID(collateralizeID string, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeKey(collateralizeID, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) addCollateralizeStatus(status int32, collateralizeID string, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeStatusKey(status, index)
record := &pty.CollateralizeRecord{
CollateralizeId: collateralizeID,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) deleteCollateralizeStatus(status int32, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeStatusKey(status, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) addCollateralizeAddr(addr string, collateralizeID string, status int32, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeAddrKey(addr, index)
record := &pty.CollateralizeRecord{
CollateralizeId: collateralizeID,
Status: status,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) deleteCollateralizeAddr(addr string, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeAddrKey(addr, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) addCollateralizeRecordStatus(recordStatus int32, collateralizeID string, recordID string, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeRecordStatusKey(recordStatus, index)
record := &pty.CollateralizeRecord{
CollateralizeId: collateralizeID,
RecordId: recordID,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) deleteCollateralizeRecordStatus(recordStatus int32, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeRecordStatusKey(recordStatus, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) addCollateralizeRecordAddr(recordAddr string, collateralizeID string, recordID string, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeRecordAddrKey(recordAddr, index)
record := &pty.CollateralizeRecord{
CollateralizeId: collateralizeID,
RecordId: recordID,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Collateralize) deleteCollateralizeRecordAddr(recordAddr string, index int64) (kvs []*types.KeyValue) {
key := calcCollateralizeRecordAddrKey(recordAddr, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
// CheckReceiptExecOk return true to check if receipt ty is ok
func (c *Collateralize) CheckReceiptExecOk() bool {
return true
......
......@@ -10,60 +10,13 @@ import (
)
func (c *Collateralize) execDelLocal(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
set := &types.LocalDBSet{}
for _, item := range receiptData.Logs {
if item.Ty == pty.TyLogCollateralizeCreate || item.Ty == pty.TyLogCollateralizeBorrow || item.Ty == pty.TyLogCollateralizeAppend ||
item.Ty == pty.TyLogCollateralizeRepay || item.Ty == pty.TyLogCollateralizeFeed || item.Ty == pty.TyLogCollateralizeRetrieve {
var collateralizeLog pty.ReceiptCollateralize
err := types.Decode(item.Log, &collateralizeLog)
if err != nil {
return nil, err
}
switch item.Ty {
case pty.TyLogCollateralizeCreate:
set.KV = append(set.KV, c.deleteCollateralizeStatus(collateralizeLog.Status, collateralizeLog.Index)...)
set.KV = append(set.KV, c.deleteCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.Index)...)
set.KV = append(set.KV, c.addCollateralizeStatus(collateralizeLog.PreStatus, collateralizeLog.CollateralizeId, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.addCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.CollateralizeId, collateralizeLog.PreStatus, collateralizeLog.PreIndex)...)
case pty.TyLogCollateralizeBorrow:
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.Index)...)
set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.Index)...)
case pty.TyLogCollateralizeAppend:
if collateralizeLog.Status == pty.CollateralizeUserStatusWarning {
set.KV = append(set.KV, c.addCollateralizeRecordStatus(collateralizeLog.PreStatus, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.Index)...)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.Index)...)
}
case pty.TyLogCollateralizeRepay:
set.KV = append(set.KV, c.addCollateralizeRecordStatus(collateralizeLog.PreStatus, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.Index)...)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
case pty.TyLogCollateralizeFeed:
set.KV = append(set.KV, c.addCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.Index)...)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.PreIndex)...)
//// 如果没有被清算,需要把地址索引更新
//if collateralizeLog.Status == pty.CollateralizeUserStatusWarning || collateralizeLog.Status == pty.CollateralizeUserStatusExpire {
// set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.Index)...)
//}
case pty.TyLogCollateralizeRetrieve:
set.KV = append(set.KV, c.deleteCollateralizeStatus(collateralizeLog.Status, collateralizeLog.Index)...)
set.KV = append(set.KV, c.deleteCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.Index)...)
set.KV = append(set.KV, c.addCollateralizeStatus(collateralizeLog.PreStatus, collateralizeLog.CollateralizeId, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.addCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.CollateralizeId, collateralizeLog.PreStatus, collateralizeLog.PreIndex)...)
}
}
kvs, err := c.DelRollbackKV(tx, tx.Execer)
if err != nil {
return nil, err
}
return set, nil
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
// ExecDelLocal_Create Action
......
......@@ -13,57 +13,42 @@ import (
func (c *Collateralize) execLocal(tx *types.Transaction, receipt *types.ReceiptData) (*types.LocalDBSet, error) {
set := &types.LocalDBSet{}
for _, item := range receipt.Logs {
if item.Ty == pty.TyLogCollateralizeCreate || item.Ty == pty.TyLogCollateralizeBorrow || item.Ty == pty.TyLogCollateralizeAppend ||
item.Ty == pty.TyLogCollateralizeRepay || item.Ty == pty.TyLogCollateralizeFeed || item.Ty == pty.TyLogCollateralizeRetrieve {
if item.Ty >= pty.TyLogCollateralizeCreate && item.Ty <= pty.TyLogCollateralizeRetrieve {
var collateralizeLog pty.ReceiptCollateralize
err := types.Decode(item.Log, &collateralizeLog)
if err != nil {
return nil, err
}
switch item.Ty {
case pty.TyLogCollateralizeCreate:
set.KV = append(set.KV, c.deleteCollateralizeStatus(collateralizeLog.PreStatus, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.deleteCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.addCollateralizeStatus(collateralizeLog.Status, collateralizeLog.CollateralizeId, collateralizeLog.Index)...)
set.KV = append(set.KV, c.addCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.CollateralizeId, collateralizeLog.Status, collateralizeLog.Index)...)
case pty.TyLogCollateralizeBorrow:
set.KV = append(set.KV, c.addCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.Index)...)
set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.Index)...)
case pty.TyLogCollateralizeAppend:
if collateralizeLog.Status == pty.CollateralizeUserStatusWarning {
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(collateralizeLog.PreStatus, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.addCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.Index)...)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.PreIndex)...)
//set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.Index)...)
if item.Ty == pty.TyLogCollateralizeCreate || item.Ty == pty.TyLogCollateralizeRetrieve {
collTable := pty.NewCollateralizeTable(c.GetLocalDB())
err = collTable.Replace(&pty.ReceiptCollateralize{CollateralizeId: collateralizeLog.CollateralizeId, Status: collateralizeLog.Status,
AccountAddr:collateralizeLog.AccountAddr})
if err != nil {
return nil, err
}
case pty.TyLogCollateralizeRepay:
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(collateralizeLog.PreStatus, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.addCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.Index)...)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.PreIndex)...)
case pty.TyLogCollateralizeFeed:
set.KV = append(set.KV, c.deleteCollateralizeRecordStatus(collateralizeLog.PreStatus, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.addCollateralizeRecordStatus(collateralizeLog.Status, collateralizeLog.CollateralizeId,
collateralizeLog.RecordId, collateralizeLog.Index)...)
//set.KV = append(set.KV, c.deleteCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.PreIndex)...)
//// 如果没有被清算,需要把地址索引更新
//if collateralizeLog.Status == pty.CollateralizeUserStatusWarning || collateralizeLog.Status == pty.CollateralizeUserStatusExpire {
// set.KV = append(set.KV, c.addCollateralizeRecordAddr(collateralizeLog.AccountAddr, collateralizeLog.CollateralizeId,
// collateralizeLog.RecordId, collateralizeLog.Index)...)
//}
case pty.TyLogCollateralizeRetrieve:
set.KV = append(set.KV, c.deleteCollateralizeStatus(collateralizeLog.PreStatus, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.deleteCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.PreIndex)...)
set.KV = append(set.KV, c.addCollateralizeStatus(collateralizeLog.Status, collateralizeLog.CollateralizeId, collateralizeLog.Index)...)
set.KV = append(set.KV, c.addCollateralizeAddr(collateralizeLog.CreateAddr, collateralizeLog.CollateralizeId, collateralizeLog.Status, collateralizeLog.Index)...)
kvs, err := collTable.Save()
if err != nil {
return nil, err
}
set.KV = append(set.KV, kvs...)
} else {
recordTable := pty.NewRecordTable(c.GetLocalDB())
err = recordTable.Replace(&pty.ReceiptCollateralize{CollateralizeId: collateralizeLog.CollateralizeId, Status: collateralizeLog.Status,
RecordId: collateralizeLog.RecordId, AccountAddr: collateralizeLog.AccountAddr})
if err != nil {
return nil, err
}
kvs, err := recordTable.Save()
if err != nil {
return nil, err
}
set.KV = append(set.KV, kvs...)
}
}
}
set.KV = c.AddRollbackKV(tx, []byte(pty.CollateralizeX), set.KV)
return set, nil
}
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import "fmt"
func calcCollateralizeKey(collateralizeID string, index int64) []byte {
key := fmt.Sprintf("LODB-collateralize-ID:%s:%018d", collateralizeID, index)
return []byte(key)
}
func calcCollateralizeStatusPrefix(status int32) []byte {
key := fmt.Sprintf("LODB-collateralize-status:%d", status)
return []byte(key)
}
func calcCollateralizeStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-collateralize-status:%d:%018d", status, index)
return []byte(key)
}
func calcCollateralizeAddrPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-collateralize-addr:%s", addr)
return []byte(key)
}
func calcCollateralizeAddrKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-collateralize-addr:%s:%018d", addr, index)
return []byte(key)
}
func calcCollateralizeRecordAddrPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-collateralize-record-addr:%s", addr)
return []byte(key)
}
func calcCollateralizeRecordAddrKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-collateralize-record-addr:%s:%018d", addr, index)
return []byte(key)
}
func calcCollateralizeRecordStatusPrefix(status string) []byte {
key := fmt.Sprintf("LODB-collateralize-record-status:%s", status)
return []byte(key)
}
func calcCollateralizeRecordStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-collateralize-record-status:%d:%018d", status, index)
return []byte(key)
}
......@@ -66,7 +66,7 @@ func (c *Collateralize) Query_CollateralizeInfoByIDs(req *pty.ReqCollateralizeIn
func (c *Collateralize) Query_CollateralizeByStatus(req *pty.ReqCollateralizeByStatus) (types.Message, error) {
ids := &pty.RepCollateralizeIDs{}
collIDRecords, err := queryCollateralizeByStatus(c.GetLocalDB(), req.Status, req.Index)
collIDRecords, err := queryCollateralizeByStatus(c.GetLocalDB(), req.Status, req.CollID)
if err != nil {
clog.Error("Query_CollateralizeByStatus", "get collateralize record error", err)
return nil, err
......@@ -78,7 +78,7 @@ func (c *Collateralize) Query_CollateralizeByStatus(req *pty.ReqCollateralizeByS
func (c *Collateralize) Query_CollateralizeByAddr(req *pty.ReqCollateralizeByAddr) (types.Message, error) {
ids := &pty.RepCollateralizeIDs{}
collIDRecords, err := queryCollateralizeByAddr(c.GetLocalDB(), req.Addr, req.Status, req.Index)
collIDRecords, err := queryCollateralizeByAddr(c.GetLocalDB(), req.Addr, req.Status, req.CollID)
if err != nil {
clog.Error("Query_CollateralizeByAddr", "get collateralize record error", err)
return nil, err
......@@ -102,7 +102,7 @@ func (c *Collateralize) Query_CollateralizeRecordByID(req *pty.ReqCollateralizeR
func (c *Collateralize) Query_CollateralizeRecordByAddr(req *pty.ReqCollateralizeRecordByAddr) (types.Message, error) {
ret := &pty.RepCollateralizeRecords{}
records, err := queryCollateralizeRecordByAddr(c.GetStateDB(), c.GetLocalDB(), req.Addr, req.Index)
records, err := queryCollateralizeRecordByAddr(c.GetStateDB(), c.GetLocalDB(), req.Addr, req.CollateralizeId, req.RecordId)
if err != nil {
clog.Error("Query_CollateralizeRecordByAddr", "get collateralize record error", err)
return nil, err
......@@ -122,7 +122,7 @@ func (c *Collateralize) Query_CollateralizeRecordByAddr(req *pty.ReqCollateraliz
func (c *Collateralize) Query_CollateralizeRecordByStatus(req *pty.ReqCollateralizeRecordByStatus) (types.Message, error) {
ret := &pty.RepCollateralizeRecords{}
records, err := queryCollateralizeRecordByStatus(c.GetStateDB(), c.GetLocalDB(), req.Status, req.Index)
records, err := queryCollateralizeRecordByStatus(c.GetStateDB(), c.GetLocalDB(), req.Status, req.CollateralizeId, req.RecordId)
if err != nil {
clog.Error("Query_CollateralizeRecordByStatus", "get collateralize record error", err)
return nil, err
......
......@@ -17,10 +17,8 @@ message Collateralize {
double latestLiquidationPrice = 11;//最高清算价格
int64 period = 12;//借贷最大期限
int64 latestExpireTime = 13;//最近超期时间
int64 index = 14;//当前索引
int64 preIndex = 15;//上一个索引
int64 collBalance = 16;//抵押bty
int32 preStatus = 17;//上一个状态
int64 collBalance = 14;//抵押bty
int32 preStatus = 15;//上一个状态
}
// 借出记录
......@@ -37,8 +35,6 @@ message BorrowRecord {
int32 preStatus = 10;//上一次抵押状态,用于告警恢复
string recordId = 11;//借贷id,标识一次借出记录
string collateralizeId = 12;//放贷id
int64 index = 13;//当前索引
int64 preIndex = 14;//上级索引
}
// 资产价格记录
......@@ -115,27 +111,14 @@ message CollateralizeRetrieve {
// exec_local 放贷信息
message ReceiptCollateralize {
string collateralizeId = 1;
string createAddr = 2;
string accountAddr = 3;
string recordId = 4;
int32 status = 5;
int32 PreStatus = 6;
int64 index = 7;
int64 preIndex = 8;
}
// exec_local 放贷记录信息
message CollateralizeRecord {
string collateralizeId = 1;
string addr = 2;
string recordId = 3;
int32 status = 4;
int64 index = 5;
}
// exec_local 放贷记录信息列表
message CollateralizeRecords {
repeated CollateralizeRecord records = 1;
repeated ReceiptCollateralize records = 1;
}
// 根据ID查询一期放贷信息
......@@ -171,14 +154,14 @@ message RepCollateralizeCurrentInfos {
// 根据放贷状态查询
message ReqCollateralizeByStatus {
int32 status = 1;
int64 index = 2;
string collID = 2;
}
// 根据用户地址查询
message ReqCollateralizeByAddr {
string addr = 1;
int32 status = 2;
int64 index = 3;
string collID = 3;
}
// 返回放贷ID列表
......@@ -191,14 +174,14 @@ message ReqCollateralizeRecordByAddr {
string collateralizeId = 1;
string addr = 2;
int32 status = 3;
int64 index = 4;
string recordId = 4;
}
// 根据状态和借贷ID混合查询具体借贷记录
message ReqCollateralizeRecordByStatus {
string collateralizeId = 1;
int32 status = 2;
int64 index = 3;
string recordId = 3;
}
// 返回借贷记录
......
package types
import (
"fmt"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
)
var opt = &table.Option{
Prefix: "LODB-collateralize",
Name: "coller",
Primary: "collateralizeid",
Index: []string{"status", "addr", "addr_status"},
}
//NewTable 新建表
func NewCollateralizeTable(kvdb db.KV) *table.Table {
rowmeta := NewCollatetalizeRow()
table, err := table.NewTable(rowmeta, kvdb, opt)
if err != nil {
panic(err)
}
return table
}
//CollatetalizeRow table meta 结构
type CollatetalizeRow struct {
*ReceiptCollateralize
}
//NewIssuanceRow 新建一个meta 结构
func NewCollatetalizeRow() *CollatetalizeRow {
return &CollatetalizeRow{ReceiptCollateralize: &ReceiptCollateralize{}}
}
//CreateRow 新建数据行
func (tx *CollatetalizeRow) CreateRow() *table.Row {
return &table.Row{Data: &ReceiptCollateralize{}}
}
//SetPayload 设置数据
func (tx *CollatetalizeRow) SetPayload(data types.Message) error {
if txdata, ok := data.(*ReceiptCollateralize); ok {
tx.ReceiptCollateralize = txdata
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (tx *CollatetalizeRow) Get(key string) ([]byte, error) {
if key == "collateralizeid" {
return []byte(tx.CollateralizeId), nil
} else if key == "status" {
return []byte(fmt.Sprintf("%2d", tx.Status)), nil
} else if key == "addr" {
return []byte(fmt.Sprintf("%s", tx.AccountAddr)), nil
} else if key == "addr_status" {
return []byte(fmt.Sprintf("%s:%2d", tx.AccountAddr, tx.Status)), nil
}
return nil, types.ErrNotFound
}
var optRecord = &table.Option{
Prefix: "LODB-collateralize",
Name: "borrow",
Primary: "borrowid",
Index: []string{"status", "addr", "id_status", "id_addr"},
}
/*
借贷记录表
*/
func NewRecordTable(kvdb db.KV) *table.Table {
rowmeta := NewRecordRow()
table, err := table.NewTable(rowmeta, kvdb, optRecord)
if err != nil {
panic(err)
}
return table
}
//CollatetalizeRow table meta 结构
type CollateralizeRecordRow struct {
*ReceiptCollateralize
}
//NewIssuanceRow 新建一个meta 结构
func NewRecordRow() *CollateralizeRecordRow {
return &CollateralizeRecordRow{ReceiptCollateralize: &ReceiptCollateralize{}}
}
//CreateRow 新建数据行
func (tx *CollateralizeRecordRow) CreateRow() *table.Row {
return &table.Row{Data: &ReceiptCollateralize{}}
}
//SetPayload 设置数据
func (tx *CollateralizeRecordRow) SetPayload(data types.Message) error {
if txdata, ok := data.(*ReceiptCollateralize); ok {
tx.ReceiptCollateralize = txdata
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (tx *CollateralizeRecordRow) Get(key string) ([]byte, error) {
if key == "borrowid" {
return []byte(tx.RecordId), nil
} else if key == "status" {
return []byte(fmt.Sprintf("%2d", tx.Status)), nil
} else if key == "addr" {
return []byte(fmt.Sprintf("%s", tx.AccountAddr)), nil
} else if key == "id_status" {
return []byte(fmt.Sprintf("%s:%2d", tx.CollateralizeId, tx.Status)), nil
} else if key == "id_addr" {
return []byte(fmt.Sprintf("%s:%s", tx.CollateralizeId, tx.AccountAddr)), nil
}
return nil, types.ErrNotFound
}
......@@ -350,7 +350,7 @@ func IssuanceQuery(cmd *cobra.Command, args []string) {
if address != "" {
params.FuncName = "IssuanceRecordsByAddr"
req := &pkt.ReqIssuanceRecordsByAddr{
req := &pkt.ReqIssuanceRecords{
IssuanceId: issuanceID,
Status: int32(status),
Addr: address,
......@@ -362,7 +362,7 @@ func IssuanceQuery(cmd *cobra.Command, args []string) {
} else if statusStr != "" {
params.FuncName = "IssuanceRecordsByStatus"
req := &pkt.ReqIssuanceRecordsByStatus{
req := &pkt.ReqIssuanceRecords{
IssuanceId: issuanceID,
Status: int32(status),
}
......@@ -373,7 +373,7 @@ func IssuanceQuery(cmd *cobra.Command, args []string) {
} else if debtID != "" {
params.FuncName = "IssuanceRecordByID"
req := &pkt.ReqIssuanceDebtInfo{
req := &pkt.ReqIssuanceRecords{
IssuanceId: issuanceID,
DebtId: debtID,
}
......
......@@ -10,47 +10,13 @@ import (
)
func (c *Issuance) execDelLocal(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
set := &types.LocalDBSet{}
for _, item := range receiptData.Logs {
if item.Ty == pty.TyLogIssuanceCreate || item.Ty == pty.TyLogIssuanceDebt || item.Ty == pty.TyLogIssuanceRepay ||
item.Ty == pty.TyLogIssuanceFeed || item.Ty == pty.TyLogIssuanceClose {
var issuanceLog pty.ReceiptIssuance
err := types.Decode(item.Log, &issuanceLog)
if err != nil {
return nil, err
}
switch item.Ty {
case pty.TyLogIssuanceCreate:
set.KV = append(set.KV, c.deleteIssuanceStatus(issuanceLog.Status, issuanceLog.Index)...)
case pty.TyLogIssuanceDebt:
set.KV = append(set.KV, c.deleteIssuanceRecordStatus(issuanceLog.Status, issuanceLog.Index)...)
set.KV = append(set.KV, c.deleteIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.Index)...)
case pty.TyLogIssuanceRepay:
set.KV = append(set.KV, c.addIssuanceRecordStatus(issuanceLog.PreStatus, issuanceLog.AccountAddr, issuanceLog.PreIndex,
issuanceLog.DebtId, issuanceLog.IssuanceId)...)
set.KV = append(set.KV, c.deleteIssuanceRecordStatus(issuanceLog.Status, issuanceLog.Index)...)
//set.KV = append(set.KV, c.addIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex, issuanceLog.DebtId,
// issuanceLog.IssuanceId)...)
case pty.TyLogIssuanceFeed:
set.KV = append(set.KV, c.addIssuanceRecordStatus(issuanceLog.Status, issuanceLog.AccountAddr, issuanceLog.PreIndex,
issuanceLog.DebtId, issuanceLog.IssuanceId)...)
set.KV = append(set.KV, c.deleteIssuanceRecordStatus(issuanceLog.Status, issuanceLog.Index)...)
//set.KV = append(set.KV, c.addIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex, issuanceLog.DebtId,
// issuanceLog.IssuanceId)...)
//// 如果没有被清算,需要把地址索引更新
//if issuanceLog.Status == pty.IssuanceUserStatusWarning || issuanceLog.Status == pty.IssuanceUserStatusExpire {
// set.KV = append(set.KV, c.deleteIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.Index)...)
//}
set.KV = append(set.KV, c.deleteIssuancePriceRecord(issuanceLog.RecordTime)...)
case pty.TyLogIssuanceClose:
set.KV = append(set.KV, c.deleteIssuanceStatus(issuanceLog.Status, issuanceLog.Index)...)
set.KV = append(set.KV, c.addIssuanceStatus(issuanceLog.PreStatus, issuanceLog.PreIndex, issuanceLog.IssuanceId)...)
}
}
kvs, err := c.DelRollbackKV(tx, tx.Execer)
if err != nil {
return nil, err
}
return set, nil
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
// ExecDelLocal_Create Action
......
......@@ -13,44 +13,41 @@ import (
func (c *Issuance) execLocal(tx *types.Transaction, receipt *types.ReceiptData) (*types.LocalDBSet, error) {
set := &types.LocalDBSet{}
for _, item := range receipt.Logs {
if item.Ty == pty.TyLogIssuanceCreate || item.Ty == pty.TyLogIssuanceDebt || item.Ty == pty.TyLogIssuanceRepay ||
item.Ty == pty.TyLogIssuanceFeed || item.Ty == pty.TyLogIssuanceClose {
if item.Ty >= pty.TyLogIssuanceCreate && item.Ty <= pty.TyLogIssuanceClose {
var issuanceLog pty.ReceiptIssuance
err := types.Decode(item.Log, &issuanceLog)
if err != nil {
return nil, err
}
switch item.Ty {
case pty.TyLogIssuanceCreate:
set.KV = append(set.KV, c.addIssuanceStatus(issuanceLog.Status, issuanceLog.Index, issuanceLog.IssuanceId)...)
case pty.TyLogIssuanceDebt:
set.KV = append(set.KV, c.addIssuanceRecordStatus(issuanceLog.Status, issuanceLog.AccountAddr, issuanceLog.Index,
issuanceLog.DebtId, issuanceLog.IssuanceId)...)
set.KV = append(set.KV, c.addIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.Index, issuanceLog.DebtId,
issuanceLog.IssuanceId)...)
case pty.TyLogIssuanceRepay:
set.KV = append(set.KV, c.deleteIssuanceRecordStatus(issuanceLog.PreStatus, issuanceLog.PreIndex)...)
set.KV = append(set.KV, c.addIssuanceRecordStatus(issuanceLog.Status, issuanceLog.AccountAddr, issuanceLog.Index,
issuanceLog.DebtId, issuanceLog.IssuanceId)...)
//set.KV = append(set.KV, c.deleteIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex)...)
case pty.TyLogIssuanceFeed:
set.KV = append(set.KV, c.deleteIssuanceRecordStatus(issuanceLog.PreStatus, issuanceLog.PreIndex)...)
set.KV = append(set.KV, c.addIssuanceRecordStatus(issuanceLog.Status, issuanceLog.AccountAddr, issuanceLog.Index,
issuanceLog.DebtId, issuanceLog.IssuanceId)...)
//set.KV = append(set.KV, c.deleteIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.PreIndex)...)
//// 如果没有被清算,需要把地址索引更新
//if issuanceLog.Status == pty.IssuanceUserStatusWarning || issuanceLog.Status == pty.IssuanceUserStatusExpire {
// set.KV = append(set.KV, c.addIssuanceRecordAddr(issuanceLog.AccountAddr, issuanceLog.Index, issuanceLog.DebtId,
// issuanceLog.IssuanceId)...)
//}
set.KV = append(set.KV, c.addIssuancePriceRecord(issuanceLog.RecordTime, issuanceLog.BtyPrice)...)
case pty.TyLogIssuanceClose:
set.KV = append(set.KV, c.addIssuanceStatus(issuanceLog.Status, issuanceLog.Index, issuanceLog.IssuanceId)...)
set.KV = append(set.KV, c.deleteIssuanceStatus(issuanceLog.PreStatus, issuanceLog.PreIndex)...)
if item.Ty == pty.TyLogIssuanceCreate || item.Ty == pty.TyLogIssuanceClose {
IDtable := pty.NewIssuanceTable(c.GetLocalDB())
err = IDtable.Replace(&pty.ReceiptIssuanceID{IssuanceId: issuanceLog.IssuanceId, Status: issuanceLog.Status})
if err != nil {
return nil, err
}
kvs, err := IDtable.Save()
if err != nil {
return nil, err
}
set.KV = append(set.KV, kvs...)
} else {
recordTable := pty.NewRecordTable(c.GetLocalDB())
err = recordTable.Replace(&pty.ReceiptIssuance{IssuanceId: issuanceLog.IssuanceId, Status: issuanceLog.Status,
DebtId: issuanceLog.DebtId, AccountAddr: issuanceLog.AccountAddr})
if err != nil {
return nil, err
}
kvs, err := recordTable.Save()
if err != nil {
return nil, err
}
set.KV = append(set.KV, kvs...)
}
}
}
set.KV = c.AddRollbackKV(tx, []byte(pty.IssuanceX), set.KV)
return set, nil
}
......
......@@ -54,110 +54,6 @@ func (c *Issuance) GetDriverName() string {
return pty.IssuanceX
}
func (c *Issuance) addIssuanceID(index int64, issuanceID string) (kvs []*types.KeyValue) {
key := calcIssuanceKey(issuanceID, index)
record := &pty.IssuanceRecord{
IssuanceId: issuanceID,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) deleteIssuanceID(index int64, issuanceID string) (kvs []*types.KeyValue) {
key := calcIssuanceKey(issuanceID, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) addIssuanceStatus(status int32, index int64, issuanceID string) (kvs []*types.KeyValue) {
key := calcIssuanceStatusKey(status, index)
record := &pty.IssuanceRecord{
IssuanceId: issuanceID,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) deleteIssuanceStatus(status int32, index int64) (kvs []*types.KeyValue) {
key := calcIssuanceStatusKey(status, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) addIssuanceRecordAddr(accountAddr string, index int64, debtID string, issuanceID string) (kvs []*types.KeyValue) {
key := calcIssuanceRecordAddrKey(accountAddr, index)
record := &pty.IssuanceRecord{
IssuanceId: issuanceID,
DebtId: debtID,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) deleteIssuanceRecordAddr(accountAddr string, index int64) (kvs []*types.KeyValue) {
key := calcIssuanceRecordAddrKey(accountAddr, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) addIssuanceRecordStatus(recordStatus int32, accountAddr string, index int64, debtID string, issuanceID string) (kvs []*types.KeyValue) {
key := calcIssuanceRecordStatusKey(recordStatus, index)
record := &pty.IssuanceRecord{
IssuanceId: issuanceID,
DebtId: debtID,
Addr: accountAddr,
Index: index,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) deleteIssuanceRecordStatus(status int32, index int64) (kvs []*types.KeyValue) {
key := calcIssuanceRecordStatusKey(status, index)
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) addIssuancePriceRecord(recordTime int64, price float64) (kvs []*types.KeyValue) {
key := calcIssuancePriceKey(string(recordTime))
record := &pty.IssuanceAssetPriceRecord{
RecordTime: recordTime,
BtyPrice: price,
}
kv := &types.KeyValue{Key: key, Value: types.Encode(record)}
kvs = append(kvs, kv)
return kvs
}
func (c *Issuance) deleteIssuancePriceRecord(recordTime int64) (kvs []*types.KeyValue) {
key := calcIssuancePriceKey(string(recordTime))
kv := &types.KeyValue{Key: key, Value: nil}
kvs = append(kvs, kv)
return kvs
}
// CheckReceiptExecOk return true to check if receipt ty is ok
func (c *Issuance) CheckReceiptExecOk() bool {
return true
......
......@@ -274,17 +274,17 @@ func TestIssuance(t *testing.T) {
debtID := createTx.Hash()
// query issuance by id
res, err = exec.Query("IssuanceRecordByID",
types.Encode(&pkt.ReqIssuanceDebtInfo{IssuanceId: common.ToHex(issuanceID), DebtId: common.ToHex(debtID)}))
types.Encode(&pkt.ReqIssuanceRecords{IssuanceId: common.ToHex(issuanceID), DebtId: common.ToHex(debtID)}))
assert.Nil(t, err)
assert.NotNil(t, res)
// query issuance by status
res, err = exec.Query("IssuanceRecordsByStatus",
types.Encode(&pkt.ReqIssuanceRecordsByStatus{IssuanceId: common.ToHex(issuanceID), Status: 1}))
types.Encode(&pkt.ReqIssuanceRecords{Status: 1}))
assert.Nil(t, err)
assert.NotNil(t, res)
// query issuance by addr
res, err = exec.Query("IssuanceRecordsByAddr",
types.Encode(&pkt.ReqIssuanceRecordsByAddr{IssuanceId: common.ToHex(issuanceID), Addr: string(Nodes[1]), Status: 1}))
types.Encode(&pkt.ReqIssuanceRecords{Addr: string(Nodes[1])}))
assert.Nil(t, err)
assert.NotNil(t, res)
......@@ -320,12 +320,12 @@ func TestIssuance(t *testing.T) {
}
// query issuance by status
res, err = exec.Query("IssuanceRecordsByStatus",
types.Encode(&pkt.ReqIssuanceRecordsByStatus{IssuanceId: common.ToHex(issuanceID), Status: 6}))
types.Encode(&pkt.ReqIssuanceRecords{Status: 6}))
assert.Nil(t, err)
assert.NotNil(t, res)
// query issuance by addr
res, err = exec.Query("IssuanceRecordsByAddr",
types.Encode(&pkt.ReqIssuanceRecordsByAddr{IssuanceId: common.ToHex(issuanceID), Addr: string(Nodes[1]), Status: 6}))
types.Encode(&pkt.ReqIssuanceRecords{Addr: string(Nodes[1])}))
assert.Nil(t, err)
assert.NotNil(t, res)
......@@ -390,7 +390,7 @@ func TestIssuance(t *testing.T) {
}
// query issuance by status
res, err = exec.Query("IssuanceRecordsByStatus",
types.Encode(&pkt.ReqIssuanceRecordsByStatus{IssuanceId: common.ToHex(issuanceID), Status: 3}))
types.Encode(&pkt.ReqIssuanceRecords{Status: 3}))
assert.Nil(t, err)
assert.NotNil(t, res)
......@@ -455,7 +455,7 @@ func TestIssuance(t *testing.T) {
}
// query issuance by status
res, err = exec.Query("IssuanceRecordsByStatus",
types.Encode(&pkt.ReqIssuanceRecordsByStatus{IssuanceId: common.ToHex(issuanceID), Status: 5}))
types.Encode(&pkt.ReqIssuanceRecords{Status: 5}))
assert.Nil(t, err)
assert.NotNil(t, res)
......
This diff is collapsed.
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package executor
import "fmt"
func calcIssuanceKey(issuanceID string, index int64) []byte {
key := fmt.Sprintf("LODB-issuance-ID:%s:%018d", issuanceID, index)
return []byte(key)
}
func calcIssuanceStatusPrefix(status int32) []byte {
key := fmt.Sprintf("LODB-issuance-status:%d", status)
return []byte(key)
}
func calcIssuanceStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-issuance-status:%d:%018d", status, index)
return []byte(key)
}
func calcIssuanceRecordAddrPrefix(addr string) []byte {
key := fmt.Sprintf("LODB-issuance-record-addr:%s", addr)
return []byte(key)
}
func calcIssuanceRecordAddrKey(addr string, index int64) []byte {
key := fmt.Sprintf("LODB-issuance-record-addr:%s:%018d", addr, index)
return []byte(key)
}
func calcIssuancePriceKey(time string) []byte {
key := fmt.Sprintf("LODB-issuance-price:%s", time)
return []byte(key)
}
func calcIssuanceRecordStatusPrefix(status string) []byte {
key := fmt.Sprintf("LODB-issuance-record-status:%s", status)
return []byte(key)
}
func calcIssuanceRecordStatusKey(status int32, index int64) []byte {
key := fmt.Sprintf("LODB-issuance-record-status:%d:%018d", status, index)
return []byte(key)
}
......@@ -58,17 +58,17 @@ func (c *Issuance) Query_IssuanceInfoByIDs(req *pty.ReqIssuanceInfos) (types.Mes
func (c *Issuance) Query_IssuanceByStatus(req *pty.ReqIssuanceByStatus) (types.Message, error) {
ids := &pty.RepIssuanceIDs{}
issuIDRecords, err := queryIssuanceByStatus(c.GetLocalDB(), req.Status, req.Index)
issuIDs, err := queryIssuanceByStatus(c.GetLocalDB(), req.Status, req.IssuanceId)
if err != nil {
clog.Error("Query_IssuanceByStatus", "get issuance error", err)
return nil, err
}
ids.IDs = append(ids.IDs, issuIDRecords...)
ids.IDs = append(ids.IDs, issuIDs...)
return ids, nil
}
func (c *Issuance) Query_IssuanceRecordByID(req *pty.ReqIssuanceDebtInfo) (types.Message, error) {
func (c *Issuance) Query_IssuanceRecordByID(req *pty.ReqIssuanceRecords) (types.Message, error) {
ret := &pty.RepIssuanceDebtInfo{}
issuRecord, err := queryIssuanceRecordByID(c.GetStateDB(), req.IssuanceId, req.DebtId)
if err != nil {
......@@ -80,9 +80,9 @@ func (c *Issuance) Query_IssuanceRecordByID(req *pty.ReqIssuanceDebtInfo) (types
return ret, nil
}
func (c *Issuance) Query_IssuanceRecordsByAddr(req *pty.ReqIssuanceRecordsByAddr) (types.Message, error) {
func (c *Issuance) Query_IssuanceRecordsByAddr(req *pty.ReqIssuanceRecords) (types.Message, error) {
ret := &pty.RepIssuanceRecords{}
records, err := queryIssuanceRecordByAddr(c.GetStateDB(), c.GetLocalDB(), req.Addr, req.Index)
records, err := queryIssuanceRecordByAddr(c.GetStateDB(), c.GetLocalDB(), req.Addr, req.DebtId)
if err != nil {
clog.Error("Query_IssuanceDebtInfoByAddr", "get issuance record error", err)
return nil, err
......@@ -101,9 +101,9 @@ func (c *Issuance) Query_IssuanceRecordsByAddr(req *pty.ReqIssuanceRecordsByAddr
return ret, nil
}
func (c *Issuance) Query_IssuanceRecordsByStatus(req *pty.ReqIssuanceRecordsByStatus) (types.Message, error) {
func (c *Issuance) Query_IssuanceRecordsByStatus(req *pty.ReqIssuanceRecords) (types.Message, error) {
ret := &pty.RepIssuanceRecords{}
records, err := queryIssuanceRecordsByStatus(c.GetStateDB(), c.GetLocalDB(), req.Status, req.Index)
records, err := queryIssuanceRecordsByStatus(c.GetStateDB(), c.GetLocalDB(), req.Status, req.DebtId)
if err != nil {
clog.Error("Query_IssuanceDebtInfoByStatus", "get issuance record error", err)
return nil, err
......@@ -113,7 +113,7 @@ func (c *Issuance) Query_IssuanceRecordsByStatus(req *pty.ReqIssuanceRecordsBySt
return ret, nil
}
func (c *Issuance) Query_IssuancePrice(req *pty.ReqIssuanceRecordsByStatus) (types.Message, error) {
func (c *Issuance) Query_IssuancePrice(req *pty.ReqIssuanceRecords) (types.Message, error) {
price, err := getLatestPrice(c.GetStateDB())
if err != nil {
clog.Error("Query_CollateralizePrice", "error", err)
......
......@@ -19,8 +19,6 @@ message Issuance {
int64 createTime = 13;//创建时间
int64 balance = 14;//剩余可发行ccny
string issuerAddr = 15;//发行地址
int64 index = 16;//当前索引
int64 preIndex = 17;//上级索引
}
// 抵押记录
......@@ -37,8 +35,6 @@ message DebtRecord {
int32 preStatus = 10;//上一次抵押状态,用于告警恢复
string debtId = 11;//借贷id
string issuId = 12;//发行id
int64 index = 13;//当前索引
int64 preIndex = 14;//上级索引
}
// 资产价格记录
......@@ -102,24 +98,17 @@ message ReceiptIssuance {
string accountAddr = 2;
string debtId = 3;
int32 status = 4;
int32 preStatus = 5;
int64 index = 6;
int64 preIndex = 7;
int64 recordTime = 8; //价格记录时间
double btyPrice = 9; //bty价格
}
// exec_local 抵押记录信息
message IssuanceRecord {
// exec_local issuid记录信息
message ReceiptIssuanceID {
string issuanceId = 1;
string addr = 2;
string debtId = 3;
int64 index = 4;
int32 status = 2;
}
// exec_local 抵押记录信息列表
message IssuanceRecords {
repeated IssuanceRecord records = 1;
repeated ReceiptIssuance records = 1;
}
// 根据ID查询发行信息
......@@ -154,7 +143,7 @@ message RepIssuanceCurrentInfos {
// 根据发行状态查询
message ReqIssuanceByStatus {
int32 status = 1;
int64 index = 2;
string issuanceId = 2;
}
// 返回发行ID列表
......@@ -163,18 +152,11 @@ message RepIssuanceIDs {
}
// 根据用户地址查询抵押记录
message ReqIssuanceRecordsByAddr {
message ReqIssuanceRecords {
string issuanceId = 1;
string addr = 2;
int32 status = 3;
int64 index = 4;
}
// 根据状态查询抵押记录
message ReqIssuanceRecordsByStatus {
string issuanceId = 1;
int32 status = 2;
int64 index = 3;
string debtId = 4;
}
// 返回记录列表
......@@ -182,12 +164,6 @@ message RepIssuanceRecords {
repeated DebtRecord records = 1;
}
// 精确查找抵押记录
message ReqIssuanceDebtInfo {
string issuanceId = 1;
string debtId = 2;
}
// 返回记录
message RepIssuanceDebtInfo {
DebtRecord record = 1;
......
This diff is collapsed.
package types
import (
"fmt"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/db/table"
"github.com/33cn/chain33/types"
)
var opt = &table.Option{
Prefix: "LODB-issuance",
Name: "issuer",
Primary: "issuanceid",
Index: []string{"status"},
}
//NewTable 新建表
func NewIssuanceTable(kvdb db.KV) *table.Table {
rowmeta := NewIssuanceRow()
table, err := table.NewTable(rowmeta, kvdb, opt)
if err != nil {
panic(err)
}
return table
}
//IssuanceRow table meta 结构
type IssuanceRow struct {
*ReceiptIssuanceID
}
//NewIssuanceRow 新建一个meta 结构
func NewIssuanceRow() *IssuanceRow {
return &IssuanceRow{ReceiptIssuanceID: &ReceiptIssuanceID{}}
}
//CreateRow 新建数据行
func (tx *IssuanceRow) CreateRow() *table.Row {
return &table.Row{Data: &ReceiptIssuanceID{}}
}
//SetPayload 设置数据
func (tx *IssuanceRow) SetPayload(data types.Message) error {
if txdata, ok := data.(*ReceiptIssuanceID); ok {
tx.ReceiptIssuanceID = txdata
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (tx *IssuanceRow) Get(key string) ([]byte, error) {
if key == "issuanceid" {
return []byte(tx.IssuanceId), nil
} else if key == "status" {
return []byte(fmt.Sprintf("%2d", tx.Status)), nil
}
return nil, types.ErrNotFound
}
var optRecord = &table.Option{
Prefix: "LODB-issuance",
Name: "debt",
Primary: "debtid",
Index: []string{"status", "addr"},
}
/*
大户发行记录表
*/
func NewRecordTable(kvdb db.KV) *table.Table {
rowmeta := NewRecordRow()
table, err := table.NewTable(rowmeta, kvdb, optRecord)
if err != nil {
panic(err)
}
return table
}
//IssuanceRow table meta 结构
type IssuanceRecordRow struct {
*ReceiptIssuance
}
//NewIssuanceRow 新建一个meta 结构
func NewRecordRow() *IssuanceRecordRow {
return &IssuanceRecordRow{ReceiptIssuance: &ReceiptIssuance{}}
}
//CreateRow 新建数据行
func (tx *IssuanceRecordRow) CreateRow() *table.Row {
return &table.Row{Data: &ReceiptIssuance{}}
}
//SetPayload 设置数据
func (tx *IssuanceRecordRow) SetPayload(data types.Message) error {
if txdata, ok := data.(*ReceiptIssuance); ok {
tx.ReceiptIssuance = txdata
return nil
}
return types.ErrTypeAsset
}
//Get 按照indexName 查询 indexValue
func (tx *IssuanceRecordRow) Get(key string) ([]byte, error) {
if key == "debtid" {
return []byte(tx.DebtId), nil
} else if key == "status" {
return []byte(fmt.Sprintf("%2d", tx.Status)), nil
} else if key == "addr" {
return []byte(fmt.Sprintf("%s", tx.AccountAddr)), nil
}
return nil, types.ErrNotFound
}
......@@ -18,7 +18,7 @@ const (
TyLogIssuanceDebt = 742
TyLogIssuanceRepay = 743
TyLogIssuanceFeed = 745
TyLogIssuanceClose = 756
TyLogIssuanceClose = 746
)
// Issuance name
......
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