mirror of
https://gitee.com/openharmony/distributeddatamgr_datamgr_service
synced 2024-11-23 23:09:56 +00:00
!706 rdb目录切至database/rdb
Merge pull request !706 from zuojiangjiang/master
This commit is contained in:
commit
bd80635842
@ -188,7 +188,7 @@ bool ITypesUtil::Marshalling(const DistributedRdb::RdbSyncerParam ¶m, Messag
|
|||||||
ZLOGE("RdbStoreParam write bundle name failed");
|
ZLOGE("RdbStoreParam write bundle name failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!parcel.WriteString(param.relativePath_)) {
|
if (!parcel.WriteString(param.hapName_)) {
|
||||||
ZLOGE("RdbStoreParam write directory failed");
|
ZLOGE("RdbStoreParam write directory failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -196,7 +196,11 @@ bool ITypesUtil::Marshalling(const DistributedRdb::RdbSyncerParam ¶m, Messag
|
|||||||
ZLOGE("RdbStoreParam write store name failed");
|
ZLOGE("RdbStoreParam write store name failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!parcel.WriteString(param.encryptLevel_)) {
|
if (!parcel.WriteInt32(param.area_)) {
|
||||||
|
ZLOGE("RdbStoreParam write security level failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!parcel.WriteInt32(param.level_)) {
|
||||||
ZLOGE("RdbStoreParam write security level failed");
|
ZLOGE("RdbStoreParam write security level failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -217,7 +221,7 @@ bool ITypesUtil::Unmarshalling(DistributedRdb::RdbSyncerParam ¶m, MessagePar
|
|||||||
ZLOGE("RdbStoreParam read bundle name failed");
|
ZLOGE("RdbStoreParam read bundle name failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!parcel.ReadString(param.relativePath_)) {
|
if (!parcel.ReadString(param.hapName_)) {
|
||||||
ZLOGE("RdbStoreParam read directory failed");
|
ZLOGE("RdbStoreParam read directory failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -225,7 +229,11 @@ bool ITypesUtil::Unmarshalling(DistributedRdb::RdbSyncerParam ¶m, MessagePar
|
|||||||
ZLOGE("RdbStoreParam read store name failed");
|
ZLOGE("RdbStoreParam read store name failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!parcel.ReadString(param.encryptLevel_)) {
|
if (!parcel.ReadInt32(param.area_)) {
|
||||||
|
ZLOGE("RdbStoreParam read security level failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!parcel.ReadInt32(param.level_)) {
|
||||||
ZLOGE("RdbStoreParam read security level failed");
|
ZLOGE("RdbStoreParam read security level failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -293,7 +293,6 @@ HWTEST_F(DeviceKvStoreTest, GetPrefixQueryEntriesAndResultSet, TestSize.Level1)
|
|||||||
|
|
||||||
// prepare 10
|
// prepare 10
|
||||||
size_t sum = 10;
|
size_t sum = 10;
|
||||||
int sumGet = 10;
|
|
||||||
std::string prefix = "prefix_";
|
std::string prefix = "prefix_";
|
||||||
for (size_t i = 0; i < sum; i++) {
|
for (size_t i = 0; i < sum; i++) {
|
||||||
kvStore_->Put({prefix + std::to_string(i)}, {std::to_string(i)});
|
kvStore_->Put({prefix + std::to_string(i)}, {std::to_string(i)});
|
||||||
@ -301,10 +300,10 @@ HWTEST_F(DeviceKvStoreTest, GetPrefixQueryEntriesAndResultSet, TestSize.Level1)
|
|||||||
|
|
||||||
DataQuery dataQuery;
|
DataQuery dataQuery;
|
||||||
dataQuery.KeyPrefix(GetKey(prefix));
|
dataQuery.KeyPrefix(GetKey(prefix));
|
||||||
dataQuery.Limit(10, 0);
|
int sumGet = 0;
|
||||||
kvStore_->GetCount(dataQuery, sumGet);
|
kvStore_->GetCount(dataQuery, sumGet);
|
||||||
EXPECT_EQ(sumGet, sum) << "count is not equal 10.";
|
EXPECT_EQ(sumGet, sum) << "count is not equal 10.";
|
||||||
|
dataQuery.Limit(10, 0);
|
||||||
std::vector<Entry> results;
|
std::vector<Entry> results;
|
||||||
kvStore_->GetEntries(dataQuery, results);
|
kvStore_->GetEntries(dataQuery, results);
|
||||||
EXPECT_EQ(results.size(), sum) << "entries size is not equal 10.";
|
EXPECT_EQ(results.size(), sum) << "entries size is not equal 10.";
|
||||||
@ -334,6 +333,59 @@ HWTEST_F(DeviceKvStoreTest, GetPrefixQueryEntriesAndResultSet, TestSize.Level1)
|
|||||||
EXPECT_EQ(status, Status::SUCCESS) << "Close resultSet failed.";
|
EXPECT_EQ(status, Status::SUCCESS) << "Close resultSet failed.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: GetInKeysQueryResultSet
|
||||||
|
* @tc.desc: get entries and result set by prefix query.
|
||||||
|
* @tc.type: FUNC
|
||||||
|
* @tc.require: I5DE2A
|
||||||
|
* @tc.author: Sven Wang
|
||||||
|
*/
|
||||||
|
HWTEST_F(DeviceKvStoreTest, GetInKeysQueryResultSet, TestSize.Level1)
|
||||||
|
{
|
||||||
|
EXPECT_NE(kvStore_, nullptr) << "kvStore is nullptr.";
|
||||||
|
if (options_.baseDir.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepare 10
|
||||||
|
size_t sum = 10;
|
||||||
|
|
||||||
|
std::string prefix = "prefix_";
|
||||||
|
for (size_t i = 0; i < sum; i++) {
|
||||||
|
kvStore_->Put({prefix + std::to_string(i)}, {std::to_string(i)});
|
||||||
|
}
|
||||||
|
|
||||||
|
DataQuery dataQuery;
|
||||||
|
dataQuery.InKeys({"prefix_0", "prefix_1", "prefix_3", "prefix_9"});
|
||||||
|
int sumGet = 0;
|
||||||
|
kvStore_->GetCount(dataQuery, sumGet);
|
||||||
|
EXPECT_EQ(sumGet, 4) << "count is not equal 4.";
|
||||||
|
dataQuery.Limit(10, 0);
|
||||||
|
std::shared_ptr<KvStoreResultSet> resultSet;
|
||||||
|
Status status = kvStore_->GetResultSet(dataQuery, resultSet);
|
||||||
|
EXPECT_EQ(status, Status::SUCCESS);
|
||||||
|
EXPECT_EQ(resultSet->GetCount(), sumGet) << "resultSet size is not equal 4.";
|
||||||
|
resultSet->IsFirst();
|
||||||
|
resultSet->IsAfterLast();
|
||||||
|
resultSet->IsBeforeFirst();
|
||||||
|
resultSet->MoveToPosition(1);
|
||||||
|
resultSet->IsLast();
|
||||||
|
resultSet->MoveToPrevious();
|
||||||
|
resultSet->MoveToNext();
|
||||||
|
resultSet->MoveToLast();
|
||||||
|
resultSet->MoveToFirst();
|
||||||
|
resultSet->GetPosition();
|
||||||
|
Entry entry;
|
||||||
|
resultSet->GetEntry(entry);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sum; i++) {
|
||||||
|
kvStore_->Delete({GetKey(prefix + std::to_string(i))});
|
||||||
|
}
|
||||||
|
|
||||||
|
status = kvStore_->CloseResultSet(resultSet);
|
||||||
|
EXPECT_EQ(status, Status::SUCCESS) << "Close resultSet failed.";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @tc.name: GetPrefixEntriesAndResultSet
|
* @tc.name: GetPrefixEntriesAndResultSet
|
||||||
* @tc.desc: get entries and result set by prefix.
|
* @tc.desc: get entries and result set by prefix.
|
||||||
|
@ -34,11 +34,11 @@ enum RdbDistributedType {
|
|||||||
|
|
||||||
struct RdbSyncerParam {
|
struct RdbSyncerParam {
|
||||||
std::string bundleName_;
|
std::string bundleName_;
|
||||||
std::string relativePath_;
|
std::string hapName_;
|
||||||
std::string storeName_;
|
std::string storeName_;
|
||||||
std::string encryptLevel_;
|
int32_t area_ = 0;
|
||||||
std::string realPath_;
|
int32_t level_ = 0;
|
||||||
int type_ = RDB_DEVICE_COLLABORATION;
|
int32_t type_ = RDB_DEVICE_COLLABORATION;
|
||||||
bool isAutoSync_ = false;
|
bool isAutoSync_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ std::string DirectoryManager::GetStore(const StoreMetaData &metaData) const
|
|||||||
return "kvdb";
|
return "kvdb";
|
||||||
}
|
}
|
||||||
// rdb use empty session
|
// rdb use empty session
|
||||||
return "";
|
return "rdb";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DirectoryManager::GetSecurity(const StoreMetaData &metaData) const
|
std::string DirectoryManager::GetSecurity(const StoreMetaData &metaData) const
|
||||||
|
@ -121,28 +121,10 @@ bool RdbServiceImpl::CheckAccess(const RdbSyncerParam ¶m)
|
|||||||
storeInfo.uid = GetCallingUid();
|
storeInfo.uid = GetCallingUid();
|
||||||
storeInfo.tokenId = GetCallingTokenID();
|
storeInfo.tokenId = GetCallingTokenID();
|
||||||
storeInfo.bundleName = param.bundleName_;
|
storeInfo.bundleName = param.bundleName_;
|
||||||
storeInfo.storeId = param.storeName_;
|
storeInfo.storeId = RdbSyncer::RemoveSuffix(param.storeName_);
|
||||||
return !CheckerManager::GetInstance().GetAppId(storeInfo).empty();
|
return !CheckerManager::GetInstance().GetAppId(storeInfo).empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
RdbSyncerParam RdbServiceImpl::ToServiceParam(const RdbSyncerParam ¶m)
|
|
||||||
{
|
|
||||||
ZLOGI("%{public}s", param.relativePath_.c_str());
|
|
||||||
auto serviceParam = param;
|
|
||||||
Security::AccessToken::AccessTokenID callerToken = GetCallingTokenID();
|
|
||||||
auto accessToken = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
|
|
||||||
if (accessToken == Security::AccessToken::TOKEN_NATIVE || accessToken == Security::AccessToken::TOKEN_SHELL) {
|
|
||||||
ZLOGD("native access");
|
|
||||||
serviceParam.realPath_ = "/data/service/el1/public/database/" + param.bundleName_ + '/' + param.relativePath_;
|
|
||||||
} else if (accessToken == Security::AccessToken::TOKEN_HAP) {
|
|
||||||
ZLOGD("hap access %{public}s", param.encryptLevel_.c_str());
|
|
||||||
auto userId = AccountDelegate::GetInstance()->GetDeviceAccountIdByUID(GetCallingUid());
|
|
||||||
serviceParam.realPath_ = "/data/app/" + param.encryptLevel_ + '/' + userId + "/database/" +
|
|
||||||
param.bundleName_ + '/' + param.relativePath_;
|
|
||||||
}
|
|
||||||
return serviceParam;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string RdbServiceImpl::ObtainDistributedTableName(const std::string &device, const std::string &table)
|
std::string RdbServiceImpl::ObtainDistributedTableName(const std::string &device, const std::string &table)
|
||||||
{
|
{
|
||||||
ZLOGI("device=%{public}s table=%{public}s", Anonymous::Change(device).c_str(), table.c_str());
|
ZLOGI("device=%{public}s table=%{public}s", Anonymous::Change(device).c_str(), table.c_str());
|
||||||
@ -220,9 +202,9 @@ std::shared_ptr<RdbSyncer> RdbServiceImpl::GetRdbSyncer(const RdbSyncerParam &pa
|
|||||||
pid_t uid = GetCallingUid();
|
pid_t uid = GetCallingUid();
|
||||||
uint32_t tokenId = GetCallingTokenID();
|
uint32_t tokenId = GetCallingTokenID();
|
||||||
std::shared_ptr<RdbSyncer> syncer;
|
std::shared_ptr<RdbSyncer> syncer;
|
||||||
|
|
||||||
syncers_.Compute(pid, [this, ¶m, pid, uid, tokenId, &syncer] (const auto& key, StoreSyncersType& syncers) {
|
syncers_.Compute(pid, [this, ¶m, pid, uid, tokenId, &syncer] (const auto& key, StoreSyncersType& syncers) {
|
||||||
auto it = syncers.find(param.storeName_);
|
auto storeId = RdbSyncer::RemoveSuffix(param.storeName_);
|
||||||
|
auto it = syncers.find(storeId);
|
||||||
if (it != syncers.end()) {
|
if (it != syncers.end()) {
|
||||||
syncer = it->second;
|
syncer = it->second;
|
||||||
timer_.Unregister(syncer->GetTimerId());
|
timer_.Unregister(syncer->GetTimerId());
|
||||||
@ -238,12 +220,11 @@ std::shared_ptr<RdbSyncer> RdbServiceImpl::GetRdbSyncer(const RdbSyncerParam &pa
|
|||||||
ZLOGE("no available syncer");
|
ZLOGE("no available syncer");
|
||||||
return !syncers.empty();
|
return !syncers.empty();
|
||||||
}
|
}
|
||||||
auto syncer_ = std::make_shared<RdbSyncer>(ToServiceParam(param),
|
auto syncer_ = std::make_shared<RdbSyncer>(param, new (std::nothrow) RdbStoreObserverImpl(this, pid));
|
||||||
new (std::nothrow) RdbStoreObserverImpl(this, pid));
|
|
||||||
if (syncer_->Init(pid, uid, tokenId) != 0) {
|
if (syncer_->Init(pid, uid, tokenId) != 0) {
|
||||||
return !syncers.empty();
|
return !syncers.empty();
|
||||||
}
|
}
|
||||||
syncers[param.storeName_] = syncer_;
|
syncers[storeId] = syncer_;
|
||||||
syncer = syncer_;
|
syncer = syncer_;
|
||||||
syncerNum_++;
|
syncerNum_++;
|
||||||
uint32_t timerId = timer_.Register([this, syncer]() { SyncerTimeout(syncer); }, SYNCER_TIMEOUT, true);
|
uint32_t timerId = timer_.Register([this, syncer]() { SyncerTimeout(syncer); }, SYNCER_TIMEOUT, true);
|
||||||
@ -334,10 +315,11 @@ std::string RdbServiceImpl::GenIdentifier(const RdbSyncerParam ¶m)
|
|||||||
{
|
{
|
||||||
pid_t uid = GetCallingUid();
|
pid_t uid = GetCallingUid();
|
||||||
uint32_t token = GetCallingTokenID();
|
uint32_t token = GetCallingTokenID();
|
||||||
CheckerManager::StoreInfo storeInfo{ uid, token, param.bundleName_, param.storeName_ };
|
auto storeId = RdbSyncer::RemoveSuffix(param.storeName_);
|
||||||
|
CheckerManager::StoreInfo storeInfo{ uid, token, param.bundleName_, storeId};
|
||||||
std::string userId = AccountDelegate::GetInstance()->GetDeviceAccountIdByUID(uid);
|
std::string userId = AccountDelegate::GetInstance()->GetDeviceAccountIdByUID(uid);
|
||||||
std::string appId = CheckerManager::GetInstance().GetAppId(storeInfo);
|
std::string appId = CheckerManager::GetInstance().GetAppId(storeInfo);
|
||||||
std::string identifier = RelationalStoreManager::GetRelationalStoreIdentifier(userId, appId, param.storeName_);
|
std::string identifier = RelationalStoreManager::GetRelationalStoreIdentifier(userId, appId, storeId);
|
||||||
return TransferStringToHex(identifier);
|
return TransferStringToHex(identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,8 +59,6 @@ private:
|
|||||||
|
|
||||||
bool CheckAccess(const RdbSyncerParam& param);
|
bool CheckAccess(const RdbSyncerParam& param);
|
||||||
|
|
||||||
RdbSyncerParam ToServiceParam(const RdbSyncerParam& param);
|
|
||||||
|
|
||||||
bool ResolveAutoLaunch(const std::string &identifier, DistributedDB::AutoLaunchParam ¶m);
|
bool ResolveAutoLaunch(const std::string &identifier, DistributedDB::AutoLaunchParam ¶m);
|
||||||
|
|
||||||
void SyncerTimeout(std::shared_ptr<RdbSyncer> syncer);
|
void SyncerTimeout(std::shared_ptr<RdbSyncer> syncer);
|
||||||
|
@ -12,24 +12,26 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define LOG_TAG "RdbSyncer"
|
#define LOG_TAG "RdbSyncer"
|
||||||
|
|
||||||
#include "rdb_syncer.h"
|
#include "rdb_syncer.h"
|
||||||
|
|
||||||
|
#include "accesstoken_kit.h"
|
||||||
#include "account/account_delegate.h"
|
#include "account/account_delegate.h"
|
||||||
#include "checker/checker_manager.h"
|
#include "checker/checker_manager.h"
|
||||||
#include "log_print.h"
|
#include "directory_manager.h"
|
||||||
#include "metadata/store_meta_data.h"
|
|
||||||
#include "metadata/meta_data_manager.h"
|
|
||||||
#include "kvstore_utils.h"
|
#include "kvstore_utils.h"
|
||||||
|
#include "log_print.h"
|
||||||
|
#include "metadata/meta_data_manager.h"
|
||||||
|
#include "metadata/store_meta_data.h"
|
||||||
|
#include "types.h"
|
||||||
|
#include "utils/constant.h"
|
||||||
|
#include "utils/converter.h"
|
||||||
|
|
||||||
using OHOS::DistributedKv::KvStoreUtils;
|
using OHOS::DistributedKv::KvStoreUtils;
|
||||||
using OHOS::DistributedKv::AccountDelegate;
|
using OHOS::DistributedKv::AccountDelegate;
|
||||||
using OHOS::DistributedData::StoreMetaData;
|
|
||||||
using OHOS::DistributedData::MetaDataManager;
|
|
||||||
using OHOS::AppDistributedKv::CommunicationProvider;
|
using OHOS::AppDistributedKv::CommunicationProvider;
|
||||||
|
using namespace OHOS::Security::AccessToken;
|
||||||
|
using namespace OHOS::DistributedData;
|
||||||
namespace OHOS::DistributedRdb {
|
namespace OHOS::DistributedRdb {
|
||||||
RdbSyncer::RdbSyncer(const RdbSyncerParam& param, RdbStoreObserverImpl* observer)
|
RdbSyncer::RdbSyncer(const RdbSyncerParam& param, RdbStoreObserverImpl* observer)
|
||||||
: param_(param), observer_(observer)
|
: param_(param), observer_(observer)
|
||||||
@ -84,14 +86,9 @@ std::string RdbSyncer::GetAppId() const
|
|||||||
return DistributedData::CheckerManager::GetInstance().GetAppId({ uid_, token_, param_.bundleName_ });
|
return DistributedData::CheckerManager::GetInstance().GetAppId({ uid_, token_, param_.bundleName_ });
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string RdbSyncer::GetPath() const
|
|
||||||
{
|
|
||||||
return param_.realPath_;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string RdbSyncer::GetStoreId() const
|
std::string RdbSyncer::GetStoreId() const
|
||||||
{
|
{
|
||||||
return param_.storeName_;
|
return RemoveSuffix(param_.storeName_);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t RdbSyncer::Init(pid_t pid, pid_t uid, uint32_t token)
|
int32_t RdbSyncer::Init(pid_t pid, pid_t uid, uint32_t token)
|
||||||
@ -100,43 +97,63 @@ int32_t RdbSyncer::Init(pid_t pid, pid_t uid, uint32_t token)
|
|||||||
pid_ = pid;
|
pid_ = pid;
|
||||||
uid_ = uid;
|
uid_ = uid;
|
||||||
token_ = token;
|
token_ = token;
|
||||||
if (CreateMetaData() != RDB_OK) {
|
StoreMetaData meta;
|
||||||
|
if (CreateMetaData(meta) != RDB_OK) {
|
||||||
ZLOGE("create meta data failed");
|
ZLOGE("create meta data failed");
|
||||||
return RDB_ERROR;
|
return RDB_ERROR;
|
||||||
}
|
}
|
||||||
|
if (InitDBDelegate(meta) != RDB_OK) {
|
||||||
|
ZLOGE("delegate is nullptr");
|
||||||
|
return RDB_ERROR;
|
||||||
|
}
|
||||||
ZLOGI("success");
|
ZLOGI("success");
|
||||||
return RDB_OK;
|
return RDB_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t RdbSyncer::CreateMetaData()
|
int32_t RdbSyncer::CreateMetaData(StoreMetaData &meta)
|
||||||
{
|
{
|
||||||
StoreMetaData newMeta;
|
meta.uid = uid_;
|
||||||
newMeta.storeType = static_cast<int32_t>(RDB_DEVICE_COLLABORATION);
|
meta.tokenId = token_;
|
||||||
newMeta.appId = GetAppId();
|
meta.instanceId = GetInstIndex(token_, param_.bundleName_);
|
||||||
newMeta.appType = "harmony";
|
meta.bundleName = param_.bundleName_;
|
||||||
newMeta.bundleName = GetBundleName();
|
meta.deviceId = CommunicationProvider::GetInstance().GetLocalDevice().uuid;
|
||||||
newMeta.deviceId = CommunicationProvider::GetInstance().GetLocalDevice().uuid;
|
meta.storeId = RemoveSuffix(param_.storeName_);
|
||||||
newMeta.storeId = GetStoreId();
|
meta.user = AccountDelegate::GetInstance()->GetDeviceAccountIdByUID(uid_);
|
||||||
newMeta.uid = uid_;
|
meta.storeType = param_.type_;
|
||||||
newMeta.tokenId = token_;
|
meta.securityLevel = param_.level_;
|
||||||
newMeta.user = AccountDelegate::GetInstance()->GetDeviceAccountIdByUID(uid_);
|
meta.area = param_.area_;
|
||||||
newMeta.account = AccountDelegate::GetInstance()->GetCurrentAccountId();
|
meta.appId = CheckerManager::GetInstance().GetAppId(Converter::ConvertToStoreInfo(meta));
|
||||||
newMeta.dataDir = GetPath();
|
meta.appType = "harmony";
|
||||||
|
meta.hapName = param_.hapName_;
|
||||||
|
meta.dataDir = DirectoryManager::GetInstance().GetStorePath(meta) + "/" + param_.storeName_;
|
||||||
|
meta.account = AccountDelegate::GetInstance()->GetCurrentAccountId();
|
||||||
|
|
||||||
auto metaKey = StoreMetaData::GetKey({ newMeta.user, "default", newMeta.bundleName, newMeta.storeId });
|
StoreMetaData old;
|
||||||
StoreMetaData oldMeta;
|
bool isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), old);
|
||||||
if (MetaDataManager::GetInstance().LoadMeta(metaKey, oldMeta)) {
|
if (isCreated && (old.storeType != meta.storeType || Constant::NotEqual(old.isEncrypt, meta.isEncrypt) ||
|
||||||
if (newMeta == oldMeta) {
|
old.area != meta.area)) {
|
||||||
ZLOGI("ignore same meta");
|
ZLOGE("meta bundle:%{public}s store:%{public}s type:%{public}d->%{public}d encrypt:%{public}d->%{public}d "
|
||||||
return RDB_OK;
|
"area:%{public}d->%{public}d",
|
||||||
}
|
meta.bundleName.c_str(), meta.storeId.c_str(), old.storeType, meta.storeType, old.isEncrypt,
|
||||||
|
meta.isEncrypt, old.area, meta.area);
|
||||||
|
return RDB_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto saved = MetaDataManager::GetInstance().SaveMeta(metaKey, newMeta);
|
auto saved = MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), meta);
|
||||||
return saved ? RDB_OK : RDB_ERROR;
|
return saved ? RDB_OK : RDB_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
DistributedDB::RelationalStoreDelegate* RdbSyncer::GetDelegate()
|
std::string RdbSyncer::RemoveSuffix(const std::string& name)
|
||||||
|
{
|
||||||
|
std::string suffix(".db");
|
||||||
|
auto pos = name.rfind(suffix);
|
||||||
|
if (pos == std::string::npos || pos < name.length() - suffix.length()) {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
return std::string(name, 0, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t RdbSyncer::InitDBDelegate(const StoreMetaData &meta)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
if (manager_ == nullptr) {
|
if (manager_ == nullptr) {
|
||||||
@ -144,21 +161,45 @@ DistributedDB::RelationalStoreDelegate* RdbSyncer::GetDelegate()
|
|||||||
}
|
}
|
||||||
if (manager_ == nullptr) {
|
if (manager_ == nullptr) {
|
||||||
ZLOGE("malloc manager failed");
|
ZLOGE("malloc manager failed");
|
||||||
return nullptr;
|
return RDB_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (delegate_ == nullptr) {
|
if (delegate_ == nullptr) {
|
||||||
DistributedDB::RelationalStoreDelegate::Option option;
|
DistributedDB::RelationalStoreDelegate::Option option;
|
||||||
option.observer = observer_;
|
option.observer = observer_;
|
||||||
ZLOGI("path=%{public}s storeId=%{public}s", GetPath().c_str(), GetStoreId().c_str());
|
std::string fileName = meta.dataDir;
|
||||||
DistributedDB::DBStatus status = manager_->OpenStore(GetPath(), GetStoreId(), option, delegate_);
|
ZLOGI("path=%{public}s storeId=%{public}s", fileName.c_str(), meta.storeId.c_str());
|
||||||
|
auto status = manager_->OpenStore(fileName, meta.storeId, option, delegate_);
|
||||||
if (status != DistributedDB::DBStatus::OK) {
|
if (status != DistributedDB::DBStatus::OK) {
|
||||||
ZLOGE("open store failed status=%{public}d", status);
|
ZLOGE("open store failed status=%{public}d", status);
|
||||||
return nullptr;
|
return RDB_ERROR;
|
||||||
}
|
}
|
||||||
ZLOGI("open store success");
|
ZLOGI("open store success");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return RDB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t RdbSyncer::GetInstIndex(uint32_t tokenId, const std::string &bundleName) const
|
||||||
|
{
|
||||||
|
if (AccessTokenKit::GetTokenTypeFlag(tokenId) != TOKEN_HAP) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
HapTokenInfo tokenInfo;
|
||||||
|
tokenInfo.instIndex = -1;
|
||||||
|
int errCode = AccessTokenKit::GetHapTokenInfo(tokenId, tokenInfo);
|
||||||
|
if (errCode != RET_SUCCESS) {
|
||||||
|
ZLOGE("GetHapTokenInfo error:%{public}d, tokenId:0x%{public}x appId:%{public}s", errCode, tokenId,
|
||||||
|
bundleName.c_str());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return tokenInfo.instIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
DistributedDB::RelationalStoreDelegate* RdbSyncer::GetDelegate()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
return delegate_;
|
return delegate_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,15 +19,16 @@
|
|||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "rdb_types.h"
|
#include "metadata/store_meta_data.h"
|
||||||
#include "rdb_notifier.h"
|
#include "rdb_notifier.h"
|
||||||
#include "rdb_store_observer_impl.h"
|
#include "rdb_store_observer_impl.h"
|
||||||
#include "relational_store_manager.h"
|
#include "rdb_types.h"
|
||||||
#include "relational_store_delegate.h"
|
#include "relational_store_delegate.h"
|
||||||
|
#include "relational_store_manager.h"
|
||||||
namespace OHOS::DistributedRdb {
|
namespace OHOS::DistributedRdb {
|
||||||
class RdbSyncer {
|
class RdbSyncer {
|
||||||
public:
|
public:
|
||||||
|
using StoreMetaData = OHOS::DistributedData::StoreMetaData;
|
||||||
RdbSyncer(const RdbSyncerParam& param, RdbStoreObserverImpl* observer);
|
RdbSyncer(const RdbSyncerParam& param, RdbStoreObserverImpl* observer);
|
||||||
~RdbSyncer() noexcept;
|
~RdbSyncer() noexcept;
|
||||||
|
|
||||||
@ -49,6 +50,7 @@ public:
|
|||||||
|
|
||||||
int32_t DoAsync(const SyncOption& option, const RdbPredicates& predicates, const SyncCallback& callback);
|
int32_t DoAsync(const SyncOption& option, const RdbPredicates& predicates, const SyncCallback& callback);
|
||||||
|
|
||||||
|
static std::string RemoveSuffix(const std::string& name);
|
||||||
private:
|
private:
|
||||||
std::string GetUserId() const;
|
std::string GetUserId() const;
|
||||||
|
|
||||||
@ -56,9 +58,10 @@ private:
|
|||||||
|
|
||||||
std::string GetAppId() const;
|
std::string GetAppId() const;
|
||||||
|
|
||||||
std::string GetPath() const;
|
int32_t CreateMetaData(StoreMetaData &meta);
|
||||||
|
int32_t InitDBDelegate(const StoreMetaData &meta);
|
||||||
|
|
||||||
int32_t CreateMetaData();
|
int32_t GetInstIndex(uint32_t tokenId, const std::string &bundleName) const;
|
||||||
|
|
||||||
DistributedDB::RelationalStoreDelegate* GetDelegate();
|
DistributedDB::RelationalStoreDelegate* GetDelegate();
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ HWTEST_F(DirectoryManagerTest, GetRDBBackupPath, TestSize.Level0)
|
|||||||
AccessTokenKit::GetHapTokenInfo(metaData.tokenId, tokenInfo);
|
AccessTokenKit::GetHapTokenInfo(metaData.tokenId, tokenInfo);
|
||||||
metaData.appId = tokenInfo.appID;
|
metaData.appId = tokenInfo.appID;
|
||||||
auto path = DirectoryManager::GetInstance().GetStoreBackupPath(metaData);
|
auto path = DirectoryManager::GetInstance().GetStoreBackupPath(metaData);
|
||||||
EXPECT_EQ(path, metaData.dataDir + "/backup");
|
EXPECT_EQ(path, metaData.dataDir + "/rdb/backup");
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @tc.name: GetKVDBBackupPath
|
* @tc.name: GetKVDBBackupPath
|
||||||
|
Loading…
Reference in New Issue
Block a user