From bf7f75c015c029649e896b7da57cb1c761d5e7c9 Mon Sep 17 00:00:00 2001 From: zhanheng Date: Wed, 3 Sep 2025 10:39:38 +0800 Subject: [PATCH] delete and create new fd after delete db Signed-off-by: zhanheng --- .../service/data_share/common/db_delegate.cpp | 29 +++++++++++++++++++ .../service/data_share/common/db_delegate.h | 3 +- .../data_share/data_share_service_impl.cpp | 24 +++++++++++++++ .../data_share/data_share_service_impl.h | 1 + 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/services/distributeddataservice/service/data_share/common/db_delegate.cpp b/services/distributeddataservice/service/data_share/common/db_delegate.cpp index 9e77bcbb4..b53cf56ae 100644 --- a/services/distributeddataservice/service/data_share/common/db_delegate.cpp +++ b/services/distributeddataservice/service/data_share/common/db_delegate.cpp @@ -77,6 +77,35 @@ std::shared_ptr DBDelegate::Create(DistributedData::StoreMetaData &m return nullptr; } +bool DBDelegate::Delete(DistributedData::StoreMetaData &metaData) +{ + // check deactivating. + if (Account::GetInstance()->IsDeactivating(atoi(metaData.user.c_str()))) { + ZLOGW("user %{public}s is deactivating, storeName: %{public}s", metaData.user.c_str(), + StringUtils::GeneralAnonymous(metaData.GetStoreAlias()).c_str()); + return false; + } + + // delete function. + auto eraseFunc = [&metaData](auto &, std::map> &stores) -> bool { + auto it = stores.find(metaData.storeId); + if (it != stores.end()) { + stores.erase(it); + return true; + } + return false; + }; + + bool result = false; + if (metaData.isEncrypt) { + result = storesEncrypt_.Compute(metaData.tokenId, eraseFunc); + } else { + result = stores_.Compute(metaData.tokenId, eraseFunc); + } + + return result; +} + void DBDelegate::SetExecutorPool(std::shared_ptr executor) { executor_ = std::move(executor); diff --git a/services/distributeddataservice/service/data_share/common/db_delegate.h b/services/distributeddataservice/service/data_share/common/db_delegate.h index 804a67633..93900edd1 100644 --- a/services/distributeddataservice/service/data_share/common/db_delegate.h +++ b/services/distributeddataservice/service/data_share/common/db_delegate.h @@ -37,6 +37,7 @@ public: using Filter = std::function; static std::shared_ptr Create(DistributedData::StoreMetaData &metaData, const std::string &extUri = "", const std::string &backup = ""); + static bool Delete(DistributedData::StoreMetaData &metaData); virtual bool Init(const DistributedData::StoreMetaData &meta, int version, bool registerFunction, const std::string &extUri, const std::string &backup) = 0; static void Close(const Filter &filter); @@ -129,7 +130,7 @@ public: static constexpr const char *DATA_TABLE = "data_"; static constexpr const char *PROXYDATA_TABLE = "proxydata_"; static std::shared_ptr GetInstance( - const std::string &dir = "", const std::shared_ptr &executors = nullptr); + const std::string &dir = "", const std::shared_ptr &executors = nullptr); virtual ~KvDBDelegate() = default; virtual std::pair Upsert(const std::string &collectionName, const KvData &value) = 0; virtual std::pair Delete(const std::string &collectionName, const std::string &filter) = 0; diff --git a/services/distributeddataservice/service/data_share/data_share_service_impl.cpp b/services/distributeddataservice/service/data_share/data_share_service_impl.cpp index d1b45596b..1251d80a6 100644 --- a/services/distributeddataservice/service/data_share/data_share_service_impl.cpp +++ b/services/distributeddataservice/service/data_share/data_share_service_impl.cpp @@ -611,6 +611,7 @@ int32_t DataShareServiceImpl::OnBind(const BindInfo &binderInfo) SubscribeConcurrentTask(); SubscribeTimeChanged(); SubscribeChange(); + SubscribeListen(); auto task = [](const std::string &bundleName, int32_t userId, const std::string &storeName) { return BundleMgrProxy::GetInstance()->IsConfigSilentProxy(bundleName, userId, storeName); }; @@ -619,6 +620,29 @@ int32_t DataShareServiceImpl::OnBind(const BindInfo &binderInfo) return E_OK; } +void DataShareServiceImpl::SubscribeListen() +{ + MetaDataManager::GetInstance().Subscribe( + StoreMetaData::GetPrefix({}), [this](const std::string &key, const std::string &value, int32_t flag) -> auto { + if (flag != MetaDataManager::DELETE) { + return false; + } + if (value.empty()) { + return false; + } + StoreMetaData meta; + if (!(StoreMetaData::Unmarshall(value, meta))) { + ZLOGE("SubscribeListen Unmarshall failed!"); + return false; + } + if (!(DBDelegate::Delete(meta))) { + ZLOGE("SubscribeListen DBDelegate Delete failed!"); + return false; + } + return true; + }, true); +} + void DataShareServiceImpl::SubscribeCommonEvent() { sptr systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); diff --git a/services/distributeddataservice/service/data_share/data_share_service_impl.h b/services/distributeddataservice/service/data_share/data_share_service_impl.h index c86cf2fa2..3647c9701 100644 --- a/services/distributeddataservice/service/data_share/data_share_service_impl.h +++ b/services/distributeddataservice/service/data_share/data_share_service_impl.h @@ -137,6 +137,7 @@ private: int32_t GetBMSAndMetaDataStatus(const std::string &uri, const int32_t tokenId); void SubscribeCommonEvent(); void SubscribeConcurrentTask(); + void SubscribeListen(); static void InitSubEvent(); void AutoLaunch(const DistributedData::Event &event); void SubscribeChange(); -- Gitee