-std::string DBHandleProvider::GetCertDBPath(pid_t pid, bool write) {
- std::unique_lock<std::recursive_mutex> u(lock_);
- if (is_user_memdb_set_ != is_global_memdb_set_)
- is_global_memdb_set_ ? SetMemoryMode(pid) : UnsetMemoryMode(pid);
-
- if (IsMemoryDBActive(pid, write))
- return cert_memdb_path;
- else
- return cert_filedb_path_;
-}
-
-sqlite3* DBHandleProvider::CreateMemoryDBHandle(const std::string& filedb_path,
- const std::string& memorydb_path) {
- sqlite3* memorydb = nullptr;
- sqlite3* filedb = nullptr;
- LOG(INFO) << "Create memory db handle : " << memorydb_path;
- int ret = sqlite3_open_v2(memorydb_path.c_str(), &memorydb,
- SQLITE_OPEN_READONLY | SQLITE_OPEN_URI, nullptr);
- if (ret != SQLITE_OK) {
- LOG(ERROR) << "Failed to open memory DB " << ret << ": " << memorydb_path;
- return nullptr;
- }
-
- ret = sqlite3_open_v2(filedb_path.c_str(), &filedb, SQLITE_OPEN_READONLY,
- nullptr);
- if (ret != SQLITE_OK) {
- LOG(ERROR) << "Failed to open file DB " << ret << ": " << filedb_path;
- sqlite3_close_v2(memorydb);
- return nullptr;
- }
-
- sqlite3_backup* backup =
- sqlite3_backup_init(memorydb, "main", filedb, "main");
- if (backup == nullptr) {
- LOG(ERROR) << "Failed to backup for memory DB";
- sqlite3_close_v2(memorydb);
- sqlite3_close_v2(filedb);
- return nullptr;
- }
-
- sqlite3_backup_step(backup, -1);
- sqlite3_backup_finish(backup);
- sqlite3_close_v2(filedb);
- LOG(INFO) << "Create memory db handle done";
- return memorydb;
-}
-
-void DBHandleProvider::SetMemoryMode(pid_t pid) {
- std::unique_lock<std::recursive_mutex> u(lock_);
- if (is_global_memdb_set_ && is_user_memdb_set_)
- return;
-
- sqlite3* parser_db =
- CreateMemoryDBHandle(user_parser_filedb_path_, user_parser_memdb_path_);
- if (parser_db != nullptr)
- parser_memdb_handle_.reset(parser_db);
-
- if (is_user_memdb_set_ == is_global_memdb_set_) {
- sqlite3* global_parser_file_db = CreateMemoryDBHandle(
- global_parser_filedb_path_, global_parser_memdb_path);
- if (global_parser_file_db)
- global_parser_memdb_handle_.reset(global_parser_file_db);
-
- sqlite3* cert_db =
- CreateMemoryDBHandle(cert_filedb_path_, cert_memdb_path);
- if (cert_db != nullptr)
- cert_memdb_handle_.reset(cert_db);
-
- InsertPID(pid);
- }
-
- is_user_memdb_set_ = true;
- is_global_memdb_set_ = true;
- LOG(INFO) << "Set Memory mode : Memory";
-}
-
-void DBHandleProvider::UnsetMemoryMode(pid_t pid) {
- std::unique_lock<std::recursive_mutex> u(lock_);
- if (!is_global_memdb_set_ && !is_user_memdb_set_)
- return;
-
- parser_memdb_handle_.reset(nullptr);
- cert_memdb_handle_.reset(nullptr);
- global_parser_memdb_handle_.reset(nullptr);
-
- if (!ErasePID(pid))
- LOG(ERROR) << "Given pid is not exists in pid list : " << pid;
-
- is_user_memdb_set_ = false;
- is_global_memdb_set_ = false;
-
- LOG(DEBUG) << "Set Memory mode : File";
-}
-
-bool DBHandleProvider::IsMemoryDBActive(pid_t pid, bool write) {
- std::unique_lock<std::shared_mutex> u(pid_list_lock_);
- if (!is_user_memdb_set_)
- return false;
-
- if (write)
- return false;
-
- if (writer_pid_list_.find(pid) != writer_pid_list_.end())
- return false;
-
- return true;