179a732c7Sopenharmony_ci/* 279a732c7Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 379a732c7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 479a732c7Sopenharmony_ci * you may not use this file except in compliance with the License. 579a732c7Sopenharmony_ci * You may obtain a copy of the License at 679a732c7Sopenharmony_ci * 779a732c7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 879a732c7Sopenharmony_ci * 979a732c7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1079a732c7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1179a732c7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1279a732c7Sopenharmony_ci * See the License for the specific language governing permissions and 1379a732c7Sopenharmony_ci * limitations under the License. 1479a732c7Sopenharmony_ci */ 1579a732c7Sopenharmony_ci#include "kv_adapter_manager.h" 1679a732c7Sopenharmony_ci 1779a732c7Sopenharmony_ci#include <mutex> 1879a732c7Sopenharmony_ci#include <unistd.h> 1979a732c7Sopenharmony_ci 2079a732c7Sopenharmony_ci#include "datetime_ex.h" 2179a732c7Sopenharmony_ci#include "string_ex.h" 2279a732c7Sopenharmony_ci 2379a732c7Sopenharmony_ci#include "dm_anonymous.h" 2479a732c7Sopenharmony_ci#include "dm_constants.h" 2579a732c7Sopenharmony_ci#include "dm_log.h" 2679a732c7Sopenharmony_ci 2779a732c7Sopenharmony_cinamespace OHOS { 2879a732c7Sopenharmony_cinamespace DistributedHardware { 2979a732c7Sopenharmony_cinamespace { 3079a732c7Sopenharmony_ciconst std::string DM_KV_STORE_PREFIX = "DM2_"; 3179a732c7Sopenharmony_ciconstexpr int64_t DM_KV_STORE_REFRESH_TIME = 24 * 60 * 60; // one day 3279a732c7Sopenharmony_ciconstexpr int64_t MAX_SUPPORTED_EXIST_TIME = 3 * 24 * 60 * 60; // 3days 3379a732c7Sopenharmony_ci} 3479a732c7Sopenharmony_ci 3579a732c7Sopenharmony_ciDM_IMPLEMENT_SINGLE_INSTANCE(KVAdapterManager); 3679a732c7Sopenharmony_ci 3779a732c7Sopenharmony_ciint32_t KVAdapterManager::Init() 3879a732c7Sopenharmony_ci{ 3979a732c7Sopenharmony_ci LOGI("Init Kv-Adapter manager"); 4079a732c7Sopenharmony_ci { 4179a732c7Sopenharmony_ci std::lock_guard<std::mutex> lock(idCacheMapMtx_); 4279a732c7Sopenharmony_ci idCacheMap_.clear(); 4379a732c7Sopenharmony_ci } 4479a732c7Sopenharmony_ci kvAdapter_ = std::make_shared<KVAdapter>(); 4579a732c7Sopenharmony_ci return kvAdapter_->Init(); 4679a732c7Sopenharmony_ci} 4779a732c7Sopenharmony_ci 4879a732c7Sopenharmony_civoid KVAdapterManager::UnInit() 4979a732c7Sopenharmony_ci{ 5079a732c7Sopenharmony_ci LOGI("Uninit Kv-Adapter manager"); 5179a732c7Sopenharmony_ci CHECK_NULL_VOID(kvAdapter_); 5279a732c7Sopenharmony_ci kvAdapter_->UnInit(); 5379a732c7Sopenharmony_ci kvAdapter_ = nullptr; 5479a732c7Sopenharmony_ci} 5579a732c7Sopenharmony_ci 5679a732c7Sopenharmony_civoid KVAdapterManager::ReInit() 5779a732c7Sopenharmony_ci{ 5879a732c7Sopenharmony_ci LOGI("Re init kv adapter"); 5979a732c7Sopenharmony_ci CHECK_NULL_VOID(kvAdapter_); 6079a732c7Sopenharmony_ci kvAdapter_->ReInit(); 6179a732c7Sopenharmony_ci} 6279a732c7Sopenharmony_ci 6379a732c7Sopenharmony_ciint32_t KVAdapterManager::PutByAnoyDeviceId(const std::string &key, const DmKVValue &value) 6479a732c7Sopenharmony_ci{ 6579a732c7Sopenharmony_ci std::string dmKey = DM_KV_STORE_PREFIX + key; 6679a732c7Sopenharmony_ci std::lock_guard<std::mutex> lock(idCacheMapMtx_); 6779a732c7Sopenharmony_ci auto idIter = idCacheMap_.find(dmKey); 6879a732c7Sopenharmony_ci if (idIter != idCacheMap_.end() && !IsTimeOut(idIter->second.lastModifyTime, value.lastModifyTime, 6979a732c7Sopenharmony_ci DM_KV_STORE_REFRESH_TIME)) { 7079a732c7Sopenharmony_ci LOGD("Kv value is existed"); 7179a732c7Sopenharmony_ci return DM_OK; 7279a732c7Sopenharmony_ci } 7379a732c7Sopenharmony_ci idCacheMap_[dmKey] = value; 7479a732c7Sopenharmony_ci std::string prefixKey = DM_KV_STORE_PREFIX + value.appID + DB_KEY_DELIMITER + value.udidHash; 7579a732c7Sopenharmony_ci idCacheMap_[prefixKey] = value; 7679a732c7Sopenharmony_ci std::string valueStr = ""; 7779a732c7Sopenharmony_ci ConvertDmKVValueToJson(value, valueStr); 7879a732c7Sopenharmony_ci CHECK_NULL_RETURN(kvAdapter_, ERR_DM_POINT_NULL); 7979a732c7Sopenharmony_ci if (kvAdapter_->Put(dmKey, valueStr) != DM_OK) { 8079a732c7Sopenharmony_ci LOGE("Insert value to DB for dmKey failed"); 8179a732c7Sopenharmony_ci return ERR_DM_FAILED; 8279a732c7Sopenharmony_ci } 8379a732c7Sopenharmony_ci if (kvAdapter_->Put(prefixKey, valueStr) != DM_OK) { 8479a732c7Sopenharmony_ci LOGE("Insert value to DB for prefixKey failed"); 8579a732c7Sopenharmony_ci return ERR_DM_FAILED; 8679a732c7Sopenharmony_ci } 8779a732c7Sopenharmony_ci return DM_OK; 8879a732c7Sopenharmony_ci} 8979a732c7Sopenharmony_ci 9079a732c7Sopenharmony_ciint32_t KVAdapterManager::Get(const std::string &key, DmKVValue &value) 9179a732c7Sopenharmony_ci{ 9279a732c7Sopenharmony_ci std::string dmKey = DM_KV_STORE_PREFIX + key; 9379a732c7Sopenharmony_ci std::lock_guard<std::mutex> lock(idCacheMapMtx_); 9479a732c7Sopenharmony_ci auto idIter = idCacheMap_.find(dmKey); 9579a732c7Sopenharmony_ci if (idIter != idCacheMap_.end()) { 9679a732c7Sopenharmony_ci value = idIter->second; 9779a732c7Sopenharmony_ci return DM_OK; 9879a732c7Sopenharmony_ci } 9979a732c7Sopenharmony_ci CHECK_NULL_RETURN(kvAdapter_, ERR_DM_POINT_NULL); 10079a732c7Sopenharmony_ci std::string valueStr; 10179a732c7Sopenharmony_ci if (kvAdapter_->Get(dmKey, valueStr) != DM_OK) { 10279a732c7Sopenharmony_ci LOGE("Get kv value failed, dmKey: %{public}s", GetAnonyString(dmKey).c_str()); 10379a732c7Sopenharmony_ci return ERR_DM_FAILED; 10479a732c7Sopenharmony_ci } 10579a732c7Sopenharmony_ci ConvertJsonToDmKVValue(valueStr, value); 10679a732c7Sopenharmony_ci idCacheMap_[dmKey] = value; 10779a732c7Sopenharmony_ci std::string prefixKey = DM_KV_STORE_PREFIX + value.appID + DB_KEY_DELIMITER + value.udidHash; 10879a732c7Sopenharmony_ci idCacheMap_[prefixKey] = value; 10979a732c7Sopenharmony_ci return DM_OK; 11079a732c7Sopenharmony_ci} 11179a732c7Sopenharmony_ci 11279a732c7Sopenharmony_ciint32_t KVAdapterManager::DeleteAgedEntry() 11379a732c7Sopenharmony_ci{ 11479a732c7Sopenharmony_ci int64_t nowTime = GetSecondsSince1970ToNow(); 11579a732c7Sopenharmony_ci std::lock_guard<std::mutex> lock(idCacheMapMtx_); 11679a732c7Sopenharmony_ci for (auto it = idCacheMap_.begin(); it != idCacheMap_.end();) { 11779a732c7Sopenharmony_ci if (IsTimeOut(it->second.lastModifyTime, nowTime, MAX_SUPPORTED_EXIST_TIME)) { 11879a732c7Sopenharmony_ci it = idCacheMap_.erase(it); 11979a732c7Sopenharmony_ci } else { 12079a732c7Sopenharmony_ci ++it; 12179a732c7Sopenharmony_ci } 12279a732c7Sopenharmony_ci } 12379a732c7Sopenharmony_ci return DM_OK; 12479a732c7Sopenharmony_ci} 12579a732c7Sopenharmony_ci 12679a732c7Sopenharmony_ciinline bool KVAdapterManager::IsTimeOut(int64_t sourceTime, int64_t targetTime, int64_t timeOut) 12779a732c7Sopenharmony_ci{ 12879a732c7Sopenharmony_ci return targetTime - sourceTime >= timeOut ? true : false; 12979a732c7Sopenharmony_ci} 13079a732c7Sopenharmony_ci 13179a732c7Sopenharmony_ciint32_t KVAdapterManager::AppUnintall(const std::string &appId) 13279a732c7Sopenharmony_ci{ 13379a732c7Sopenharmony_ci LOGI("appId %{public}s.", GetAnonyString(appId).c_str()); 13479a732c7Sopenharmony_ci std::lock_guard<std::mutex> lock(idCacheMapMtx_); 13579a732c7Sopenharmony_ci for (auto it = idCacheMap_.begin(); it != idCacheMap_.end();) { 13679a732c7Sopenharmony_ci if (it->second.appID == appId) { 13779a732c7Sopenharmony_ci it = idCacheMap_.erase(it); 13879a732c7Sopenharmony_ci } else { 13979a732c7Sopenharmony_ci ++it; 14079a732c7Sopenharmony_ci } 14179a732c7Sopenharmony_ci } 14279a732c7Sopenharmony_ci CHECK_NULL_RETURN(kvAdapter_, ERR_DM_POINT_NULL); 14379a732c7Sopenharmony_ci if (kvAdapter_->DeleteByAppId(appId, DM_KV_STORE_PREFIX) != DM_OK) { 14479a732c7Sopenharmony_ci LOGE("DeleteByAppId failed"); 14579a732c7Sopenharmony_ci return ERR_DM_FAILED; 14679a732c7Sopenharmony_ci } 14779a732c7Sopenharmony_ci return DM_OK; 14879a732c7Sopenharmony_ci} 14979a732c7Sopenharmony_ci} // namespace DistributedHardware 15079a732c7Sopenharmony_ci} // namespace OHOS 151