• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &paramList,
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