This bumps the major version of the database module to v3. This is needed because the current code already has backwards incompatible changes.
99 lines
2.8 KiB
Go
99 lines
2.8 KiB
Go
// Copyright (c) 2015-2016 The btcsuite developers
|
|
// Copyright (c) 2016-2020 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 (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/decred/dcrd/chaincfg/v3"
|
|
"github.com/decred/dcrd/database/v3"
|
|
_ "github.com/decred/dcrd/database/v3/ffldb"
|
|
"github.com/decred/dcrd/dcrutil/v4"
|
|
)
|
|
|
|
var (
|
|
dcrdHomeDir = dcrutil.AppDataDir("dcrd", false)
|
|
knownDbTypes = database.SupportedDrivers()
|
|
activeNetParams = chaincfg.MainNetParams()
|
|
|
|
// Default global config.
|
|
cfg = &config{
|
|
DataDir: filepath.Join(dcrdHomeDir, "data"),
|
|
DbType: "ffldb",
|
|
}
|
|
)
|
|
|
|
// config defines the global configuration options.
|
|
type config struct {
|
|
DataDir string `short:"b" long:"datadir" description:"Location of the dcrd data directory"`
|
|
DbType string `long:"dbtype" description:"Database backend to use for the Block Chain"`
|
|
TestNet bool `long:"testnet" description:"Use the test network"`
|
|
SimNet bool `long:"simnet" description:"Use the simulation test network"`
|
|
}
|
|
|
|
// fileExists reports whether the named file or directory exists.
|
|
func fileExists(name string) bool {
|
|
if _, err := os.Stat(name); err != nil {
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// validDbType returns whether or not dbType is a supported database type.
|
|
func validDbType(dbType string) bool {
|
|
for _, knownType := range knownDbTypes {
|
|
if dbType == knownType {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// setupGlobalConfig examine the global configuration options for any conditions
|
|
// which are invalid as well as performs any addition setup necessary after the
|
|
// initial parse.
|
|
func setupGlobalConfig() error {
|
|
// Multiple networks can't be selected simultaneously.
|
|
// Count number of network flags passed; assign active network params
|
|
// while we're at it
|
|
numNets := 0
|
|
if cfg.TestNet {
|
|
numNets++
|
|
activeNetParams = chaincfg.TestNet3Params()
|
|
}
|
|
if cfg.SimNet {
|
|
numNets++
|
|
activeNetParams = chaincfg.SimNetParams()
|
|
}
|
|
if numNets > 1 {
|
|
return errors.New("the testnet and simnet params can't be " +
|
|
"used together -- choose one of the two")
|
|
}
|
|
|
|
// Validate database type.
|
|
if !validDbType(cfg.DbType) {
|
|
str := "the specified database type [%v] is invalid -- " +
|
|
"supported types %v"
|
|
return fmt.Errorf(str, cfg.DbType, knownDbTypes)
|
|
}
|
|
|
|
// Append the network type to the data directory so it is "namespaced"
|
|
// per network. In addition to the block database, there are other
|
|
// pieces of data that are saved to disk such as address manager state.
|
|
// All data is specific to a network, so namespacing the data directory
|
|
// means each individual piece of serialized data does not have to
|
|
// worry about changing names per network and such.
|
|
cfg.DataDir = filepath.Join(cfg.DataDir, activeNetParams.Name)
|
|
|
|
return nil
|
|
}
|