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 @@ -10,6 +10,7 @@ public: static const DatabaseQueryExecutor &getQueryExecutor(); static void clearSensitiveData(); + static void initializeQueryExecutor(std::string &databasePath); }; } // 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 @@ -1,8 +1,17 @@ #include "DatabaseManager.h" +#include "../Tools/CommSecureStore.h" +#include "Logger.h" #include "SQLiteQueryExecutor.h" namespace comm { +typedef std::string DatabaseManagerStatus; +const DatabaseManagerStatus DB_MANAGER_WORKABLE = "WORKABLE"; +const DatabaseManagerStatus DB_MANAGER_FIRST_FAILURE = "FIRST_FAILURE"; +const DatabaseManagerStatus DB_MANAGER_SECOND_FAILURE = "SECOND_FAILURE"; + +const std::string DATABASE_MANAGER_STATUS_KEY = "DATABASE_MANAGER_STATUS"; + const DatabaseQueryExecutor &DatabaseManager::getQueryExecutor() { // TODO: conditionally create desired type of db manager // maybe basing on some preprocessor flag @@ -14,4 +23,32 @@ SQLiteQueryExecutor::clearSensitiveData(); } +void DatabaseManager::initializeQueryExecutor(std::string &databasePath) { + comm::CommSecureStore commSecureStore{}; + try { + SQLiteQueryExecutor::initialize(databasePath); + DatabaseManager::getQueryExecutor(); + commSecureStore.set(DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_WORKABLE); + Logger::log("Database manager initialized"); + } catch (...) { + folly::Optional databaseManagerStatus = + commSecureStore.get(DATABASE_MANAGER_STATUS_KEY); + if (!databaseManagerStatus.hasValue() || + databaseManagerStatus.value() == DB_MANAGER_WORKABLE) { + commSecureStore.set( + DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_FIRST_FAILURE); + Logger::log("Database manager initialization issue, terminating app"); + throw; + } + if (databaseManagerStatus.value() == DB_MANAGER_FIRST_FAILURE) { + commSecureStore.set( + DATABASE_MANAGER_STATUS_KEY, DB_MANAGER_SECOND_FAILURE); + Logger::log( + "Database manager initialization issue, app proceeding, but " + "database needs to be deleted"); + return; + } + } +} + } // namespace comm