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