Commit a92ce051 authored by linj's avatar linj

impl trade local rollback

parent f792dd54
......@@ -63,7 +63,7 @@ func (t *trade) localDelLog(tx *types.Transaction, receipt *types.ReceiptData, i
if err != nil {
panic(err) //数据错误了,已经被修改了
}
kv := t.deleteBuy(receipt.Base)
kv := t.deleteBuy(receipt.Base, txIndex, table)
set.KV = append(set.KV, kv...)
} else if item.Ty == pty.TyLogTradeBuyRevoke {
var receipt pty.ReceiptTradeBuyRevoke
......@@ -71,7 +71,7 @@ func (t *trade) localDelLog(tx *types.Transaction, receipt *types.ReceiptData, i
if err != nil {
panic(err) //数据错误了,已经被修改了
}
kv := t.deleteBuyLimit([]byte(receipt.Base.BuyID), item.Ty)
kv := t.deleteBuyLimit(receipt.Base, item.Ty, tx, txIndex, table, tradedBoardlot)
set.KV = append(set.KV, kv...)
} else if item.Ty == pty.TyLogTradeBuyLimit {
var receipt pty.ReceiptTradeBuyLimit
......@@ -79,7 +79,7 @@ func (t *trade) localDelLog(tx *types.Transaction, receipt *types.ReceiptData, i
if err != nil {
panic(err) //数据错误了,已经被修改了
}
kv := t.deleteBuyLimit([]byte(receipt.Base.BuyID), item.Ty)
kv := t.deleteBuyLimit(receipt.Base, item.Ty, tx, txIndex, table, tradedBoardlot)
set.KV = append(set.KV, kv...)
} else if item.Ty == pty.TyLogTradeSellMarket {
var receipt pty.ReceiptSellMarket
......@@ -87,7 +87,7 @@ func (t *trade) localDelLog(tx *types.Transaction, receipt *types.ReceiptData, i
if err != nil {
panic(err) //数据错误了,已经被修改了
}
kv := t.deleteSellMarket(receipt.Base)
kv := t.deleteSellMarket(receipt.Base, txIndex, table)
set.KV = append(set.KV, kv...)
}
}
......
......@@ -211,7 +211,7 @@ func (t *trade) rollBackSellLimit(tx *types.Transaction, sell *pty.ReceiptSellBa
}
// 撤销订单回滚, 只需要修改状态
// 其他的操作需要还修改数量
order.Status = pty.TradeOrderStatusOnBuy
order.Status = pty.TradeOrderStatusOnSale
order.TxHash = order.TxHash[:len(order.TxHash)-1]
order.TradedBoardlot = order.TradedBoardlot - tradedBoardlot
......@@ -312,6 +312,28 @@ func (t *trade) updateBuyLimit(tx *types.Transaction, buy *pty.ReceiptBuyBase,
return order
}
func (t *trade) rollbackBuyLimit(tx *types.Transaction, buy *pty.ReceiptBuyBase,
buyorder *pty.BuyLimitOrder, txIndex string, ldb *table.Table, traded int64) *pty.LocalOrder {
xs, err := ldb.ListIndex("key", []byte(buy.SellID), nil, 1, 0)
if err != nil || len(xs) != 1 {
return nil
}
order, ok := xs[0].Data.(*pty.LocalOrder)
if !ok {
return nil
}
order.Status = pty.TradeOrderStatusOnBuy
order.TxHash = order.TxHash[:len(order.TxHash)-1]
order.TradedBoardlot = order.TradedBoardlot - traded
ldb.Replace(order)
return order
}
func (t *trade) genBuyMarket(tx *types.Transaction, buy *pty.ReceiptBuyBase, txIndex string) *pty.LocalOrder {
order := &pty.LocalOrder{
......
......@@ -133,8 +133,9 @@ func (t *trade) saveBuy(receiptTradeBuy *pty.ReceiptBuyBase, tx *types.Transacti
return saveBuyMarketOrderKeyValue(kv, receiptTradeBuy, pty.TradeOrderStatusBoughtOut, t.GetHeight())
}
func (t *trade) deleteBuy(receiptTradeBuy *pty.ReceiptBuyBase) []*types.KeyValue {
func (t *trade) deleteBuy(receiptTradeBuy *pty.ReceiptBuyBase, txIndex string, ldb *table.Table) []*types.KeyValue {
var kv []*types.KeyValue
ldb.Del([]byte(txIndex))
return deleteBuyMarketOrderKeyValue(kv, receiptTradeBuy, pty.TradeOrderStatusBoughtOut, t.GetHeight())
}
......@@ -192,8 +193,13 @@ func genDeleteBuyLimitKv(buyOrder *pty.BuyLimitOrder) []*types.KeyValue {
return kv
}
func (t *trade) deleteBuyLimit(buyID []byte, ty int32) []*types.KeyValue {
buyOrder := t.getBuyOrderFromDb(buyID)
func (t *trade) deleteBuyLimit(buy *pty.ReceiptBuyBase, ty int32, tx *types.Transaction, txIndex string, ldb *table.Table, traded int64) []*types.KeyValue {
buyOrder := t.getBuyOrderFromDb([]byte(buy.BuyID))
if ty == pty.TradeOrderStatusOnBuy && buy.BoughtBoardlot == 0 {
ldb.Del([]byte(txIndex))
} else {
t.rollbackBuyLimit(tx, buy, buyOrder, txIndex, ldb, traded)
}
return genDeleteBuyLimitKv(buyOrder)
}
......@@ -204,8 +210,9 @@ func (t *trade) saveSellMarket(receiptTradeBuy *pty.ReceiptSellBase, tx *types.T
return saveSellMarketOrderKeyValue(kv, receiptTradeBuy, pty.TradeOrderStatusSoldOut, t.GetHeight())
}
func (t *trade) deleteSellMarket(receiptTradeBuy *pty.ReceiptSellBase) []*types.KeyValue {
func (t *trade) deleteSellMarket(receiptTradeBuy *pty.ReceiptSellBase, txIndex string, ldb *table.Table) []*types.KeyValue {
var kv []*types.KeyValue
ldb.Del([]byte(txIndex))
return deleteSellMarketOrderKeyValue(kv, receiptTradeBuy, pty.TradeOrderStatusSoldOut, t.GetHeight())
}
......
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