diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.h @@ -31,6 +31,9 @@ static void initializeSQLiteQueryExecutorProperties(std::string &databasePath); + // Creates restoredConnectionManager instance based on data from SecureStore. + static void initializeRestoredConnectionManager(); + // Generate and persist a backup key used as a database encryption key. static std::string generateBackupDataKey(); // Generate and persist key used for encrypt backup logs. diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseManager.cpp @@ -46,25 +46,7 @@ DatabaseManager::getQueryExecutor(DatabaseIdentifier id) { if (id == DatabaseIdentifier::RESTORED) { if (!DatabaseManager::restoredConnectionManager) { - folly::Optional mainCompactionPath = - CommSecureStore::get(CommSecureStore::restoredBackupPath); - folly::Optional mainCompactionEncryptionKey = - CommSecureStore::get(CommSecureStore::restoredBackupDataKey); - - if (!mainCompactionPath.has_value() || - !mainCompactionEncryptionKey.has_value()) { - throw std::runtime_error( - "mainCompaction path / encryption key is not set"); - } - - SQLiteBackup::validateMainCompaction( - mainCompactionPath.value(), mainCompactionEncryptionKey.value()); - - DatabaseManager::restoredConnectionManager = - std::make_shared( - mainCompactionPath.value(), - mainCompactionEncryptionKey.value(), - ""); + DatabaseManager::initializeRestoredConnectionManager(); } thread_local SQLiteQueryExecutor restoredQueryExecutor( @@ -182,6 +164,28 @@ } } +void DatabaseManager::initializeRestoredConnectionManager() { + if (DatabaseManager::restoredConnectionManager) { + return; + } + folly::Optional mainCompactionPath = + CommSecureStore::get(CommSecureStore::restoredBackupPath); + folly::Optional mainCompactionEncryptionKey = + CommSecureStore::get(CommSecureStore::restoredBackupDataKey); + + if (!mainCompactionPath.has_value() || + !mainCompactionEncryptionKey.has_value()) { + throw std::runtime_error("mainCompaction path / encryption key is not set"); + } + + SQLiteBackup::validateMainCompaction( + mainCompactionPath.value(), mainCompactionEncryptionKey.value()); + + DatabaseManager::restoredConnectionManager = + std::make_shared( + mainCompactionPath.value(), mainCompactionEncryptionKey.value(), ""); +} + void DatabaseManager::setDatabaseStatusAsWorkable() { CommSecureStore::set(DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_WORKABLE); } @@ -475,6 +479,10 @@ } void DatabaseManager::copyContentFromBackupDatabase() { + if (!DatabaseManager::restoredConnectionManager) { + DatabaseManager::initializeRestoredConnectionManager(); + } + DatabaseManager::getQueryExecutor().copyContentFromDatabase( DatabaseManager::restoredConnectionManager->getSQLiteFilePath(), DatabaseManager::restoredConnectionManager->getBackupDataKey());