// QueryNodeByTaxID querys Node by taxid func QueryNodeByTaxID(db *bolt.DB, bucket string, taxids []string) ([]nodes.Node, error) { for _, taxid := range taxids { if !reDigitals.MatchString(taxid) { return []nodes.Node{}, fmt.Errorf("non-digital taxid given: %s", taxid) } } nods := make([]nodes.Node, len(taxids)) if len(taxids) == 0 { return nods, nil } err := db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(bucket)) if b == nil { return fmt.Errorf("database not exists: %s", bucket) } for i, taxid := range taxids { s := string(b.Get([]byte(taxid))) if s == "" { nods[i] = nodes.Node{} continue } node, err := nodes.NodeFromJSON(s) if err != nil { return errors.New("failed to parse node record from database") } nods[i] = node } return nil }) return nods, err }
// LoadAllNodes loads all nodes into memory func LoadAllNodes(db *bolt.DB, bucket string) (map[string]nodes.Node, error) { nods := make(map[string]nodes.Node) ch := make(chan string, runtime.NumCPU()) chDone := make(chan int) go func() { for s := range ch { node, err := nodes.NodeFromJSON(s) checkError(err) nods[node.TaxID] = node } chDone <- 1 }() err := db.View(func(tx *bolt.Tx) error { b := tx.Bucket([]byte(bucket)) if b == nil { return fmt.Errorf("database not exists: %s", bucket) } b.ForEach(func(k, v []byte) error { ch <- string(v) return nil }) return nil }) close(ch) <-chDone return nods, err }