Commit 98df01c0 authored by linj's avatar linj

实现trade 数据库 order 升级

parent 812368e2
......@@ -4,6 +4,8 @@ import (
"bytes"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
pty "github.com/33cn/plugin/plugin/dapp/trade/types"
"github.com/pkg/errors"
)
......@@ -28,8 +30,17 @@ const (
orderASTHK = "LODB-trade-order-asthk:"
)
// TradeUpdateLocalDBV2 trade 本地数据库升级
func TradeUpdateLocalDBV2(localDB dbm.DB, total int) error {
err := UpdateLocalDBPart2(localDB, total)
if err != nil {
return err
}
return UpdateLocalDBPart1(localDB, total)
}
// UpdateLocalDBPart1 手动生成KV,需要在原有数据库中删除
func UpdateLocalDBPart1(localDB dbm.DB) error {
func UpdateLocalDBPart1(localDB dbm.DB, total int) error {
prefixes := []string{
sellOrderSHTAS,
sellOrderASTS,
......@@ -43,7 +54,7 @@ func UpdateLocalDBPart1(localDB dbm.DB) error {
}
for _, prefix := range prefixes {
err := delOnePrefix(localDB, prefix)
err := delOnePrefix(localDB, prefix, total)
if err != nil {
tradelog.Error("UpdateLocalDBPart1 failed", "err", err)
return errors.Cause(err)
......@@ -52,9 +63,8 @@ func UpdateLocalDBPart1(localDB dbm.DB) error {
return nil
}
func delOnePrefix(localDB dbm.DB, prefix string) (err error) {
func delOnePrefix(localDB dbm.DB, prefix string, total int) (err error) {
allDeleted := false
total := 10000
for !allDeleted {
allDeleted, err = delOnePrefixLimit(localDB, prefix, total)
if err != nil {
......@@ -104,3 +114,98 @@ func delOnePrefixLimit(localDB dbm.DB, prefix string, total int) (allDeleted boo
return count < total, nil
}
// UpdateLocalDBPart2 升级order
// order 从 v1 升级到 v2
// 通过tableV1 删除, 通过tableV2 添加, 无需通过每个区块扫描对应的交易
func UpdateLocalDBPart2(localDB dbm.DB, total int) error {
kvdb := dbm.NewKVDB(localDB)
if getVersion() == 2 {
return nil
}
err := upgradeOrder(kvdb, total)
if err != nil {
return err
}
setVersion(2)
return nil
}
var v = 1
func getVersion() int {
return v
}
func setVersion(v1 int) {
v = v1
}
// TODO trade local version 记录下相关信息
// version = 1/2
func upgradeOrder(kvdb dbm.KVDB, total int) (err error) {
allDeleted := false
for !allDeleted {
allDeleted, err = upgradeOrderLimit(kvdb, total)
if err != nil {
return err
}
}
return nil
}
func upgradeOrderLimit(kvdb dbm.KVDB, total int) (allDeleted bool, err error) {
tab2 := NewOrderTableV2(kvdb)
tab := NewOrderTable(kvdb)
q1 := tab.GetQuery(kvdb)
var order1 pty.LocalOrder
rows, err := q1.List("key", &order1, []byte(""), int32(total), 0)
if err != nil && err != types.ErrNotFound {
return false, errors.Wrap(err, "upgradeOrderLimit list from order v1 table")
}
for _, row := range rows {
o1, ok := row.Data.(*pty.LocalOrder)
if !ok {
return false, errors.Wrap(types.ErrTypeAsset, "decode order v1")
}
err = tab2.Add(o1)
if err != nil {
return false, errors.Wrap(err, "upgradeOrderLimit add to order v2 table")
}
err = tab.Del([]byte(o1.GetKey()))
if err != nil {
return false, errors.Wrap(err, "upgradeOrderLimit add to order v2 table")
}
}
kvs, err := tab2.Save()
if err != nil {
return false, errors.Wrap(err, "upgradeOrderLimit save-add to order v2 table")
}
kvs2, err := tab.Save()
if err != nil {
return false, errors.Wrap(err, "upgradeOrderLimit save-del to order v1 table")
}
kvs = append(kvs, kvs2...)
kvdb.Begin()
for _, kv := range kvs {
err = kvdb.Set(kv.GetKey(), kv.GetValue())
if err != nil {
break
}
}
if err != nil {
kvdb.Rollback()
return false, errors.Wrap(err, "upgradeOrderLimit kvdb set")
}
err = kvdb.Commit()
if err != nil {
kvdb.Rollback()
return false, errors.Wrap(err, "upgradeOrderLimit kvdb set")
}
return len(rows) < total, nil
}
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