diff --git a/services/distributeddataservice/framework/include/metadata/store_meta_data_local.h b/services/distributeddataservice/framework/include/metadata/store_meta_data_local.h index 717b495f997670d39ac5fce9a7455443af1dfcb2..01039d6fd36ec88d5e6b78ba763b2cf54a47a700 100755 --- a/services/distributeddataservice/framework/include/metadata/store_meta_data_local.h +++ b/services/distributeddataservice/framework/include/metadata/store_meta_data_local.h @@ -27,6 +27,8 @@ struct API_EXPORT PolicyValue final : public Serializable { uint32_t valueUint = 0; API_EXPORT PolicyValue() = default; API_EXPORT ~PolicyValue() = default; + API_EXPORT bool operator==(const PolicyValue &policyValue) const; + API_EXPORT bool operator!=(const PolicyValue &policyValue) const; API_EXPORT bool IsValueEffect() const; API_EXPORT bool Marshal(json &node) const override; API_EXPORT bool Unmarshal(const json &node) override; diff --git a/services/distributeddataservice/framework/metadata/store_meta_data_local.cpp b/services/distributeddataservice/framework/metadata/store_meta_data_local.cpp index 19aea85c52cf3a127368444f31e4c18b9974c7d9..910e27c5be5b2368f38fbc54a2adaa535ba4bea6 100755 --- a/services/distributeddataservice/framework/metadata/store_meta_data_local.cpp +++ b/services/distributeddataservice/framework/metadata/store_meta_data_local.cpp @@ -38,6 +38,16 @@ bool PolicyValue::IsValueEffect() const return (index > 0); } +bool PolicyValue::operator==(const PolicyValue &policyValue) const +{ + return type == policyValue.type && index == policyValue.index && valueUint == policyValue.valueUint; +} + +bool PolicyValue::operator!=(const PolicyValue &policyValue) const +{ + return !(*this == policyValue); +} + bool StoreMetaDataLocal::HasPolicy(uint32_t type) { for (const auto &policy : policies) { diff --git a/services/distributeddataservice/framework/test/store_meta_data_local_test.cpp b/services/distributeddataservice/framework/test/store_meta_data_local_test.cpp index d0c6b6379d1bd767bf07bfcdfb6d0b4a98351097..df88ca5d386a85923b114fa630e7f2809a283ee7 100644 --- a/services/distributeddataservice/framework/test/store_meta_data_local_test.cpp +++ b/services/distributeddataservice/framework/test/store_meta_data_local_test.cpp @@ -18,6 +18,7 @@ using namespace testing::ext; using OHOS::DistributedData::StoreMetaDataLocal; +using OHOS::DistributedData::PolicyValue; namespace OHOS::Test { class StoreMetaDataLocalTest : public testing::Test { public: @@ -122,4 +123,35 @@ HWTEST_F(StoreMetaDataLocalTest, GetPolicy, TestSize.Level1) policy = metaData.GetPolicy(type); EXPECT_EQ(policy.type, type); } + +/** +* @tc.name: GetPolicy +* @tc.desc: test GetPolicy function +* @tc.type: FUNC +*/ +HWTEST_F(StoreMetaDataLocalTest, PolicyValue, TestSize.Level1) +{ + PolicyValue pValue; + pValue.type = UINT32_MAX; + pValue.index = 0; + pValue.valueUint = 1; + + PolicyValue pValue1; + pValue1.type = UINT32_MAX; + pValue1.index = 1; + pValue1.valueUint = 1; + + PolicyValue pValue2; + pValue2.type = UINT32_MAX; + pValue2.index = 0; + pValue2.valueUint = 1; + EXPECT_NE(pValue, pValue1); + EXPECT_EQ(pValue, pValue2); + + std::vector pValues = { pValue, pValue1, pValue2 }; + std::vector pValues1 = { pValue, pValue1, pValue1 }; + std::vector pValues2 = { pValue, pValue1, pValue2 };; + EXPECT_NE(pValues, pValues1); + EXPECT_EQ(pValues, pValues2); +} } // namespace OHOS::Test \ No newline at end of file diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index c497a1288eb9c3d409f49d361888856b94368bbb..d787d29f864e8757caa1279713083a305d0c8b98 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -794,7 +794,7 @@ Status KVDBServiceImpl::AfterCreate( StoreMetaMapping oldMeta(metaData); auto isCreated = MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKey(), oldMeta, true); Status status = SUCCESS; - if (isCreated && oldMeta != metaData) { + if (isCreated && (oldMeta != metaData || oldMeta.schema != metaData.schema)) { auto dbStatus = Upgrade::GetInstance().UpdateStore(oldMeta, metaData, password); ZLOGI("update status:%{public}d appId:%{public}s storeId:%{public}s inst:%{public}d " "type:%{public}d->%{public}d dir:%{public}s dataType:%{public}d->%{public}d", @@ -814,12 +814,12 @@ Status KVDBServiceImpl::AfterCreate( oldMeta = metaData; MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta, true); } + AppIDMetaData appIdMeta; appIdMeta.bundleName = metaData.bundleName; appIdMeta.appId = metaData.appId; - MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true); + SaveAppIdMetaData(appIdMeta); SaveLocalMetaData(options, metaData); - if (metaData.isEncrypt && !password.empty()) { SaveSecretKeyMeta(metaData, password); } @@ -830,6 +830,16 @@ Status KVDBServiceImpl::AfterCreate( return status; } +void KVDBServiceImpl::SaveAppIdMetaData(const AppIDMetaData &appIdMeta) +{ + AppIDMetaData oldAppIdMeta; + if (MetaDataManager::GetInstance().LoadMeta(appIdMeta.GetKey(), oldAppIdMeta, true) && appIdMeta == oldAppIdMeta) { + return; + } + bool isSaved = MetaDataManager::GetInstance().SaveMeta(appIdMeta.GetKey(), appIdMeta, true); + ZLOGI("save app meta failed, bundleName: %{public}s isSaved: %{public}d", appIdMeta.bundleName.c_str(), isSaved); +} + int32_t KVDBServiceImpl::OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &appId) { ZLOGI("pid:%{public}d uid:%{public}d appId:%{public}s", pid, uid, appId.c_str()); @@ -973,6 +983,12 @@ void KVDBServiceImpl::SaveLocalMetaData(const Options &options, const StoreMetaD } localMetaData.policies.emplace_back(value); } + StoreMetaDataLocal oldLocalMetaData; + if (MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), oldLocalMetaData, true) + && oldLocalMetaData == localMetaData && oldLocalMetaData.schema == localMetaData.schema + && oldLocalMetaData.policies == localMetaData.policies) { + return; + } MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocal(), localMetaData, true); } diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h index dd185700db36228cfe8a58253e5a1babcd88b06d..33bd2fc58a1f82606d09a6c9a6c4d8e99b2e9603 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h @@ -27,6 +27,7 @@ #include "kvdb_service_stub.h" #include "kvdb_watcher.h" #include "kvstore_sync_manager.h" +#include "metadata/appid_meta_data.h" #include "metadata/meta_data_manager.h" #include "metadata/store_meta_data.h" #include "metadata/store_meta_data_local.h" @@ -166,6 +167,7 @@ private: std::string GenerateKey(const std::string &userId, const std::string &storeId) const; std::vector LoadSecretKey(const StoreMetaData &metaData, CryptoManager::SecretKeyType secretKeyType); void SaveSecretKeyMeta(const StoreMetaData &metaData, const std::vector &password); + void SaveAppIdMetaData(const DistributedData::AppIDMetaData &appIdMeta); static Factory factory_; ConcurrentMap syncAgents_; std::shared_ptr executors_; diff --git a/services/distributeddataservice/service/test/meta_data_test.cpp b/services/distributeddataservice/service/test/meta_data_test.cpp index 714fd0b53a5762941758766da8045c2ab1ac4330..9830fb6928dce053448a9141d5c566b41ce49722 100644 --- a/services/distributeddataservice/service/test/meta_data_test.cpp +++ b/services/distributeddataservice/service/test/meta_data_test.cpp @@ -164,5 +164,34 @@ HWTEST_F(MetaDataTest, MateDataChanged, TestSize.Level0) ASSERT_FALSE(metaData.isNeedCompress); ASSERT_TRUE(MetaDataManager::GetInstance().DelMeta(metaData_.GetKeyWithoutPath())); } + +/** +* @tc.name: SchemaChanged +* @tc.desc: schema data changed +* @tc.type: FUNC +*/ +HWTEST_F(MetaDataTest, SchemaChanged, TestSize.Level0) +{ + ZLOGI("SchemaChanged start"); + options_.schema = ""; + StoreMetaData metaData; + std::vector password {}; + auto status = kvdbServiceImpl_->AfterCreate(appId, storeId, options_, password); + ASSERT_EQ(status, Status::SUCCESS); + StoreMetaMapping meta(metaData_); + ASSERT_TRUE(MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true)); + status = kvdbServiceImpl_->AfterCreate(appId, storeId, options_, password); + ASSERT_EQ(status, Status::SUCCESS); + + options_.schema = "schema_data"; + status = kvdbServiceImpl_->AfterCreate(appId, storeId, options_, password); + ASSERT_EQ(status, Status::SUCCESS); + meta = metaData_; + ASSERT_TRUE(MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true)); + status = kvdbServiceImpl_->AfterCreate(appId, storeId, options_, password); + ASSERT_EQ(status, Status::SUCCESS); + ASSERT_TRUE(MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), metaData, true)); + ASSERT_EQ(metaData.schema, "schema_data"); +} } // namespace DistributedDataTest } // namespace OHOS::Test