• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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