func (c *pbuildCmd) Main() { if c.cache <= 0 { Usage(c, "Max cache size must be > 0") } c.configuredCmd.Main() InitLog() hashes := make(chan *symflux.Zp) done := make(chan interface{}) var db *openpgp.DB var err error if db, err = openpgp.NewDB(); err != nil { die(err) } var ptree recon.PrefixTree reconSettings := recon.NewSettings(openpgp.Config().Settings.TomlTree) reconSettings.Set("symflux.recon.diskv.cacheSizeMax", 1024*1024*c.cache) if ptree, err = openpgp.NewSksPTree(reconSettings); err != nil { die(err) } if err = ptree.Create(); err != nil { panic(err) } insertPtree := func() { defer func() { done <- struct{}{} }() n := 0 for { select { case z, ok := <-hashes: if z != nil { err = ptree.Insert(z) if err != nil { if c.ignoreDups && strings.Contains(err.Error(), "insert duplicate element") { continue } log.Printf("Error inserting %x into ptree: %v", z.Bytes(), err) panic(err) } n++ if n%1000 == 0 { fmt.Printf(".") } } if !ok { return } } } } for i := 0; i < c.nworkers; i++ { go insertPtree() } readHashes(db, hashes) close(hashes) for i := 0; i < c.nworkers; i++ { <-done } if err = ptree.Close(); err != nil { log.Println("Close:", err) } }