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 }