From d5c8f0539c7f22041d9c67697a51650fc0317977 Mon Sep 17 00:00:00 2001 From: mayuecheng Date: Wed, 13 Nov 2024 01:31:00 +0000 Subject: [PATCH] fix vcard import concurrent problem Signed-off-by: mayuecheng --- .../utils_vcard_gtest/contact_data_test.cpp | 2 +- utils/vcard/include/vcard_constant.h | 1 + utils/vcard/include/vcard_rdb_helper.h | 2 +- utils/vcard/src/vcard_contact.cpp | 2 -- utils/vcard/src/vcard_encoder.cpp | 1 + utils/vcard/src/vcard_manager.cpp | 6 +++-- utils/vcard/src/vcard_rdb_helper.cpp | 26 +++++++------------ 7 files changed, 18 insertions(+), 22 deletions(-) diff --git a/test/unittest/utils_vcard_gtest/contact_data_test.cpp b/test/unittest/utils_vcard_gtest/contact_data_test.cpp index 981067e76..970915145 100644 --- a/test/unittest/utils_vcard_gtest/contact_data_test.cpp +++ b/test/unittest/utils_vcard_gtest/contact_data_test.cpp @@ -633,7 +633,7 @@ HWTEST_F(ContactDataTest, VCardRdbHelper, Function | MediumTest | Level3) { VCardRdbHelper::GetInstance().SetDataHelper(nullptr); - EXPECT_EQ(VCardRdbHelper::GetInstance().QueryRawContactMaxId(), DB_FAILD); + EXPECT_EQ(VCardRdbHelper::GetInstance().QueryRawContactMaxId(0), DB_FAILD); std::vector rawContactValues; OHOS::DataShare::DataShareValuesBucket rawContactValue; diff --git a/utils/vcard/include/vcard_constant.h b/utils/vcard/include/vcard_constant.h index 442997359..941e36fc0 100755 --- a/utils/vcard/include/vcard_constant.h +++ b/utils/vcard/include/vcard_constant.h @@ -229,6 +229,7 @@ public: static constexpr const char *ACCOUNT_ID = "account_id"; static constexpr const char *CONTACT_ID = "contact_id"; static constexpr const char *IS_DELETED = "is_deleted"; + static constexpr const char *PRIMARY_CONTACT = "primary_contact"; }; // contact_data diff --git a/utils/vcard/include/vcard_rdb_helper.h b/utils/vcard/include/vcard_rdb_helper.h index 07c30d912..8d7f0df56 100644 --- a/utils/vcard/include/vcard_rdb_helper.h +++ b/utils/vcard/include/vcard_rdb_helper.h @@ -43,7 +43,7 @@ public: static void SetDataHelper(std::shared_ptr dataShareHelper); static void Release(); static VCardRdbHelper &GetInstance(); - static int32_t QueryRawContactMaxId(); + static int32_t QueryRawContactMaxId(int32_t queryNum); static int32_t BatchInsertRawContact(const std::vector &rawContactValues); static int32_t BatchInsertContactData(const std::vector &contactsDataValues); static int32_t QueryGroupId(std::string groupName); diff --git a/utils/vcard/src/vcard_contact.cpp b/utils/vcard/src/vcard_contact.cpp index 6bb84f8ce..e9a69add1 100755 --- a/utils/vcard/src/vcard_contact.cpp +++ b/utils/vcard/src/vcard_contact.cpp @@ -113,8 +113,6 @@ void VCardContact::AddRemainDatas(std::string name, std::string rawValue, std::v AddIms(name, rawValue, propValue, values, parasMap); } else if (name == VCARD_TYPE_X_GROUP) { AddGroups(rawValue); - } else { - TELEPHONY_LOGI("No need to do anything"); } } diff --git a/utils/vcard/src/vcard_encoder.cpp b/utils/vcard/src/vcard_encoder.cpp index 8a335dfb2..0278b9f54 100755 --- a/utils/vcard/src/vcard_encoder.cpp +++ b/utils/vcard/src/vcard_encoder.cpp @@ -39,6 +39,7 @@ std::string VCardEncoder::ContructVCard(std::shared_ptr columns; DataShare::DataSharePredicates predicates; predicates.EqualTo(RawContact::CONTACT_ID, id)->And()->EqualTo(RawContact::IS_DELETED, CONTACTS_NOT_DELETED); + predicates.NotEqualTo(RawContact::PRIMARY_CONTACT, TELEPHONY_ERROR); auto rawResultSet = VCardRdbHelper::GetInstance().QueryRawContact(columns, predicates); if (rawResultSet == nullptr) { TELEPHONY_LOGE("QueryContactData failed"); diff --git a/utils/vcard/src/vcard_manager.cpp b/utils/vcard/src/vcard_manager.cpp index a8e379aa8..a90dde4b3 100755 --- a/utils/vcard/src/vcard_manager.cpp +++ b/utils/vcard/src/vcard_manager.cpp @@ -176,7 +176,7 @@ void VCardManager::BatchInsertContactDbAbility(int32_t accountId, int32_t &error void VCardManager::BatchInsertRawContact( int32_t accountId, uint32_t size, std::vector &rawIds, int32_t &errorCode) { - int32_t rawContactMaxId = VCardRdbHelper::GetInstance().QueryRawContactMaxId(); + int32_t rawContactMaxId = VCardRdbHelper::GetInstance().QueryRawContactMaxId(static_cast(size)); std::vector rawContactValues; for (uint32_t i = 0; i < size; i++) { OHOS::DataShare::DataShareValuesBucket valuesBucket; @@ -184,8 +184,10 @@ void VCardManager::BatchInsertRawContact( if (IsContactsIdExit(accountId)) { valuesBucket.Put(RawContact::CONTACT_ID, accountId); } + int32_t newRawId = rawContactMaxId + i + 1; + valuesBucket.Put(RawContact::ID, newRawId); rawContactValues.push_back(valuesBucket); - rawIds.push_back(rawContactMaxId + i + 1); + rawIds.push_back(newRawId); } VCardRdbHelper::GetInstance().BatchInsertRawContact(rawContactValues); } diff --git a/utils/vcard/src/vcard_rdb_helper.cpp b/utils/vcard/src/vcard_rdb_helper.cpp index dea84f9fa..707efe442 100755 --- a/utils/vcard/src/vcard_rdb_helper.cpp +++ b/utils/vcard/src/vcard_rdb_helper.cpp @@ -25,8 +25,8 @@ OHOS::Uri uriRawContact("datashare:///com.ohos.contactsdataability/contacts/raw_ OHOS::Uri uriContactData("datashare:///com.ohos.contactsdataability/contacts/contact_data"); OHOS::Uri uriAccount("datashare:///com.ohos.contactsdataability/contacts/account"); OHOS::Uri uriContact("datashare:///com.ohos.contactsdataability/contacts/contact"); -OHOS::Uri uriRawContactMaxId("datashare:///com.ohos.contactsdataability/raw_contact/get_inc_id"); OHOS::Uri uriGroup("datashare:///com.ohos.contactsdataability/contacts/groups"); +OHOS::Uri uriRawContactMaxId("datashare:///com.ohos.contactsdataability/raw_contact/place_holder"); } // namespace @@ -40,29 +40,23 @@ VCardRdbHelper &VCardRdbHelper::GetInstance() return instance; } -int32_t VCardRdbHelper::QueryRawContactMaxId() +int32_t VCardRdbHelper::QueryRawContactMaxId(int32_t queryNum) { if (dataShareHelper_ == nullptr) { TELEPHONY_LOGE("dataShareHelper is nullptr"); return DB_FAILD; } Uri uriRawContactMaxIdQuery(uriRawContactMaxId.ToString() + "?isFromBatch=true"); - std::vector columns; - DataShare::DataSharePredicates predicates; - std::shared_ptr resultSet = - dataShareHelper_->Query(uriRawContactMaxIdQuery, predicates, columns); - if (resultSet == nullptr) { - TELEPHONY_LOGE("resultSet is nullptr"); + DataShare::DataShareValuesBucket dbQueryNum; + dbQueryNum.Put("importContactNum", queryNum); + int32_t queryResult = dataShareHelper_->Insert(uriRawContactMaxIdQuery, dbQueryNum); + if (queryResult < 0) { + TELEPHONY_LOGE("query RawContactMaxId failed %{public}d", queryResult); + return DB_FAILD; } - int rawMaxId = 0; - if (resultSet->GoToFirstRow() == TELEPHONY_ERR_SUCCESS) { - int curValueIndex; - resultSet->GetColumnIndex("seq", curValueIndex); - resultSet->GetInt(curValueIndex, rawMaxId); - } - TELEPHONY_LOGI("batchInsert rawId: %{public}d", rawMaxId); - return rawMaxId; + TELEPHONY_LOGW("batchInsert rawId: %{public}d", queryResult); + return queryResult; } int32_t VCardRdbHelper::BatchInsertRawContact(const std::vector &rawContactValues)