// realMain is the real main function for the utility. It is necessary to work // around the fact that deferred functions do not run when os.Exit() is called. func realMain() error { // Load configuration and parse command line. tcfg, _, err := loadConfig() if err != nil { return err } cfg = tcfg // Setup logging. backendLogger := btclog.NewDefaultBackendLogger() defer backendLogger.Flush() log = btclog.NewSubsystemLogger(backendLogger, "") database.UseLogger(btclog.NewSubsystemLogger(backendLogger, "BCDB: ")) blockchain.UseLogger(btclog.NewSubsystemLogger(backendLogger, "CHAN: ")) indexers.UseLogger(btclog.NewSubsystemLogger(backendLogger, "INDX: ")) // Load the block database. db, err := loadBlockDB() if err != nil { log.Errorf("Failed to load database: %v", err) return err } defer db.Close() fi, err := os.Open(cfg.InFile) if err != nil { log.Errorf("Failed to open file %v: %v", cfg.InFile, err) return err } defer fi.Close() // Create a block importer for the database and input file and start it. // The done channel returned from start will contain an error if // anything went wrong. importer, err := newBlockImporter(db, fi) if err != nil { log.Errorf("Failed create block importer: %v", err) return err } // Perform the import asynchronously. This allows blocks to be // processed and read in parallel. The results channel returned from // Import contains the statistics about the import including an error // if something went wrong. log.Info("Starting import") resultsChan := importer.Import() results := <-resultsChan if results.err != nil { log.Errorf("%v", results.err) return results.err } log.Infof("Processed a total of %d blocks (%d imported, %d already "+ "known)", results.blocksProcessed, results.blocksImported, results.blocksProcessed-results.blocksImported) return nil }
// useLogger updates the logger references for subsystemID to logger. Invalid // subsystems are ignored. func useLogger(subsystemID string, logger btclog.Logger) { if _, ok := subsystemLoggers[subsystemID]; !ok { return } subsystemLoggers[subsystemID] = logger switch subsystemID { case "ADXR": adxrLog = logger case "AMGR": amgrLog = logger addrmgr.UseLogger(logger) case "CMGR": cmgrLog = logger connmgr.UseLogger(logger) case "BCDB": bcdbLog = logger database.UseLogger(logger) case "BMGR": bmgrLog = logger case "BTCD": btcdLog = logger case "CHAN": chanLog = logger blockchain.UseLogger(logger) case "DISC": discLog = logger case "INDX": indxLog = logger indexers.UseLogger(logger) case "MINR": minrLog = logger mining.UseLogger(logger) cpuminer.UseLogger(logger) case "PEER": peerLog = logger peer.UseLogger(logger) case "RPCS": rpcsLog = logger case "SCRP": scrpLog = logger txscript.UseLogger(logger) case "SRVR": srvrLog = logger case "TXMP": txmpLog = logger mempool.UseLogger(logger) } }