diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 62f0f53b01..ba11933b91 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -3856,16 +3856,19 @@ bool CWallet::MigrateToSQLite(bilingual_str& error) // Close this database and delete the file fs::path db_path = fs::PathFromString(m_database->Filename()); - fs::path db_dir = db_path.parent_path(); m_database->Close(); fs::remove(db_path); + // Generate the path for the location of the migrated wallet + // Wallets that are plain files rather than wallet directories will be migrated to be wallet directories. + const fs::path wallet_path = fsbridge::AbsPathJoin(GetWalletDir(), fs::PathFromString(m_name)); + // Make new DB DatabaseOptions opts; opts.require_create = true; opts.require_format = DatabaseFormat::SQLITE; DatabaseStatus db_status; - std::unique_ptr new_db = MakeDatabase(db_dir, opts, db_status, error); + std::unique_ptr new_db = MakeDatabase(wallet_path, opts, db_status, error); assert(new_db); // This is to prevent doing anything further with this wallet. The original file was deleted, but a backup exists. m_database.reset(); m_database = std::move(new_db); diff --git a/test/functional/wallet_migration.py b/test/functional/wallet_migration.py index c6c2af10b1..320f5dd9df 100755 --- a/test/functional/wallet_migration.py +++ b/test/functional/wallet_migration.py @@ -6,6 +6,7 @@ import os import random +import shutil from test_framework.descriptors import descsum_create from test_framework.test_framework import BitcoinTestFramework from test_framework.util import ( @@ -470,6 +471,40 @@ class WalletMigrationTest(BitcoinTestFramework): assert_equal(bals, wallet.getbalances()) + def test_default_wallet(self): + self.log.info("Test migration of the wallet named as the empty string") + wallet = self.create_legacy_wallet("") + + wallet.migratewallet() + info = wallet.getwalletinfo() + assert_equal(info["descriptors"], True) + assert_equal(info["format"], "sqlite") + + def test_direct_file(self): + self.log.info("Test migration of a wallet that is not in a wallet directory") + wallet = self.create_legacy_wallet("plainfile") + wallet.unloadwallet() + + wallets_dir = os.path.join(self.nodes[0].datadir, "regtest", "wallets") + wallet_path = os.path.join(wallets_dir, "plainfile") + wallet_dat_path = os.path.join(wallet_path, "wallet.dat") + shutil.copyfile(wallet_dat_path, os.path.join(wallets_dir, "plainfile.bak")) + shutil.rmtree(wallet_path) + shutil.move(os.path.join(wallets_dir, "plainfile.bak"), wallet_path) + + self.nodes[0].loadwallet("plainfile") + info = wallet.getwalletinfo() + assert_equal(info["descriptors"], False) + assert_equal(info["format"], "bdb") + + wallet.migratewallet() + info = wallet.getwalletinfo() + assert_equal(info["descriptors"], True) + assert_equal(info["format"], "sqlite") + + assert os.path.isdir(wallet_path) + assert os.path.isfile(wallet_dat_path) + def run_test(self): self.generate(self.nodes[0], 101) @@ -482,6 +517,8 @@ class WalletMigrationTest(BitcoinTestFramework): self.test_encrypted() self.test_unloaded() self.test_unloaded_by_path() + self.test_default_wallet() + self.test_direct_file() if __name__ == '__main__': WalletMigrationTest().main()