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 "net_stats_database_helper.h"
17
18 #include <cstdlib>
19 #include <filesystem>
20
21 #include "net_manager_constants.h"
22 #include "net_mgr_log_wrapper.h"
23 #include "net_stats_constants.h"
24 #include "net_stats_database_defines.h"
25 #include "net_stats_info.h"
26
27 namespace OHOS {
28 namespace NetManagerStandard {
29 using namespace NetStatsDatabaseDefines;
30 namespace {
__anon80ec43220202(void *notUsed, int argc, char **argv, char **colName) 31 NetStatsDatabaseHelper::SqlCallback sqlCallback = [](void *notUsed, int argc, char **argv, char **colName) {
32 std::string data;
33 for (int i = 0; i < argc; i++) {
34 data.append(colName[i]).append(" = ").append(argv[i] ? argv[i] : "nullptr\n");
35 }
36 NETMGR_LOG_D("Recv data: %{public}s", data.c_str());
37 return 0;
38 };
39
CheckFilePath(const std::string & fileName)40 bool CheckFilePath(const std::string &fileName)
41 {
42 char tmpPath[PATH_MAX] = {0};
43 const auto pos = fileName.find_last_of('/');
44 const auto dir = fileName.substr(0, pos);
45 if (!realpath(dir.c_str(), tmpPath)) {
46 NETMGR_LOG_E("Get realPath failed error: %{public}d, %{public}s", errno, strerror(errno));
47 return false;
48 }
49 if (strcmp(tmpPath, dir.c_str()) != 0) {
50 NETMGR_LOG_E("file name is illegal fileName: %{public}s, tmpPath: %{public}s", fileName.c_str(), tmpPath);
51 return false;
52 }
53 return true;
54 }
55 } // namespace
56
NetStatsDatabaseHelper(const std::string & path)57 NetStatsDatabaseHelper::NetStatsDatabaseHelper(const std::string &path)
58 {
59 if (!CheckFilePath(path)) {
60 return;
61 }
62 Open(path);
63 }
64
~NetStatsDatabaseHelper()65 NetStatsDatabaseHelper::~NetStatsDatabaseHelper()
66 {
67 Close();
68 sqlite_ = nullptr;
69 }
70
ExecSql(const std::string & sql,void * recv,SqlCallback callback)71 int32_t NetStatsDatabaseHelper::ExecSql(const std::string &sql, void *recv, SqlCallback callback)
72 {
73 char *errMsg = nullptr;
74 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
75 int32_t ret = sqlite3_exec(sqlite_, sql.c_str(), callback, recv, &errMsg);
76 lock.unlock();
77 NETMGR_LOG_D("EXEC SQL : %{public}s", sql.c_str());
78 if (errMsg != nullptr) {
79 NETMGR_LOG_E("Exec sql failed err:%{public}s", errMsg);
80 sqlite3_free(errMsg);
81 }
82 return ret == SQLITE_OK ? NETMANAGER_SUCCESS : NETMANAGER_ERROR;
83 }
84
CreateTable(const std::string & tableName,const std::string & tableInfo)85 int32_t NetStatsDatabaseHelper::CreateTable(const std::string &tableName, const std::string &tableInfo)
86 {
87 std::string sql = "CREATE TABLE IF NOT EXISTS " + tableName + "(" + tableInfo + ");";
88 int32_t ret = ExecSql(sql, nullptr, sqlCallback);
89 if (ret != NETMANAGER_SUCCESS) {
90 return STATS_ERR_CREATE_TABLE_FAIL;
91 }
92 return NETMANAGER_SUCCESS;
93 }
94
Open(const std::string & path)95 int32_t NetStatsDatabaseHelper::Open(const std::string &path)
96 {
97 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
98 int32_t ret = sqlite3_open_v2(path.c_str(), &sqlite_,
99 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, nullptr);
100 return ret == SQLITE_OK ? NETMANAGER_SUCCESS : NETMANAGER_ERROR;
101 }
102
InsertData(const std::string & tableName,const std::string & paramList,const NetStatsInfo & info)103 int32_t NetStatsDatabaseHelper::InsertData(const std::string &tableName, const std::string ¶mList,
104 const NetStatsInfo &info)
105 {
106 std::string params;
107 int32_t paramCount = count(paramList.begin(), paramList.end(), ',') + 1;
108 for (int32_t i = 0; i < paramCount; ++i) {
109 params += "?";
110 if (i != paramCount - 1) {
111 params += ",";
112 }
113 }
114 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
115 std::string sql = "INSERT INTO " + tableName + " (" + paramList + ") " + "VALUES" + " (" + params + ") ";
116 int32_t ret = statement_.Prepare(sqlite_, sql);
117 if (ret != SQLITE_OK) {
118 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
119 return STATS_ERR_WRITE_DATA_FAIL;
120 }
121 int32_t idx = 1;
122 if (paramCount == UID_PARAM_NUM) {
123 statement_.BindInt64(idx, info.uid_);
124 ++idx;
125 }
126 statement_.BindText(idx, info.iface_);
127 statement_.BindInt64(++idx, info.date_);
128 statement_.BindInt64(++idx, info.rxBytes_);
129 statement_.BindInt64(++idx, info.rxPackets_);
130 statement_.BindInt64(++idx, info.txBytes_);
131 statement_.BindInt64(++idx, info.txPackets_);
132 if (paramCount == UID_PARAM_NUM) {
133 statement_.BindText(++idx, info.ident_);
134 }
135 statement_.BindInt64(++idx, info.flag_);
136 ret = statement_.Step();
137 statement_.ResetStatementAndClearBindings();
138 if (ret != SQLITE_DONE) {
139 NETMGR_LOG_E("Step failed ret:%{public}d", ret);
140 return STATS_ERR_WRITE_DATA_FAIL;
141 }
142 return NETMANAGER_SUCCESS;
143 }
144
SelectData(std::vector<NetStatsInfo> & infos,const std::string & tableName,uint64_t start,uint64_t end)145 int32_t NetStatsDatabaseHelper::SelectData(std::vector<NetStatsInfo> &infos, const std::string &tableName,
146 uint64_t start, uint64_t end)
147 {
148 infos.clear();
149 std::string sql = "SELECT * FROM " + tableName + " t WHERE 1=1 AND t.Date >= ?" + " AND t.Date <= ?";
150 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
151 int32_t ret = statement_.Prepare(sqlite_, sql);
152 if (ret != SQLITE_OK) {
153 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
154 return STATS_ERR_READ_DATA_FAIL;
155 }
156 int32_t idx = 1;
157 ret = statement_.BindInt64(idx, start);
158 if (ret != SQLITE_OK) {
159 NETMGR_LOG_E("Bind int64 failed ret:%{public}d", ret);
160 return STATS_ERR_READ_DATA_FAIL;
161 }
162 ret = statement_.BindInt64(++idx, end);
163 if (ret != SQLITE_OK) {
164 NETMGR_LOG_E("Bind int64 failed ret:%{public}d", ret);
165 return STATS_ERR_READ_DATA_FAIL;
166 }
167 return Step(infos);
168 }
169
SelectData(const uint32_t uid,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)170 int32_t NetStatsDatabaseHelper::SelectData(const uint32_t uid, uint64_t start, uint64_t end,
171 std::vector<NetStatsInfo> &infos)
172 {
173 infos.clear();
174 std::string sql = "SELECT * FROM " + std::string(UID_TABLE) + " t WHERE 1=1 AND t.UID == ?" + " AND t.Date >= ?" +
175 " AND t.Date <= ?";
176 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
177 int32_t ret = statement_.Prepare(sqlite_, sql);
178 if (ret != SQLITE_OK) {
179 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
180 return STATS_ERR_READ_DATA_FAIL;
181 }
182 int32_t idx = 1;
183 ret = statement_.BindInt64(idx, uid);
184 if (ret != SQLITE_OK) {
185 NETMGR_LOG_E("Bind int32 failed ret:%{public}d", ret);
186 return STATS_ERR_READ_DATA_FAIL;
187 }
188 ret = BindInt64(idx, start, end);
189 if (ret != SQLITE_OK) {
190 return ret;
191 }
192 return Step(infos);
193 }
194
SelectData(const std::string & iface,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)195 int32_t NetStatsDatabaseHelper::SelectData(const std::string &iface, uint64_t start, uint64_t end,
196 std::vector<NetStatsInfo> &infos)
197 {
198 infos.clear();
199 std::string sql = "SELECT * FROM " + std::string(IFACE_TABLE) + " t WHERE 1=1 AND t.IFace = ?" +
200 " AND t.Date >= ?" + " AND t.Date <= ?";
201 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
202 int32_t ret = statement_.Prepare(sqlite_, sql);
203 if (ret != SQLITE_OK) {
204 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
205 return STATS_ERR_READ_DATA_FAIL;
206 }
207 int32_t idx = 1;
208 ret = statement_.BindText(idx, iface);
209 if (ret != SQLITE_OK) {
210 NETMGR_LOG_E("Bind text failed ret:%{public}d", ret);
211 return STATS_ERR_READ_DATA_FAIL;
212 }
213 ret = BindInt64(idx, start, end);
214 if (ret != SQLITE_OK) {
215 return ret;
216 }
217 return Step(infos);
218 }
219
SelectData(const std::string & iface,const uint32_t uid,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)220 int32_t NetStatsDatabaseHelper::SelectData(const std::string &iface, const uint32_t uid, uint64_t start, uint64_t end,
221 std::vector<NetStatsInfo> &infos)
222 {
223 infos.clear();
224 std::string sql = "SELECT * FROM " + std::string(UID_TABLE) + " t WHERE 1=1 AND t.UID = ?" + " AND t.IFace = ?" +
225 " AND t.Date >= ?" + " AND t.Date <= ?";
226 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
227 int32_t ret = statement_.Prepare(sqlite_, sql);
228 if (ret != SQLITE_OK) {
229 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
230 return STATS_ERR_READ_DATA_FAIL;
231 }
232 int32_t idx = 1;
233 ret = statement_.BindInt64(idx, uid);
234 if (ret != SQLITE_OK) {
235 NETMGR_LOG_E("bind int32 ret:%{public}d", ret);
236 return STATS_ERR_READ_DATA_FAIL;
237 }
238 ret = statement_.BindText(++idx, iface);
239 if (ret != SQLITE_OK) {
240 NETMGR_LOG_E("Bind text failed ret:%{public}d", ret);
241 return STATS_ERR_READ_DATA_FAIL;
242 }
243 ret = BindInt64(idx, start, end);
244 if (ret != SQLITE_OK) {
245 return ret;
246 }
247 return Step(infos);
248 }
249
QueryData(const std::string & tableName,const std::string & ident,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)250 int32_t NetStatsDatabaseHelper::QueryData(const std::string &tableName, const std::string &ident, uint64_t start,
251 uint64_t end, std::vector<NetStatsInfo> &infos)
252 {
253 infos.clear();
254 std::string sql =
255 "SELECT * FROM " + tableName + " t WHERE 1=1 AND t.Ident = ?" + " AND t.Date >= ?" + " AND t.Date <= ?";
256 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
257 int32_t ret = statement_.Prepare(sqlite_, sql);
258 if (ret != SQLITE_OK) {
259 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
260 return STATS_ERR_READ_DATA_FAIL;
261 }
262 int32_t idx = 1;
263 ret = statement_.BindText(idx, ident);
264 if (ret != SQLITE_OK) {
265 NETMGR_LOG_E("bind text ret:%{public}d", ret);
266 return STATS_ERR_READ_DATA_FAIL;
267 }
268 ret = BindInt64(idx, start, end);
269 if (ret != SQLITE_OK) {
270 return ret;
271 }
272 return Step(infos);
273 }
274
QueryData(const std::string & tableName,const uint32_t uid,const std::string & ident,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)275 int32_t NetStatsDatabaseHelper::QueryData(const std::string &tableName, const uint32_t uid, const std::string &ident,
276 uint64_t start, uint64_t end, std::vector<NetStatsInfo> &infos)
277 {
278 infos.clear();
279 std::string sql = "SELECT * FROM " + tableName + " t WHERE 1=1 AND T.UID = ? AND t.Ident = ?" + " AND t.Date >= ?" +
280 " AND t.Date <= ?";
281 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
282 int32_t ret = statement_.Prepare(sqlite_, sql);
283 if (ret != SQLITE_OK) {
284 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
285 return STATS_ERR_READ_DATA_FAIL;
286 }
287 int32_t idx = 1;
288 ret = statement_.BindInt64(idx, uid);
289 if (ret != SQLITE_OK) {
290 NETMGR_LOG_E("bind int32 ret:%{public}d", ret);
291 return STATS_ERR_READ_DATA_FAIL;
292 }
293 ret = statement_.BindText(++idx, ident);
294 if (ret != SQLITE_OK) {
295 NETMGR_LOG_E("bind text ret:%{public}d", ret);
296 return STATS_ERR_READ_DATA_FAIL;
297 }
298 ret = BindInt64(idx, start, end);
299 if (ret != SQLITE_OK) {
300 return ret;
301 }
302 return Step(infos);
303 }
304
DeleteData(const std::string & tableName,uint64_t start,uint64_t end)305 int32_t NetStatsDatabaseHelper::DeleteData(const std::string &tableName, uint64_t start, uint64_t end)
306 {
307 std::string sql =
308 "DELETE FROM " + tableName + " WHERE Date >= " + std::to_string(start) + " AND Date <= " + std::to_string(end);
309 return ExecSql(sql, nullptr, sqlCallback);
310 }
311
DeleteData(const std::string & tableName,uint64_t uid)312 int32_t NetStatsDatabaseHelper::DeleteData(const std::string &tableName, uint64_t uid)
313 {
314 std::string sql = "DELETE FROM " + tableName + " WHERE UID = ?";
315 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
316 int32_t ret = statement_.Prepare(sqlite_, sql);
317 if (ret != SQLITE_OK) {
318 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
319 return STATS_ERR_WRITE_DATA_FAIL;
320 }
321 int32_t idx = 1;
322 statement_.BindInt64(idx, uid);
323 ret = statement_.Step();
324 statement_.ResetStatementAndClearBindings();
325 if (ret != SQLITE_DONE) {
326 NETMGR_LOG_E("Step failed ret:%{public}d", ret);
327 return STATS_ERR_WRITE_DATA_FAIL;
328 }
329 return NETMANAGER_SUCCESS;
330 }
331
Close()332 int32_t NetStatsDatabaseHelper::Close()
333 {
334 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
335 int32_t ret = sqlite3_close_v2(sqlite_);
336 return ret == SQLITE_OK ? NETMANAGER_SUCCESS : NETMANAGER_ERROR;
337 }
338
ClearData(const std::string & tableName)339 int32_t NetStatsDatabaseHelper::ClearData(const std::string &tableName)
340 {
341 std::string sql = "DELETE FROM " + tableName;
342 std::string shrinkMemSql = "PRAGMA shrink_memory";
343 int32_t execSqlRet = ExecSql(sql, nullptr, sqlCallback);
344 if (execSqlRet != NETMANAGER_SUCCESS) {
345 NETMGR_LOG_E("Delete data failed");
346 return execSqlRet;
347 }
348 execSqlRet = ExecSql(shrinkMemSql, nullptr, sqlCallback);
349 if (execSqlRet != NETMANAGER_SUCCESS) {
350 NETMGR_LOG_E("Delete data failed");
351 return execSqlRet;
352 }
353 sql = "VACUUM";
354 execSqlRet = ExecSql(sql, nullptr, sqlCallback);
355 if (execSqlRet != NETMANAGER_SUCCESS) {
356 NETMGR_LOG_E("Delete data failed");
357 return execSqlRet;
358 }
359 return ExecSql(shrinkMemSql, nullptr, sqlCallback);
360 }
361
Step(std::vector<NetStatsInfo> & infos)362 int32_t NetStatsDatabaseHelper::Step(std::vector<NetStatsInfo> &infos)
363 {
364 int32_t rc = statement_.Step();
365 NETMGR_LOG_I("Step result:%{public}d", rc);
366 while (rc != SQLITE_DONE) {
367 if (rc != SQLITE_ROW) {
368 NETMGR_LOG_E("sqlite step error: %{public}d", rc);
369 statement_.ResetStatementAndClearBindings();
370 return STATS_ERR_READ_DATA_FAIL;
371 }
372 int32_t i = 0;
373 NetStatsInfo info;
374 if (statement_.GetColumnCount() == UID_PARAM_NUM) {
375 statement_.GetColumnInt(i, info.uid_);
376 ++i;
377 }
378 statement_.GetColumnString(i, info.iface_);
379 statement_.GetColumnLong(++i, info.date_);
380 statement_.GetColumnLong(++i, info.rxBytes_);
381 statement_.GetColumnLong(++i, info.rxPackets_);
382 statement_.GetColumnLong(++i, info.txBytes_);
383 statement_.GetColumnLong(++i, info.txPackets_);
384 if (statement_.GetColumnCount() == UID_PARAM_NUM) {
385 statement_.GetColumnString(++i, info.ident_);
386 }
387 statement_.GetColumnInt(++i, info.flag_);
388 infos.emplace_back(info);
389 rc = statement_.Step();
390 NETMGR_LOG_D("Step result:%{public}d", rc);
391 }
392 statement_.ResetStatementAndClearBindings();
393 return NETMANAGER_SUCCESS;
394 }
395
BindInt64(int32_t idx,uint64_t start,uint64_t end)396 int32_t NetStatsDatabaseHelper::BindInt64(int32_t idx, uint64_t start, uint64_t end)
397 {
398 int32_t ret = statement_.BindInt64(++idx, start);
399 if (ret != SQLITE_OK) {
400 NETMGR_LOG_E("Bind int64 failed ret:%{public}d", ret);
401 return STATS_ERR_READ_DATA_FAIL;
402 }
403 ret = statement_.BindInt64(++idx, end);
404 if (ret != SQLITE_OK) {
405 NETMGR_LOG_E("Bind int64 failed ret:%{public}d", ret);
406 return STATS_ERR_READ_DATA_FAIL;
407 }
408
409 return ret;
410 }
411
Upgrade()412 int32_t NetStatsDatabaseHelper::Upgrade()
413 {
414 auto ret = ExecTableUpgrade(UID_TABLE, Version_1);
415 if (ret != NETMANAGER_SUCCESS) {
416 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_TABLE, Version_1);
417 }
418 ret = ExecTableUpgrade(UID_SIM_TABLE, Version_2);
419 if (ret != NETMANAGER_SUCCESS) {
420 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_SIM_TABLE, Version_2);
421 }
422 ret = ExecTableUpgrade(UID_TABLE, Version_3);
423 if (ret != NETMANAGER_SUCCESS) {
424 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_TABLE, Version_3);
425 }
426 ret = ExecTableUpgrade(UID_SIM_TABLE, Version_3);
427 if (ret != NETMANAGER_SUCCESS) {
428 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_SIM_TABLE, Version_3);
429 }
430 ret = ExecTableUpgrade(UID_SIM_TABLE, Version_4);
431 if (ret != NETMANAGER_SUCCESS) {
432 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_SIM_TABLE, Version_4);
433 }
434 return ret;
435 }
436
ExecTableUpgrade(const std::string & tableName,TableVersion newVersion)437 int32_t NetStatsDatabaseHelper::ExecTableUpgrade(const std::string &tableName, TableVersion newVersion)
438 {
439 TableVersion oldVersion;
440 auto ret = GetTableVersion(oldVersion, tableName);
441 if (ret != SQLITE_OK) {
442 NETMGR_LOG_E("ExecTableUpgrade getTableVersion failed. ret = %{public}d", ret);
443 return NETMANAGER_ERROR;
444 }
445 if (oldVersion == newVersion) {
446 return NETMANAGER_SUCCESS;
447 }
448 NETMGR_LOG_I("ExecTableUpgrade tableName = %{public}s, oldVersion = %{public}d, newVersion = %{public}d",
449 tableName.c_str(), oldVersion, newVersion);
450 ExecUpgradeSql(tableName, oldVersion, newVersion);
451 if (oldVersion != newVersion) {
452 NETMGR_LOG_E("ExecTableUpgrade error. oldVersion = %{public}d, newVersion = %{public}d",
453 oldVersion, newVersion);
454 return NETMANAGER_ERROR;
455 }
456 ret = UpdateTableVersion(oldVersion, tableName);
457 if (ret != NETMANAGER_SUCCESS) {
458 NETMGR_LOG_E("ExecTableUpgrade updateVersion failed. ret = %{public}d", ret);
459 return NETMANAGER_ERROR;
460 }
461 return NETMANAGER_SUCCESS;
462 }
463
ExecUpgradeSql(const std::string & tableName,TableVersion & oldVersion,TableVersion newVersion)464 void NetStatsDatabaseHelper::ExecUpgradeSql(const std::string &tableName, TableVersion &oldVersion,
465 TableVersion newVersion)
466 {
467 int32_t ret = NETMANAGER_SUCCESS;
468 if (oldVersion < Version_1 && newVersion >= Version_1) {
469 std::string sql = "ALTER TABLE " + tableName + " ADD COLUMN Ident CHAR(100) NOT NULL DEFAULT '';";
470 ret = ExecSql(sql, nullptr, sqlCallback);
471 if (ret != SQLITE_OK) {
472 NETMGR_LOG_E("ExecTableUpgrade version_1 failed. ret = %{public}d", ret);
473 }
474 oldVersion = Version_1;
475 }
476 if (oldVersion < Version_2 && newVersion >= Version_2) {
477 ret = DeleteData(tableName, Sim_UID);
478 if (ret != SQLITE_OK) {
479 NETMGR_LOG_E("ExecTableUpgrade Version_2 failed. ret = %{public}d", ret);
480 }
481 oldVersion = Version_2;
482 }
483 if (oldVersion < Version_3 && newVersion >= Version_3) {
484 std::string sql = "ALTER TABLE " + tableName + " ADD COLUMN Flag INTEGER NOT NULL DEFAULT 0;";
485 ret = ExecSql(sql, nullptr, sqlCallback);
486 if (ret != SQLITE_OK) {
487 NETMGR_LOG_E("ExecTableUpgrade version_3 failed. ret = %{public}d", ret);
488 }
489 oldVersion = Version_3;
490 }
491 if (oldVersion < Version_4 && newVersion >= Version_4) {
492 std::string sql = "UPDATE " + tableName + " SET Flag = " + std::to_string(STATS_DATA_FLAG_SIM) +
493 " WHERE Flag = " + std::to_string(STATS_DATA_FLAG_DEFAULT) + ";";
494 ret = ExecSql(sql, nullptr, sqlCallback);
495 if (ret != SQLITE_OK) {
496 NETMGR_LOG_E("ExecTableUpgrade Version_4 failed. ret = %{public}d", ret);
497 }
498 oldVersion = Version_4;
499 }
500 }
501
GetTableVersion(TableVersion & version,const std::string & tableName)502 int32_t NetStatsDatabaseHelper::GetTableVersion(TableVersion &version, const std::string &tableName)
503 {
504 std::string sql = "SELECT * FROM " + std::string(VERSION_TABLE) + " WHERE Name = ?;";
505 std::unique_lock<ffrt::mutex> lock(sqliteMutex_);
506 int32_t ret = statement_.Prepare(sqlite_, sql);
507 if (ret != SQLITE_OK) {
508 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret);
509 return STATS_ERR_READ_DATA_FAIL;
510 }
511 int32_t idx = 1;
512 ret = statement_.BindText(idx, tableName);
513 if (ret != SQLITE_OK) {
514 NETMGR_LOG_E("bind text ret:%{public}d", ret);
515 return STATS_ERR_READ_DATA_FAIL;
516 }
517 int32_t rc = statement_.Step();
518 auto v = static_cast<uint32_t>(Version_0);
519 while (rc != SQLITE_DONE) {
520 int32_t i = 1;
521 statement_.GetColumnInt(i, v);
522 rc = statement_.Step();
523 }
524 statement_.ResetStatementAndClearBindings();
525 version = static_cast<TableVersion>(v);
526 return NETMANAGER_SUCCESS;
527 }
528
UpdateTableVersion(TableVersion version,const std::string & tableName)529 int32_t NetStatsDatabaseHelper::UpdateTableVersion(TableVersion version, const std::string &tableName)
530 {
531 std::string sql = "INSERT OR REPLACE INTO "+ std::string(VERSION_TABLE) + "(Name, Version) VALUES('" +
532 tableName + "', " + std::to_string(version) + ");";
533 return ExecSql(sql, nullptr, sqlCallback);
534 }
535
UpdateStatsFlag(const std::string & tableName,uint32_t uid,uint32_t flag)536 int32_t NetStatsDatabaseHelper::UpdateStatsFlag(const std::string &tableName, uint32_t uid, uint32_t flag)
537 {
538 std::string sql = "UPDATE " + tableName + " SET Flag = " + std::to_string(flag) +
539 " WHERE UID = " + std::to_string(uid);
540 return ExecSql(sql, nullptr, sqlCallback);
541 }
542
UpdateDataFlag(const std::string & tableName,uint32_t oldFlag,uint32_t newFlag)543 int32_t NetStatsDatabaseHelper::UpdateDataFlag(const std::string &tableName, uint32_t oldFlag, uint32_t newFlag)
544 {
545 std::string sql =
546 "UPDATE " + tableName + " SET Flag = " + std::to_string(newFlag) + " WHERE Flag = " + std::to_string(oldFlag);
547 return ExecSql(sql, nullptr, sqlCallback);
548 }
549 } // namespace NetManagerStandard
550 } // namespace OHOS
551