forked from TencentBlueKing/bk-cmdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
iterator_inst.go
112 lines (86 loc) · 2.68 KB
/
iterator_inst.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
/*
* Tencent is pleased to support the open source community by making 蓝鲸 available.
* Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved.
* Licensed under the MIT License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
* http://opensource.org/licenses/MIT
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package inst
import (
"configcenter/src/framework/common"
//"configcenter/src/framework/core/log"
"io"
"configcenter/src/framework/core/output/module/client"
"configcenter/src/framework/core/output/module/model"
"configcenter/src/framework/core/types"
)
// Iterator the iterator interface for the Inst
type Iterator interface {
Next() (CommonInstInterface, error)
ForEach(callbackItem func(item CommonInstInterface) error) error
}
type iteratorInst struct {
targetModel model.Model
cond common.Condition
buffer []types.MapStr
bufIdx int
}
func newIteratorInst(target model.Model, cond common.Condition) (Iterator, error) {
iter := &iteratorInst{
targetModel: target,
cond: cond,
buffer: make([]types.MapStr, 0),
}
iter.cond.SetLimit(DefaultLimit)
iter.cond.SetStart(iter.bufIdx)
iter.cond.Field(model.ObjectID).Eq(target.GetID())
existItems, err := client.GetClient().CCV3(client.Params{SupplierAccount: target.GetSupplierAccount()}).CommonInst().SearchInst(cond)
if nil != err {
return nil, err
}
iter.buffer = append(iter.buffer, existItems...)
return iter, nil
}
func (cli *iteratorInst) Next() (CommonInstInterface, error) {
if len(cli.buffer) == cli.bufIdx {
cli.cond.SetStart(cli.bufIdx)
existItems, err := client.GetClient().CCV3(client.Params{SupplierAccount: cli.targetModel.GetSupplierAccount()}).CommonInst().SearchInst(cli.cond)
if nil != err {
return nil, err
}
if 0 == len(existItems) {
cli.bufIdx = 0
return nil, io.EOF
}
cli.buffer = append(cli.buffer, existItems...)
}
tmpItem := cli.buffer[cli.bufIdx]
cli.bufIdx++
returnItem := &inst{
target: cli.targetModel,
datas: tmpItem,
}
return returnItem, nil
}
func (cli *iteratorInst) ForEach(callbackItem func(item CommonInstInterface) error) error {
for {
item, err := cli.Next()
if nil != err {
if io.EOF == err {
return nil
}
return err
}
if nil == item {
return nil
}
err = callbackItem(item)
if nil != err {
return err
}
}
}