-
Notifications
You must be signed in to change notification settings - Fork 1
/
localdb.go
120 lines (106 loc) · 2.96 KB
/
localdb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// 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 (
dbm "github.com/assetcloud/chain/common/db"
"github.com/assetcloud/chain/common/db/table"
"github.com/assetcloud/chain/types"
pty "github.com/assetcloud/plugin/plugin/dapp/unfreeze/types"
)
/*
1. 可以用创建者和收益者进行列表
1. 按 txIndex 排序
*/
var opt_addr_table = &table.Option{
Prefix: "LODB-unfreeze",
Name: "addr",
Primary: "txIndex",
Index: []string{
"beneficiary",
"init",
"id",
},
}
// AddrRow order row
type AddrRow struct {
*pty.LocalUnfreeze
}
// NewAddrRow create row
func NewAddrRow() *AddrRow {
return &AddrRow{LocalUnfreeze: nil}
}
// CreateRow create row
func (r *AddrRow) CreateRow() *table.Row {
return &table.Row{Data: &pty.LocalUnfreeze{}}
}
// SetPayload set payload
func (r *AddrRow) SetPayload(data types.Message) error {
if d, ok := data.(*pty.LocalUnfreeze); ok {
r.LocalUnfreeze = d
return nil
}
return types.ErrTypeAsset
}
// Get get index key
func (r *AddrRow) Get(key string) ([]byte, error) {
switch key {
case "txIndex":
return []byte(r.TxIndex), nil
case "init":
return []byte(r.Unfreeze.Initiator), nil
case "beneficiary":
return []byte(r.Unfreeze.Beneficiary), nil
case "id":
return []byte(r.Unfreeze.UnfreezeID), nil
default:
return nil, types.ErrNotFound
}
}
// NewAddrTable create order table
func NewAddrTable(kvdb dbm.KV) *table.Table {
rowMeta := NewAddrRow()
rowMeta.SetPayload(&pty.LocalUnfreeze{})
t, err := table.NewTable(rowMeta, kvdb, opt_addr_table)
if err != nil {
panic(err)
}
return t
}
func update(ldb *table.Table, unfreeze *pty.Unfreeze) error {
xs, err := ldb.ListIndex("id", []byte(unfreeze.UnfreezeID), nil, 1, 0)
if err != nil || len(xs) != 1 {
uflog.Error("update query List failed", "key", unfreeze.UnfreezeID, "err", err, "len", len(xs))
return nil
}
u, ok := xs[0].Data.(*pty.LocalUnfreeze)
if !ok {
uflog.Error("update decode failed", "data", xs[0].Data)
return nil
}
u.Unfreeze = unfreeze
return ldb.Update([]byte(u.TxIndex), u)
}
func list(db dbm.KVDB, indexName string, data *pty.LocalUnfreeze, count, direction int32) ([]*table.Row, error) {
query := NewAddrTable(db).GetQuery(db)
var primary []byte
if len(data.TxIndex) > 0 {
primary = []byte(data.TxIndex)
}
cur := &AddrRow{LocalUnfreeze: data}
index, err := cur.Get(indexName)
if err != nil {
uflog.Error("query List failed", "key", string(primary), "param", data, "err", err)
return nil, err
}
uflog.Debug("query List dbg", "indexName", indexName, "index", string(index), "primary", primary, "count", count, "direction", direction)
rows, err := query.ListIndex(indexName, index, primary, count, direction)
if err != nil {
uflog.Error("query List failed", "key", string(primary), "param", data, "err", err)
return nil, err
}
if len(rows) == 0 {
return nil, types.ErrNotFound
}
return rows, nil
}