Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/wallettool.cpp
Show First 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | static void WalletShowInfo(CWallet *wallet_instance) { | ||||
tfm::format(std::cout, "Keypool Size: %u\n", | tfm::format(std::cout, "Keypool Size: %u\n", | ||||
wallet_instance->GetKeyPoolSize()); | wallet_instance->GetKeyPoolSize()); | ||||
tfm::format(std::cout, "Transactions: %zu\n", | tfm::format(std::cout, "Transactions: %zu\n", | ||||
wallet_instance->mapWallet.size()); | wallet_instance->mapWallet.size()); | ||||
tfm::format(std::cout, "Address Book: %zu\n", | tfm::format(std::cout, "Address Book: %zu\n", | ||||
wallet_instance->m_address_book.size()); | wallet_instance->m_address_book.size()); | ||||
} | } | ||||
static bool SalvageWallet(const fs::path &path) { | |||||
// Create a Database handle to allow for the db to be initialized before | |||||
// recovery | |||||
std::unique_ptr<WalletDatabase> database = WalletDatabase::Create(path); | |||||
// Initialize the environment before recovery | |||||
bilingual_str error_string; | |||||
try { | |||||
WalletBatch::VerifyEnvironment(path, error_string); | |||||
} catch (const fs::filesystem_error &e) { | |||||
error_string = | |||||
Untranslated(strprintf("Error loading wallet. %s", | |||||
fsbridge::get_filesystem_error_message(e))); | |||||
} | |||||
if (!error_string.original.empty()) { | |||||
tfm::format(std::cerr, "Failed to open wallet for salvage :%s\n", | |||||
error_string.original); | |||||
return false; | |||||
} | |||||
// Perform the recovery | |||||
CWallet dummy_wallet(Params(), nullptr, WalletLocation(), | |||||
WalletDatabase::CreateDummy()); | |||||
std::string backup_filename; | |||||
return WalletBatch::Recover(path, (void *)&dummy_wallet, | |||||
WalletBatch::RecoverKeysOnlyFilter, | |||||
backup_filename); | |||||
} | |||||
bool ExecuteWalletToolFunc(const std::string &command, | bool ExecuteWalletToolFunc(const std::string &command, | ||||
const std::string &name) { | const std::string &name) { | ||||
fs::path path = fs::absolute(name, GetWalletDir()); | fs::path path = fs::absolute(name, GetWalletDir()); | ||||
if (command == "create") { | if (command == "create") { | ||||
std::shared_ptr<CWallet> wallet_instance = CreateWallet(name, path); | std::shared_ptr<CWallet> wallet_instance = CreateWallet(name, path); | ||||
if (wallet_instance) { | if (wallet_instance) { | ||||
WalletShowInfo(wallet_instance.get()); | WalletShowInfo(wallet_instance.get()); | ||||
wallet_instance->Flush(true); | wallet_instance->Flush(true); | ||||
} | } | ||||
} else if (command == "info") { | } else if (command == "info" || command == "salvage") { | ||||
if (!fs::exists(path)) { | if (!fs::exists(path)) { | ||||
tfm::format(std::cerr, "Error: no wallet file at %s\n", name); | tfm::format(std::cerr, "Error: no wallet file at %s\n", name); | ||||
return false; | return false; | ||||
} | } | ||||
bilingual_str error; | bilingual_str error; | ||||
if (!WalletBatch::VerifyEnvironment(path, error)) { | if (!WalletBatch::VerifyEnvironment(path, error)) { | ||||
tfm::format(std::cerr, | tfm::format(std::cerr, | ||||
"%s\nError loading %s. Is wallet being used by other " | "%s\nError loading %s. Is wallet being used by other " | ||||
"process?\n", | "process?\n", | ||||
error.original, name); | error.original, name); | ||||
return false; | return false; | ||||
} | } | ||||
if (command == "info") { | |||||
std::shared_ptr<CWallet> wallet_instance = LoadWallet(name, path); | std::shared_ptr<CWallet> wallet_instance = LoadWallet(name, path); | ||||
if (!wallet_instance) { | if (!wallet_instance) { | ||||
return false; | return false; | ||||
} | } | ||||
WalletShowInfo(wallet_instance.get()); | WalletShowInfo(wallet_instance.get()); | ||||
wallet_instance->Flush(true); | wallet_instance->Flush(true); | ||||
} else if (command == "salvage") { | |||||
return SalvageWallet(path); | |||||
} | |||||
} else { | } else { | ||||
tfm::format(std::cerr, "Invalid command: %s\n", command); | tfm::format(std::cerr, "Invalid command: %s\n", command); | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
} // namespace WalletTool | } // namespace WalletTool |