dont use searchset for indirect pin checking
License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
Jeromy committed
Jul 10, 2015 at 11:34 UTC
859de5140634db36c326cb8050d00209880f26cb
1 file changed
+21
-24
pin/pin.go
+21
-24
@@ -176,19 +176,16 @@ func (p *pinner) isPinned(k key.Key) (string, bool, error) {
176
}
177
178
for _, rk := range p.recursePin.GetKeys() {
179
- ss := &searchSet{target: k}
180
-
179
rnd, err := p.dserv.Get(context.Background(), rk)
180
if err != nil {
181
return "", false, err
182
}
183
186
- err = mdag.EnumerateChildren(context.Background(), p.dserv, rnd, ss)
184
+ has, err := hasChild(p.dserv, rnd, k)
185
if err != nil {
186
return "", false, err
187
}
190
-
191
- if ss.found {
188
+ if has {
189
return rk.B58String(), true, nil
190
}
191
}
@@ -349,26 +346,26 @@ func (p *pinner) PinWithMode(k key.Key, mode PinMode) {
346
}
347
}
348
352
-// searchSet implements key.KeySet in
353
-type searchSet struct {
354
- target key.Key
355
- found bool
356
-}
349
+func hasChild(ds mdag.DAGService, root *mdag.Node, child key.Key) (bool, error) {
350
+ for _, lnk := range root.Links {
351
+ k := key.Key(lnk.Hash)
352
+ if k == child {
353
+ return true, nil
354
+ }
355
358
-func (ss *searchSet) Add(k key.Key) {
359
- if ss.target == k {
360
- ss.found = true
361
- }
362
-}
356
+ nd, err := ds.Get(context.Background(), k)
357
+ if err != nil {
358
+ return false, err
359
+ }
360
364
-func (ss *searchSet) Has(k key.Key) bool {
365
- // returning true to all Has queries will cause EnumerateChildren to return
366
- // almost immediately
367
- return ss.found
368
-}
361
+ has, err := hasChild(ds, nd, child)
362
+ if err != nil {
363
+ return false, err
364
+ }
365
370
-func (ss *searchSet) Keys() []key.Key {
371
- return nil
366
+ if has {
367
+ return has, nil
368
+ }
369
+ }
370
+ return false, nil
371
}
373
-
374
-func (ss *searchSet) Remove(key.Key) {}