diff --git a/services/common/include/bundle_active_usage_database.h b/services/common/include/bundle_active_usage_database.h index 883eb766c8dc444305237e474f15c114ad719493..41123f45a36e259a46c80f2d5633dd3b9ae34734 100644 --- a/services/common/include/bundle_active_usage_database.h +++ b/services/common/include/bundle_active_usage_database.h @@ -114,7 +114,10 @@ private: void CheckDatabaseFile(uint32_t databaseType); void UpdateFormData(const int32_t userId, const std::string bundleName, const std::string moduleName, const BundleActiveFormRecord& formRecord, - std::shared_ptr rdbStore); + std::shared_ptr rdbStore, + std::vector& formValueBuckets); + void BatchInsert(std::shared_ptr rdbStore, + std::vector& rawContactValues, const std::string& tableName); int32_t JudgeQueryCondition(const int64_t beginTime, const int64_t endTime, const int64_t eventTableTime); std::string GetSystemEventName(const int32_t userId); int32_t ExecuteRenameTableName(std::string tablePrefix, int64_t tableOldTime, int64_t tableNewTime, diff --git a/services/common/src/bundle_active_usage_database.cpp b/services/common/src/bundle_active_usage_database.cpp index 75268081e31e2fbd888048f9f746ada57b421d82..0dbf59e996db5e7f8827c89d52cf38ef978118da 100644 --- a/services/common/src/bundle_active_usage_database.cpp +++ b/services/common/src/bundle_active_usage_database.cpp @@ -813,6 +813,15 @@ int32_t BundleActiveUsageDatabase::CreateBundleHistoryTable(uint32_t databaseTyp return BUNDLE_ACTIVE_SUCCESS; } +void BundleActiveUsageDatabase::BatchInsert(std::shared_ptr rdbStore, + std::vector& rawContactValues, const std::string& tableName) +{ + int64_t outRowId = BUNDLE_ACTIVE_FAIL; + if (rawContactValues.size() != 0) { + rdbStore->BatchInsert(outRowId, tableName, rawContactValues); + } +} + void BundleActiveUsageDatabase::PutBundleHistoryData(int32_t userId, shared_ptr>> userHistory) { @@ -826,8 +835,7 @@ void BundleActiveUsageDatabase::PutBundleHistoryData(int32_t userId, } CheckDatabaseFileAndTable(); int32_t changeRow = BUNDLE_ACTIVE_FAIL; - int64_t outRowId = BUNDLE_ACTIVE_FAIL; - NativeRdb::ValuesBucket valuesBucket; + std::vector valuesBuckets; vector queryCondition; int32_t updatedcount = 0; int32_t unupdatedcount = 0; @@ -836,6 +844,7 @@ void BundleActiveUsageDatabase::PutBundleHistoryData(int32_t userId, unupdatedcount++; continue; } + NativeRdb::ValuesBucket valuesBucket; queryCondition.push_back(to_string(userId)); queryCondition.push_back(iter->second->bundleName_); queryCondition.push_back(to_string(iter->second->uid_)); @@ -851,16 +860,15 @@ void BundleActiveUsageDatabase::PutBundleHistoryData(int32_t userId, valuesBucket.PutString(BUNDLE_ACTIVE_DB_BUNDLE_NAME, iter->second->bundleName_); valuesBucket.PutInt(BUNDLE_ACTIVE_DB_USER_ID, userId); valuesBucket.PutInt(BUNDLE_ACTIVE_DB_UID, iter->second->uid_); - rdbStore->Insert(outRowId, BUNDLE_HISTORY_LOG_TABLE, valuesBucket); - outRowId = BUNDLE_ACTIVE_FAIL; + valuesBuckets.push_back(valuesBucket); } else { changeRow = BUNDLE_ACTIVE_FAIL; } - valuesBucket.Clear(); queryCondition.clear(); iter->second->isChanged_ = false; updatedcount++; } + BatchInsert(rdbStore, valuesBuckets, BUNDLE_HISTORY_LOG_TABLE); BUNDLE_ACTIVE_LOGI("update %{public}d bundles, keep %{public}d bundles group", updatedcount, unupdatedcount); } @@ -973,14 +981,14 @@ void BundleActiveUsageDatabase::FlushPackageInfo(uint32_t databaseType, const Bu } string tableName = PACKAGE_LOG_TABLE + to_string(stats.beginTime_); int32_t changeRow = BUNDLE_ACTIVE_FAIL; - int64_t outRowId = BUNDLE_ACTIVE_FAIL; - NativeRdb::ValuesBucket valuesBucket; + std::vector valuesBuckets; vector queryCondition; for (auto iter = stats.bundleStats_.begin(); iter != stats.bundleStats_.end(); iter++) { if (iter->second == nullptr || (iter->second->totalInFrontTime_ == 0 && iter->second->totalContiniousTaskUsedTime_ == 0)) { continue; } + NativeRdb::ValuesBucket valuesBucket; queryCondition.push_back(to_string(stats.userId_)); queryCondition.push_back(iter->second->bundleName_); queryCondition.push_back(to_string(iter->second->uid_)); @@ -999,14 +1007,13 @@ void BundleActiveUsageDatabase::FlushPackageInfo(uint32_t databaseType, const Bu valuesBucket.PutString(BUNDLE_ACTIVE_DB_BUNDLE_NAME, iter->second->bundleName_); valuesBucket.PutInt(BUNDLE_ACTIVE_DB_USER_ID, stats.userId_); valuesBucket.PutInt(BUNDLE_ACTIVE_DB_UID, iter->second->uid_); - rdbStore->Insert(outRowId, tableName, valuesBucket); - outRowId = BUNDLE_ACTIVE_FAIL; + valuesBuckets.push_back(valuesBucket); } else { changeRow = BUNDLE_ACTIVE_FAIL; } - valuesBucket.Clear(); queryCondition.clear(); } + BatchInsert(rdbStore, valuesBuckets, tableName); } shared_ptr BundleActiveUsageDatabase::GetCurrentUsageData(int32_t databaseType, @@ -1074,17 +1081,18 @@ void BundleActiveUsageDatabase::FlushEventInfo(uint32_t databaseType, BundleActi } int64_t eventTableTime = ParseStartTime(eventTableName_); int64_t outRowId = BUNDLE_ACTIVE_FAIL; - NativeRdb::ValuesBucket valuesBucket; + std::vector valuesBuckets; for (int32_t i = 0; i < stats.events_.Size(); i++) { + NativeRdb::ValuesBucket valuesBucket; valuesBucket.PutInt(BUNDLE_ACTIVE_DB_USER_ID, stats.userId_); valuesBucket.PutString(BUNDLE_ACTIVE_DB_BUNDLE_NAME, stats.events_.events_.at(i).bundleName_); valuesBucket.PutInt(BUNDLE_ACTIVE_DB_EVENT_ID, stats.events_.events_.at(i).eventId_); valuesBucket.PutLong(BUNDLE_ACTIVE_DB_TIME_STAMP, stats.events_.events_.at(i).timeStamp_ - eventTableTime); valuesBucket.PutString(BUNDLE_ACTIVE_DB_ABILITY_ID, stats.events_.events_.at(i).abilityId_); valuesBucket.PutInt(BUNDLE_ACTIVE_DB_UID, stats.events_.events_.at(i).uid_); - rdbStore->Insert(outRowId, eventTableName_, valuesBucket); - valuesBucket.Clear(); + valuesBuckets.push_back(valuesBucket); } + BatchInsert(rdbStore, valuesBuckets, eventTableName_); } string BundleActiveUsageDatabase::GetTableIndexSql(uint32_t databaseType, int64_t tableTime, bool createFlag, @@ -1632,10 +1640,11 @@ void BundleActiveUsageDatabase::UpdateModuleData(const int32_t userId, CreateRecordTable(timeStamp); int64_t moduleTableTime = ParseStartTime(moduleRecordsTableName_); int32_t changeRow = BUNDLE_ACTIVE_FAIL; - int64_t outRowId = BUNDLE_ACTIVE_FAIL; - NativeRdb::ValuesBucket moduleValuesBucket; + std::vector moduleValuesBuckets; + std::vector formValueBuckets; vector queryCondition; for (const auto& oneModuleRecord : moduleRecords) { + NativeRdb::ValuesBucket moduleValuesBucket; if (oneModuleRecord.second) { queryCondition.emplace_back(to_string(oneModuleRecord.second->userId_)); queryCondition.emplace_back(oneModuleRecord.second->bundleName_); @@ -1652,20 +1661,20 @@ void BundleActiveUsageDatabase::UpdateModuleData(const int32_t userId, moduleValuesBucket.PutString(BUNDLE_ACTIVE_DB_BUNDLE_NAME, oneModuleRecord.second->bundleName_); moduleValuesBucket.PutString(BUNDLE_ACTIVE_DB_MODULE_NAME, oneModuleRecord.second->moduleName_); moduleValuesBucket.PutInt(BUNDLE_ACTIVE_DB_UID, oneModuleRecord.second->uid_); - rdbStore->Insert(outRowId, moduleRecordsTableName_, moduleValuesBucket); - outRowId = BUNDLE_ACTIVE_FAIL; + moduleValuesBuckets.push_back(moduleValuesBucket); changeRow = BUNDLE_ACTIVE_FAIL; } else { changeRow = BUNDLE_ACTIVE_FAIL; } - moduleValuesBucket.Clear(); queryCondition.clear(); for (const auto& oneFormRecord : oneModuleRecord.second->formRecords_) { UpdateFormData(oneModuleRecord.second->userId_, oneModuleRecord.second->bundleName_, - oneModuleRecord.second->moduleName_, oneFormRecord, rdbStore); + oneModuleRecord.second->moduleName_, oneFormRecord, rdbStore, formValueBuckets); } } } + BatchInsert(rdbStore, moduleValuesBuckets, moduleRecordsTableName_); + BatchInsert(rdbStore, formValueBuckets, formRecordsTableName_); } void BundleActiveUsageDatabase::CreateRecordTable(const int64_t timeStamp) @@ -1680,16 +1689,15 @@ void BundleActiveUsageDatabase::CreateRecordTable(const int64_t timeStamp) void BundleActiveUsageDatabase::UpdateFormData(const int32_t userId, const std::string bundleName, const string moduleName, const BundleActiveFormRecord& formRecord, - std::shared_ptr rdbStore) + std::shared_ptr rdbStore, std::vector& formValueBuckets) { if (rdbStore == nullptr) { return; } - int64_t formRecordsTableTime = ParseStartTime(formRecordsTableName_); NativeRdb::ValuesBucket formValueBucket; + int64_t formRecordsTableTime = ParseStartTime(formRecordsTableName_); vector queryCondition; int32_t changeRow = BUNDLE_ACTIVE_FAIL; - int64_t outRowId = BUNDLE_ACTIVE_FAIL; queryCondition.emplace_back(to_string(userId)); queryCondition.emplace_back(bundleName); queryCondition.emplace_back(moduleName); @@ -1713,7 +1721,7 @@ void BundleActiveUsageDatabase::UpdateFormData(const int32_t userId, const std:: formValueBucket.PutInt(BUNDLE_ACTIVE_DB_FORM_DIMENSION, formRecord.formDimension_); formValueBucket.PutInt(BUNDLE_ACTIVE_DB_FORM_ID, formRecord.formId_); formValueBucket.PutInt(BUNDLE_ACTIVE_DB_FORM_ID, formRecord.uid_); - rdbStore->Insert(outRowId, formRecordsTableName_, formValueBucket); + formValueBuckets.push_back(formValueBucket); } } diff --git a/test/unittest/bundle_active_total_test.cpp b/test/unittest/bundle_active_total_test.cpp index 48d061ded549dfead053139e471de52a3aa60836..3f8c01e789a49646a10d05fbd3abb113864192e1 100644 --- a/test/unittest/bundle_active_total_test.cpp +++ b/test/unittest/bundle_active_total_test.cpp @@ -304,9 +304,10 @@ HWTEST_F(BundleActiveTotalTest, BundleActiveUsageDatabaseTest_006, Function | Me HWTEST_F(BundleActiveTotalTest, BundleActiveUsageDatabaseTest_007, Function | MediumTest | Level0) { BundleActiveUsageDatabase test; + std::vector formValueBuckets; std::shared_ptr rdbStore; BundleActiveFormRecord formRecord; - test.UpdateFormData(0, "test", "test", formRecord, rdbStore); + test.UpdateFormData(0, "test", "test", formRecord, rdbStore, formValueBuckets); std::string result = test.GetSystemEventName(0); EXPECT_EQ(result, ""); test.JudgeQueryCondition(0, 0, 1); diff --git a/test/unittest/device_usage_statistics_service_test.cpp b/test/unittest/device_usage_statistics_service_test.cpp index c93354d2a00b1f0eccc8b597f224ee4f87dec9e1..b6d59705318fa6c9a1c721415a39117bf0e4c619 100644 --- a/test/unittest/device_usage_statistics_service_test.cpp +++ b/test/unittest/device_usage_statistics_service_test.cpp @@ -1446,10 +1446,11 @@ HWTEST_F(DeviceUsageStatisticsServiceTest, DeviceUsageStatisticsServiceTest_Upda std::string bundleName = "defaultBundleName"; std::string moduleName = "defaultModuleName"; std::string formName = "defaultFormName"; + std::vector formValueBuckets; database->InitUsageGroupDatabase(0, true); BundleActiveFormRecord formRecord; auto rdbStore = database->GetBundleActiveRdbStore(0); - database->UpdateFormData(userId, bundleName, moduleName, formRecord, rdbStore); + database->UpdateFormData(userId, bundleName, moduleName, formRecord, rdbStore, formValueBuckets); EXPECT_NE(database, nullptr); }