• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "single_ver_data_sync_utils.h"
16 
17 #include <mutex>
18 #include "db_common.h"
19 #include "version.h"
20 #include "log_print.h"
21 #include "message.h"
22 namespace DistributedDB {
23 namespace {
FillPermissionCheckParam(const SyncGenericInterface * storage,int mode,PermissionCheckParam & param,uint8_t & flag)24 void FillPermissionCheckParam(const SyncGenericInterface* storage, int mode, PermissionCheckParam &param, uint8_t &flag)
25 {
26     param.appId = storage->GetDbProperties().GetStringProp(DBProperties::APP_ID, "");
27     param.userId = storage->GetDbProperties().GetStringProp(DBProperties::USER_ID, "");
28     param.storeId = storage->GetDbProperties().GetStringProp(DBProperties::STORE_ID, "");
29     param.instanceId = storage->GetDbProperties().GetIntProp(DBProperties::INSTANCE_ID, 0);
30     switch (mode) {
31         case SyncModeType::PUSH:
32             flag = CHECK_FLAG_RECEIVE;
33             break;
34         case SyncModeType::PULL:
35             flag = CHECK_FLAG_SEND;
36             break;
37         case SyncModeType::PUSH_AND_PULL:
38             flag = CHECK_FLAG_SEND | CHECK_FLAG_RECEIVE;
39             break;
40         default:
41             flag = CHECK_FLAG_RECEIVE;
42             break;
43     }
44 }
45 }
46 
QuerySyncCheck(const SingleVerSyncTaskContext * context,bool & isCheckStatus)47 int SingleVerDataSyncUtils::QuerySyncCheck(const SingleVerSyncTaskContext *context, bool &isCheckStatus)
48 {
49     if (context == nullptr) {
50         isCheckStatus = false;
51         return -E_INVALID_ARGS;
52     }
53     if (!context->IsQuerySync()) {
54         isCheckStatus = true;
55         return E_OK;
56     }
57     uint32_t version = std::min(context->GetRemoteSoftwareVersion(), SOFTWARE_VERSION_CURRENT);
58     // for 101 version, no need to do abilitySync, just send request to remote
59     if (version <= SOFTWARE_VERSION_RELEASE_1_0) {
60         isCheckStatus = true;
61         return E_OK;
62     }
63     if (version < SOFTWARE_VERSION_RELEASE_4_0) {
64         LOGE("[SingleVerDataSync] not support query sync when remote ver lower than 104");
65         isCheckStatus = false;
66         return E_OK;
67     }
68     if (version < SOFTWARE_VERSION_RELEASE_5_0 && !(context->GetQuery().IsQueryOnlyByKey())) {
69         LOGE("[SingleVerDataSync] remote version only support prefix key");
70         isCheckStatus = false;
71         return E_OK;
72     }
73     if (context->GetQuery().HasInKeys() && context->IsNotSupportAbility(SyncConfig::INKEYS_QUERY)) {
74         isCheckStatus = false;
75         return E_OK;
76     }
77     isCheckStatus = true;
78     return E_OK;
79 }
80 
AckMsgErrnoCheck(const SingleVerSyncTaskContext * context,const Message * message)81 int SingleVerDataSyncUtils::AckMsgErrnoCheck(const SingleVerSyncTaskContext *context, const Message *message)
82 {
83     if (context == nullptr || message == nullptr) {
84         return -E_INVALID_ARGS;
85     }
86     if (message->IsFeedbackError()) {
87         LOGE("[DataSync][AckMsgErrnoCheck] message errNo=%d", message->GetErrorNo());
88         return -static_cast<int>(message->GetErrorNo());
89     }
90     return E_OK;
91 }
92 
RequestQueryCheck(const DataRequestPacket * packet,SyncGenericInterface * storage)93 int SingleVerDataSyncUtils::RequestQueryCheck(const DataRequestPacket *packet, SyncGenericInterface *storage)
94 {
95     if (storage == nullptr || packet == nullptr) {
96         return -E_INVALID_ARGS;
97     }
98     if (SyncOperation::GetSyncType(packet->GetMode()) != SyncType::QUERY_SYNC_TYPE) {
99         return E_OK;
100     }
101     QuerySyncObject syncQuery = packet->GetQuery();
102     int errCode = storage->CheckAndInitQueryCondition(syncQuery);
103     if (errCode != E_OK) {
104         LOGE("[SingleVerDataSync] check sync query failed,errCode=%d", errCode);
105         return errCode;
106     }
107     return E_OK;
108 }
109 
IsPermitLocalDeviceRecvData(const std::string & deviceId,const SecurityOption & remoteSecOption)110 bool SingleVerDataSyncUtils::IsPermitLocalDeviceRecvData(const std::string &deviceId,
111     const SecurityOption &remoteSecOption)
112 {
113     return RuntimeContext::GetInstance()->CheckDeviceSecurityAbility(deviceId, remoteSecOption);
114 }
115 
IsPermitRemoteDeviceRecvData(const std::string & deviceId,const SecurityOption & remoteSecOption,SyncGenericInterface * storage)116 bool SingleVerDataSyncUtils::IsPermitRemoteDeviceRecvData(const std::string &deviceId,
117     const SecurityOption &remoteSecOption, SyncGenericInterface *storage)
118 {
119     if (storage == nullptr) {
120         return -E_INVALID_ARGS;
121     }
122     SecurityOption localSecOption;
123     if (remoteSecOption.securityLabel == NOT_SURPPORT_SEC_CLASSIFICATION) {
124         return true;
125     }
126     int errCode = storage->GetSecurityOption(localSecOption);
127     if (errCode == -E_NOT_SUPPORT) {
128         return true;
129     }
130     return RuntimeContext::GetInstance()->CheckDeviceSecurityAbility(deviceId, localSecOption);
131 }
132 
TransDbDataItemToSendDataItem(const std::string & localHashName,std::vector<SendDataItem> & outData)133 void SingleVerDataSyncUtils::TransDbDataItemToSendDataItem(const std::string &localHashName,
134     std::vector<SendDataItem> &outData)
135 {
136     for (size_t i = 0; i < outData.size(); i++) {
137         if (outData[i] == nullptr) {
138             continue;
139         }
140         outData[i]->SetOrigDevice(outData[i]->GetOrigDevice().empty() ? localHashName : outData[i]->GetOrigDevice());
141         if (i == 0 || i == (outData.size() - 1)) {
142             LOGD("[DataSync][TransToSendItem] printData packet=%zu,timestamp=%" PRIu64 ",flag=%" PRIu64, i,
143                 outData[i]->GetTimestamp(), outData[i]->GetFlag());
144         }
145     }
146 }
147 
TransferForeignOrigDevName(const std::string & deviceName,const std::string & localHashName)148 std::string SingleVerDataSyncUtils::TransferForeignOrigDevName(const std::string &deviceName,
149     const std::string &localHashName)
150 {
151     if (localHashName == deviceName) {
152         return "";
153     }
154     return deviceName;
155 }
156 
TransSendDataItemToLocal(const SingleVerSyncTaskContext * context,const std::string & localHashName,const std::vector<SendDataItem> & data)157 void SingleVerDataSyncUtils::TransSendDataItemToLocal(const SingleVerSyncTaskContext *context,
158     const std::string &localHashName, const std::vector<SendDataItem> &data)
159 {
160     TimeOffset offset = context->GetTimeOffset();
161     for (auto &item : data) {
162         if (item == nullptr) {
163             continue;
164         }
165         item->SetOrigDevice(TransferForeignOrigDevName(item->GetOrigDevice(), localHashName));
166         Timestamp tempTimestamp = item->GetTimestamp();
167         Timestamp tempWriteTimestamp = item->GetWriteTimestamp();
168         item->SetTimestamp(tempTimestamp - static_cast<Timestamp>(offset));
169         if (tempWriteTimestamp != 0) {
170             item->SetWriteTimestamp(tempWriteTimestamp - static_cast<Timestamp>(offset));
171         }
172 
173         Timestamp currentLocalTime = context->GetCurrentLocalTime();
174         if (item->GetTimestamp() > currentLocalTime) {
175             item->SetTimestamp(currentLocalTime);
176         }
177         if (item->GetWriteTimestamp() > currentLocalTime) {
178             item->SetWriteTimestamp(currentLocalTime);
179         }
180     }
181 }
182 
TranslateErrCodeIfNeed(int mode,uint32_t version,int & errCode)183 void SingleVerDataSyncUtils::TranslateErrCodeIfNeed(int mode, uint32_t version, int &errCode)
184 {
185     // once get data occur E_EKEYREVOKED error, should also send request to remote dev to pull data.
186     if (SyncOperation::TransferSyncMode(mode) == SyncModeType::PUSH_AND_PULL &&
187         version > SOFTWARE_VERSION_RELEASE_2_0 && errCode == -E_EKEYREVOKED) {
188         errCode = E_OK;
189     }
190 }
191 
RunPermissionCheck(SingleVerSyncTaskContext * context,const SyncGenericInterface * storage,const std::string & label,const DataRequestPacket * packet)192 int SingleVerDataSyncUtils::RunPermissionCheck(SingleVerSyncTaskContext *context, const SyncGenericInterface* storage,
193     const std::string &label, const DataRequestPacket *packet)
194 {
195     int mode = SyncOperation::TransferSyncMode(packet->GetMode());
196     return RunPermissionCheckInner(context, storage, label, packet, mode);
197 }
198 
RunPermissionCheck(SingleVerSyncTaskContext * context,const SyncGenericInterface * storage,const std::string & label,int mode)199 int SingleVerDataSyncUtils::RunPermissionCheck(SingleVerSyncTaskContext *context, const SyncGenericInterface* storage,
200     const std::string &label, int mode)
201 {
202     return RunPermissionCheckInner(context, storage, label, nullptr, mode);
203 }
204 
CheckPermitReceiveData(const SingleVerSyncTaskContext * context,const ICommunicator * communicator,const SyncGenericInterface * storage)205 bool SingleVerDataSyncUtils::CheckPermitReceiveData(const SingleVerSyncTaskContext *context,
206     const ICommunicator *communicator, const SyncGenericInterface *storage)
207 {
208     if (storage == nullptr) {
209         LOGE("[DataSync] storage is nullptr when check receive data");
210         return false;
211     }
212     // check memory db here because remote maybe low version
213     // it will send option with not set rather than not support when remote is memory db
214     bool memory = storage->GetDbProperties().GetBoolProp(KvDBProperties::MEMORY_MODE, false);
215     if (memory) {
216         LOGE("[DataSync] skip check receive data because local is memory db");
217         return true;
218     }
219     SecurityOption remoteSecOption = context->GetRemoteSeccurityOption();
220     std::string localDeviceId;
221     if (communicator == nullptr || remoteSecOption.securityLabel == NOT_SURPPORT_SEC_CLASSIFICATION) {
222         return true;
223     }
224     communicator->GetLocalIdentity(localDeviceId);
225     bool isPermitSync = SingleVerDataSyncUtils::IsPermitLocalDeviceRecvData(localDeviceId, remoteSecOption);
226     if (isPermitSync) {
227         return isPermitSync;
228     }
229     LOGE("[DataSync][PermitReceiveData] check failed: permitReceive=%d, localDev=%s, seclabel=%d, secflag=%d",
230         isPermitSync, STR_MASK(localDeviceId), remoteSecOption.securityLabel, remoteSecOption.securityFlag);
231     return isPermitSync;
232 }
233 
SetPacketId(DataRequestPacket * packet,SingleVerSyncTaskContext * context,uint32_t version)234 void SingleVerDataSyncUtils::SetPacketId(DataRequestPacket *packet, SingleVerSyncTaskContext *context, uint32_t version)
235 {
236     if (version > SOFTWARE_VERSION_RELEASE_2_0) {
237         context->IncPacketId(); // begin from 1
238         std::vector<uint64_t> reserved {context->GetPacketId()};
239         packet->SetReserved(reserved);
240     }
241 }
242 
GetMessageId(SyncType syncType)243 int SingleVerDataSyncUtils::GetMessageId(SyncType syncType)
244 {
245     if (syncType == SyncType::QUERY_SYNC_TYPE) {
246         return QUERY_SYNC_MESSAGE;
247     }
248     return DATA_SYNC_MESSAGE;
249 }
250 
PushAndPullKeyRevokHandle(SingleVerSyncTaskContext * context)251 void SingleVerDataSyncUtils::PushAndPullKeyRevokHandle(SingleVerSyncTaskContext *context)
252 {
253     // for push_and_pull mode it may be EKEYREVOKED error before receive watermarkexception
254     // should clear errCode and restart pushpull request.
255     int mode = SyncOperation::TransferSyncMode(context->GetMode());
256     if (context->GetRemoteSoftwareVersion() > SOFTWARE_VERSION_RELEASE_2_0 && mode == SyncModeType::PUSH_AND_PULL &&
257         context->GetTaskErrCode() == -E_EKEYREVOKED) {
258         context->SetTaskErrCode(E_OK);
259     }
260 }
261 
GetReSendMode(int mode,uint32_t sequenceId,SyncType syncType)262 int SingleVerDataSyncUtils::GetReSendMode(int mode, uint32_t sequenceId, SyncType syncType)
263 {
264     int curMode = SyncOperation::TransferSyncMode(mode);
265     if (curMode == SyncModeType::PUSH || curMode == SyncModeType::PULL) {
266         return mode;
267     }
268     if (curMode == SyncModeType::RESPONSE_PULL) {
269         return (syncType == SyncType::QUERY_SYNC_TYPE) ? SyncModeType::QUERY_PUSH : SyncModeType::PUSH;
270     }
271     // set push_and_pull mode when resend first sequenceId to inform remote to run RESPONSE_PULL task
272     // for sequenceId which is larger than first, only need to send data, means to set push or query_push mode
273     if (sequenceId == 1) {
274         return (syncType == SyncType::QUERY_SYNC_TYPE) ? SyncModeType::QUERY_PUSH_PULL : SyncModeType::PUSH_AND_PULL;
275     }
276     return (syncType == SyncType::QUERY_SYNC_TYPE) ? SyncModeType::QUERY_PUSH : SyncModeType::PUSH;
277 }
278 
FillControlRequestPacket(ControlRequestPacket * packet,SingleVerSyncTaskContext * context)279 void SingleVerDataSyncUtils::FillControlRequestPacket(ControlRequestPacket *packet, SingleVerSyncTaskContext *context)
280 {
281     uint32_t version = std::min(context->GetRemoteSoftwareVersion(), SOFTWARE_VERSION_CURRENT);
282     uint32_t flag = 0;
283     if (context->GetMode() == SyncModeType::SUBSCRIBE_QUERY && context->IsAutoSubscribe()) {
284         flag = SubscribeRequest::IS_AUTO_SUBSCRIBE;
285     }
286     packet->SetPacketHead(E_OK, version, GetControlCmdType(context->GetMode()), flag);
287     packet->SetQuery(context->GetQuery());
288 }
289 
GetControlCmdType(int mode)290 ControlCmdType SingleVerDataSyncUtils::GetControlCmdType(int mode)
291 {
292     if (mode == SyncModeType::SUBSCRIBE_QUERY) {
293         return ControlCmdType::SUBSCRIBE_QUERY_CMD;
294     } else if  (mode == SyncModeType::UNSUBSCRIBE_QUERY) {
295         return ControlCmdType::UNSUBSCRIBE_QUERY_CMD;
296     }
297     return ControlCmdType::INVALID_CONTROL_CMD;
298 }
299 
GetModeByControlCmdType(ControlCmdType controlCmd)300 int SingleVerDataSyncUtils::GetModeByControlCmdType(ControlCmdType controlCmd)
301 {
302     if (controlCmd == ControlCmdType::SUBSCRIBE_QUERY_CMD) {
303         return SyncModeType::SUBSCRIBE_QUERY;
304     } else if  (controlCmd == ControlCmdType::UNSUBSCRIBE_QUERY_CMD) {
305         return SyncModeType::UNSUBSCRIBE_QUERY;
306     }
307     return SyncModeType::INVALID_MODE;
308 }
309 
IsNeedTriggerQueryAutoSync(Message * inMsg,QuerySyncObject & query)310 bool SingleVerDataSyncUtils::IsNeedTriggerQueryAutoSync(Message *inMsg, QuerySyncObject &query)
311 {
312     if (inMsg == nullptr) {
313         return false;
314     }
315     if (inMsg->GetMessageId() != CONTROL_SYNC_MESSAGE) {
316         return false;
317     }
318     const ControlRequestPacket *packet = inMsg->GetObject<ControlRequestPacket>();
319     if (packet == nullptr) {
320         return false;
321     }
322     uint32_t controlCmdType = packet->GetcontrolCmdType();
323     if (controlCmdType == ControlCmdType::SUBSCRIBE_QUERY_CMD && inMsg->GetMessageType() == TYPE_REQUEST) {
324         const SubscribeRequest *subPacket = inMsg->GetObject<SubscribeRequest>();
325         if (subPacket == nullptr) {
326             return false;
327         }
328         query = subPacket->GetQuery();
329         LOGI("[SingleVerDataSync] receive sub scribe query cmd,begin to trigger query auto sync");
330         return true;
331     }
332     return false;
333 }
334 
ControlAckErrorHandle(const SingleVerSyncTaskContext * context,const std::shared_ptr<SubscribeManager> & subManager)335 void SingleVerDataSyncUtils::ControlAckErrorHandle(const SingleVerSyncTaskContext *context,
336     const std::shared_ptr<SubscribeManager> &subManager)
337 {
338     if (context->GetMode() == SyncModeType::SUBSCRIBE_QUERY) {
339         // reserve before need clear
340         subManager->DeleteLocalSubscribeQuery(context->GetDeviceId(), context->GetQuery());
341     }
342 }
343 
SetMessageHeadInfo(Message & message,uint16_t inMsgType,const std::string & inTarget,uint32_t inSequenceId,uint32_t inSessionId)344 void SingleVerDataSyncUtils::SetMessageHeadInfo(Message &message, uint16_t inMsgType, const std::string &inTarget,
345     uint32_t inSequenceId, uint32_t inSessionId)
346 {
347     message.SetMessageType(inMsgType);
348     message.SetTarget(inTarget);
349     message.SetSequenceId(inSequenceId);
350     message.SetSessionId(inSessionId);
351 }
352 
IsGetDataSuccessfully(int errCode)353 bool SingleVerDataSyncUtils::IsGetDataSuccessfully(int errCode)
354 {
355     return (errCode == E_OK || errCode == -E_UNFINISHED);
356 }
357 
GetMaxSendDataTime(const std::vector<SendDataItem> & inData)358 Timestamp SingleVerDataSyncUtils::GetMaxSendDataTime(const std::vector<SendDataItem> &inData)
359 {
360     Timestamp stamp = 0;
361     for (size_t i = 0; i < inData.size(); i++) {
362         if (inData[i] == nullptr) {
363             continue;
364         }
365         Timestamp tempStamp = inData[i]->GetTimestamp();
366         if (stamp < tempStamp) {
367             stamp = tempStamp;
368         }
369     }
370     return stamp;
371 }
372 
GetFullSyncDataTimeRange(const std::vector<SendDataItem> & inData,WaterMark localMark,UpdateWaterMark & isUpdate)373 SyncTimeRange SingleVerDataSyncUtils::GetFullSyncDataTimeRange(const std::vector<SendDataItem> &inData,
374     WaterMark localMark, UpdateWaterMark &isUpdate)
375 {
376     Timestamp maxTimestamp = localMark;
377     Timestamp minTimestamp = localMark;
378     for (size_t i = 0; i < inData.size(); i++) {
379         if (inData[i] == nullptr) {
380             continue;
381         }
382         Timestamp tempStamp = inData[i]->GetTimestamp();
383         if (maxTimestamp < tempStamp) {
384             maxTimestamp = tempStamp;
385         }
386         if (minTimestamp > tempStamp) {
387             minTimestamp = tempStamp;
388         }
389         isUpdate.normalUpdateMark = true;
390     }
391     return {minTimestamp, 0, maxTimestamp, 0};
392 }
393 
GetQuerySyncDataTimeRange(const std::vector<SendDataItem> & inData,WaterMark localMark,WaterMark deleteLocalMark,UpdateWaterMark & isUpdate)394 SyncTimeRange SingleVerDataSyncUtils::GetQuerySyncDataTimeRange(const std::vector<SendDataItem> &inData,
395     WaterMark localMark, WaterMark deleteLocalMark, UpdateWaterMark &isUpdate)
396 {
397     SyncTimeRange dataTimeRange = {localMark, deleteLocalMark, localMark, deleteLocalMark};
398     for (size_t i = 0; i < inData.size(); i++) {
399         if (inData[i] == nullptr) {
400             continue;
401         }
402         Timestamp tempStamp = inData[i]->GetTimestamp();
403         if ((inData[i]->GetFlag() & DataItem::DELETE_FLAG) == 0) { // query data
404             if (dataTimeRange.endTime < tempStamp) {
405                 dataTimeRange.endTime = tempStamp;
406             }
407             if (dataTimeRange.beginTime > tempStamp) {
408                 dataTimeRange.beginTime = tempStamp;
409             }
410             isUpdate.normalUpdateMark = true;
411         }
412         if ((inData[i]->GetFlag() & DataItem::DELETE_FLAG) != 0) { // delete data
413             if (dataTimeRange.deleteEndTime < tempStamp) {
414                 dataTimeRange.deleteEndTime = tempStamp;
415             }
416             if (dataTimeRange.deleteBeginTime > tempStamp) {
417                 dataTimeRange.deleteBeginTime = tempStamp;
418             }
419             isUpdate.deleteUpdateMark = true;
420         }
421     }
422     return dataTimeRange;
423 }
424 
ReviseLocalMark(SyncType syncType,const SyncTimeRange & dataTimeRange,UpdateWaterMark updateMark)425 SyncTimeRange SingleVerDataSyncUtils::ReviseLocalMark(SyncType syncType, const SyncTimeRange &dataTimeRange,
426     UpdateWaterMark updateMark)
427 {
428     SyncTimeRange tmpDataTime = dataTimeRange;
429     if (updateMark.deleteUpdateMark && syncType == SyncType::QUERY_SYNC_TYPE) {
430         tmpDataTime.deleteEndTime += 1;
431     }
432     if (updateMark.normalUpdateMark) {
433         tmpDataTime.endTime += 1;
434     }
435     return tmpDataTime;
436 }
437 
GetRecvDataTimeRange(SyncType syncType,const std::vector<SendDataItem> & data,UpdateWaterMark & isUpdate)438 SyncTimeRange SingleVerDataSyncUtils::GetRecvDataTimeRange(SyncType syncType,
439     const std::vector<SendDataItem> &data, UpdateWaterMark &isUpdate)
440 {
441     if (syncType != SyncType::QUERY_SYNC_TYPE) {
442         return SingleVerDataSyncUtils::GetFullSyncDataTimeRange(data, 0, isUpdate);
443     }
444     return SingleVerDataSyncUtils::GetQuerySyncDataTimeRange(data, 0, 0, isUpdate);
445 }
446 
GetSyncDataTimeRange(SyncType syncType,WaterMark localMark,WaterMark deleteMark,const std::vector<SendDataItem> & inData,UpdateWaterMark & isUpdate)447 SyncTimeRange SingleVerDataSyncUtils::GetSyncDataTimeRange(SyncType syncType, WaterMark localMark, WaterMark deleteMark,
448     const std::vector<SendDataItem> &inData, UpdateWaterMark &isUpdate)
449 {
450     if (syncType != SyncType::QUERY_SYNC_TYPE) {
451         return SingleVerDataSyncUtils::GetFullSyncDataTimeRange(inData, localMark, isUpdate);
452     }
453     return SingleVerDataSyncUtils::GetQuerySyncDataTimeRange(inData, localMark, deleteMark, isUpdate);
454 }
455 
RunPermissionCheckInner(const SingleVerSyncTaskContext * context,const SyncGenericInterface * storage,const std::string & label,const DataRequestPacket * packet,int mode)456 int SingleVerDataSyncUtils::RunPermissionCheckInner(const SingleVerSyncTaskContext *context,
457     const SyncGenericInterface* storage, const std::string &label, const DataRequestPacket *packet, int mode)
458 {
459     PermissionCheckParam param;
460     uint8_t flag = 0u;
461     FillPermissionCheckParam(storage, mode, param, flag);
462     param.deviceId = context->GetDeviceId();
463     if (packet != nullptr) {
464         param.extraConditions = packet->GetExtraConditions();
465     }
466     int errCode = RuntimeContext::GetInstance()->RunPermissionCheck(param, flag);
467     if (errCode != E_OK) {
468         LOGE("[DataSync][RunPermissionCheck] check failed flag=%" PRIu8 ",Label=%s,dev=%s", flag, label.c_str(),
469             STR_MASK(context->GetDeviceId()));
470     }
471     return errCode;
472 }
473 }