1 /*
2 * Copyright (c) 2023-2025 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 #include "app_event_observer_dao.h"
16
17 #include "app_event_store.h"
18 #include "hilog/log.h"
19 #include "rdb_helper.h"
20 #include "sql_util.h"
21
22 #undef LOG_DOMAIN
23 #define LOG_DOMAIN 0xD002D07
24
25 #undef LOG_TAG
26 #define LOG_TAG "ObserverDao"
27
28 namespace OHOS {
29 namespace HiviewDFX {
30 namespace AppEventObserverDao {
31 using namespace AppEventCacheCommon;
32 using namespace AppEventCacheCommon::Observers;
Create(NativeRdb::RdbStore & dbStore)33 int Create(NativeRdb::RdbStore& dbStore)
34 {
35 /**
36 * table: observers
37 *
38 * |-------|------|------|---------|
39 * | seq | name | hash | filters |
40 * |-------|------|------|---------|
41 * | INT64 | TEXT | INT64| TEXT |
42 * |-------|------|------|---------|
43 */
44 const std::vector<std::pair<std::string, std::string>> fields = {
45 {FIELD_NAME, SqlUtil::SQL_TEXT_TYPE},
46 {FIELD_HASH, SqlUtil::SQL_INT_TYPE},
47 {FIELD_FILTERS, SqlUtil::SQL_TEXT_TYPE},
48 };
49 std::string sql = SqlUtil::CreateTable(TABLE, fields);
50 return dbStore.ExecuteSql(sql);
51 }
52
Insert(std::shared_ptr<NativeRdb::RdbStore> dbStore,const Observer & observer,int64_t & seq)53 int Insert(std::shared_ptr<NativeRdb::RdbStore> dbStore, const Observer& observer, int64_t& seq)
54 {
55 NativeRdb::ValuesBucket bucket;
56 bucket.PutString(FIELD_NAME, observer.name);
57 bucket.PutLong(FIELD_HASH, observer.hashCode);
58 bucket.PutString(FIELD_FILTERS, observer.filters);
59 return dbStore->Insert(seq, TABLE, bucket);
60 }
61
Update(std::shared_ptr<NativeRdb::RdbStore> dbStore,int64_t seq,const std::string & filters)62 int Update(std::shared_ptr<NativeRdb::RdbStore> dbStore, int64_t seq, const std::string& filters)
63 {
64 NativeRdb::ValuesBucket bucket;
65 bucket.PutString(FIELD_FILTERS, filters);
66
67 int changedRows = 0;
68 NativeRdb::AbsRdbPredicates predicates(TABLE);
69 predicates.EqualTo(FIELD_SEQ, seq);
70 int ret = dbStore->Update(changedRows, bucket, predicates);
71 HILOG_INFO(LOG_CORE, "update %{public}d observer seq=%{public}" PRId64 ", filters=%{public}s, ret=%{public}d",
72 changedRows, seq, filters.c_str(), ret);
73 return ret;
74 }
75
QuerySeqAndFilters(std::shared_ptr<NativeRdb::RdbStore> dbStore,const Observer & observer,int64_t & seq,std::string & filters)76 int QuerySeqAndFilters(std::shared_ptr<NativeRdb::RdbStore> dbStore, const Observer& observer,
77 int64_t& seq, std::string& filters)
78 {
79 NativeRdb::AbsRdbPredicates predicates(TABLE);
80 predicates.EqualTo(FIELD_NAME, observer.name);
81 predicates.EqualTo(FIELD_HASH, observer.hashCode);
82 auto resultSet = dbStore->Query(predicates, {FIELD_SEQ, FIELD_FILTERS});
83 if (resultSet == nullptr) {
84 HILOG_ERROR(LOG_CORE, "failed to query table, observer name=%{public}s, hash code=%{public}" PRId64,
85 observer.name.c_str(), observer.hashCode);
86 return NativeRdb::E_ERROR;
87 }
88
89 // the hash code is unique, so get only the first
90 int ret = resultSet->GoToNextRow();
91 if (ret == NativeRdb::E_OK && resultSet->GetLong(0, seq) == NativeRdb::E_OK
92 && resultSet->GetString(1, filters) == NativeRdb::E_OK) {
93 HILOG_INFO(LOG_CORE, "succ to query observer seq=%{public}" PRId64 ", name=%{public}s, hash=%{public}" PRId64,
94 seq, observer.name.c_str(), observer.hashCode);
95 }
96 resultSet->Close();
97 return ret;
98 }
99
QuerySeqs(std::shared_ptr<NativeRdb::RdbStore> dbStore,const std::string & name,std::vector<int64_t> & observerSeqs)100 int QuerySeqs(std::shared_ptr<NativeRdb::RdbStore> dbStore, const std::string& name,
101 std::vector<int64_t>& observerSeqs)
102 {
103 NativeRdb::AbsRdbPredicates predicates(TABLE);
104 predicates.EqualTo(FIELD_NAME, name);
105 auto resultSet = dbStore->Query(predicates, {FIELD_SEQ});
106 if (resultSet == nullptr) {
107 HILOG_ERROR(LOG_CORE, "failed to query table, observer=%{public}s", name.c_str());
108 return NativeRdb::E_ERROR;
109 }
110 int ret = resultSet->GoToNextRow();
111 while (ret == NativeRdb::E_OK) {
112 int64_t observerSeq = 0;
113 if (resultSet->GetLong(0, observerSeq) != NativeRdb::E_OK) {
114 HILOG_ERROR(LOG_CORE, "failed to get seq value from resultSet, observer=%{public}s", name.c_str());
115 ret = resultSet->GoToNextRow();
116 continue;
117 }
118 observerSeqs.emplace_back(observerSeq);
119 ret = resultSet->GoToNextRow();
120 }
121 resultSet->Close();
122 return ret == NativeRdb::E_SQLITE_CORRUPT ? ret : NativeRdb::E_OK;
123 }
124
Delete(std::shared_ptr<NativeRdb::RdbStore> dbStore,const std::string & name)125 int Delete(std::shared_ptr<NativeRdb::RdbStore> dbStore, const std::string& name)
126 {
127 int deleteRows = 0;
128 NativeRdb::AbsRdbPredicates predicates(TABLE);
129 predicates.EqualTo(FIELD_NAME, name);
130 int ret = dbStore->Delete(deleteRows, predicates);
131 HILOG_INFO(LOG_CORE, "delete %{public}d records, observer=%{public}s, ret=%{public}d",
132 deleteRows, name.c_str(), ret);
133 return ret;
134 }
135
Delete(std::shared_ptr<NativeRdb::RdbStore> dbStore,int64_t observerSeq)136 int Delete(std::shared_ptr<NativeRdb::RdbStore> dbStore, int64_t observerSeq)
137 {
138 int deleteRows = 0;
139 NativeRdb::AbsRdbPredicates predicates(TABLE);
140 predicates.EqualTo(FIELD_SEQ, observerSeq);
141 int ret = dbStore->Delete(deleteRows, predicates);
142 HILOG_INFO(LOG_CORE, "delete %{public}d records, observerSeq=%{public}" PRId64 ", ret=%{public}d",
143 deleteRows, observerSeq, ret);
144 return ret;
145 }
146
QueryWatchers(std::shared_ptr<NativeRdb::RdbStore> dbStore,std::vector<Observer> & observers)147 int QueryWatchers(std::shared_ptr<NativeRdb::RdbStore> dbStore, std::vector<Observer>& observers)
148 {
149 NativeRdb::AbsRdbPredicates predicates(TABLE);
150 predicates.EqualTo(FIELD_HASH, 0); // hash = 0 means watcher
151 auto resultSet = dbStore->Query(predicates, {FIELD_SEQ, FIELD_NAME, FIELD_FILTERS});
152 if (resultSet == nullptr) {
153 HILOG_ERROR(LOG_CORE, "failed to query watcher from observers");
154 return NativeRdb::E_ERROR;
155 }
156 int ret = resultSet->GoToNextRow();
157 while (ret == NativeRdb::E_OK) {
158 int64_t seq = 0;
159 std::string name;
160 std::string filters;
161 if (resultSet->GetLong(0, seq) != NativeRdb::E_OK // 0 means index of seq
162 || resultSet->GetString(1, name) != NativeRdb::E_OK // 1 means index of name
163 || resultSet->GetString(2, filters) != NativeRdb::E_OK) { // 2 means index of filters
164 HILOG_ERROR(LOG_CORE, "failed to get value from resultSet");
165 ret = resultSet->GoToNextRow();
166 continue;
167 }
168 observers.emplace_back(Observer(seq, name, filters));
169 ret = resultSet->GoToNextRow();
170 }
171 resultSet->Close();
172 return ret == NativeRdb::E_SQLITE_CORRUPT ? ret : NativeRdb::E_OK;
173 }
174 } // namespace AppEventObserverDao
175 } // namespace HiviewDFX
176 } // namespace OHOS
177