• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "rdb_migrate_mgr.h"
16 #include "app_domain_verify_hilog.h"
17 #include "app_domain_verify_hisysevent.h"
18 #include "rdb_errno.h"
19 #include "rdb_store.h"
20 
21 namespace OHOS::AppDomainVerify {
22 constexpr int INNER_VERSION_UNKNOWN = 0;
23 constexpr int INNER_VERSION_1_0 = 1;
24 constexpr int INNER_VERSION_1_0_COL_CNT = 2;
25 constexpr int RDB_VERSION_1 = 1;
26 constexpr int RDB_VERSION_2 = 2;
27 
Upgrade(NativeRdb::RdbStore & rdbStore,int currVersion,int targetVersion)28 int RdbMigrateMgr::Upgrade(NativeRdb::RdbStore& rdbStore, int currVersion, int targetVersion)
29 {
30     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
31     int ret = NativeRdb::E_OK;
32     if (currVersion == RDB_VERSION_1) {
33         int innerVersion = QueryInnerVersion(rdbStore);
34         if (innerVersion == INNER_VERSION_1_0) {
35             UpgradeFromV1ToV2(rdbStore);
36         }
37         ret = UpgradeFromV2ToV3(rdbStore);
38     } else if (currVersion == RDB_VERSION_2) {
39         ret = UpgradeFromV2ToV3(rdbStore);
40     } else {
41         APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE,
42             "current version:%d is not support", currVersion);
43     }
44     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called, end");
45     return ret;
46 }
47 
RdbMigrateMgr(const AppDomainVerifyRdbConfig & appDomainVerifyRdbConfig)48 RdbMigrateMgr::RdbMigrateMgr(const AppDomainVerifyRdbConfig& appDomainVerifyRdbConfig)
49 {
50     appDomainVerifyRdbConfig_ = appDomainVerifyRdbConfig;
51 }
QueryInnerVersion(NativeRdb::RdbStore & rdbStore)52 int RdbMigrateMgr::QueryInnerVersion(NativeRdb::RdbStore& rdbStore)
53 {
54     NativeRdb::AbsRdbPredicates absRdbPredicates(appDomainVerifyRdbConfig_.tableName);
55     std::vector<std::string> columns = {};
56     auto absSharedResultSet = rdbStore.Query(absRdbPredicates, columns);
57     if (absSharedResultSet == nullptr) {
58         APP_DOMAIN_VERIFY_HILOGE(
59             APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "QueryInnerVersion query absSharedResultSet failed");
60         return INNER_VERSION_UNKNOWN;
61     }
62     int innerVersion = INNER_VERSION_UNKNOWN;
63     int count = -1;
64     absSharedResultSet->GetColumnCount(count);
65     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdbStore GetColumnCount %{public}d", count);
66     if (count == INNER_VERSION_1_0_COL_CNT) {
67         innerVersion = INNER_VERSION_1_0;
68     }
69     absSharedResultSet->Close();
70     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdbStore innerVersion %{public}d", innerVersion);
71     return innerVersion;
72 }
73 
UpgradeFromV1ToV2(NativeRdb::RdbStore & rdbStore)74 void RdbMigrateMgr::UpgradeFromV1ToV2(NativeRdb::RdbStore& rdbStore)
75 {
76     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
77     const std::string migrateSqls[] = { R"(drop table IF EXISTS temp_table;)", R"(drop table IF EXISTS final_table;)",
78         R"(CREATE TEMPORARY TABLE temp_table AS
79             SELECT
80               verified_domain.KEY,
81               json_extract(verified_domain.VALUE, '$.appIdentifier') as appid,
82               json_extract(verified_domain.VALUE, '$.hostVerifyStatusMap') as map
83             FROM
84               verified_domain;)",
85         R"(CREATE TABLE final_table AS
86             SELECT
87               temp_table.KEY as BUNDLE_NAME,
88               temp_table.appid as APP_IDENTIFIER,
89               json_each.key AS DOMAIN,
90               json_each.value AS VERIFY_STATUES
91             FROM
92               temp_table,
93               json_each(temp_table.map);)",
94         R"(drop table IF EXISTS verified_domain;)",
95         R"(CREATE TABLE IF NOT EXISTS  verified_domain (ID INTEGER PRIMARY KEY AUTOINCREMENT, BUNDLE_NAME TEXT NOT NULL,
96             APP_IDENTIFIER TEXT,
97             DOMAIN TEXT NOT NULL, VERIFY_STATUES INTEGER);)",
98         R"(INSERT INTO verified_domain (BUNDLE_NAME,APP_IDENTIFIER,DOMAIN,VERIFY_STATUES) select * from final_table;)",
99         R"(drop table IF EXISTS final_table;)" };
100     for (const auto& sql : migrateSqls) {
101         auto ret = rdbStore.ExecuteSql(sql);
102         if (ret != NativeRdb::E_OK) {
103             APP_DOMAIN_VERIFY_HILOGE(
104                 APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "execute sql %{public}s failed.", sql.c_str());
105             UNIVERSAL_ERROR_EVENT(UPDATE_DB_FAULT);
106             auto dropTableSql = R"(drop table IF EXISTS verified_domain;)";
107             (void)rdbStore.ExecuteSql(dropTableSql);
108             APP_DOMAIN_VERIFY_HILOGE(
109                 APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "UpgradeFromV1_0 executeSql failed, ret: %{public}d", ret);
110             break;
111         }
112     }
113     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
114 }
115 
UpgradeFromV2ToV3(NativeRdb::RdbStore & rdbStore)116 int RdbMigrateMgr::UpgradeFromV2ToV3(NativeRdb::RdbStore& rdbStore)
117 {
118     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
119     const std::string migrateSqls[] = {
120         R"(ALTER TABLE verified_domain ADD COLUMN VERIFY_TIME TEXT NOT NULL DEFAULT '';)",
121         R"(ALTER TABLE verified_domain ADD COLUMN VERIFY_COUNT INTERGER NULL DEFAULT 0;)",
122     };
123     int ret = ExecSqlWithTrans(rdbStore, [&](NativeRdb::RdbStore& rdbStore)->bool {
124         for (const auto& sql : migrateSqls) {
125             auto ret = rdbStore.ExecuteSql(sql);
126             if (ret != NativeRdb::E_OK) {
127                 APP_DOMAIN_VERIFY_HILOGE(
128                     APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE,
129                     "UpgradeFromV2ToV3 executeSql failed, ret: %{public}d, reason: exec %{public}s fail.",
130                     ret, sql.c_str());
131                 return false;
132             }
133         }
134         return true;
135     });
136     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called end, ret:%{public}d", ret);
137     return ret;
138 }
139 
ExecSqlWithTrans(NativeRdb::RdbStore & rdbStore,const TransFunc & func)140 int RdbMigrateMgr::ExecSqlWithTrans(NativeRdb::RdbStore& rdbStore, const TransFunc& func)
141 {
142     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "called");
143     auto ret = rdbStore.BeginTransaction();
144     if (ret != NativeRdb::E_OK) {
145         return ret;
146     }
147     if (func(rdbStore)) {
148         return rdbStore.Commit();
149     }
150     APP_DOMAIN_VERIFY_HILOGI(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdb exec roll back");
151     ret = rdbStore.RollBack();
152     if (ret != NativeRdb::E_OK) {
153         APP_DOMAIN_VERIFY_HILOGE(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "rdb exec roll back fail.");
154         return ret;
155     }
156     return NativeRdb::E_ERROR;
157 }
158 
159 }