• 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 
16 #include "app_control_manager_rdb.h"
17 
18 #include "app_control_constants.h"
19 #include "app_log_tag_wrapper.h"
20 #include "bms_extension_client.h"
21 #include "bundle_util.h"
22 #include "event_report.h"
23 #include "hitrace_meter.h"
24 #include "scope_guard.h"
25 
26 namespace OHOS {
27 namespace AppExecFwk {
28 namespace {
29     constexpr const char* APP_CONTROL_RDB_TABLE_NAME = "app_control";
30     constexpr const char* RUNNING_CONTROL = "RunningControl";
31     constexpr const char* DISPOSED_RULE = "DisposedRule";
32     constexpr const char* UNINSTALL_DISPOSED_RULE = "UninstallDisposedRule";
33     constexpr const char* APP_CONTROL_EDM_DEFAULT_MESSAGE = "The app has been disabled by EDM";
34     constexpr const char* DEFAULT = "default";
35     constexpr int8_t CALLING_NAME_INDEX = 1;
36     constexpr int8_t APP_ID_INDEX = 4;
37     constexpr int8_t CONTROL_MESSAGE_INDEX = 5;
38     constexpr int8_t DISPOSED_STATUS_INDEX = 6;
39     constexpr int8_t TIME_STAMP_INDEX = 8;
40     // app control table key
41     constexpr const char* CALLING_NAME = "CALLING_NAME";
42     constexpr const char* APP_CONTROL_LIST = "APP_CONTROL_LIST";
43     constexpr const char* USER_ID = "USER_ID";
44     constexpr const char* APP_ID = "APP_ID";
45     constexpr const char* CONTROL_MESSAGE = "CONTROL_MESSAGE";
46     constexpr const char* DISPOSED_STATUS = "DISPOSED_STATUS";
47     constexpr const char* PRIORITY = "PRIORITY";
48     constexpr const char* TIME_STAMP = "TIME_STAMP";
49     constexpr const char* APP_INDEX = "APP_INDEX";
50 
51     enum class PRIORITY : uint16_t {
52         EDM = 100,
53         APP_MARKET = 200,
54     };
55 }
AppControlManagerRdb()56 AppControlManagerRdb::AppControlManagerRdb()
57 {
58     LOG_D(BMS_TAG_DEFAULT, "create AppControlManagerRdb");
59     BmsRdbConfig bmsRdbConfig;
60     bmsRdbConfig.dbName = ServiceConstants::BUNDLE_RDB_NAME;
61     bmsRdbConfig.tableName = APP_CONTROL_RDB_TABLE_NAME;
62     bmsRdbConfig.createTableSql = std::string(
63         "CREATE TABLE IF NOT EXISTS "
64         + std::string(APP_CONTROL_RDB_TABLE_NAME)
65         + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, CALLING_NAME TEXT NOT NULL, "
66         + "APP_CONTROL_LIST TEXT, USER_ID INTEGER, APP_ID TEXT, CONTROL_MESSAGE TEXT, "
67         + "DISPOSED_STATUS TEXT, PRIORITY INTEGER, TIME_STAMP INTEGER);");
68     bmsRdbConfig.insertColumnSql.push_back(std::string("ALTER TABLE " + std::string(APP_CONTROL_RDB_TABLE_NAME) +
69         " ADD APP_INDEX INTEGER DEFAULT 0;"));
70     rdbDataManager_ = std::make_shared<RdbDataManager>(bmsRdbConfig);
71     rdbDataManager_->CreateTable();
72 }
73 
~AppControlManagerRdb()74 AppControlManagerRdb::~AppControlManagerRdb()
75 {
76     LOG_D(BMS_TAG_DEFAULT, "destroy AppControlManagerRdb");
77 }
78 
AddAppInstallControlRule(const std::string & callingName,const std::vector<std::string> & appIds,const std::string & controlRuleType,int32_t userId)79 ErrCode AppControlManagerRdb::AddAppInstallControlRule(const std::string &callingName,
80     const std::vector<std::string> &appIds, const std::string &controlRuleType, int32_t userId)
81 {
82     int64_t timeStamp = BundleUtil::GetCurrentTime();
83     std::vector<NativeRdb::ValuesBucket> valuesBuckets;
84     for (auto appId : appIds) {
85         ErrCode result = DeleteOldControlRule(callingName, controlRuleType, appId, userId);
86         if (result != ERR_OK) {
87             LOG_E(BMS_TAG_DEFAULT, "DeleteOldControlRule failed");
88             return result;
89         }
90         NativeRdb::ValuesBucket valuesBucket;
91         valuesBucket.PutString(CALLING_NAME, callingName);
92         valuesBucket.PutString(APP_CONTROL_LIST, controlRuleType);
93         valuesBucket.PutInt(USER_ID, static_cast<int>(userId));
94         valuesBucket.PutString(APP_ID, appId);
95         valuesBucket.PutInt(TIME_STAMP, timeStamp);
96         valuesBuckets.emplace_back(valuesBucket);
97     }
98     int64_t insertNum = 0;
99     bool ret = rdbDataManager_->BatchInsert(insertNum, valuesBuckets);
100     if (!ret) {
101         LOG_E(BMS_TAG_DEFAULT, "BatchInsert failed");
102         return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
103     }
104     EventInfo info;
105     info.callingName = callingName;
106     info.userId = userId;
107     info.appIds = appIds;
108     info.rule = controlRuleType;
109     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
110     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_INSTALL);
111     EventReport::SendAppControlRuleEvent(info);
112     if (valuesBuckets.size() != static_cast<uint64_t>(insertNum)) {
113         LOG_E(BMS_TAG_DEFAULT, "BatchInsert size not expected");
114         return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
115     }
116     return ERR_OK;
117 }
118 
DeleteAppInstallControlRule(const std::string & callingName,const std::string & controlRuleType,const std::vector<std::string> & appIds,int32_t userId)119 ErrCode AppControlManagerRdb::DeleteAppInstallControlRule(const std::string &callingName,
120     const std::string &controlRuleType, const std::vector<std::string> &appIds, int32_t userId)
121 {
122     for (const auto &appId : appIds) {
123         NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
124         absRdbPredicates.EqualTo(CALLING_NAME, callingName);
125         absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
126         absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
127         absRdbPredicates.EqualTo(APP_ID, appId);
128         bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
129         if (!ret) {
130             LOG_E(BMS_TAG_DEFAULT, "Delete failed callingName:%{public}s appId:%{private}s userId:%{public}d",
131                 callingName.c_str(), appId.c_str(), userId);
132             return ERR_APPEXECFWK_DB_DELETE_ERROR;
133         }
134         EventInfo info;
135         info.callingName = callingName;
136         info.userId = userId;
137         info.appIds.push_back(appId);
138         info.rule = controlRuleType;
139         info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
140         info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_INSTALL);
141         EventReport::SendAppControlRuleEvent(info);
142     }
143     return ERR_OK;
144 }
145 
DeleteAppInstallControlRule(const std::string & callingName,const std::string & controlRuleType,int32_t userId)146 ErrCode AppControlManagerRdb::DeleteAppInstallControlRule(const std::string &callingName,
147     const std::string &controlRuleType, int32_t userId)
148 {
149     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
150     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
151     absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
152     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
153     bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
154     if (!ret) {
155         LOG_E(BMS_TAG_DEFAULT, "DeleteData callingName:%{public}s controlRuleType:%{public}s failed",
156             callingName.c_str(), controlRuleType.c_str());
157         return ERR_APPEXECFWK_DB_DELETE_ERROR;
158     }
159     EventInfo info;
160     info.callingName = callingName;
161     info.userId = userId;
162     info.rule = controlRuleType;
163     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
164     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_INSTALL);
165     EventReport::SendAppControlRuleEvent(info);
166     return ERR_OK;
167 }
168 
GetAppInstallControlRule(const std::string & callingName,const std::string & controlRuleType,int32_t userId,std::vector<std::string> & appIds)169 ErrCode AppControlManagerRdb::GetAppInstallControlRule(const std::string &callingName,
170     const std::string &controlRuleType, int32_t userId, std::vector<std::string> &appIds)
171 {
172     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
173     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
174     absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
175     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
176     auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
177     if (absSharedResultSet == nullptr) {
178         LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
179         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
180     }
181     ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
182     int32_t count;
183     int ret = absSharedResultSet->GetRowCount(count);
184     if (ret != NativeRdb::E_OK) {
185         LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
186         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
187     }
188     if (count == 0) {
189         LOG_D(BMS_TAG_DEFAULT, "GetAppInstallControlRule size 0");
190         return ERR_OK;
191     }
192 
193     ret = absSharedResultSet->GoToFirstRow();
194     if (ret != NativeRdb::E_OK) {
195         LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
196         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
197     }
198     do {
199         std::string appId;
200         ret = absSharedResultSet->GetString(APP_ID_INDEX, appId);
201         if (ret != NativeRdb::E_OK) {
202             LOG_E(BMS_TAG_DEFAULT, "GetString appId failed, ret: %{public}d", ret);
203             return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
204         }
205         appIds.push_back(appId);
206     } while (absSharedResultSet->GoToNextRow() == NativeRdb::E_OK);
207     return ERR_OK;
208 }
209 
AddAppRunningControlRule(const std::string & callingName,const std::vector<AppRunningControlRule> & controlRules,int32_t userId)210 ErrCode AppControlManagerRdb::AddAppRunningControlRule(const std::string &callingName,
211     const std::vector<AppRunningControlRule> &controlRules, int32_t userId)
212 {
213     int64_t timeStamp = BundleUtil::GetCurrentTime();
214     std::vector<NativeRdb::ValuesBucket> valuesBuckets;
215     for (auto &controlRule : controlRules) {
216         ErrCode result = DeleteOldControlRule(callingName, RUNNING_CONTROL, controlRule.appId, userId);
217         if (result != ERR_OK) {
218             LOG_E(BMS_TAG_DEFAULT, "DeleteOldControlRule failed");
219             return result;
220         }
221         NativeRdb::ValuesBucket valuesBucket;
222         valuesBucket.PutString(CALLING_NAME, callingName);
223         valuesBucket.PutString(APP_CONTROL_LIST, RUNNING_CONTROL);
224         valuesBucket.PutInt(USER_ID, static_cast<int>(userId));
225         valuesBucket.PutString(APP_ID, controlRule.appId);
226         valuesBucket.PutString(CONTROL_MESSAGE, controlRule.controlMessage);
227         valuesBucket.PutInt(PRIORITY, static_cast<int>(PRIORITY::EDM));
228         valuesBucket.PutInt(TIME_STAMP, timeStamp);
229         valuesBuckets.emplace_back(valuesBucket);
230     }
231     int64_t insertNum = 0;
232     bool ret = rdbDataManager_->BatchInsert(insertNum, valuesBuckets);
233     if (!ret) {
234         LOG_E(BMS_TAG_DEFAULT, "BatchInsert AddAppRunningControlRule failed");
235         return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
236     }
237     for (auto &controlRule : controlRules) {
238         EventInfo info;
239         info.callingName = callingName;
240         info.userId = userId;
241         info.rule = controlRule.controlMessage;
242         info.appIds.push_back(controlRule.appId);
243         info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
244         info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_RUNUING);
245         EventReport::SendAppControlRuleEvent(info);
246     }
247     if (valuesBuckets.size() != static_cast<uint64_t>(insertNum)) {
248         LOG_E(BMS_TAG_DEFAULT, "BatchInsert size not expected");
249         return ERR_APPEXECFWK_DB_BATCH_INSERT_ERROR;
250     }
251     return ERR_OK;
252 }
253 
DeleteAppRunningControlRule(const std::string & callingName,const std::vector<AppRunningControlRule> & controlRules,int32_t userId)254 ErrCode AppControlManagerRdb::DeleteAppRunningControlRule(const std::string &callingName,
255     const std::vector<AppRunningControlRule> &controlRules, int32_t userId)
256 {
257     for (auto &rule : controlRules) {
258         NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
259         absRdbPredicates.EqualTo(CALLING_NAME, callingName);
260         absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
261         absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
262         absRdbPredicates.EqualTo(APP_ID, rule.appId);
263         bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
264         if (!ret) {
265             LOG_E(BMS_TAG_DEFAULT, "Delete failed callingName:%{public}s appid:%{private}s userId:%{public}d",
266                 callingName.c_str(), rule.appId.c_str(), userId);
267             return ERR_APPEXECFWK_DB_DELETE_ERROR;
268         }
269         EventInfo info;
270         info.callingName = callingName;
271         info.userId = userId;
272         info.appIds.push_back(rule.appId);
273         info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
274         info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_RUNUING);
275         EventReport::SendAppControlRuleEvent(info);
276     }
277     return ERR_OK;
278 }
DeleteAppRunningControlRule(const std::string & callingName,int32_t userId)279 ErrCode AppControlManagerRdb::DeleteAppRunningControlRule(const std::string &callingName, int32_t userId)
280 {
281     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
282     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
283     absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
284     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
285     bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
286     if (!ret) {
287         LOG_E(BMS_TAG_DEFAULT, "DeleteAppRunningControlRule callingName:%{public}s userId:%{public}d failed",
288             callingName.c_str(), userId);
289         return ERR_APPEXECFWK_DB_DELETE_ERROR;
290     }
291     EventInfo info;
292     info.callingName = callingName;
293     info.userId = userId;
294     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
295     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_OF_RUNUING);
296     EventReport::SendAppControlRuleEvent(info);
297     return ERR_OK;
298 }
299 
GetAppRunningControlRule(const std::string & callingName,int32_t userId,std::vector<std::string> & appIds)300 ErrCode AppControlManagerRdb::GetAppRunningControlRule(const std::string &callingName,
301     int32_t userId, std::vector<std::string> &appIds)
302 {
303     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
304     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
305     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
306     absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
307     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
308     auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
309     if (absSharedResultSet == nullptr) {
310         LOG_E(BMS_TAG_DEFAULT, "QueryData failed");
311         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
312     }
313     ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
314     int32_t count;
315     int ret = absSharedResultSet->GetRowCount(count);
316     if (ret != NativeRdb::E_OK) {
317         LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
318         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
319     }
320     if (count == 0) {
321         LOG_D(BMS_TAG_DEFAULT, "GetAppRunningControlRule size 0");
322         return ERR_OK;
323     }
324     ret = absSharedResultSet->GoToFirstRow();
325     if (ret != NativeRdb::E_OK) {
326         LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
327         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
328     }
329     do {
330         std::string appId;
331         ret = absSharedResultSet->GetString(APP_ID_INDEX, appId);
332         if (ret != NativeRdb::E_OK) {
333             LOG_E(BMS_TAG_DEFAULT, "GetString appId failed, ret: %{public}d", ret);
334             return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
335         }
336         appIds.push_back(appId);
337     } while (absSharedResultSet->GoToNextRow() == NativeRdb::E_OK);
338     return ERR_OK;
339 }
340 
GetAppRunningControlRule(const std::string & appId,int32_t userId,AppRunningControlRuleResult & controlRuleResult)341 ErrCode AppControlManagerRdb::GetAppRunningControlRule(const std::string &appId,
342     int32_t userId, AppRunningControlRuleResult &controlRuleResult)
343 {
344     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
345     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
346     absRdbPredicates.EqualTo(APP_ID, appId);
347     absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
348     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
349     absRdbPredicates.OrderByAsc(PRIORITY); // ascending
350     auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
351     if (absSharedResultSet == nullptr) {
352         LOG_E(BMS_TAG_DEFAULT, "QueryData failed");
353         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
354     }
355     ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
356     int32_t count;
357     int ret = absSharedResultSet->GetRowCount(count);
358     if (ret != NativeRdb::E_OK) {
359         LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
360         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
361     }
362     if (count == 0) {
363         LOG_NOFUNC_W(BMS_TAG_DEFAULT, "control rule invalid size 0");
364         return ERR_BUNDLE_MANAGER_BUNDLE_NOT_SET_CONTROL;
365     }
366     ret = absSharedResultSet->GoToFirstRow();
367     if (ret != NativeRdb::E_OK) {
368         LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
369         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
370     }
371     std::string callingName;
372     if (absSharedResultSet->GetString(CALLING_NAME_INDEX, callingName) != NativeRdb::E_OK) {
373         LOG_E(BMS_TAG_DEFAULT, "GetString callingName failed, ret: %{public}d", ret);
374         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
375     }
376     ret = absSharedResultSet->GetString(CONTROL_MESSAGE_INDEX, controlRuleResult.controlMessage);
377     if (ret != NativeRdb::E_OK) {
378         LOG_W(BMS_TAG_DEFAULT, "GetString controlMessage failed, ret: %{public}d", ret);
379         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
380     }
381     if (controlRuleResult.controlMessage.empty() && callingName == AppControlConstants::EDM_CALLING) {
382         LOG_D(BMS_TAG_DEFAULT, "GetString controlMessage default");
383         controlRuleResult.controlMessage = APP_CONTROL_EDM_DEFAULT_MESSAGE;
384     }
385     std::string wantString;
386     if (absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, wantString) != NativeRdb::E_OK) {
387         LOG_E(BMS_TAG_DEFAULT, "GetString controlWant failed, ret: %{public}d", ret);
388     }
389     if (!wantString.empty()) {
390         std::unique_ptr<Want> wantPtr(Want::FromString(wantString));
391         if (wantPtr) {
392             controlRuleResult.controlWant = std::make_shared<Want>(*wantPtr);
393         } else {
394             LOG_E(BMS_TAG_DEFAULT, "wantPtr is null");
395         }
396     }
397     if (callingName == AppControlConstants::EDM_CALLING) {
398         controlRuleResult.isEdm = true;
399     }
400     return ERR_OK;
401 }
402 
SetDisposedStatus(const std::string & callingName,const std::string & appId,const Want & want,int32_t userId)403 ErrCode AppControlManagerRdb::SetDisposedStatus(const std::string &callingName,
404     const std::string &appId, const Want &want, int32_t userId)
405 {
406     LOG_D(BMS_TAG_DEFAULT, "rdb begin to SetDisposedStatus");
407     ErrCode code = DeleteDisposedStatus(callingName, appId, userId);
408     if (code != ERR_OK) {
409         LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus failed");
410         return ERR_APPEXECFWK_DB_DELETE_ERROR;
411     }
412     int64_t timeStamp = BundleUtil::GetCurrentTime();
413     NativeRdb::ValuesBucket valuesBucket;
414     valuesBucket.PutString(CALLING_NAME, callingName);
415     valuesBucket.PutString(APP_CONTROL_LIST, RUNNING_CONTROL);
416     valuesBucket.PutString(APP_ID, appId);
417     valuesBucket.PutString(DISPOSED_STATUS, want.ToString());
418     valuesBucket.PutInt(PRIORITY, static_cast<int>(PRIORITY::APP_MARKET));
419     valuesBucket.PutInt(TIME_STAMP, timeStamp);
420     valuesBucket.PutString(USER_ID, std::to_string(userId));
421     bool ret = rdbDataManager_->InsertData(valuesBucket);
422     if (!ret) {
423         LOG_E(BMS_TAG_DEFAULT, "SetDisposedStatus callingName:%{public}s appId:%{private}s failed",
424             callingName.c_str(), appId.c_str());
425         return ERR_APPEXECFWK_DB_INSERT_ERROR;
426     }
427     EventInfo info;
428     info.callingName = callingName;
429     info.userId = userId;
430     info.appIds.push_back(appId);
431     info.rule = want.ToString();
432     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
433     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_STATUS);
434     EventReport::SendAppControlRuleEvent(info);
435     return ERR_OK;
436 }
437 
DeleteDisposedStatus(const std::string & callingName,const std::string & appId,int32_t userId)438 ErrCode AppControlManagerRdb::DeleteDisposedStatus(const std::string &callingName,
439     const std::string &appId, int32_t userId)
440 {
441     LOG_D(BMS_TAG_DEFAULT, "rdb begin to DeleteDisposedStatus");
442     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
443     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
444     absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
445     absRdbPredicates.EqualTo(APP_ID, appId);
446     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
447     bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
448     if (!ret) {
449         LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus callingName:%{public}s appId:%{private}s failed",
450             callingName.c_str(), appId.c_str());
451         return ERR_APPEXECFWK_DB_DELETE_ERROR;
452     }
453     EventInfo info;
454     info.callingName = callingName;
455     info.userId = userId;
456     info.appIds.push_back(appId);
457     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
458     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_STATUS);
459     EventReport::SendAppControlRuleEvent(info);
460     return ERR_OK;
461 }
462 
GetDisposedStatus(const std::string & callingName,const std::string & appId,Want & want,int32_t userId)463 ErrCode AppControlManagerRdb::GetDisposedStatus(const std::string &callingName,
464     const std::string &appId, Want &want, int32_t userId)
465 {
466     LOG_D(BMS_TAG_DEFAULT, "rdb begin to GetDisposedStatus");
467     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
468     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
469     absRdbPredicates.EqualTo(APP_CONTROL_LIST, RUNNING_CONTROL);
470     absRdbPredicates.EqualTo(APP_ID, appId);
471     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
472     auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
473     if (absSharedResultSet == nullptr) {
474         LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
475         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
476     }
477     ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
478     int32_t count;
479     int ret = absSharedResultSet->GetRowCount(count);
480     if (ret != NativeRdb::E_OK) {
481         LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
482         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
483     }
484     if (count == 0) {
485         LOG_D(BMS_TAG_DEFAULT, "GetAppRunningControlRule size 0");
486         return ERR_OK;
487     }
488     ret = absSharedResultSet->GoToFirstRow();
489     if (ret != NativeRdb::E_OK) {
490         LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
491         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
492     }
493     std::string wantString;
494     ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, wantString);
495     if (ret != NativeRdb::E_OK) {
496         LOG_E(BMS_TAG_DEFAULT, "GetString DisposedStatus failed, ret: %{public}d", ret);
497         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
498     }
499     std::unique_ptr<Want> wantPtr(Want::FromString(wantString));
500     if (!wantPtr) {
501         LOG_E(BMS_TAG_DEFAULT, "wantPtr is null");
502         return ERR_BUNDLE_MANAGER_APP_CONTROL_INTERNAL_ERROR;
503     }
504     want = *wantPtr;
505     return ERR_OK;
506 }
507 
DeleteOldControlRule(const std::string & callingName,const std::string & controlRuleType,const std::string & appId,int32_t userId)508 ErrCode AppControlManagerRdb::DeleteOldControlRule(const std::string &callingName, const std::string &controlRuleType,
509     const std::string &appId, int32_t userId)
510 {
511     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
512     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
513     absRdbPredicates.EqualTo(APP_CONTROL_LIST, controlRuleType);
514     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
515     absRdbPredicates.EqualTo(APP_ID, appId);
516     bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
517     if (!ret) {
518         LOG_E(BMS_TAG_DEFAULT, "DeleteOldControlRule %{public}s, %{public}s, %{public}s, %{public}d failed",
519             callingName.c_str(), appId.c_str(), controlRuleType.c_str(), userId);
520         return ERR_APPEXECFWK_DB_DELETE_ERROR;
521     }
522     EventInfo info;
523     info.callingName = callingName;
524     info.userId = userId;
525     info.appIds.push_back(appId);
526     info.rule = controlRuleType;
527     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
528     EventReport::SendAppControlRuleEvent(info);
529     return ERR_OK;
530 }
531 
SetDisposedRule(const std::string & callingName,const std::string & appId,const DisposedRule & rule,int32_t appIndex,int32_t userId)532 ErrCode AppControlManagerRdb::SetDisposedRule(const std::string &callingName,
533     const std::string &appId, const DisposedRule &rule, int32_t appIndex, int32_t userId)
534 {
535     ErrCode code = DeleteDisposedRule(callingName, appId, appIndex, userId);
536     if (code != ERR_OK) {
537         LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus failed.");
538         return ERR_APPEXECFWK_DB_DELETE_ERROR;
539     }
540     int64_t timeStamp = BundleUtil::GetCurrentTime();
541     NativeRdb::ValuesBucket valuesBucket;
542     valuesBucket.PutString(CALLING_NAME, callingName);
543     valuesBucket.PutString(APP_CONTROL_LIST, DISPOSED_RULE);
544     valuesBucket.PutString(APP_ID, appId);
545     valuesBucket.PutString(DISPOSED_STATUS, rule.ToString());
546     valuesBucket.PutInt(PRIORITY, rule.priority);
547     valuesBucket.PutInt(TIME_STAMP, timeStamp);
548     valuesBucket.PutString(USER_ID, std::to_string(userId));
549     valuesBucket.PutString(APP_INDEX, std::to_string(appIndex));
550     bool ret = rdbDataManager_->InsertData(valuesBucket);
551     if (!ret) {
552         LOG_E(BMS_TAG_DEFAULT, "SetDisposedStatus callingName:%{public}s appId:%{private}s failed.",
553             callingName.c_str(), appId.c_str());
554         return ERR_APPEXECFWK_DB_INSERT_ERROR;
555     }
556     EventInfo info;
557     info.callingName = callingName;
558     info.userId = userId;
559     info.appIds.push_back(appId);
560     info.rule = rule.ToString();
561     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_ADD_RULE);
562     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_RULE);
563     info.appIndex = appIndex;
564     EventReport::SendAppControlRuleEvent(info);
565     return ERR_OK;
566 }
567 
DeleteDisposedRule(const std::string & callingName,const std::string & appId,int32_t appIndex,int32_t userId)568 ErrCode AppControlManagerRdb::DeleteDisposedRule(const std::string &callingName,
569     const std::string &appId, int32_t appIndex, int32_t userId)
570 {
571     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
572     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
573     absRdbPredicates.EqualTo(APP_CONTROL_LIST, DISPOSED_RULE);
574     absRdbPredicates.EqualTo(APP_ID, appId);
575     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
576     absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
577     bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
578     if (!ret) {
579         LOG_E(BMS_TAG_DEFAULT, "DeleteDisposedStatus callingName:%{public}s appId:%{private}s failed",
580             callingName.c_str(), appId.c_str());
581         return ERR_APPEXECFWK_DB_DELETE_ERROR;
582     }
583     EventInfo info;
584     info.callingName = callingName;
585     info.userId = userId;
586     info.appIds.push_back(appId);
587     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
588     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_RULE);
589     info.appIndex = appIndex;
590     EventReport::SendAppControlRuleEvent(info);
591     return ERR_OK;
592 }
593 
DeleteAllDisposedRuleByBundle(const std::string & appId,int32_t appIndex,int32_t userId)594 ErrCode AppControlManagerRdb::DeleteAllDisposedRuleByBundle(const std::string &appId, int32_t appIndex, int32_t userId)
595 {
596     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
597     std::vector<std::string> controlList = {DISPOSED_RULE, RUNNING_CONTROL, UNINSTALL_DISPOSED_RULE};
598     absRdbPredicates.In(APP_CONTROL_LIST, controlList);
599     absRdbPredicates.EqualTo(APP_ID, appId);
600     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
601     // if appIndex is main app also clear all clone app
602     if (appIndex != Constants::MAIN_APP_INDEX) {
603         absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
604     }
605     bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
606     if (!ret) {
607         LOG_E(BMS_TAG_DEFAULT, "DeleteAllDisposedRuleByBundle appId:%{private}s failed", appId.c_str());
608         return ERR_APPEXECFWK_DB_DELETE_ERROR;
609     }
610     EventInfo info;
611     info.userId = userId;
612     info.appIds.push_back(appId);
613     info.operationType = static_cast<int32_t>(OPERATION_TYPE_ENUM::OPERATION_TYPE_REMOVE_RULE);
614     info.actionType = static_cast<int32_t>(ACTION_TYPE_ENUM::ACTION_TYPE_DISPOSE_RULE);
615     info.appIndex = appIndex;
616     EventReport::SendAppControlRuleEvent(info);
617     return ERR_OK;
618 }
619 
OptimizeDisposedPredicates(const std::string & callingName,const std::string & appId,int32_t userId,int32_t appIndex,NativeRdb::AbsRdbPredicates & absRdbPredicates)620 ErrCode AppControlManagerRdb::OptimizeDisposedPredicates(const std::string &callingName, const std::string &appId,
621     int32_t userId, int32_t appIndex, NativeRdb::AbsRdbPredicates &absRdbPredicates)
622 {
623     auto bmsExtensionClient = std::make_shared<BmsExtensionClient>();
624     return bmsExtensionClient->OptimizeDisposedPredicates(callingName, appId, userId, appIndex, absRdbPredicates);
625 }
626 
GetDisposedRule(const std::string & callingName,const std::string & appId,DisposedRule & rule,int32_t appIndex,int32_t userId)627 ErrCode AppControlManagerRdb::GetDisposedRule(const std::string &callingName,
628     const std::string &appId, DisposedRule &rule, int32_t appIndex, int32_t userId)
629 {
630     LOG_D(BMS_TAG_DEFAULT, "rdb begin to GetDisposedRule");
631     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
632     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
633     absRdbPredicates.EqualTo(APP_CONTROL_LIST, DISPOSED_RULE);
634     absRdbPredicates.EqualTo(APP_ID, appId);
635     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
636     absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
637     OptimizeDisposedPredicates(callingName, appId, userId, appIndex, absRdbPredicates);
638     auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
639     if (absSharedResultSet == nullptr) {
640         LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
641         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
642     }
643     ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
644     int32_t count;
645     int ret = absSharedResultSet->GetRowCount(count);
646     if (ret != NativeRdb::E_OK) {
647         LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
648         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
649     }
650     if (count == 0) {
651         LOG_D(BMS_TAG_DEFAULT, "GetDisposedRule size 0");
652         return ERR_OK;
653     }
654     ret = absSharedResultSet->GoToFirstRow();
655     if (ret != NativeRdb::E_OK) {
656         LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
657         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
658     }
659     std::string ruleString;
660     ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, ruleString);
661     if (ret != NativeRdb::E_OK) {
662         LOG_E(BMS_TAG_DEFAULT, "GetString DisposedStatus failed, ret: %{public}d", ret);
663         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
664     }
665     DisposedRule::FromString(ruleString, rule);
666     return ERR_OK;
667 }
668 
GetAbilityRunningControlRule(const std::string & appId,int32_t appIndex,int32_t userId,std::vector<DisposedRule> & disposedRules)669 ErrCode AppControlManagerRdb::GetAbilityRunningControlRule(
670     const std::string &appId, int32_t appIndex, int32_t userId, std::vector<DisposedRule>& disposedRules)
671 {
672     HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
673     LOG_D(BMS_TAG_DEFAULT, "rdb begin to GetAbilityRunningControlRule");
674     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
675     absRdbPredicates.EqualTo(APP_CONTROL_LIST, DISPOSED_RULE);
676     absRdbPredicates.EqualTo(APP_ID, appId);
677     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
678     absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
679     absRdbPredicates.OrderByAsc(PRIORITY); // ascending
680     auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
681     if (absSharedResultSet == nullptr) {
682         LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
683         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
684     }
685     ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
686     int32_t count;
687     int ret = absSharedResultSet->GetRowCount(count);
688     if (ret != NativeRdb::E_OK) {
689         LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
690         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
691     }
692     if (count == 0) {
693         LOG_D(BMS_TAG_DEFAULT, "GetDisposedRule size 0");
694         return ERR_OK;
695     }
696     ret = absSharedResultSet->GoToFirstRow();
697     if (ret != NativeRdb::E_OK) {
698         LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
699         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
700     }
701     do {
702         ret = GetDisposedRuleFromResultSet(absSharedResultSet, disposedRules);
703         if (ret != ERR_OK) {
704             return ret;
705         }
706     } while (absSharedResultSet->GoToNextRow() == NativeRdb::E_OK);
707     return ERR_OK;
708 }
709 
GetDisposedRuleFromResultSet(std::shared_ptr<NativeRdb::ResultSet> absSharedResultSet,std::vector<DisposedRule> & disposedRules)710 ErrCode AppControlManagerRdb::GetDisposedRuleFromResultSet(
711     std::shared_ptr<NativeRdb::ResultSet> absSharedResultSet, std::vector<DisposedRule> &disposedRules)
712 {
713     if (absSharedResultSet == nullptr) {
714         LOG_E(BMS_TAG_DEFAULT, "GetAppInstallControlRule failed");
715         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
716     }
717     std::string ruleString;
718     ErrCode ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, ruleString);
719     if (ret != NativeRdb::E_OK) {
720         LOG_E(BMS_TAG_DEFAULT, "GetString appId failed, ret: %{public}d", ret);
721         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
722     }
723     std::string callerName;
724     ret = absSharedResultSet->GetString(CALLING_NAME_INDEX, callerName);
725     if (ret != NativeRdb::E_OK) {
726         callerName = "";
727         LOG_I(BMS_TAG_DEFAULT, "GetString callerName failed, ret: %{public}d", ret);
728     }
729     int32_t setTime = 0;
730     ret = absSharedResultSet->GetInt(TIME_STAMP_INDEX, setTime);
731     if (ret != NativeRdb::E_OK) {
732         setTime = 0;
733         LOG_I(BMS_TAG_DEFAULT, "GetInt setTime failed, ret: %{public}d", ret);
734     }
735     DisposedRule rule;
736     bool parseRet = DisposedRule::FromString(ruleString, rule);
737     if (!parseRet) {
738         LOG_W(BMS_TAG_DEFAULT, "parse DisposedRule failed");
739     }
740     rule.callerName = callerName;
741     rule.setTime = setTime;
742     disposedRules.push_back(rule);
743     return ERR_OK;
744 }
745 
SetUninstallDisposedRule(const std::string & callingName,const std::string & appIdentifier,const UninstallDisposedRule & rule,int32_t appIndex,int32_t userId)746 ErrCode AppControlManagerRdb::SetUninstallDisposedRule(const std::string &callingName,
747     const std::string &appIdentifier, const UninstallDisposedRule &rule, int32_t appIndex, int32_t userId)
748 {
749     LOG_D(BMS_TAG_DEFAULT, "begin");
750     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
751     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
752     absRdbPredicates.EqualTo(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
753     absRdbPredicates.EqualTo(APP_ID, appIdentifier);
754     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
755     absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
756 
757     int64_t timeStamp = BundleUtil::GetCurrentTime();
758     NativeRdb::ValuesBucket valuesBucket;
759     valuesBucket.PutString(CALLING_NAME, callingName);
760     valuesBucket.PutString(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
761     valuesBucket.PutString(APP_ID, appIdentifier);
762     valuesBucket.PutString(DISPOSED_STATUS, rule.ToString());
763     valuesBucket.PutInt(PRIORITY, rule.priority);
764     valuesBucket.PutInt(TIME_STAMP, timeStamp);
765     valuesBucket.PutString(USER_ID, std::to_string(userId));
766     valuesBucket.PutString(APP_INDEX, std::to_string(appIndex));
767     bool ret = rdbDataManager_->UpdateOrInsertData(valuesBucket, absRdbPredicates);
768     if (!ret) {
769         LOG_E(BMS_TAG_DEFAULT, "callingName:%{public}s appIdentifier:%{private}s failed.",
770             callingName.c_str(), appIdentifier.c_str());
771         return ERR_APPEXECFWK_DB_UPDATE_ERROR;
772     }
773     return ERR_OK;
774 }
775 
DeleteUninstallDisposedRule(const std::string & callingName,const std::string & appIdentifier,int32_t appIndex,int32_t userId)776 ErrCode AppControlManagerRdb::DeleteUninstallDisposedRule(const std::string &callingName,
777     const std::string &appIdentifier, int32_t appIndex, int32_t userId)
778 {
779     LOG_D(BMS_TAG_DEFAULT, "begin");
780     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
781     absRdbPredicates.EqualTo(CALLING_NAME, callingName);
782     absRdbPredicates.EqualTo(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
783     absRdbPredicates.EqualTo(APP_ID, appIdentifier);
784     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
785     absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
786     bool ret = rdbDataManager_->DeleteData(absRdbPredicates);
787     if (!ret) {
788         LOG_E(BMS_TAG_DEFAULT, "callingName:%{public}s appIdentifier:%{private}s failed",
789             callingName.c_str(), appIdentifier.c_str());
790         return ERR_APPEXECFWK_DB_DELETE_ERROR;
791     }
792     return ERR_OK;
793 }
794 
GetUninstallDisposedRule(const std::string & appIdentifier,int32_t appIndex,int32_t userId,UninstallDisposedRule & rule)795 ErrCode AppControlManagerRdb::GetUninstallDisposedRule(const std::string &appIdentifier,
796     int32_t appIndex, int32_t userId, UninstallDisposedRule &rule)
797 {
798     LOG_D(BMS_TAG_DEFAULT, "begin");
799     NativeRdb::AbsRdbPredicates absRdbPredicates(APP_CONTROL_RDB_TABLE_NAME);
800     absRdbPredicates.EqualTo(APP_CONTROL_LIST, UNINSTALL_DISPOSED_RULE);
801     absRdbPredicates.EqualTo(APP_ID, appIdentifier);
802     absRdbPredicates.EqualTo(USER_ID, std::to_string(userId));
803     absRdbPredicates.EqualTo(APP_INDEX, std::to_string(appIndex));
804     absRdbPredicates.OrderByAsc(PRIORITY);
805     absRdbPredicates.OrderByAsc(TIME_STAMP);
806     auto absSharedResultSet = rdbDataManager_->QueryData(absRdbPredicates);
807     if (absSharedResultSet == nullptr) {
808         LOG_E(BMS_TAG_DEFAULT, "null absSharedResultSet");
809         return ERR_APPEXECFWK_DB_RESULT_SET_EMPTY;
810     }
811     ScopeGuard stateGuard([&] { absSharedResultSet->Close(); });
812     int32_t count;
813     int ret = absSharedResultSet->GetRowCount(count);
814     if (ret != NativeRdb::E_OK) {
815         LOG_E(BMS_TAG_DEFAULT, "GetRowCount failed, ret: %{public}d", ret);
816         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
817     }
818     if (count == 0) {
819         LOG_D(BMS_TAG_DEFAULT, "count size 0");
820         return ERR_OK;
821     }
822     ret = absSharedResultSet->GoToFirstRow();
823     if (ret != NativeRdb::E_OK) {
824         LOG_E(BMS_TAG_DEFAULT, "GoToFirstRow failed, ret: %{public}d", ret);
825         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
826     }
827     std::string ruleString;
828     ret = absSharedResultSet->GetString(DISPOSED_STATUS_INDEX, ruleString);
829     if (ret != NativeRdb::E_OK) {
830         LOG_E(BMS_TAG_DEFAULT, "GetString failed, ret: %{public}d", ret);
831         return ERR_APPEXECFWK_DB_RESULT_SET_OPT_ERROR;
832     }
833     UninstallDisposedRule::FromString(ruleString, rule);
834     return ERR_OK;
835 }
836 }
837 }