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 @@ -11,13 +11,14 @@ class DatabaseManager { static std::once_flag initialized; - static void setDatabaseStatusAsWorkable(); + static void setDatabaseStatusAsWorkable(bool afterClearingDatabase); public: static const DatabaseQueryExecutor &getQueryExecutor(); static void clearSensitiveData(); static void initializeQueryExecutor(std::string &databasePath); static bool checkIfDatabaseNeedsDeletion(); + static void reportDBOperationsFailure(); }; } // namespace comm 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 @@ -11,6 +11,7 @@ DatabaseManagerStatus DB_MANAGER_WORKABLE = "WORKABLE"; DatabaseManagerStatus DB_MANAGER_FIRST_FAILURE = "FIRST_FAILURE"; DatabaseManagerStatus DB_MANAGER_SECOND_FAILURE = "SECOND_FAILURE"; +DatabaseManagerStatus DB_OPERATIONS_FAILURE = "DB_OPERATIONS_FAILURE"; const std::string DATABASE_MANAGER_STATUS_KEY = "DATABASE_MANAGER_STATUS"; @@ -22,14 +23,14 @@ // creating an instance means that migration code was executed // and finished without error and database is workable std::call_once(DatabaseManager::initialized, []() { - DatabaseManager::setDatabaseStatusAsWorkable(); + DatabaseManager::setDatabaseStatusAsWorkable(false); }); return instance; } void DatabaseManager::clearSensitiveData() { SQLiteQueryExecutor::clearSensitiveData(); - DatabaseManager::setDatabaseStatusAsWorkable(); + DatabaseManager::setDatabaseStatusAsWorkable(true); } void DatabaseManager::initializeQueryExecutor(std::string &databasePath) { @@ -37,7 +38,7 @@ try { SQLiteQueryExecutor::initialize(databasePath); DatabaseManager::getQueryExecutor(); - commSecureStore.set(DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_WORKABLE); + DatabaseManager::setDatabaseStatusAsWorkable(false); Logger::log("Database manager initialized"); } catch (...) { folly::Optional databaseManagerStatus = @@ -60,9 +61,18 @@ } } -void DatabaseManager::setDatabaseStatusAsWorkable() { +void DatabaseManager::setDatabaseStatusAsWorkable(bool afterClearingDatabase) { comm::CommSecureStore commSecureStore{}; - commSecureStore.set(DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_WORKABLE); + if (afterClearingDatabase) { + commSecureStore.set(DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_WORKABLE); + return; + } + folly::Optional databaseManagerStatus = + commSecureStore.get(DATABASE_MANAGER_STATUS_KEY); + if (!databaseManagerStatus.hasValue() || + databaseManagerStatus.value() != DB_OPERATIONS_FAILURE) { + commSecureStore.set(DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_WORKABLE); + } } bool DatabaseManager::checkIfDatabaseNeedsDeletion() { @@ -70,7 +80,13 @@ folly::Optional databaseManagerStatus = commSecureStore.get(DATABASE_MANAGER_STATUS_KEY); return databaseManagerStatus.hasValue() && - databaseManagerStatus.value() == DB_MANAGER_SECOND_FAILURE; + (databaseManagerStatus.value() == DB_MANAGER_SECOND_FAILURE || + databaseManagerStatus.value() == DB_OPERATIONS_FAILURE); +} + +void DatabaseManager::reportDBOperationsFailure() { + comm::CommSecureStore commSecureStore{}; + commSecureStore.set(DATABASE_MANAGER_STATUS_KEY, DB_OPERATIONS_FAILURE); } } // namespace comm