diff --git a/datamgr_service/services/distributeddataservice/framework/cloud/cloud_info.cpp b/datamgr_service/services/distributeddataservice/framework/cloud/cloud_info.cpp index a50f4d69d03d060d220235e63cfed5dd50bbc043..d07deb1c966704dc6c4f73f3bef1f440dc66a54a 100644 --- a/datamgr_service/services/distributeddataservice/framework/cloud/cloud_info.cpp +++ b/datamgr_service/services/distributeddataservice/framework/cloud/cloud_info.cpp @@ -67,15 +67,15 @@ std::string CloudInfo::GetKey() const std::map CloudInfo::GetSchemaKey() const { std::map keys; - for (const auto &app : apps) { + for (const auto &[bundle, app] : apps) { const auto key = GetKey( - SCHEMA_PREFIX, { std::to_string(user), app.bundleName, std::to_string(app.instanceId) }); + SCHEMA_PREFIX, { std::to_string(user), bundle, std::to_string(app.instanceId) }); keys.insert_or_assign(app.bundleName, key); } return keys; } -std::string CloudInfo::GetSchemaKey(const std::string &bundleName, const int32_t instanceId) const +std::string CloudInfo::GetSchemaKey(const std::string &bundleName, int32_t instanceId) const { return GetKey(SCHEMA_PREFIX, { std::to_string(user), bundleName, std::to_string(instanceId) }); } @@ -90,14 +90,13 @@ bool CloudInfo::IsValid() const return !id.empty(); } -bool CloudInfo::IsExist(const std::string &bundleName) const +bool CloudInfo::Exist(const std::string &bundleName, int32_t instanceId) { - for (const auto &app : apps) { - if (app.bundleName == bundleName) { - return true; - } + if (bundleName.empty()) { + return false; } - return false; + auto it = apps.find(bundleName); + return it != apps.end() && it->second.bundleName == bundleName && it->second.instanceId == instanceId; } std::string CloudInfo::GetPrefix(const std::initializer_list &fields) diff --git a/datamgr_service/services/distributeddataservice/framework/include/cloud/cloud_info.h b/datamgr_service/services/distributeddataservice/framework/include/cloud/cloud_info.h index dc73202775809e0f82e98ecacabfc0f8900f43f8..e2f50cb76101588f398a49c882cc8add99b204d1 100644 --- a/datamgr_service/services/distributeddataservice/framework/include/cloud/cloud_info.h +++ b/datamgr_service/services/distributeddataservice/framework/include/cloud/cloud_info.h @@ -35,14 +35,14 @@ public: uint64_t totalSpace = 0; uint64_t remainSpace = 0; bool enableCloud = false; - std::vector apps; + std::map apps; std::string GetKey() const; std::map GetSchemaKey() const; - std::string GetSchemaKey(const std::string &bundleName, const int32_t instanceId = 0) const; + std::string GetSchemaKey(const std::string &bundleName, int32_t instanceId = 0) const; static std::string GetSchemaKey(const StoreMetaData &meta); bool IsValid() const; - bool IsExist(const std::string &bundleName) const; + bool Exist(const std::string &bundleName, int32_t instanceId = 0); static std::string GetPrefix(const std::initializer_list &field); bool Marshal(json &node) const override; diff --git a/datamgr_service/services/distributeddataservice/service/backup/src/backup_manager.cpp b/datamgr_service/services/distributeddataservice/service/backup/src/backup_manager.cpp index 5c52cbd735a4d0c3591d586aea8f2c5198580c2a..64505866bb61a8e94bb2393fa0f0402d91e57211 100644 --- a/datamgr_service/services/distributeddataservice/service/backup/src/backup_manager.cpp +++ b/datamgr_service/services/distributeddataservice/service/backup/src/backup_manager.cpp @@ -289,7 +289,7 @@ void BackupManager::CopyFile(const std::string &oldPath, const std::string &newP fout.open(newPath, std::ios_base::out | std::ios_base::trunc); } char buf[COPY_SIZE] = {0}; - while (!fin.eof()) { + while (fin.good()) { fin.read(buf, COPY_SIZE); fout.write(buf, fin.gcount()); } diff --git a/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.cpp b/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.cpp index cd3c8d16066e2ba1d66462a35cfe6d4351616098..e30b052dde8b09cf0d3886671544765cf6eeb53f 100644 --- a/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.cpp +++ b/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.cpp @@ -36,6 +36,12 @@ using namespace DistributedData; using DmAdapter = OHOS::DistributedData::DeviceManagerAdapter; using Account = OHOS::DistributedKv::AccountDelegate; __attribute__((used)) CloudServiceImpl::Factory CloudServiceImpl::factory_; +const CloudServiceImpl::Work CloudServiceImpl::HANDLERS[WORK_BUTT] = { + &CloudServiceImpl::DoSubscribe, + &CloudServiceImpl::UpdateCloudInfo, + &CloudServiceImpl::UpdateSchema, +}; + CloudServiceImpl::Factory::Factory() noexcept { FeatureSystem::GetInstance().RegisterCreator( @@ -67,15 +73,11 @@ int32_t CloudServiceImpl::EnableCloud(const std::string &id, const std::map bool { - return appInfo.bundleName == item.first; - }); - if (it == cloudInfo.apps.end()) { + for (const auto &[bundle, value] : switches) { + if (!cloudInfo.Exist(bundle)) { continue; } - it->cloudSwitch = item.second; + cloudInfo.apps[bundle].cloudSwitch = value; } if (!MetaDataManager::GetInstance().SaveMeta(cloudInfo.GetKey(), cloudInfo, true)) { return ERROR; @@ -106,15 +108,11 @@ int32_t CloudServiceImpl::ChangeAppSwitch(const std::string &id, const std::stri if (status != SUCCESS) { return status; } - auto it = std::find_if(cloudInfo.apps.begin(), cloudInfo.apps.end(), - [&bundleName](const CloudInfo::AppInfo &appInfo) -> bool { - return appInfo.bundleName == bundleName; - }); - if (it == cloudInfo.apps.end()) { + if (!cloudInfo.Exist(bundleName)) { ZLOGE("bundleName:%{public}s", bundleName.c_str()); return INVALID_ARGUMENT; } - (*it).cloudSwitch = appSwitch; + cloudInfo.apps[bundleName].cloudSwitch = appSwitch; if (!MetaDataManager::GetInstance().SaveMeta(cloudInfo.GetKey(), cloudInfo, true)) { return ERROR; } @@ -131,12 +129,12 @@ int32_t CloudServiceImpl::Clean(const std::string &id, const std::map bool { - return appInfo.bundleName == bundleName; - }); - if (it == cloudInfo.apps.end()) { + if (!cloudInfo.Exist(bundleName)) { ZLOGE("bundleName:%{public}s", bundleName.c_str()); return INVALID_ARGUMENT; } - if (!it->cloudSwitch) { + if (!cloudInfo.apps[bundleName].cloudSwitch) { return CLOUD_DISABLE_SWITCH; } - auto key = cloudInfo.GetSchemaKey(bundleName); SchemaMeta schemaMeta; if (!MetaDataManager::GetInstance().LoadMeta(key, schemaMeta, true)) { ZLOGE("bundleName:%{public}s", bundleName.c_str()); return INVALID_ARGUMENT; } + const auto &app = cloudInfo.apps[bundleName]; for (const auto &database : schemaMeta.databases) { EventCenter::Defer defer; CloudEvent::StoreInfo storeInfo; - storeInfo.bundleName = it->bundleName; - storeInfo.instanceId = it->instanceId; + storeInfo.bundleName = app.bundleName; + storeInfo.instanceId = app.instanceId; storeInfo.user = cloudInfo.user; storeInfo.storeName = database.name; auto evt = std::make_unique(CloudEvent::DATA_CHANGE, storeInfo); @@ -192,8 +186,7 @@ int32_t CloudServiceImpl::NotifyDataChange(const std::string &id, const std::str int32_t CloudServiceImpl::OnInitialize() { - FeatureInit(); - Execute(GetCloudTask(0, 0)); + Execute(GetCloudTask(0, 0, { WORK_CLOUD_INFO_UPDATE, WORK_SCHEMA_UPDATE })); return E_OK; } @@ -209,7 +202,7 @@ int32_t CloudServiceImpl::OnExecutor(std::shared_ptr executor) int32_t CloudServiceImpl::OnUserChange(uint32_t code, const std::string &user, const std::string &account) { - Execute(GetCloudTask(0, atoi(user.c_str()))); + Execute(GetCloudTask(0, atoi(user.c_str()), { WORK_CLOUD_INFO_UPDATE, WORK_SCHEMA_UPDATE })); return E_OK; } @@ -244,54 +237,92 @@ int32_t CloudServiceImpl::GetCloudInfoFromServer(CloudInfo &cloudInfo) { auto instance = CloudServer::GetInstance(); if (instance == nullptr) { + ZLOGW("cloud server unavailable"); return NOT_SUPPORT; } cloudInfo = instance->GetServerInfo(cloudInfo.user); return SUCCESS; } -void CloudServiceImpl::UpdateCloudInfo(CloudInfo &cloudInfo) +bool CloudServiceImpl::UpdateCloudInfo(int32_t user) { + CloudInfo cloudInfo; + cloudInfo.user = user; + if (GetCloudInfoFromServer(cloudInfo) != SUCCESS) { + ZLOGE("failed, user:%{public}d", user); + return false; + } CloudInfo oldInfo; if (!MetaDataManager::GetInstance().LoadMeta(cloudInfo.GetKey(), oldInfo, true)) { MetaDataManager::GetInstance().SaveMeta(cloudInfo.GetKey(), cloudInfo, true); - return; + return true; + } + if (oldInfo.id != cloudInfo.id) { + ZLOGE("different id, [server] id:%{public}s, [meta] id:%{public}s", + Anonymous::Change(cloudInfo.id).c_str(), Anonymous::Change(oldInfo.id).c_str()); + return false; } oldInfo.totalSpace = cloudInfo.totalSpace; oldInfo.remainSpace = cloudInfo.remainSpace; oldInfo.apps = std::move(cloudInfo.apps); - cloudInfo = oldInfo; + for (auto &[bundle, app] : cloudInfo.apps) { + if (oldInfo.Exist(bundle)) { + continue; + } + oldInfo.apps[bundle] = std::move(app); + } MetaDataManager::GetInstance().SaveMeta(oldInfo.GetKey(), oldInfo, true); + return true; } -void CloudServiceImpl::AddSchema(CloudInfo &cloudInfo) +bool CloudServiceImpl::UpdateSchema(int32_t user) { + CloudInfo cloudInfo; + cloudInfo.user = user; + if (GetCloudInfoFromServer(cloudInfo) != SUCCESS) { + ZLOGE("failed, user:%{public}d", user); + return false; + } auto keys = cloudInfo.GetSchemaKey(); - for (const auto &key : keys) { + for (const auto &[bundle, key] : keys) { SchemaMeta schemaMeta; - if (MetaDataManager::GetInstance().LoadMeta(key.second, schemaMeta, true)) { + if (MetaDataManager::GetInstance().LoadMeta(key, schemaMeta, true)) { continue; } - if (GetAppSchema(cloudInfo.user, key.first, schemaMeta) != SUCCESS) { - continue; + if (GetAppSchema(cloudInfo.user, bundle, schemaMeta) != SUCCESS) { + return false; } - MetaDataManager::GetInstance().SaveMeta(key.second, schemaMeta, true); + MetaDataManager::GetInstance().SaveMeta(key, schemaMeta, true); } + return true; } int32_t CloudServiceImpl::GetAppSchema(int32_t user, const std::string &bundleName, SchemaMeta &schemaMeta) { auto instance = CloudServer::GetInstance(); if (instance == nullptr) { + ZLOGW("cloud server unavailable"); return SERVER_UNAVAILABLE; } schemaMeta = instance->GetAppSchema(user, bundleName); return SUCCESS; } -ExecutorPool::Task CloudServiceImpl::GetCloudTask(int32_t retry, int32_t user) +CloudServiceImpl::Tasks CloudServiceImpl::GetCloudTask( + int32_t retry, int32_t user, const std::initializer_list &works) { - return [this, retry, user]() -> void { + Tasks tasks; + tasks.reserve(works.size() + 1); + tasks.push_back(GenTask(retry, user, WORK_SUB)); + for (auto work : works) { + tasks.push_back(GenTask(retry, user, work)); + } + return tasks; +} + +ExecutorPool::Task CloudServiceImpl::GenTask(int32_t retry, int32_t user, AsyncWork work) +{ + return [this, retry, user, work]() -> void { auto executor = executor_; if (retry >= RETRY_TIMES || executor == nullptr) { return; @@ -306,13 +337,10 @@ ExecutorPool::Task CloudServiceImpl::GetCloudTask(int32_t retry, int32_t user) } for (auto user : users) { - Subscription subscription; - subscription.userId = user; - MetaDataManager::GetInstance().LoadMeta(subscription.GetKey(), subscription, true); - finished = DoSubscribe(subscription) && finished; + finished = (this->*HANDLERS[work])(user) && finished; } if (!finished) { - executor->Schedule(std::chrono::seconds(RETRY_INTERVAL), GetCloudTask(retry + 1, user)); + executor->Schedule(std::chrono::seconds(RETRY_INTERVAL), GenTask(retry + 1, user, work)); } }; } @@ -335,10 +363,7 @@ SchemaMeta CloudServiceImpl::GetSchemaMata(int32_t userId, const std::string &bu } MetaDataManager::GetInstance().SaveMeta(cloudInfo.GetKey(), cloudInfo, true); } - if (std::find_if(cloudInfo.apps.begin(), cloudInfo.apps.end(), - [&bundleName, &instanceId](const CloudInfo::AppInfo &appInfo) { - return appInfo.bundleName == bundleName && appInfo.instanceId == instanceId; - }) == cloudInfo.apps.end()) { + if (!cloudInfo.Exist(bundleName, instanceId)) { ZLOGE("bundleName:%{public}s instanceId:%{public}d", bundleName.c_str(), instanceId); return schemaMeta; } @@ -363,27 +388,6 @@ StoreMetaData CloudServiceImpl::GetStoreMata(int32_t userId, const std::string & return storeMetaData; } -void CloudServiceImpl::FeatureInit() -{ - CloudInfo cloudInfo; - std::vector users; - if (!DistributedKv::AccountDelegate::GetInstance()->QueryUsers(users) || users.empty()) { - return; - } - for (const auto &user : users) { - if (user == USER_ID) { - continue; - } - cloudInfo.user = user; - if (GetCloudInfoFromServer(cloudInfo) != SUCCESS) { - ZLOGE("failed, user:%{public}d", user); - continue; - } - UpdateCloudInfo(cloudInfo); - AddSchema(cloudInfo); - } -} - void CloudServiceImpl::GetSchema(const Event &event) { auto &rdbEvent = static_cast(event); @@ -430,8 +434,11 @@ void CloudServiceImpl::GetSchema(const Event &event) return; } -bool CloudServiceImpl::DoSubscribe(const Subscription &sub) +bool CloudServiceImpl::DoSubscribe(int32_t user) { + Subscription sub; + sub.userId = user; + MetaDataManager::GetInstance().LoadMeta(sub.GetKey(), sub, true); if (CloudServer::GetInstance() == nullptr) { ZLOGI("not support cloud server"); return true; @@ -451,10 +458,10 @@ bool CloudServiceImpl::DoSubscribe(const Subscription &sub) auto offThreshold = std::chrono::system_clock::now().time_since_epoch(); std::map> subDbs; std::map> unsubDbs; - for (auto &app : cloudInfo.apps) { + for (auto &[bundle, app] : cloudInfo.apps) { auto enabled = cloudInfo.enableCloud && app.cloudSwitch; auto &dbs = enabled ? subDbs : unsubDbs; - auto it = sub.expiresTime.find(app.bundleName); + auto it = sub.expiresTime.find(bundle); // cloud is enabled, but the subscription won't expire if (enabled && (it != sub.expiresTime.end() && it->second >= onThreshold.count())) { continue; @@ -465,9 +472,10 @@ bool CloudServiceImpl::DoSubscribe(const Subscription &sub) } SchemaMeta schemaMeta; - exits = MetaDataManager::GetInstance().LoadMeta(cloudInfo.GetSchemaKey(app.bundleName), schemaMeta, true); + exits = MetaDataManager::GetInstance().LoadMeta( + cloudInfo.GetSchemaKey(bundle), schemaMeta, true); if (exits) { - dbs[app.bundleName] = std::move(schemaMeta.databases); + dbs[bundle] = std::move(schemaMeta.databases); } } @@ -480,12 +488,14 @@ bool CloudServiceImpl::DoSubscribe(const Subscription &sub) return subDbs.empty() && unsubDbs.empty(); } -void CloudServiceImpl::Execute(ExecutorPool::Task task) +void CloudServiceImpl::Execute(Tasks tasks) { - auto executor = executor_; - if (executor == nullptr) { - return; + for (auto &task : tasks) { + auto executor = executor_; + if (executor == nullptr) { + return; + } + executor->Execute(std::move(task)); } - executor->Execute(std::move(task)); } } // namespace OHOS::CloudData \ No newline at end of file diff --git a/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.h b/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.h index 35121c5762f8498ff9619c4b497ace2216aa3839..9d900cb98de9cc772114adca2bf4fd5cdeac896b 100644 --- a/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.h +++ b/datamgr_service/services/distributeddataservice/service/cloud/cloud_service_impl.h @@ -39,7 +39,6 @@ public: int32_t OnUserChange(uint32_t code, const std::string &user, const std::string &account) override; private: - static const inline int USER_ID = 0; class Factory { public: Factory() noexcept; @@ -53,13 +52,23 @@ private: using SchemaMeta = DistributedData::SchemaMeta; using Event = DistributedData::Event; using Subscription = DistributedData::Subscription; + using Work = bool (CloudServiceImpl::*)(int32_t); + using Tasks = std::vector; + enum AsyncWork : int32_t { + WORK_SUB = 0, + WORK_CLOUD_INFO_UPDATE, + WORK_SCHEMA_UPDATE, + WORK_BUTT, + }; + + static constexpr int32_t SYSTEM_USER = 0; static constexpr int32_t RETRY_TIMES = 10; static constexpr int32_t RETRY_INTERVAL = 30; static constexpr int32_t EXPIRE_INTERVAL = 7 * 24; // 7 day - void UpdateCloudInfo(CloudInfo &cloudInfo); - void AddSchema(CloudInfo &cloudInfo); + bool UpdateCloudInfo(int32_t user); + bool UpdateSchema(int32_t user); SchemaMeta GetSchemaMata(int32_t userId, const std::string &bundleName, int32_t instanceId); StoreMetaData GetStoreMata(int32_t userId, const std::string &bundleName, const std::string &storeName, int32_t instanceId); @@ -67,12 +76,13 @@ private: int32_t GetCloudInfoFromMeta(CloudInfo &cloudInfo); int32_t GetCloudInfoFromServer(CloudInfo &cloudInfo); int32_t GetAppSchema(int32_t user, const std::string &bundleName, SchemaMeta &schemaMeta); - void FeatureInit(); void GetSchema(const Event &event); - ExecutorPool::Task GetCloudTask(int32_t retry, int32_t user); - void Execute(ExecutorPool::Task task); - bool DoSubscribe(const Subscription &sub); + Tasks GetCloudTask(int32_t retry, int32_t user, const std::initializer_list &works = {}); + ExecutorPool::Task GenTask(int32_t retry, int32_t user, AsyncWork work); + void Execute(Tasks tasks); + bool DoSubscribe(int32_t user); std::shared_ptr executor_; + static const Work HANDLERS[WORK_BUTT]; }; } // namespace OHOS::DistributedData diff --git a/datamgr_service/services/distributeddataservice/service/rdb/rdb_watcher.cpp b/datamgr_service/services/distributeddataservice/service/rdb/rdb_watcher.cpp index 01572668fe1ae78a84267ee25e22145718de26da..74e563b215a72dafa912ec659dee41527a572979 100644 --- a/datamgr_service/services/distributeddataservice/service/rdb/rdb_watcher.cpp +++ b/datamgr_service/services/distributeddataservice/service/rdb/rdb_watcher.cpp @@ -21,7 +21,7 @@ namespace OHOS::DistributedRdb { using namespace DistributedData; -using Err = DistributedData::GeneralError; +using Error = DistributedData::GeneralError; RdbWatcher::RdbWatcher(RdbServiceImpl *rdbService, uint32_t tokenId, const std::string &storeName) : rdbService_(rdbService), tokenId_(tokenId), storeName_(storeName) { @@ -30,14 +30,14 @@ RdbWatcher::RdbWatcher(RdbServiceImpl *rdbService, uint32_t tokenId, const std:: int32_t RdbWatcher::OnChange(Origin origin, const std::string &id) { if (rdbService_ == nullptr) { - return Err::E_ERROR; + return Error::E_ERROR; } rdbService_->OnChange(tokenId_, storeName_); - return Err::E_OK; + return Error::E_OK; } int32_t RdbWatcher::OnChange(Origin origin, const std::string &id, const std::vector &values) { - return Err::E_NOT_SUPPORT; + return Error::E_NOT_SUPPORT; } } // namespace OHOS::DistributedRdb diff --git a/kv_store/frameworks/jskitsimpl/distributeddata/include/js_util.h b/kv_store/frameworks/jskitsimpl/distributeddata/include/js_util.h index 9e3d9afbfa00ec35beeef3c16c49c4e63e755b5d..83e3f61d42560a239f4baaeca83cbd047a4e8ccc 100644 --- a/kv_store/frameworks/jskitsimpl/distributeddata/include/js_util.h +++ b/kv_store/frameworks/jskitsimpl/distributeddata/include/js_util.h @@ -160,23 +160,9 @@ public: static inline napi_status GetNamedProperty( napi_env env, napi_value in, const std::string& prop, T& value, bool optional = false) { - bool hasProp = false; - napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp); - if (status != napi_ok) { - return napi_generic_failure; - } - if (!hasProp) { - return optional ? napi_ok : napi_generic_failure; - } - napi_value inner = nullptr; - status = napi_get_named_property(env, in, prop.c_str(), &inner); - if (status != napi_ok || inner == nullptr) { - return napi_generic_failure; - } - if (optional && JSUtil::IsNull(env, inner)) { - return napi_ok; - } - return GetValue(env, inner, value); + napi_status status; + napi_value inner = GetInnerValue(env, in, prop, optional, status); + return (inner == nullptr) ? status : GetValue(env, inner, value); }; /* napi_define_class wrapper */ @@ -200,6 +186,8 @@ private: TUPLE_VALUE, TUPLE_SIZE }; + static napi_value GetInnerValue( + napi_env env, napi_value in, const std::string& prop, bool optional, napi_status &out); }; } // namespace OHOS::DistributedData #endif // OHOS_JS_UTIL_H diff --git a/kv_store/frameworks/jskitsimpl/distributeddata/src/js_util.cpp b/kv_store/frameworks/jskitsimpl/distributeddata/src/js_util.cpp index f4133e01d752312b4d7fa90e3c6361b5e2023b6b..a4360b0343de929620fe63f4d22242817e55f69e 100644 --- a/kv_store/frameworks/jskitsimpl/distributeddata/src/js_util.cpp +++ b/kv_store/frameworks/jskitsimpl/distributeddata/src/js_util.cpp @@ -1146,4 +1146,30 @@ napi_status JSUtil::GetValue(napi_env env, napi_value in, ContextParam ¶m) } return napi_ok; } + +napi_value JSUtil::GetInnerValue( + napi_env env, napi_value in, const std::string& prop, bool optional, napi_status &out) +{ + bool hasProp = false; + napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp); + if (status != napi_ok) { + out = napi_generic_failure; + return nullptr; + } + if (!hasProp) { + out = optional ? napi_ok : napi_generic_failure; + return nullptr; + } + napi_value inner = nullptr; + status = napi_get_named_property(env, in, prop.c_str(), &inner); + if (status != napi_ok || inner == nullptr) { + out = napi_generic_failure; + return nullptr; + } + if (optional && JSUtil::IsNull(env, inner)) { + out = napi_ok; + return nullptr; + } + return inner; +} } // namespace OHOS::DistributedData diff --git a/kv_store/frameworks/jskitsimpl/distributedkvstore/include/js_util.h b/kv_store/frameworks/jskitsimpl/distributedkvstore/include/js_util.h index 74194aee2ea8018ed16d02a6254cf61eefd2b3f4..265576b97ef089c2338a16d2ca57847e2fd3211b 100644 --- a/kv_store/frameworks/jskitsimpl/distributedkvstore/include/js_util.h +++ b/kv_store/frameworks/jskitsimpl/distributedkvstore/include/js_util.h @@ -177,26 +177,12 @@ public: static StatusMsg GetCurrentAbilityParam(napi_env env, ContextParam ¶m); /* napi_get_named_property wrapper */ template - static inline napi_status GetNamedProperty( + static napi_status GetNamedProperty( napi_env env, napi_value in, const std::string& prop, T& value, bool optional = false) { - bool hasProp = false; - napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp); - if (status != napi_ok) { - return napi_generic_failure; - } - if (!hasProp) { - return optional ? napi_ok : napi_generic_failure; - } - napi_value inner = nullptr; - status = napi_get_named_property(env, in, prop.c_str(), &inner); - if (status != napi_ok || inner == nullptr) { - return napi_generic_failure; - } - if (optional && JSUtil::IsNull(env, inner)) { - return napi_ok; - } - return GetValue(env, inner, value); + napi_status status; + napi_value inner = GetInnerValue(env, in, prop, optional, status); + return (inner == nullptr) ? StatusMsg(status) : GetValue(env, inner, value); }; /* napi_define_class wrapper */ @@ -223,6 +209,8 @@ private: TUPLE_SIZE }; static napi_status GetLevel(int32_t level, int32_t &out); + static napi_value GetInnerValue( + napi_env env, napi_value in, const std::string& prop, bool optional, napi_status &out); }; } // namespace OHOS::DistributedKVStore #endif // OHOS_JS_UTIL_H diff --git a/kv_store/frameworks/jskitsimpl/distributedkvstore/src/js_util.cpp b/kv_store/frameworks/jskitsimpl/distributedkvstore/src/js_util.cpp index b4881dd0c637a11ecb12a0a83d4fa34dd6792b4c..43adcc66fe451676ec356fb261588b5ac5a3df83 100644 --- a/kv_store/frameworks/jskitsimpl/distributedkvstore/src/js_util.cpp +++ b/kv_store/frameworks/jskitsimpl/distributedkvstore/src/js_util.cpp @@ -1023,6 +1023,32 @@ napi_status JSUtil::GetLevel(int32_t level, int32_t &out) } } +napi_value JSUtil::GetInnerValue( + napi_env env, napi_value in, const std::string& prop, bool optional, napi_status &out) +{ + bool hasProp = false; + napi_status status = napi_has_named_property(env, in, prop.c_str(), &hasProp); + if (status != napi_ok) { + out = napi_generic_failure; + return nullptr; + } + if (!hasProp) { + out = optional ? napi_ok : napi_generic_failure; + return nullptr; + } + napi_value inner = nullptr; + status = napi_get_named_property(env, in, prop.c_str(), &inner); + if (status != napi_ok || inner == nullptr) { + out = napi_generic_failure; + return nullptr; + } + if (optional && JSUtil::IsNull(env, inner)) { + out = napi_ok; + return nullptr; + } + return inner; +} + JSUtil::StatusMsg JSUtil::GetValue(napi_env env, napi_value inner, JsSchema*& out) { return JsSchema::ToJson(env, inner, out);