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 { __anon93d5b41a0202(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 int32_t ret = sqlite3_exec(sqlite_, sql.c_str(), callback, recv, &errMsg); 75 NETMGR_LOG_D("EXEC SQL : %{public}s", sql.c_str()); 76 if (errMsg != nullptr) { 77 NETMGR_LOG_E("Exec sql failed err:%{public}s", errMsg); 78 sqlite3_free(errMsg); 79 } 80 return ret == SQLITE_OK ? NETMANAGER_SUCCESS : NETMANAGER_ERROR; 81 } 82 CreateTable(const std::string & tableName,const std::string & tableInfo)83 int32_t NetStatsDatabaseHelper::CreateTable(const std::string &tableName, const std::string &tableInfo) 84 { 85 std::string sql = "CREATE TABLE IF NOT EXISTS " + tableName + "(" + tableInfo + ");"; 86 int32_t ret = ExecSql(sql, nullptr, sqlCallback); 87 if (ret != NETMANAGER_SUCCESS) { 88 return STATS_ERR_CREATE_TABLE_FAIL; 89 } 90 return NETMANAGER_SUCCESS; 91 } 92 Open(const std::string & path)93 int32_t NetStatsDatabaseHelper::Open(const std::string &path) 94 { 95 int32_t ret = sqlite3_open_v2(path.c_str(), &sqlite_, 96 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, nullptr); 97 return ret == SQLITE_OK ? NETMANAGER_SUCCESS : NETMANAGER_ERROR; 98 } 99 InsertData(const std::string & tableName,const std::string & paramList,const NetStatsInfo & info)100 int32_t NetStatsDatabaseHelper::InsertData(const std::string &tableName, const std::string ¶mList, 101 const NetStatsInfo &info) 102 { 103 std::string params; 104 int32_t paramCount = count(paramList.begin(), paramList.end(), ',') + 1; 105 for (int32_t i = 0; i < paramCount; ++i) { 106 params += "?"; 107 if (i != paramCount - 1) { 108 params += ","; 109 } 110 } 111 std::string sql = "INSERT INTO " + tableName + " (" + paramList + ") " + "VALUES" + " (" + params + ") "; 112 int32_t ret = statement_.Prepare(sqlite_, sql); 113 if (ret != SQLITE_OK) { 114 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 115 return STATS_ERR_WRITE_DATA_FAIL; 116 } 117 int32_t idx = 1; 118 if (paramCount == UID_PARAM_NUM) { 119 statement_.BindInt32(idx, info.uid_); 120 ++idx; 121 } 122 statement_.BindText(idx, info.iface_); 123 statement_.BindInt64(++idx, info.date_); 124 statement_.BindInt64(++idx, info.rxBytes_); 125 statement_.BindInt64(++idx, info.rxPackets_); 126 statement_.BindInt64(++idx, info.txBytes_); 127 statement_.BindInt64(++idx, info.txPackets_); 128 if (paramCount == UID_PARAM_NUM) { 129 statement_.BindText(++idx, info.ident_); 130 } 131 statement_.BindInt64(++idx, info.flag_); 132 ret = statement_.Step(); 133 statement_.ResetStatementAndClearBindings(); 134 if (ret != SQLITE_DONE) { 135 NETMGR_LOG_E("Step failed ret:%{public}d", ret); 136 return STATS_ERR_WRITE_DATA_FAIL; 137 } 138 return NETMANAGER_SUCCESS; 139 } 140 SelectData(std::vector<NetStatsInfo> & infos,const std::string & tableName,uint64_t start,uint64_t end)141 int32_t NetStatsDatabaseHelper::SelectData(std::vector<NetStatsInfo> &infos, const std::string &tableName, 142 uint64_t start, uint64_t end) 143 { 144 infos.clear(); 145 std::string sql = "SELECT * FROM " + tableName + " t WHERE 1=1 AND t.Date >= ?" + " AND t.Date <= ?"; 146 int32_t ret = statement_.Prepare(sqlite_, sql); 147 if (ret != SQLITE_OK) { 148 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 149 return STATS_ERR_READ_DATA_FAIL; 150 } 151 int32_t idx = 1; 152 ret = statement_.BindInt64(idx, start); 153 if (ret != SQLITE_OK) { 154 NETMGR_LOG_E("Bind int64 failed ret:%{public}d", ret); 155 return STATS_ERR_READ_DATA_FAIL; 156 } 157 ret = statement_.BindInt64(++idx, end); 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 return Step(infos); 163 } 164 SelectData(const uint32_t uid,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)165 int32_t NetStatsDatabaseHelper::SelectData(const uint32_t uid, uint64_t start, uint64_t end, 166 std::vector<NetStatsInfo> &infos) 167 { 168 infos.clear(); 169 std::string sql = "SELECT * FROM " + std::string(UID_TABLE) + " t WHERE 1=1 AND t.UID == ?" + " AND t.Date >= ?" + 170 " AND t.Date <= ?"; 171 int32_t ret = statement_.Prepare(sqlite_, sql); 172 if (ret != SQLITE_OK) { 173 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 174 return STATS_ERR_READ_DATA_FAIL; 175 } 176 int32_t idx = 1; 177 ret = statement_.BindInt32(idx, uid); 178 if (ret != SQLITE_OK) { 179 NETMGR_LOG_E("Bind int32 failed ret:%{public}d", ret); 180 return STATS_ERR_READ_DATA_FAIL; 181 } 182 ret = BindInt64(idx, start, end); 183 if (ret != SQLITE_OK) { 184 return ret; 185 } 186 return Step(infos); 187 } 188 SelectData(const std::string & iface,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)189 int32_t NetStatsDatabaseHelper::SelectData(const std::string &iface, uint64_t start, uint64_t end, 190 std::vector<NetStatsInfo> &infos) 191 { 192 infos.clear(); 193 std::string sql = "SELECT * FROM " + std::string(IFACE_TABLE) + " t WHERE 1=1 AND t.IFace = ?" + 194 " AND t.Date >= ?" + " AND t.Date <= ?"; 195 int32_t ret = statement_.Prepare(sqlite_, sql); 196 if (ret != SQLITE_OK) { 197 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 198 return STATS_ERR_READ_DATA_FAIL; 199 } 200 int32_t idx = 1; 201 ret = statement_.BindText(idx, iface); 202 if (ret != SQLITE_OK) { 203 NETMGR_LOG_E("Bind text failed ret:%{public}d", ret); 204 return STATS_ERR_READ_DATA_FAIL; 205 } 206 ret = BindInt64(idx, start, end); 207 if (ret != SQLITE_OK) { 208 return ret; 209 } 210 return Step(infos); 211 } 212 SelectData(const std::string & iface,const uint32_t uid,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)213 int32_t NetStatsDatabaseHelper::SelectData(const std::string &iface, const uint32_t uid, uint64_t start, uint64_t end, 214 std::vector<NetStatsInfo> &infos) 215 { 216 infos.clear(); 217 std::string sql = "SELECT * FROM " + std::string(UID_TABLE) + " t WHERE 1=1 AND t.UID = ?" + " AND t.IFace = ?" + 218 " AND t.Date >= ?" + " AND t.Date <= ?"; 219 int32_t ret = statement_.Prepare(sqlite_, sql); 220 if (ret != SQLITE_OK) { 221 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 222 return STATS_ERR_READ_DATA_FAIL; 223 } 224 int32_t idx = 1; 225 ret = statement_.BindInt32(idx, uid); 226 if (ret != SQLITE_OK) { 227 NETMGR_LOG_E("bind int32 ret:%{public}d", ret); 228 return STATS_ERR_READ_DATA_FAIL; 229 } 230 ret = statement_.BindText(++idx, iface); 231 if (ret != SQLITE_OK) { 232 NETMGR_LOG_E("Bind text failed ret:%{public}d", ret); 233 return STATS_ERR_READ_DATA_FAIL; 234 } 235 ret = BindInt64(idx, start, end); 236 if (ret != SQLITE_OK) { 237 return ret; 238 } 239 return Step(infos); 240 } 241 QueryData(const std::string & tableName,const std::string & ident,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)242 int32_t NetStatsDatabaseHelper::QueryData(const std::string &tableName, const std::string &ident, uint64_t start, 243 uint64_t end, std::vector<NetStatsInfo> &infos) 244 { 245 infos.clear(); 246 std::string sql = 247 "SELECT * FROM " + tableName + " t WHERE 1=1 AND t.Ident = ?" + " AND t.Date >= ?" + " AND t.Date <= ?"; 248 int32_t ret = statement_.Prepare(sqlite_, sql); 249 if (ret != SQLITE_OK) { 250 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 251 return STATS_ERR_READ_DATA_FAIL; 252 } 253 int32_t idx = 1; 254 ret = statement_.BindText(idx, ident); 255 if (ret != SQLITE_OK) { 256 NETMGR_LOG_E("bind text ret:%{public}d", ret); 257 return STATS_ERR_READ_DATA_FAIL; 258 } 259 ret = BindInt64(idx, start, end); 260 if (ret != SQLITE_OK) { 261 return ret; 262 } 263 return Step(infos); 264 } 265 QueryData(const std::string & tableName,const uint32_t uid,const std::string & ident,uint64_t start,uint64_t end,std::vector<NetStatsInfo> & infos)266 int32_t NetStatsDatabaseHelper::QueryData(const std::string &tableName, const uint32_t uid, const std::string &ident, 267 uint64_t start, uint64_t end, std::vector<NetStatsInfo> &infos) 268 { 269 infos.clear(); 270 std::string sql = "SELECT * FROM " + tableName + " t WHERE 1=1 AND T.UID = ? AND t.Ident = ?" + " AND t.Date >= ?" + 271 " AND t.Date <= ?"; 272 int32_t ret = statement_.Prepare(sqlite_, sql); 273 if (ret != SQLITE_OK) { 274 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 275 return STATS_ERR_READ_DATA_FAIL; 276 } 277 int32_t idx = 1; 278 ret = statement_.BindInt32(idx, uid); 279 if (ret != SQLITE_OK) { 280 NETMGR_LOG_E("bind int32 ret:%{public}d", ret); 281 return STATS_ERR_READ_DATA_FAIL; 282 } 283 ret = statement_.BindText(++idx, ident); 284 if (ret != SQLITE_OK) { 285 NETMGR_LOG_E("bind text ret:%{public}d", ret); 286 return STATS_ERR_READ_DATA_FAIL; 287 } 288 ret = BindInt64(idx, start, end); 289 if (ret != SQLITE_OK) { 290 return ret; 291 } 292 return Step(infos); 293 } 294 DeleteData(const std::string & tableName,uint64_t start,uint64_t end)295 int32_t NetStatsDatabaseHelper::DeleteData(const std::string &tableName, uint64_t start, uint64_t end) 296 { 297 std::string sql = 298 "DELETE FROM " + tableName + " WHERE Date >= " + std::to_string(start) + " AND Date <= " + std::to_string(end); 299 return ExecSql(sql, nullptr, sqlCallback); 300 } 301 DeleteData(const std::string & tableName,uint64_t uid)302 int32_t NetStatsDatabaseHelper::DeleteData(const std::string &tableName, uint64_t uid) 303 { 304 std::string sql = "DELETE FROM " + tableName + " WHERE UID = ?"; 305 int32_t ret = statement_.Prepare(sqlite_, sql); 306 if (ret != SQLITE_OK) { 307 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 308 return STATS_ERR_WRITE_DATA_FAIL; 309 } 310 int32_t idx = 1; 311 statement_.BindInt32(idx, static_cast<int32_t>(uid)); 312 ret = statement_.Step(); 313 statement_.ResetStatementAndClearBindings(); 314 if (ret != SQLITE_DONE) { 315 NETMGR_LOG_E("Step failed ret:%{public}d", ret); 316 return STATS_ERR_WRITE_DATA_FAIL; 317 } 318 return NETMANAGER_SUCCESS; 319 } 320 Close()321 int32_t NetStatsDatabaseHelper::Close() 322 { 323 int32_t ret = sqlite3_close_v2(sqlite_); 324 return ret == SQLITE_OK ? NETMANAGER_SUCCESS : NETMANAGER_ERROR; 325 } 326 ClearData(const std::string & tableName)327 int32_t NetStatsDatabaseHelper::ClearData(const std::string &tableName) 328 { 329 std::string sql = "DELETE FROM " + tableName; 330 std::string shrinkMemSql = "PRAGMA shrink_memory"; 331 int32_t execSqlRet = ExecSql(sql, nullptr, sqlCallback); 332 if (execSqlRet != NETMANAGER_SUCCESS) { 333 NETMGR_LOG_E("Delete data failed"); 334 return execSqlRet; 335 } 336 execSqlRet = ExecSql(shrinkMemSql, nullptr, sqlCallback); 337 if (execSqlRet != NETMANAGER_SUCCESS) { 338 NETMGR_LOG_E("Delete data failed"); 339 return execSqlRet; 340 } 341 sql = "VACUUM"; 342 execSqlRet = ExecSql(sql, nullptr, sqlCallback); 343 if (execSqlRet != NETMANAGER_SUCCESS) { 344 NETMGR_LOG_E("Delete data failed"); 345 return execSqlRet; 346 } 347 return ExecSql(shrinkMemSql, nullptr, sqlCallback); 348 } 349 Step(std::vector<NetStatsInfo> & infos)350 int32_t NetStatsDatabaseHelper::Step(std::vector<NetStatsInfo> &infos) 351 { 352 int32_t rc = statement_.Step(); 353 NETMGR_LOG_I("Step result:%{public}d", rc); 354 while (rc != SQLITE_DONE) { 355 if (rc != SQLITE_ROW) { 356 NETMGR_LOG_E("sqlite step error: %{public}d", rc); 357 statement_.ResetStatementAndClearBindings(); 358 return STATS_ERR_READ_DATA_FAIL; 359 } 360 int32_t i = 0; 361 NetStatsInfo info; 362 if (statement_.GetColumnCount() == UID_PARAM_NUM) { 363 statement_.GetColumnInt(i, info.uid_); 364 ++i; 365 } 366 statement_.GetColumnString(i, info.iface_); 367 statement_.GetColumnLong(++i, info.date_); 368 statement_.GetColumnLong(++i, info.rxBytes_); 369 statement_.GetColumnLong(++i, info.rxPackets_); 370 statement_.GetColumnLong(++i, info.txBytes_); 371 statement_.GetColumnLong(++i, info.txPackets_); 372 if (statement_.GetColumnCount() == UID_PARAM_NUM) { 373 statement_.GetColumnString(++i, info.ident_); 374 } 375 statement_.GetColumnInt(++i, info.flag_); 376 infos.emplace_back(info); 377 rc = statement_.Step(); 378 NETMGR_LOG_D("Step result:%{public}d", rc); 379 } 380 statement_.ResetStatementAndClearBindings(); 381 return NETMANAGER_SUCCESS; 382 } 383 BindInt64(int32_t idx,uint64_t start,uint64_t end)384 int32_t NetStatsDatabaseHelper::BindInt64(int32_t idx, uint64_t start, uint64_t end) 385 { 386 int32_t ret = statement_.BindInt64(++idx, start); 387 if (ret != SQLITE_OK) { 388 NETMGR_LOG_E("Bind int64 failed ret:%{public}d", ret); 389 return STATS_ERR_READ_DATA_FAIL; 390 } 391 ret = statement_.BindInt64(++idx, end); 392 if (ret != SQLITE_OK) { 393 NETMGR_LOG_E("Bind int64 failed ret:%{public}d", ret); 394 return STATS_ERR_READ_DATA_FAIL; 395 } 396 397 return ret; 398 } 399 Upgrade()400 int32_t NetStatsDatabaseHelper::Upgrade() 401 { 402 auto ret = ExecTableUpgrade(UID_TABLE, Version_1); 403 if (ret != NETMANAGER_SUCCESS) { 404 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_TABLE, Version_1); 405 } 406 ret = ExecTableUpgrade(UID_SIM_TABLE, Version_2); 407 if (ret != NETMANAGER_SUCCESS) { 408 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_SIM_TABLE, Version_2); 409 } 410 ret = ExecTableUpgrade(UID_TABLE, Version_3); 411 if (ret != NETMANAGER_SUCCESS) { 412 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_TABLE, Version_3); 413 } 414 ret = ExecTableUpgrade(UID_SIM_TABLE, Version_3); 415 if (ret != NETMANAGER_SUCCESS) { 416 NETMGR_LOG_E("Upgrade db failed. table is %{public}s, version is %{public}d", UID_SIM_TABLE, Version_3); 417 } 418 return ret; 419 } 420 ExecTableUpgrade(const std::string & tableName,TableVersion newVersion)421 int32_t NetStatsDatabaseHelper::ExecTableUpgrade(const std::string &tableName, TableVersion newVersion) 422 { 423 TableVersion oldVersion; 424 auto ret = GetTableVersion(oldVersion, tableName); 425 if (ret != SQLITE_OK) { 426 NETMGR_LOG_E("ExecTableUpgrade getTableVersion failed. ret = %{public}d", ret); 427 return NETMANAGER_ERROR; 428 } 429 if (oldVersion == newVersion) { 430 return NETMANAGER_SUCCESS; 431 } 432 NETMGR_LOG_I("ExecTableUpgrade tableName = %{public}s, oldVersion = %{public}d, newVersion = %{public}d", 433 tableName.c_str(), oldVersion, newVersion); 434 if (oldVersion < Version_1 && newVersion >= Version_1) { 435 std::string sql = "ALTER TABLE " + tableName + " ADD COLUMN Ident CHAR(100) NOT NULL DEFAULT '';"; 436 ret = ExecSql(sql, nullptr, sqlCallback); 437 if (ret != SQLITE_OK) { 438 NETMGR_LOG_E("ExecTableUpgrade version_1 failed. ret = %{public}d", ret); 439 } 440 oldVersion = Version_1; 441 } 442 if (oldVersion < Version_2 && newVersion >= Version_2) { 443 ret = DeleteData(tableName, Sim_UID); 444 if (ret != SQLITE_OK) { 445 NETMGR_LOG_E("ExecTableUpgrade Version_2 failed. ret = %{public}d", ret); 446 } 447 oldVersion = Version_2; 448 } 449 if (oldVersion < Version_3 && newVersion >= Version_3) { 450 std::string sql = "ALTER TABLE " + tableName + " ADD COLUMN Flag INTEGER NOT NULL DEFAULT 0;"; 451 ret = ExecSql(sql, nullptr, sqlCallback); 452 if (ret != SQLITE_OK) { 453 NETMGR_LOG_E("ExecTableUpgrade version_3 failed. ret = %{public}d", ret); 454 } 455 oldVersion = Version_3; 456 } 457 if (oldVersion != newVersion) { 458 NETMGR_LOG_E("ExecTableUpgrade error. oldVersion = %{public}d, newVersion = %{public}d", 459 oldVersion, newVersion); 460 return NETMANAGER_ERROR; 461 } 462 ret = UpdateTableVersion(oldVersion, tableName); 463 if (ret != NETMANAGER_SUCCESS) { 464 NETMGR_LOG_E("ExecTableUpgrade updateVersion failed. ret = %{public}d", ret); 465 return NETMANAGER_ERROR; 466 } 467 return NETMANAGER_SUCCESS; 468 } 469 GetTableVersion(TableVersion & version,const std::string & tableName)470 int32_t NetStatsDatabaseHelper::GetTableVersion(TableVersion &version, const std::string &tableName) 471 { 472 std::string sql = "SELECT * FROM " + std::string(VERSION_TABLE) + " WHERE Name = ?;"; 473 int32_t ret = statement_.Prepare(sqlite_, sql); 474 if (ret != SQLITE_OK) { 475 NETMGR_LOG_E("Prepare failed ret:%{public}d", ret); 476 return STATS_ERR_READ_DATA_FAIL; 477 } 478 int32_t idx = 1; 479 ret = statement_.BindText(idx, tableName); 480 if (ret != SQLITE_OK) { 481 NETMGR_LOG_E("bind text ret:%{public}d", ret); 482 return STATS_ERR_READ_DATA_FAIL; 483 } 484 int32_t rc = statement_.Step(); 485 auto v = static_cast<uint32_t>(Version_0); 486 while (rc != SQLITE_DONE) { 487 int32_t i = 1; 488 statement_.GetColumnInt(i, v); 489 rc = statement_.Step(); 490 } 491 statement_.ResetStatementAndClearBindings(); 492 version = static_cast<TableVersion>(v); 493 return NETMANAGER_SUCCESS; 494 } 495 UpdateTableVersion(TableVersion version,const std::string & tableName)496 int32_t NetStatsDatabaseHelper::UpdateTableVersion(TableVersion version, const std::string &tableName) 497 { 498 std::string sql = "INSERT OR REPLACE INTO "+ std::string(VERSION_TABLE) + "(Name, Version) VALUES('" + 499 tableName + "', " + std::to_string(version) + ");"; 500 return ExecSql(sql, nullptr, sqlCallback); 501 } 502 UpdateStatsFlag(const std::string & tableName,uint32_t uid,uint32_t flag)503 int32_t NetStatsDatabaseHelper::UpdateStatsFlag(const std::string &tableName, uint32_t uid, uint32_t flag) 504 { 505 std::string sql = "UPDATE " + tableName + " SET Flag = " + std::to_string(flag) + 506 " WHERE UID = " + std::to_string(uid); 507 return ExecSql(sql, nullptr, sqlCallback); 508 } 509 } // namespace NetManagerStandard 510 } // namespace OHOS 511