2013-09-15 20:39:28 +02:00
|
|
|
// Copyright (c) 2013 Conformal Systems LLC.
|
|
|
|
// Use of this source code is governed by an ISC
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
2013-09-15 19:08:42 +02:00
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
)
|
|
|
|
|
|
|
|
// upgradeDBPathNet moves the database for a specific network from its
|
|
|
|
// location prior to btcd version 0.2.0 and uses heuristics to ascertain the old
|
|
|
|
// database type to rename to the new format.
|
|
|
|
func upgradeDBPathNet(oldDbPath, netName string) error {
|
|
|
|
// Prior to version 0.2.0, the database was named the same thing for
|
|
|
|
// both sqlite and leveldb. Use heuristics to figure out the type
|
|
|
|
// of the database and move it to the new path and name introduced with
|
|
|
|
// version 0.2.0 accordingly.
|
|
|
|
fi, err := os.Stat(oldDbPath)
|
|
|
|
if err == nil {
|
|
|
|
oldDbType := "sqlite"
|
|
|
|
if fi.IsDir() {
|
|
|
|
oldDbType = "leveldb"
|
|
|
|
}
|
|
|
|
|
|
|
|
// The new database name is based on the database type and
|
|
|
|
// resides in the a directory named after the network type.
|
|
|
|
newDbRoot := filepath.Join(filepath.Dir(cfg.DataDir), netName)
|
|
|
|
newDbName := blockDbNamePrefix + "_" + oldDbType
|
|
|
|
if oldDbType == "sqlite" {
|
|
|
|
newDbName = newDbName + ".db"
|
|
|
|
}
|
|
|
|
newDbPath := filepath.Join(newDbRoot, newDbName)
|
|
|
|
|
|
|
|
// Create the new path if needed.
|
|
|
|
err = os.MkdirAll(newDbRoot, 0700)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Move and rename the old database.
|
|
|
|
err := os.Rename(oldDbPath, newDbPath)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// upgradeDBPaths moves the databases from their locations prior to btcd
|
|
|
|
// version 0.2.0 to their new locations.
|
|
|
|
func upgradeDBPaths() error {
|
|
|
|
// Prior to version 0.2.0, the databases were in the "db" directory and
|
|
|
|
// their names were suffixed by "testnet" and "regtest" for their
|
|
|
|
// respective networks. Check for the old database and update it to the
|
|
|
|
// new path introduced with version 0.2.0 accodingly.
|
|
|
|
oldDbRoot := filepath.Join(btcdHomeDir(), "db")
|
|
|
|
upgradeDBPathNet(filepath.Join(oldDbRoot, "btcd.db"), "mainnet")
|
|
|
|
upgradeDBPathNet(filepath.Join(oldDbRoot, "btcd_testnet.db"), "testnet")
|
|
|
|
upgradeDBPathNet(filepath.Join(oldDbRoot, "btcd_regtest.db"), "regtest")
|
|
|
|
|
|
|
|
// Remove the old db directory.
|
|
|
|
err := os.RemoveAll(oldDbRoot)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-09-15 20:39:28 +02:00
|
|
|
// doUpgrades performs upgrades to btcd as new versions require it.
|
|
|
|
func doUpgrades() error {
|
2013-09-15 19:08:42 +02:00
|
|
|
return upgradeDBPaths()
|
2013-09-15 20:39:28 +02:00
|
|
|
}
|