1 /*
2 * Copyright (c) 2023 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 "rdb_global_params_callback.h"
17
18 #include <string>
19
20 #include "data_storage_errors.h"
21 #include "data_storage_log_wrapper.h"
22 #include "parser_util.h"
23 #include "global_params_data.h"
24 #include "rdb_errno.h"
25 #include "rdb_store.h"
26 #include "values_bucket.h"
27
28 namespace OHOS {
29 namespace Telephony {
RdbGlobalParamsCallback( const std::vector<std::string> &createTableVec)30 RdbGlobalParamsCallback::RdbGlobalParamsCallback(
31 const std::vector<std::string> &createTableVec) : RdbBaseCallBack(createTableVec) {}
32
OnUpgrade(NativeRdb::RdbStore &rdbStore, int oldVersion, int newVersion)33 int RdbGlobalParamsCallback::OnUpgrade(NativeRdb::RdbStore &rdbStore, int oldVersion, int newVersion)
34 {
35 DATA_STORAGE_LOGI(
36 "RdbGlobalParamsCallback::OnUpgrade##oldVersion = %d, newVersion = %d\n", oldVersion, newVersion);
37 return NativeRdb::E_OK;
38 }
39
OnDowngrade(NativeRdb::RdbStore &rdbStore, int currentVersion, int targetVersion)40 int RdbGlobalParamsCallback::OnDowngrade(NativeRdb::RdbStore &rdbStore, int currentVersion, int targetVersion)
41 {
42 DATA_STORAGE_LOGI(
43 "RdbGlobalParamsCallback::OnDowngrade##currentVersion = %d, "
44 "targetVersion = %d\n",
45 currentVersion, targetVersion);
46 return NativeRdb::E_OK;
47 }
48
OnCreate(NativeRdb::RdbStore &rdbStore)49 int RdbGlobalParamsCallback::OnCreate(NativeRdb::RdbStore &rdbStore)
50 {
51 DATA_STORAGE_LOGI("RdbGlobalParamsCallback::OnCreate");
52 RdbBaseCallBack::OnCreate(rdbStore);
53 InitData(rdbStore, TABLE_NUMBER_MATCH, false);
54 InitData(rdbStore, TABLE_ECC_DATA, false);
55 return NativeRdb::E_OK;
56 }
57
OnOpen(NativeRdb::RdbStore &rdbStore)58 int RdbGlobalParamsCallback::OnOpen(NativeRdb::RdbStore &rdbStore)
59 {
60 DATA_STORAGE_LOGD("RdbGlobalParamsCallback::OnOpen");
61 InitData(rdbStore, TABLE_NUMBER_MATCH, true);
62 InitData(rdbStore, TABLE_ECC_DATA, true);
63 return NativeRdb::E_OK;
64 }
65
InitEccData(NativeRdb::RdbStore &rdbStore, const std::string &tableName, const bool hashCheck)66 void RdbGlobalParamsCallback::InitEccData(NativeRdb::RdbStore &rdbStore, const std::string &tableName,
67 const bool hashCheck)
68 {
69 DATA_STORAGE_LOGD("InitData start");
70 ParserUtil util;
71 std::vector<EccNum> vec;
72 int ret = util.ParserEccDataJson(vec, hashCheck);
73 if (ret != DATA_STORAGE_SUCCESS) {
74 if (ret != FILE_HASH_NO_CHANGE) {
75 DATA_STORAGE_LOGE("ParserEccDataJson fail ret = %{public}d", ret);
76 }
77 util.ClearTempDigest(ECC_DATA_HASH);
78 return;
79 }
80 ClearData(rdbStore, tableName);
81 ret = rdbStore.BeginTransaction();
82 if (ret != NativeRdb::E_OK) {
83 DATA_STORAGE_LOGE("BeginTransaction error!");
84 util.ClearTempDigest(ECC_DATA_HASH);
85 return;
86 }
87 DATA_STORAGE_LOGD("InitData size = %{public}zu", vec.size());
88 for (size_t i = 0; i < vec.size(); i++) {
89 NativeRdb::ValuesBucket value;
90 util.ParserEccDataToValuesBucket(value, vec[i]);
91 int64_t id;
92 rdbStore.Insert(id, tableName, value);
93 }
94 if (rdbStore.Commit() == NativeRdb::E_OK) {
95 util.RefreshDigest(ECC_DATA_HASH);
96 } else {
97 util.ClearTempDigest(ECC_DATA_HASH);
98 }
99 DATA_STORAGE_LOGD("InitData end");
100 }
101
InitNumMatchData(NativeRdb::RdbStore &rdbStore, const std::string &tableName, const bool hashCheck)102 void RdbGlobalParamsCallback::InitNumMatchData(NativeRdb::RdbStore &rdbStore, const std::string &tableName,
103 const bool hashCheck)
104 {
105 DATA_STORAGE_LOGD("InitData start");
106 ParserUtil util;
107 std::vector<NumMatch> vec;
108 int resultCode = util.ParserNumMatchJson(vec, hashCheck);
109 if (resultCode != DATA_STORAGE_SUCCESS) {
110 if (resultCode != FILE_HASH_NO_CHANGE) {
111 DATA_STORAGE_LOGE("ParserNumMatchJson fail resultCode = %{public}d", resultCode);
112 }
113 util.ClearTempDigest(NUM_MATCH_HASH);
114 return;
115 }
116 ClearData(rdbStore, tableName);
117 resultCode = rdbStore.BeginTransaction();
118 if (resultCode != NativeRdb::E_OK) {
119 DATA_STORAGE_LOGE("BeginTransaction error!");
120 util.ClearTempDigest(NUM_MATCH_HASH);
121 return;
122 }
123 DATA_STORAGE_LOGD("InitData size = %{public}zu", vec.size());
124 for (size_t i = 0; i < vec.size(); i++) {
125 NativeRdb::ValuesBucket value;
126 util.ParserNumMatchToValuesBucket(value, vec[i]);
127 int64_t id;
128 rdbStore.Insert(id, tableName, value);
129 }
130 if (rdbStore.Commit() == NativeRdb::E_OK) {
131 util.RefreshDigest(NUM_MATCH_HASH);
132 } else {
133 util.ClearTempDigest(NUM_MATCH_HASH);
134 }
135 DATA_STORAGE_LOGD("InitData end");
136 }
137
InitData(NativeRdb::RdbStore &rdbStore, const std::string &tableName, const bool hashCheck)138 void RdbGlobalParamsCallback::InitData(NativeRdb::RdbStore &rdbStore, const std::string &tableName,
139 const bool hashCheck)
140 {
141 DATA_STORAGE_LOGD("InitData start");
142 if (tableName.compare(TABLE_NUMBER_MATCH) == 0) {
143 InitNumMatchData(rdbStore, tableName, hashCheck);
144 } else if (tableName.compare(TABLE_ECC_DATA) == 0) {
145 InitEccData(rdbStore, tableName, hashCheck);
146 } else {
147 DATA_STORAGE_LOGE("RdbGlobalParamsCallback::InitData failed: tableName %s invalid\n", tableName.c_str());
148 }
149 }
150
ClearData(NativeRdb::RdbStore &rdbStore, const std::string &tableName)151 int RdbGlobalParamsCallback::ClearData(NativeRdb::RdbStore &rdbStore, const std::string &tableName)
152 {
153 std::string sql;
154 sql.append("delete from ").append(tableName);
155 return rdbStore.ExecuteSql(sql);
156 }
157 } // namespace Telephony
158 } // namespace OHOS
159