// LoadPinner loads a pinner and its keysets from the given datastore func LoadPinner(d ds.ThreadSafeDatastore, dserv mdag.DAGService) (Pinner, error) { p := new(pinner) { // load recursive set var recurseKeys []key.Key if err := loadSet(d, recursePinDatastoreKey, &recurseKeys); err != nil { return nil, err } p.recursePin = set.SimpleSetFromKeys(recurseKeys) } { // load direct set var directKeys []key.Key if err := loadSet(d, directPinDatastoreKey, &directKeys); err != nil { return nil, err } p.directPin = set.SimpleSetFromKeys(directKeys) } { // load indirect set var err error p.indirPin, err = loadIndirPin(d, indirectPinDatastoreKey) if err != nil { return nil, err } } // assign services p.dserv = dserv p.dstore = d return p, nil }
func loadIndirPin(d ds.Datastore, k ds.Key) (*indirectPin, error) { var rcStore map[string]int err := loadSet(d, k, &rcStore) if err != nil { return nil, err } refcnt := make(map[key.Key]int) var keys []key.Key for encK, v := range rcStore { if v > 0 { k := key.B58KeyDecode(encK) keys = append(keys, k) refcnt[k] = v } } // log.Debugf("indirPin keys: %#v", keys) return &indirectPin{blockset: set.SimpleSetFromKeys(keys), refCounts: refcnt}, nil }