1 /*
2  * Copyright (c) 2024 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 "rdb_data_manager.h"
17 
18 #include "hilog_tag_wrapper.h"
19 
20 namespace OHOS {
21 namespace AbilityRuntime {
Init(NativeRdb::RdbOpenCallback & rdbCallback)22 int32_t RdbDataManager::Init(NativeRdb::RdbOpenCallback &rdbCallback)
23 {
24     std::lock_guard<std::mutex> lock(rdbMutex_);
25     if (rdbStore_ != nullptr) {
26         TAG_LOGD(AAFwkTag::ABILITYMGR, "Ability mgr rdb has existed");
27         return NativeRdb::E_OK;
28     }
29 
30     NativeRdb::RdbStoreConfig rdbStoreConfig(amsRdbConfig_.dbPath + amsRdbConfig_.dbName);
31     rdbStoreConfig.SetSecurityLevel(NativeRdb::SecurityLevel::S1);
32 
33     int32_t ret = NativeRdb::E_OK;
34     rdbStore_ = NativeRdb::RdbHelper::GetRdbStore(rdbStoreConfig, amsRdbConfig_.version, rdbCallback, ret);
35     if (rdbStore_ == nullptr) {
36         TAG_LOGE(AAFwkTag::ABILITYMGR, "Ability mgr rdb init fail");
37         return NativeRdb::E_ERROR;
38     }
39 
40     return NativeRdb::E_OK;
41 }
42 
InsertData(const NativeRdb::ValuesBucket & valuesBucket)43 int32_t RdbDataManager::InsertData(const NativeRdb::ValuesBucket &valuesBucket)
44 {
45     std::lock_guard<std::mutex> lock(rdbMutex_);
46     if (rdbStore_ == nullptr) {
47         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store is null");
48         return NativeRdb::E_ERROR;
49     }
50 
51     int64_t rowId = -1;
52     return rdbStore_->InsertWithConflictResolution(
53         rowId, amsRdbConfig_.tableName, valuesBucket, NativeRdb::ConflictResolution::ON_CONFLICT_REPLACE);
54 }
55 
BatchInsert(int64_t & outInsertNum,const std::vector<NativeRdb::ValuesBucket> & valuesBuckets)56 int32_t RdbDataManager::BatchInsert(int64_t &outInsertNum, const std::vector<NativeRdb::ValuesBucket> &valuesBuckets)
57 {
58     std::lock_guard<std::mutex> lock(rdbMutex_);
59     if (rdbStore_ == nullptr) {
60         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store is null");
61         return NativeRdb::E_ERROR;
62     }
63     auto ret = rdbStore_->BatchInsert(outInsertNum, amsRdbConfig_.tableName, valuesBuckets);
64     return ret == NativeRdb::E_OK;
65 }
66 
UpdateData(const NativeRdb::ValuesBucket & valuesBucket,const NativeRdb::AbsRdbPredicates & absRdbPredicates)67 int32_t RdbDataManager::UpdateData(
68     const NativeRdb::ValuesBucket &valuesBucket, const NativeRdb::AbsRdbPredicates &absRdbPredicates)
69 {
70     std::lock_guard<std::mutex> lock(rdbMutex_);
71     if (rdbStore_ == nullptr) {
72         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store is null");
73         return NativeRdb::E_ERROR;
74     }
75     if (absRdbPredicates.GetTableName() != amsRdbConfig_.tableName) {
76         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store table is invalid");
77         return NativeRdb::E_ERROR;
78     }
79     int32_t rowId = -1;
80     return rdbStore_->Update(rowId, valuesBucket, absRdbPredicates);
81 }
82 
DeleteData(const NativeRdb::AbsRdbPredicates & absRdbPredicates)83 int32_t RdbDataManager::DeleteData(const NativeRdb::AbsRdbPredicates &absRdbPredicates)
84 {
85     std::lock_guard<std::mutex> lock(rdbMutex_);
86     if (rdbStore_ == nullptr) {
87         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store is null");
88         return NativeRdb::E_ERROR;
89     }
90     if (absRdbPredicates.GetTableName() != amsRdbConfig_.tableName) {
91         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store table is invalid");
92         return NativeRdb::E_ERROR;
93     }
94     int32_t rowId = -1;
95     return rdbStore_->Delete(rowId, absRdbPredicates);
96 }
97 
QueryData(const NativeRdb::AbsRdbPredicates & absRdbPredicates)98 std::shared_ptr<NativeRdb::AbsSharedResultSet> RdbDataManager::QueryData(
99     const NativeRdb::AbsRdbPredicates &absRdbPredicates)
100 {
101     std::lock_guard<std::mutex> lock(rdbMutex_);
102     if (rdbStore_ == nullptr) {
103         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store is null");
104         return nullptr;
105     }
106     if (absRdbPredicates.GetTableName() != amsRdbConfig_.tableName) {
107         TAG_LOGE(AAFwkTag::ABILITYMGR, "Rdb store table is invalid");
108         return nullptr;
109     }
110     auto absSharedResultSet = rdbStore_->Query(absRdbPredicates, std::vector<std::string>());
111     if (absSharedResultSet == nullptr || !absSharedResultSet->HasBlock()) {
112         TAG_LOGE(AAFwkTag::ABILITYMGR, "Query data failed.");
113         return nullptr;
114     }
115     return absSharedResultSet;
116 }
117 
ClearCache()118 void RdbDataManager::ClearCache()
119 {
120     NativeRdb::RdbHelper::ClearCache();
121 }
122 } // namespace AbilityRuntime
123 } // namespace OHOS