From 3e313f5fcd5e220e5fb496e2635ce40d616d4178 Mon Sep 17 00:00:00 2001 From: j21p3 Date: Thu, 11 Jul 2024 20:27:33 +0800 Subject: [PATCH] Fix add duplicate policy error, UNIQUE constraint failed; path limit change to 4095 Change-Id: I12b39ed6cea100b900c4d42e4b7744a3782ec7d4 Signed-off-by: j21p3 --- .../src/sandbox_manager_kit.cpp | 2 +- .../cpp/include/database/sandbox_manager_db.h | 7 +++++-- .../include/service/sandbox_manager_const.h | 2 +- .../cpp/src/database/sandbox_manager_db.cpp | 20 ++++++++++++++----- .../cpp/src/service/policy_info_manager.cpp | 18 ++++++++++------- .../test/unittest/sandbox_manager_db_test.cpp | 2 +- 6 files changed, 34 insertions(+), 17 deletions(-) diff --git a/interfaces/innerkits/sandbox_manager/src/sandbox_manager_kit.cpp b/interfaces/innerkits/sandbox_manager/src/sandbox_manager_kit.cpp index 700718a..9080082 100644 --- a/interfaces/innerkits/sandbox_manager/src/sandbox_manager_kit.cpp +++ b/interfaces/innerkits/sandbox_manager/src/sandbox_manager_kit.cpp @@ -29,7 +29,7 @@ static constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, ACCESSCONTROL_DOMAIN_SANDBOXMANAGER, "SandboxManagerKit"}; } const uint64_t POLICY_VECTOR_SIZE_LIMIT = 500; -const uint32_t POLICY_PATH_LIMIT = 256; +const uint32_t POLICY_PATH_LIMIT = 4095; int32_t SandboxManagerKit::CleanPersistPolicyByPath(const std::vector& filePathList) { diff --git a/services/sandbox_manager/main/cpp/include/database/sandbox_manager_db.h b/services/sandbox_manager/main/cpp/include/database/sandbox_manager_db.h index 40916f2..fbf434e 100644 --- a/services/sandbox_manager/main/cpp/include/database/sandbox_manager_db.h +++ b/services/sandbox_manager/main/cpp/include/database/sandbox_manager_db.h @@ -32,6 +32,8 @@ namespace SandboxManager { class SandboxManagerDb : public SqliteHelper { public: enum ExecuteResult { FAILURE = -1, SUCCESS }; + static const std::string IGNORE; + static const std::string REPLACE; struct SqliteTable { public: std::string tableName_; @@ -45,7 +47,8 @@ public: ~SandboxManagerDb() override; - int32_t Add(const DataType type, const std::vector &values); + int32_t Add(const DataType type, const std::vector &values, + const std::string &duplicateMode = IGNORE); int32_t Remove(const DataType type, const GenericValues &conditions); @@ -63,7 +66,7 @@ public: private: int32_t CreatePersistedPolicyTable() const; - std::string CreateInsertPrepareSqlCmd(const DataType type) const; + std::string CreateInsertPrepareSqlCmd(const DataType type, const std::string &duplicateMode) const; std::string CreateDeletePrepareSqlCmd( const DataType type, const std::vector &columnNames = std::vector()) const; std::string CreateUpdatePrepareSqlCmd(const DataType type, const std::vector &modifyColumns, diff --git a/services/sandbox_manager/main/cpp/include/service/sandbox_manager_const.h b/services/sandbox_manager/main/cpp/include/service/sandbox_manager_const.h index b44c506..6a3e0a9 100644 --- a/services/sandbox_manager/main/cpp/include/service/sandbox_manager_const.h +++ b/services/sandbox_manager/main/cpp/include/service/sandbox_manager_const.h @@ -22,7 +22,7 @@ namespace AccessControl { namespace SandboxManager { #define SA_LIFE_TIME (1000 * 60 * 3) // 3 min -const uint32_t POLICY_PATH_LIMIT = 256; +const uint32_t POLICY_PATH_LIMIT = 4095; const uint64_t MODE_FILTER = 0b11; // 1bit-readbit 2bit- writebit, see OperateMode diff --git a/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp b/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp index 3163df3..5b36200 100644 --- a/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp +++ b/services/sandbox_manager/main/cpp/src/database/sandbox_manager_db.cpp @@ -30,6 +30,9 @@ static const std::string INTEGER_STR = " integer not null,"; static const std::string TEXT_STR = " text not null,"; } +const std::string SandboxManagerDb::IGNORE = "ignore"; +const std::string SandboxManagerDb::REPLACE = "replace"; + SandboxManagerDb& SandboxManagerDb::GetInstance() { static SandboxManagerDb instance; @@ -69,10 +72,16 @@ SandboxManagerDb::SandboxManagerDb() : SqliteHelper(DATABASE_NAME, DATABASE_PATH Open(); } -int32_t SandboxManagerDb::Add(const DataType type, const std::vector& values) +int32_t SandboxManagerDb::Add(const DataType type, const std::vector &values, + const std::string &duplicateMode) { OHOS::Utils::UniqueWriteGuard lock(this->rwLock_); - std::string prepareSql = CreateInsertPrepareSqlCmd(type); + if ((duplicateMode != IGNORE) && (duplicateMode != REPLACE)) { + SANDBOXMANAGER_LOG_ERROR(LABEL, "Duplicate mode should be ignore or replace, input = %{public}s.", + duplicateMode.c_str()); + return FAILURE; + } + std::string prepareSql = CreateInsertPrepareSqlCmd(type, duplicateMode); auto statement = Prepare(prepareSql); BeginTransaction(); bool isExecuteSuccessfully = true; @@ -177,7 +186,7 @@ int32_t SandboxManagerDb::RefreshAll(const DataType type, const std::vector lock(this->rwLock_); std::string deleteSql = CreateDeletePrepareSqlCmd(type); - std::string insertSql = CreateInsertPrepareSqlCmd(type); + std::string insertSql = CreateInsertPrepareSqlCmd(type, IGNORE); auto deleteStatement = Prepare(deleteSql); auto insertStatement = Prepare(insertSql); BeginTransaction(); @@ -205,13 +214,14 @@ int32_t SandboxManagerDb::RefreshAll(const DataType type, const std::vectorsecond.tableName_ + " values("; + std::string sql = "insert or " + duplicateMode + " into " + it->second.tableName_ + " values("; int i = 1; for (const auto& columnName : it->second.tableColumnNames_) { sql.append(":" + columnName); diff --git a/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp b/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp index b95cf7e..7de5b0d 100644 --- a/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp +++ b/services/sandbox_manager/main/cpp/src/service/policy_info_manager.cpp @@ -182,20 +182,24 @@ int32_t PolicyInfoManager::AddToDatabaseIfNotDuplicate(const uint32_t tokenId, c const std::vector &passIndexes, const uint32_t flag, std::vector &results) { std::vector addPolicyGeneric; + if (passIndexes.empty()) { + SANDBOXMANAGER_LOG_INFO(LABEL, "No policies need to add."); + return SANDBOX_MANAGER_OK; + } + for (size_t each : passIndexes) { GenericValues condition; TransferPolicyToGeneric(tokenId, policies[each], condition); - int32_t ret = SandboxManagerDb::GetInstance().Remove( - SandboxManagerDb::SANDBOX_MANAGER_PERSISTED_POLICY, condition); - if (ret != SandboxManagerDb::SUCCESS) { - SANDBOXMANAGER_LOG_ERROR(LABEL, "Database remove error"); - return SANDBOX_MANAGER_DB_ERR; - } condition.Put(PolicyFiledConst::FIELD_FLAG, static_cast(flag)); addPolicyGeneric.emplace_back(condition); } + std::string duplicateMode = SandboxManagerDb::IGNORE; + // replace duplicate policy when flag is 1 + if (flag == 1) { + duplicateMode = SandboxManagerDb::REPLACE; + } int32_t ret = SandboxManagerDb::GetInstance().Add( - SandboxManagerDb::SANDBOX_MANAGER_PERSISTED_POLICY, addPolicyGeneric); + SandboxManagerDb::SANDBOX_MANAGER_PERSISTED_POLICY, addPolicyGeneric, duplicateMode); if (ret != SandboxManagerDb::SUCCESS) { SANDBOXMANAGER_LOG_ERROR(LABEL, "database operate error"); results.clear(); diff --git a/services/sandbox_manager/test/unittest/sandbox_manager_db_test.cpp b/services/sandbox_manager/test/unittest/sandbox_manager_db_test.cpp index c04a6c1..66cf2e8 100644 --- a/services/sandbox_manager/test/unittest/sandbox_manager_db_test.cpp +++ b/services/sandbox_manager/test/unittest/sandbox_manager_db_test.cpp @@ -340,7 +340,7 @@ HWTEST_F(SandboxManagerDbTest, SandboxManagerDbTest007, TestSize.Level1) EXPECT_TRUE(ret.empty()); ret = SandboxManagerDb::GetInstance().CreateInsertPrepareSqlCmd( - SandboxManagerDb::SANDBOX_MANAGER_PERSISTED_POLICY); + SandboxManagerDb::SANDBOX_MANAGER_PERSISTED_POLICY, "ignore"); EXPECT_TRUE(ret.empty()); SandboxManagerDb::GetInstance().dataTypeToSqlTable_ = oldTable; } -- Gitee