| 825 | } |
| 826 | |
| 827 | std::unique_ptr<BerkeleyDatabase> MakeBerkeleyDatabase(const fs::path& path, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error) |
| 828 | { |
| 829 | fs::path data_file = BDBDataFile(path); |
| 830 | std::unique_ptr<BerkeleyDatabase> db; |
| 831 | { |
| 832 | LOCK(cs_db); // Lock env.m_databases until insert in BerkeleyDatabase constructor |
| 833 | std::string data_filename = fs::PathToString(data_file.filename()); |
| 834 | std::shared_ptr<BerkeleyEnvironment> env = GetBerkeleyEnv(data_file.parent_path()); |
| 835 | if (env->m_databases.count(data_filename)) { |
| 836 | error = Untranslated(strprintf("Refusing to load database. Data file '%s' is already loaded.", fs::PathToString(env->Directory() / data_filename))); |
| 837 | status = DatabaseStatus::FAILED_ALREADY_LOADED; |
| 838 | return nullptr; |
| 839 | } |
| 840 | db = std::make_unique<BerkeleyDatabase>(std::move(env), std::move(data_filename)); |
| 841 | } |
| 842 | |
| 843 | if (options.verify && !db->Verify(error)) { |
| 844 | status = DatabaseStatus::FAILED_VERIFY; |
| 845 | return nullptr; |
| 846 | } |
| 847 | |
| 848 | status = DatabaseStatus::SUCCESS; |
| 849 | return db; |
| 850 | } |
| 851 | } // namespace wallet |
no test coverage detected