dcrd/database2/cmd/dbtool/loadheaders.go
Dave Collins 0e47daf6ba database: Update for Decred.
This commit ports the database2 package from btcsuite pulled in via the
previous commit to Decred.

It includes updating all necessary package imports, types, logic,
copyrights, and documentation as well as replacing the first 256 Bitcoin
blocks in the test data with the first 256 Decred blocks.
2016-05-25 23:09:31 -05:00

103 lines
2.5 KiB
Go

// Copyright (c) 2015-2016 The btcsuite developers
// Copyright (c) 2016 The Decred developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
package main
import (
"time"
"github.com/decred/dcrd/chaincfg/chainhash"
database "github.com/decred/dcrd/database2"
)
// headersCmd defines the configuration options for the loadheaders command.
type headersCmd struct {
Bulk bool `long:"bulk" description:"Use bulk loading of headers instead of one at a time"`
}
var (
// headersCfg defines the configuration options for the command.
headersCfg = headersCmd{
Bulk: false,
}
)
// Execute is the main entry point for the command. It's invoked by the parser.
func (cmd *headersCmd) Execute(args []string) error {
// Setup the global config options and ensure they are valid.
if err := setupGlobalConfig(); err != nil {
return err
}
// Load the block database.
db, err := loadBlockDB()
if err != nil {
return err
}
defer db.Close()
// NOTE: This code will only work for ffldb. Ideally the package using
// the database would keep a metadata index of its own.
blockIdxName := []byte("ffldb-blockidx")
if !headersCfg.Bulk {
err = db.View(func(tx database.Tx) error {
totalHdrs := 0
blockIdxBucket := tx.Metadata().Bucket(blockIdxName)
blockIdxBucket.ForEach(func(k, v []byte) error {
totalHdrs++
return nil
})
log.Infof("Loading headers for %d blocks...", totalHdrs)
numLoaded := 0
startTime := time.Now()
blockIdxBucket.ForEach(func(k, v []byte) error {
var hash chainhash.Hash
copy(hash[:], k)
_, err := tx.FetchBlockHeader(&hash)
if err != nil {
return err
}
numLoaded++
return nil
})
log.Infof("Loaded %d headers in %v", numLoaded,
time.Now().Sub(startTime))
return nil
})
if err != nil {
return err
}
return nil
}
// Bulk load headers.
err = db.View(func(tx database.Tx) error {
blockIdxBucket := tx.Metadata().Bucket(blockIdxName)
hashes := make([]chainhash.Hash, 0, 500000)
blockIdxBucket.ForEach(func(k, v []byte) error {
var hash chainhash.Hash
copy(hash[:], k)
hashes = append(hashes, hash)
return nil
})
log.Infof("Loading headers for %d blocks...", len(hashes))
startTime := time.Now()
hdrs, err := tx.FetchBlockHeaders(hashes)
if err != nil {
return err
}
log.Infof("Loaded %d headers in %v", len(hdrs),
time.Now().Sub(startTime))
return nil
})
if err != nil {
return err
}
return nil
}